Hadoop中RPC协议小例子报错java.lang.reflect.UndeclaredThrowableException解决方法

最近在学习传智播客吴超老师的Hadoop视频,里面他在讲解RPC通信原理的过程中给了一个RPC的小例子,但是自己编写的过程中遇到一个小错误,整理如下:

log4j:WARN No appenders could be found for logger (org.apache.hadoop.metrics2.lib.MutableMetricsFactory).
log4j:WARN Please initialize the log4j system properly.
log4j:WARN See http://logging.apache.org/log4j/1.2/faq.html#noconfig for more info.
Exception in thread "main" java.lang.reflect.UndeclaredThrowableException
    at com.sun.proxy.$Proxy4.login(Unknown Source)
    at cn.edu.nupt.Hadoop.rpc.LoginController.main(LoginController.java:13)
Caused by: org.apache.hadoop.ipc.RemoteException(org.apache.hadoop.ipc.RpcServerException): Unknown protocol: cn.edu.nupt.Hadoop.rpc.LoginServiceInterface
    at org.apache.hadoop.ipc.WritableRpcEngine$Server$WritableRpcInvoker.call(WritableRpcEngine.java:493)
    at org.apache.hadoop.ipc.RPC$Server.call(RPC.java:969)
    at org.apache.hadoop.ipc.Server$Handler$1.run(Server.java:2049)
    at org.apache.hadoop.ipc.Server$Handler$1.run(Server.java:2045)
    at java.security.AccessController.doPrivileged(Native Method)
    at javax.security.auth.Subject.doAs(Subject.java:422)
    at org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1657)
    at org.apache.hadoop.ipc.Server$Handler.run(Server.java:2043)

at org.apache.hadoop.ipc.Client.call(Client.java:1475)
    at org.apache.hadoop.ipc.Client.call(Client.java:1412)
    at org.apache.hadoop.ipc.WritableRpcEngine$Invoker.invoke(WritableRpcEngine.java:243)
    ... 2 more

  导致此类问题的原因主要是由于命名空间的问题(包的命名不一致)。在我的环境中我的linux中的包命名为cn.edu.nupt.hadoop.rpc,而在我的windows工程中我的包的命名格式为cn.edu.nupt.Hadoop.rpc,很清楚的看到我的命名格式不一致。改好后运行成功。因为我的windows中的项目是通过maven创建的,所以不太好修改报名,直接统一改成了cn.edu.nupt.Hadoop.rpc格式。

几点说明:

  我的namenode的ip对应的“域名”为master;

  采用的端口号监听是:10000

  抽象接口(协议):接口

  实例:具体实现类

几个重要的类如下:

1、Linux端

(1)接口:LoginServiceInterface

package cn.edu.nupt.Hadoop.rpc;

public interface LoginServiceInterface {
    public static final long versionID=1L;
    public String login(String username,String passwd);
}

(2)实现类:LoginServiceImplement

package cn.edu.nupt.Hadoop.rpc;

public class LoginServiceImplement implements LoginServiceInterface{
    @Override
    public String login(String username, String passwd) {
        // TODO Auto-generated method stub
        System.out.println("haha");
        return username+"Login Successful!";
    }
}

(3)程序入口:start

package cn.edu.nupt.Hadoop.rpc;

import java.io.IOException;

import org.apache.hadoop.HadoopIllegalArgumentException;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.ipc.RPC;

/**
 *
 * @author hadoop
 *
 */
public class start {

    public static void main(String[] args) throws HadoopIllegalArgumentException, IOException {
        RPC.Builder builder = new RPC.Builder(new Configuration());

        builder.setBindAddress("master").setPort(10000).setProtocol(LoginServiceInterface.class)
                .setInstance(new LoginServiceImplement());

        org.apache.hadoop.ipc.RPC.Server server = builder.build();
        server.start();
    }
}

2、windows端

(1)抽象类:loginServiceInterface

package cn.edu.nupt.Hadoop.rpc;

public interface LoginServiceInterface {
    public static final long versionID=1l;
    public String login(String username,String passwd);
}

(2)测试类:LoginController

package cn.edu.nupt.Hadoop.rpc;

import java.io.IOException;
import java.net.InetSocketAddress;

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.ipc.RPC;

