1、各個工具的通訊技術
在分佈式系統中,網絡通訊是底層的基礎模塊,不同的大數據工具使用不同的通訊技術,比如:
組件 | 通訊技術 |
---|---|
Hadoop | Hadoop自己封裝了RPC |
Flink | Akka |
Kafka | NIO |
Spark | 老版本使用了Akka,新版本Netty |
Hadoop自己對RPC做了封裝,叫做Hadoop RPC,RPC是Remote Procedure Call的簡稱,是遠程過程調用,遠程調用是指不同進程之間的調用,過程調用是指方法調用,也就是不同進程之間的方法調用,比如客戶端是一個進程,服務端是一個進程,他們兩個之間的方法調用就是遠程過程調用。
2、通過例子嘗試一下Hadoop RPC
舉個例子,展示了Hadoop RPC的調用方式:
package com.chybin.hdfs.rpc;
/***
* 定義一個接口,實際上就是RPC的一個協議
*/
public interface MyProtocol {
//必須要有一個versionID
long versionID=666L;
//接口(協議)中定義了一個方法,實現了協議的服務端必須要實現這個方法,
// 以供客戶端進行調用。
void mkdir(String path);
}
package com.chybin.hdfs.rpc;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.ipc.RPC;
import org.apache.hadoop.ipc.Server;
import java.io.IOException;
/***
* 模擬一個NameNode服務端,實現了協議中的方法
*/
public class MyNameNodeServiceRpc implements MyProtocol {
public void mkdir(String path) {
System.out.println("服務端執行了mkdir:"+path);
}
public static void main(String[] args) throws IOException {
Server server=new RPC.Builder(new Configuration())
.setBindAddress("localhost")
.setPort(1234)
.setProtocol(MyProtocol.class)
.setInstance(new MyNameNodeServiceRpc())
.build()
;
System.out.println("服務端啓動....");
server.start();
}
}
package com.chybin.hdfs.rpc;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.ipc.RPC;
import java.io.IOException;
import java.net.InetSocketAddress;
/***
* 客戶端
*/
public class ClientRpc {
public static void main(String[] args) throws IOException {
//定義一個協議,定義一個代理來與服務端進行通信。
MyProtocol nameNode = RPC.getProxy(
MyProtocol.class,
MyProtocol.versionID,
new InetSocketAddress("localhost", 1234),
new Configuration()
);
System.out.println("客戶端調用遠程的mkdir方法:");
nameNode.mkdir("/user/soft");
}
}
這個例子中模擬了客戶端調用NameNode服務端的mkdir方法的過程,其中MyProtocol接口實際上就是一個PRC的協議,服務端和客戶端根據這個接口中的定義來進行方法實現和調用,所以在做爲服務端的MyNameNodeServiceRpc要實現MyProtocol 接口,服務端啓動後,客戶端使用同樣的協議使用代理遠程調用服務端的mkdir()方法。
3、Hadoop RPC的一些總結
- Hadoop RPC是指的是不同進程之間的方法調用, 也就是客戶端對服務端的方法調用。
- Hadoop RPC的協議實際上就是一個個的接口,通訊雙方依據接口分別進行實現和遠程調用。
- 協議接口中必須要有一個versionID以標識協議的版本。
- Hadoop RPC服務端啓動後是一個進程,可以使用jps命令查看到進程。
- 使用new RPC.Builder來定義一個服務端。
- 使用RPC.getProxy來定義一個代理來調用服務端方法。