1. 程式人生 > >Hadoop的RPC框架

Hadoop的RPC框架

專案一:作為服務端: 在這裡插入圖片描述

ClientNamenodeProtocol 這是一個介面,相當於是呼叫RPC之間的協議

package com.thp.bigdata.protocol;

public interface ClientNamenodeProtocol {
    public static final long versionID = 1L;   // 會讀取這個版本號,可以和客戶端的不一樣, 沒有校驗
	public String getMetaData(String path);
}

MyNameNode : 是實現類:

package com.thp.bigdata.server;

import com.thp.bigdata.protocol.ClientNamenodeProtocol;

public class MyNameNode implements ClientNamenodeProtocol {
	// 模擬namenode的業務方法之一:查詢元資料
	@Override
	public String getMetaData(String path) {
		return path + " 3- {BLK_1,BLK_2} ... ";
	}
}

PublishServiceUtil 服務端的啟動程式:

package com.thp.bigdata.start;

import java.io.IOException;

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

import com.thp.bigdata.protocol.ClientNamenodeProtocol;
import com.thp.bigdata.server.MyNameNode;

/**
 * 啟動rpc的服務端
 * @author 湯小萌
 *
 */
public class PublishServiceUtil {
	public static void main(String[] args) throws HadoopIllegalArgumentException, IOException {
		Builder builder = new RPC.Builder(new Configuration());
		builder.setBindAddress("localhost")
		.setPort(8888)
		.setProtocol(ClientNamenodeProtocol.class)
		.setInstance(new MyNameNode());
		Server server = builder.build();
		server.start();
		
	}
}

服務端工程: 在這裡插入圖片描述

ClientNamenodeProtocol 這個介面就是協議,是跟服務端工程的介面完全一致,包名也要一樣. MyHdfsClient 是 客戶端啟動的程式:

package com.thp.bigdata.client;

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

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

import com.thp.bigdata.protocol.ClientNamenodeProtocol;

public class MyHdfsClient {
	public static void main(String[] args) throws IOException {
		ClientNamenodeProtocol namenodeProxy = RPC.getProxy(ClientNamenodeProtocol.class, 1L, new InetSocketAddress("localhost",8888), new Configuration());
		System.out.println("==================");
		System.out.println(namenodeProxy.getClass());
		System.out.println("==================");
		String metaData = namenodeProxy.getMetaData("/llp.txt");
		System.out.println("呼叫RPC返回的資料 : " + metaData);
		
	}
}

返回的namenodeProxy 其實是RPC框架生成的一個代理物件,當客戶端需要呼叫服務端的方法時,服務端會更新實現類生成一個物件然後傳輸給客戶端.