public class LoginController {
    public static void main(String[] args) throws IOException {
        LoginServiceInterface proxy = RPC.getProxy(LoginServiceInterface.class, 1L, new InetSocketAddress("master", 10000), new Configuration());

        String result=proxy.login("Angelababy ", "123456");
        System.out.println(result);
    }
}

时间: 2024-08-03 07:19:26

Hadoop中RPC协议小例子报错java.lang.reflect.UndeclaredThrowableException解决方法的相关文章

Cglib学习报错 java.lang.reflect.InvocationTargetException-->null

package javacore.testForCglibProxy; import java.lang.reflect.Method; import net.sf.cglib.proxy.Enhancer; import net.sf.cglib.proxy.MethodInterceptor; import net.sf.cglib.proxy.MethodProxy; public class GetNewBook { public static void main(String[] ar

在linux环境下报错java.lang.reflect.InvocationTargetException

今天开发了一个excel导出的功能,放到linux服务器上后发现报错. 捕获的异常是 InvocationTargetException 异常,之前没有见过这个异常,网上搜了一下. 内容如下: 在某一个项目A中使用了某个jar包x.jar, 而x.jar引入了一个类Y, 应该包含y.jar才可以使用Y类. 但是y.jar没有被包含到工程中, 这时候就会在项目A中跑出InvocationTargetException. 这个错是指找不到jar包而使用了这个jar包下面的类,查了源码发现是这个类引起

使用hibernate报错java.lang.ExceptionInInitializerError的处理方法

今天使用hibernate搭建持久层出现一个问题 原因在于  在创建user liberty时同时勾选了System Library(added to the boot class )path

maven web 项目中启动报错java.lang.ClassNotFoundException: org.springframework.web.util.Log4jConfigListener

本篇文章主要介绍了"maven web 项目中启动报错java.lang.ClassNotFoundException: org.springframework.web.util.Log4jConfigListener ",主要涉及到maven web 项目中启动报错java.lang.ClassNotFoundException: org.springframework.web.util.Log4jConfigListener 方面的内容,对于maven web 项目中启动报错jav

eclipse下执行wordcount报错 java.lang.ClassNotFoundException 解决办法

eclipse下执行wordcount报错 java.lang.ClassNotFoundException 17/08/29 07:52:54 INFO Configuration.deprecation: fs.default.name is deprecated. Instead, use fs.defaultFS 17/08/29 07:52:54 WARN util.NativeCodeLoader: Unable to load native-hadoop library for y

Android Studo 使用 JNI报错:java.lang.UnsatisfiedLinkError: Couldn't load XXX from loader dalvik.system.PathClassLoader

今天在使用Android Studio的时候突然发现代码没错,so包也引入了,各个版本都引入了,但是就是一直报错: java.lang.UnsatisfiedLinkError: Couldn't load serphone from loader dalvik.system.PathClassLoader 11-30 11:13:18.766 29255-29255/com.personal.tai.ronglianim E/AndroidRuntime: at java.lang.Runti

MyEclipse2014报错java.lang.ClassNotFoundException

MyEclipse2014做web开发的时候,总是报错java.lang.ClassNotFoundException.而对应的类有能在包中找到.原因一般是由下面情况引起的. 在开发的时候,我们习惯性的在lib下面根据包类型或作用分文件夹来管理,然后手动将包导入到项目中(此时包会在Referenced Libraries中),而MyEclipse2014只会自动加载Web app Libraries文件夹中的包. 解决办法就是,将所有的支撑包都放到lib目录下,而不要在lib目录下分文件夹管理.

DRP问题集结(一)-Tomcat无法启动,报错java.lang.NoClassDefFoundError: org/apache/juli/logging/LogFactory

问题一:  Tomcat无法启动,报错java.lang.NoClassDefFoundError: org/apache/juli/logging/LogFactory 问题二:[Error]JavaWeb: 严重: Failed to initialize end point associated with ProtocolHandler ["http-bio-8080"] 问题三:The APR based Apache Tomcat Native library which a

项目报错java.lang.ClassNotFoundException: org.common.SessionListener

现象:项目报错java.lang.ClassNotFoundException: org.common.SessionListener,并且myeclipse左侧Package Explorer中项目目录的WEB-INF下显示多了个classes文件夹.既然报错是ClassNotFoundException,就去tomcat的WEB-INF/classes下找该项目,的确没有class文件. 解决方法:右击项目,点击properties(或者右击项目,选择build path--config b