用户在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. BZOJ2301: [HAOI2011]Problem b 莫比乌斯反演

    分析:对于给出的n个询问,每次求有多少个数对(x,y),满足a≤x≤b,c≤y≤d,且gcd(x,y) = k,gcd(x,y)函数为x和y的最大公约数. 然后对于求这样单个的gcd(x,y)=k的, ...

  2. iframe 处理

    import java.io.File; import org.openqa.selenium.By; import org.openqa.selenium.WebDriver; import org ...

  3. sr4000自带API和opencv结合获取图像

    /* * ===================================================================================== * * Filen ...

  4. Mac osx 下配置ANT

    一般安装过程如下: 1:sudo sh (会提示你输入当前用户的密码) 2:cp apache-ant.1.8.2-bin.zip /usr/local 3:cd /usr/local 4:unzip ...

  5. FPGA开发板

    kingst.cnblogs.com 各种应用需要的接口不同: 做数字信号处理的,需要有AD/DA, 做图像处理,需要有图像接口.如果是通信的,需要有通信的接口,例如PCI/LVDS等.... 然后根 ...

  6. iOS开发中常见的语句@synthesize obj = _obj 的意义详解

    我们在进行iOS开发时,经常会在类的声明部分看见类似于@synthesize window=_window; 的语句,那么,这个window是什么,_ window又是什么,两个东西分别怎么用,这是一 ...

  7. CMDB, 配置管理数据库, ITIL - ManageEngine ServiceDesk Plus

    Download Bitnami Review Board Stack click here CMDB, 配置管理数据库, ITIL - ManageEngine ServiceDesk Plus

  8. [四]SpringMvc学习-对servlet与json的支持与实现

    1.对servletAPI的支持 request.response.session作为参数自动注入 2.对Json的支持 2.1springmvc配置文件中添加支持对象与json的转换 <mvc ...

  9. phpstorm映射远程项目

    项目要设置为default,否则自动更新会失败:type要选正确 development path和web path都要设置 options选项中选ctrl+s自动保存,且下方没告警

  10. 算法之旅,直奔<algorithm>之十三 fill

    fill(vs2010) 引言 这是我学习总结<algorithm>的第十三篇,fill是一个很好的初始化工具.大学挺好,好好珍惜... 作用 fill  的作用是 给容器里一个指定的范围 ...