用户在Client 端是很难对 NameNode中的信息进行直接访问的,

所以 ,在Hadoop系统中为 Client端 提供了一系列的方法调用,这些方法调用是通过RPC 方法来实现的,

根据RPC 的访问机制,可以将代码分为两个部分 : Server 端 和 Client端。

Server 端 和 Client 端 共同拥有一个 interface : XXXProtocol

其中 ,Server 端 是对 XXXProtocol进行 implements

Client 端 是对XXXProtocol  以动态代理的方式进行调用的。

不过对于应用于实现RPC 调用的接口来说,都是要继承一个 VersionedProtocol 类的实例。

并且,在接口中定义好 final static long versionID 这个 ID值, 这个ID值 是用来 在RPC 初始化的时候 作为参数进行 传入的。

拿NameNodeRpcServer(org.apache.hadoop.hdfs.server.namenode.NameNodeRpcServer)为例,

在Hadoop系统中,它是作为远程调用RPC 的Server端的存在。 它implements NamenodeProtocols

而对于 NamenodeProtocols 这个接口来说, 它extends NameProtocol,ClientProtocol 等等一系列 遵照RPC 通信机制 而继承了

VersionedProtocol 这个接口的多个接口。

在本片文章中LZ 主要介绍一下,如何实现自己的RPC Client端 来通过RPC调用 NameNodeRpcServer

来获取正在运行的NameNode中的相关信息。

===========实现思路=====================

1. 遵照 RPC 通信原理 将代码分为 Client 端 和Server 端 ,

其中Client端 由自己编写 MyClient 来实现,

2. Server端 ,由可以获取 NameNode 运行信息的NameNodeRpcServer 充当。

3. 公共调用的接口 可以由 ClientProtocol 来充当。

============实现代码=========================

package myclient;

import org.apache.hadoop.hdfs.protocol.ClientProtocol ;
import org.apache.hadoop.conf.Configuration ;
import org.apache.hadoop.fs.FileSystem ;
import org.apache.hadoop.ipc.RPC ;
import org.apache.hadoop.fs.permission.FsPermission;
import org.apache.hadoop.fs.permission.PermissionStatus;
import org.apache.hadoop.fs.CreateFlag;
import org.apache.hadoop.fs.permission.FsAction;
import org.apache.hadoop.io.EnumSetWritable;
import org.apache.commons.logging.LogFactory;
import org.apache.commons.lang.StringUtils;
import org.apache.hadoop.security.authentication.util.KerberosName;
import org.apache.log4j.Level;
import org.apache.hadoop.net.NetUtils ;
import org.apache.hadoop.hdfs.DFSConfigKeys;
import org.apache.hadoop.hdfs.server.namenode.NameNode ; import com.google.common.collect.Maps; import java.net.InetSocketAddress;
import java.io.IOException ;
import java.util.EnumSet;
import java.net.URI;
import java.net.InetAddress; //method 2 :
import org.apache.hadoop.fs.FsServerDefaults;
import com.google.protobuf.Message; /**
*
* @author inuyasha1027
*/
public class MyClient
{
private ClientProtocol proxy ; public MyClient ()throws Exception
{
Configuration conf = new Configuration () ; InetSocketAddress addr = new InetSocketAddress("node0", 9000) ; System.out.println("address default:"+addr.getHostName()+" port: "+addr.getPort()); try
{
proxy = (ClientProtocol) RPC.waitForProxy(ClientProtocol.class,
ClientProtocol.versionID, addr, conf ) ; if (proxy != null)
System.out.println("now we start RPC service") ;
else
System.out.println("fail~") ;
}
catch (IOException e)
{
e.printStackTrace();
}
} public void createFile (String src)
{
EnumSetWritable<CreateFlag> flags = new EnumSetWritable(EnumSet.of(CreateFlag.OVERWRITE)) ;; FsPermission permission = new FsPermission ( FsAction.ALL, FsAction.ALL, FsAction.ALL) ;
try
{
proxy.create(src, permission, ClientProtocol.class.getName(), flags, false, (short)2, 4096);
}
catch (Exception e)
{
e.printStackTrace();
}
}
public void clientGetFsServerDefaults() throws IOException
{
FsServerDefaults def = proxy.getServerDefaults();
System.out.println("blockSize"+def.getBlockSize());
}
public void closeRPC()
{
System.out.println("now RPC will be stopped") ;
RPC.stopProxy(proxy);
}
public static void main(String[] args) throws Exception
{
MyClient client = new MyClient () ;
String dst = new String("hdfs://192.168.163.100:9000/user") ;
client.createFile(dst);
client.clientGetFsServerDefaults() ;
client.closeRPC();
}
}

create那个方法,实现起来有些复杂,如果是单纯的验证一下RPC 程序的调用的话, 调用ClientProtocol中的

getServerDefaults()

这个方法就可以,这个方法会调用NameNode 中的方法,返回一个FsServerDefault 对象,

通过的个实例对象 我们可以访问 或是查询一些 NameNode中的变量和属性值等等,

