Hadoop之——再谈Hadoop的PRC机制

本文详细介绍了Hadoop中的远程过程调用(RPC)机制,包括服务端如何发布服务及客户端如何调用服务的具体实现过程。

转载请注明出处:http://blog.csdn.net/l1028386804/article/details/52665398

今天,我们重温一下Hadoop的RPC机制,同样的,我们还是基于之前的示例程序为大家讲解Hadoop的RPC机制,那我们直接进入正题吧。

被调用方(也可称为服务端)的业务代码中必须有一个接口,而业务的具体实现写在 此接口的实现类中(jdk的动态代理必须要有接口的),而通过org.apache.hadoop.ipc.RPC(在hadoop-common-2.2.0.jar包中)的一系列方法来发布服务供调用方调用:

LoginService接口:

public interface LoginService {  
    public static final long versionID = 1L;  
  
    public String login(String username, String password);  
}  
注意,接口中要指定静态的、final的成员变量versionID,否则到时候客户端调用的时候会报异常。

接口实现类LoginServiceImpl:

public class LoginServiceImpl implements LoginService {  
  
    public String login(String username, String password) {  
        return username + " logged in successfully";  
    }  
}  
接口实现类只需重写接口的方法。

启动服务的代码,需要写在某个类的main方法中,任意类,甚至可以是上述接口实现类:

public static void main(String[] args) throws HadoopIllegalArgumentException, IOException {  
    Builder builder = new RPC.Builder(new Configuration());  
    builder.setBindAddress("192.168.1.6").setPort(10000).setProtocol(LoginService.class)  
            .setInstance(new LoginServiceImpl());  
    builder.build().start();  
} 
首先是创建了一个org.apache.hadoop.ipc.RPC的内部类Builder的实例(构造方法Builder(Configuration config),此Configuration类是org.apache.hadoop.conf.Configuration,也在hadoop-common.jar包中,此处只需new出来一个Configuration对象即可),然后用这个实例设置一些必须的属性(socket通信的服务端设置的属性),有ip地址、端口号、协议(这里的协议指的就是接口)、接口实例(即接口实现类对象)。最后,调用Builder实例的build()方法得到org.apache.hadoop.ipc.RPC.Server对象,调动该Server对象的start()方法即启动了服务,或者说是发布了服务。

调用方(也可以称为客户端)也必须有和服务端一样的一个接口,代码一致,且所在包也需得一致(实测如果包名不一致的话,会报org.apache.hadoop.ipc.RpcServerException): Unknown protocol 异常):

LoginService接口:
public interface LoginService {  
    public static final long versionID = 1L;  
  
    public String login(String username, String password);  
}  
调用服务代码

@Test  
public void test1() throws IOException {  
    LoginService proxy = RPC.getProxy(LoginService.class, 1L, new InetSocketAddress("192.168.1.6", 10000),  
            new Configuration());  
    String result = proxy.login("liuyazhuang", "123");  
    System.out.println(result);  
}  

主要就是利用org.apache.hadoop.ipc.RPC的getProxy(Class<T> protocol,long clientVersion,InetSocketAddress addr, Configuration conf)方法(此方法里的protocol也就是接口,clientVersion也就是接口代码中配置的versionID的值,InetSocketAddress实例可以通过InetSocketAddress(String hostname, int port)构造器new出来。)获得接口对象(其实是个代理对象),然后调用此对象的业务方法的效果就等同于直接调服务端业务方法的效果一样。至此,就完成了Hadoop的RPC。

### 配置错误解决方案 在 Ubuntu 上搭建 Hadoop 时,如果遇到 `JAVA_HOME` 报错问题,通常是因为环境变量未正确设置或配置文件路径不正确。以下是解决该问题的详细方法: #### 1. 检查 Java 安装 确保系统中已安装 JDK,并确认其版本是否符合 Hadoop 的要求。可以通过以下命令检查: ```bash java -version ``` 如果未安装 JDK,可以使用以下命令安装: ```bash sudo apt update sudo apt install openjdk-8-jdk ``` #### 2. 设置 JAVA_HOME 环境变量 编辑系统的环境变量配置文件 `/etc/profile` 或 `~/.bashrc`,添加以下内容: ```bash export JAVA_HOME=/usr/lib/jvm/java-8-openjdk-amd64 export PATH=$PATH:$JAVA_HOME/bin ``` 注意:`/usr/lib/jvm/java-8-openjdk-amd64` 是 JDK 的安装路径,具体路径可能因系统不同而有所差异。可以通过以下命令查找 JDK 路径: ```bash update-alternatives --config java ``` 保存后,重新加载配置文件: ```bash source /etc/profile ``` 或 ```bash source ~/.bashrc ``` #### 3. 修改 Hadoop 配置文件 编辑 Hadoop 的 `hadoop-env.sh` 文件,确保其中包含正确的 `JAVA_HOME` 设置: ```bash sudo nano /usr/local/hadoop/etc/hadoop/hadoop-env.sh ``` 在文件中添加或修改以下行: ```bash export JAVA_HOME=/usr/lib/jvm/java-8-openjdk-amd64 ``` 确保路径与上一步中设置的路径一致[^1]。 #### 4. 验证配置 完成上述步骤后,重新启动 Hadoop 服务并验证配置是否生效: ```bash ./start-all.sh ``` 如果仍有错误,请检查日志文件以获取更多信息。 #### 5. 处理其他潜在问题 如果仍然出现类似 `Cannot find configuration directory` 的错误,可能需要调整 `HADOOP_CONF_DIR` 的值。编辑 `hadoop-env.sh` 文件,添加以下行: ```bash export HADOOP_CONF_DIR=/usr/local/hadoop/etc/hadoop/ ``` 然后重新加载配置文件[^3]。 --- ### 示例代码 以下是一个完整的配置脚本示例: ```bash # 设置 JAVA_HOME export JAVA_HOME=/usr/lib/jvm/java-8-openjdk-amd64 export PATH=$PATH:$JAVA_HOME/bin # 设置 Hadoop 配置目录 export HADOOP_CONF_DIR=/usr/local/hadoop/etc/hadoop/ # 启动 Hadoop 服务 ./start-all.sh ``` --- ### 注意事项 - 如果使用的是 Hadoop 3.x 版本,建议优先选择 OpenJDK 11,因为 Hadoop 3.x 对 Java 8 的支持逐渐减少。 - 在多节点集群环境中,确保所有节点的 `JAVA_HOME` 和 `HADOOP_CONF_DIR` 配置一致。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

冰 河

可以吃鸡腿么?

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值