在这个例子中,LZ实现的是对BlockSize 大小 这一属性值的访问。

按照这个思路的话,其实可以自己实现接口,通过这种通信方式,

借助于NamenodeRpcServer 这个类对NameNode中的各个属性进行访问的。

使用RPC 调用NameNode中的方法的更多相关文章

  1. smarty 截取字符串,调用php中的方法,foreach循环

    1.smarty截取字符串       html中的代码    <{$content|truncate:30:"..."}>                       ...

  2. Unity SLua 如何调用Unity中C#方法

    1.原理 就是通常在Lua框架中所说的,开放一个C#的web接口,或者叫做在Slua框架中注册函数. 2.作用 在Lua中调用C#中的方法,这个是在做热更新中很常用的一种方法,无论是slua,还是lu ...

  3. vue 在methods中调用mounted中的方法?

    首先可以在data中先声明一个变量 比如 isShow=' ' mounted 中 ---> methods 中 --->  this.sureDelBox(item) 直接this调用 ...

  4. 在Android Studio中调用so中的方法

    本节用的so是上节用Android Studio创建的so.想在Android Studio中调用so中的方法,需要先引用so.Android Studio中引用so的方法有二种,下面开始介绍. 一 ...

  5. thinkphp模型中的获取器和修改器(根据字段名自动调用模型中的方法)

    thinkphp模型中的获取器和修改器(根据字段名自动调用模型中的方法) 一.总结 记得看下面 1.获取器的作用是在获取数据的字段值后自动进行处理 2.修改器的作用是可以在数据赋值的时候自动进行转换处 ...

  6. 【学习】调用iframe中的方法

    当页面中有iframe时,想在主页面调用iframe中的方法,可以用contentWindow属性.但具体用时还有一点要注意,就是必须等页面加载完成才可以,否则会报错找不到函数. 例: 父页面: &l ...

  7. 使用AIDL远程调用服务中的方法

    AIDL:android interface define language(接口定义语言) 作用:方便远程调用其他服务中的方法 注意:安卓四大组件都要在清单文件注册 aidl创建图: AIDL的全称 ...

  8. 纯静态界面中(html)中通过js调用dll中的方法从数据库中读取数据

    最近接到一个离职员工的任务,一个搭好框架的ERP系统,看了两天,说一下看到的东西,整个项目目录中我没发现一个.aspx后缀的文件,全是静态HTML文件,之后发现他用的jquery简直看的头疼,不过大概 ...

  9. C#如何静态调用C++中的方法(静态调用dll)

    当我们想要在C#中使用C++项目的方法时,这个时候就可以通过调用C++项目的dll来实现,它有静态和动态调用两种方法. DLL(Dynamic Link Library)文件为动态链接库文件,又称“应 ...

随机推荐

  1. tcxtreelist Properties的使用(TcxImageComboBoxProperties)

    TcxImageComboBoxProperties(MID_Comp.Properties).Items.Clear; 这样就可以使用属性了. if lstPaper.FocusedNode.Val ...

  2. NOIP2013 花匠 DP 线段树优化

    网上一堆题解,我写的是N^2优化的那种,nlogn,O(n)的那种能看懂,但是让我自己在赛场写,肯定没戏了 #include <cstdio> #include <iostream& ...

  3. 查看ssh服务开启状态

    root@dbaudit-desktop:/etc/init.d# /etc/init.d/ssh status * sshd is running 或者这样检查:root@dbaudit-deskt ...

  4. getchar

    getchar函数每次只从缓冲区中接受一个字符. getchar有一个int型的返回值. 当程序调用getchar时,程序就等着用户按键,用户输入的字符被存放在键盘缓冲区中,直到用户按回车为止(回车字 ...

  5. Tyvj P1729 文艺平衡树 Splay

    题目: http://tyvj.cn/p/1729 P1729 文艺平衡树 时间: 1000ms / 空间: 131072KiB / Java类名: Main 背景 此为平衡树系列第二道:文艺平衡树 ...

  6. Apache mod_wsgi部署Django项目

    学习python web开发,Django部署备忘 1.下载mod_wsgi,下载路径如下:http://code.google.com/p/modwsgi/downloads/list挑选For 2 ...

  7. HW4.45

    public class Solution { public static void main(String[] args) { int count = 0; for(int i = 1; i < ...

  8. Java 常见异常及趣味解释

    java.lang ArithmeticException 你正在试图使用电脑解决一个自己解决不了的数学问题,请重新阅读你的算术表达式并再次尝试. ArrayIndexOutOfBoundsExcep ...

  9. cocos2d-x载入texture

    转自:http://blog.csdn.net/aa4790139/article/details/8107325 SpriteTestLayer.cpp(就只改了这个这个文件) #include & ...

  10. 安装完Ubuntu 14.04要做的九件事

    www.linuxidc.com/Linux/2014-04/100411.htm 1.看看有哪些新特性 安装完之后的第一件事肯定是看看Ubuntu 14.04有哪些新的特性. Ubuntu 14.0 ...