用户在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. libcurl断点下载

    开发需要写了一个处理curl 下载的c++类,内含有多个静态方法和实例方法,写在这里留给有需求的同学 头文件 CURLHelper.h enum CURLHelperStateType { CURLH ...

  2. 从微信推送看Android Service的创建和销毁

    启动服务是有两组参数影响服务的状态. 1.在onStartCommand(Intent intent, int flags, int startId) 接口中返回值,例如 START_STICKY;  ...

  3. å∫ç∂´ƒ©˙ˆ∆˚¬µ˜øπœ®ß†¨√∑≈¥Ω who know?

    ´é∑w∑w∑wqq¡œœ∑åååß∂˚¬∆¬˚∆˙ß∂ƒµ˜∫√ç≍Ωåœ∑´®†¥¨ˆøπ“‘æ…¬˚∆˙©ƒ∂ßåΩ≍ç≍ç√∫˜µ≤≥÷÷¡™£¢∞§§¶••ªº–≠«``¡™£¢∞§¶•ªº ...

  4. 华为过滤字符串(java)

    /*通过键盘输入一串小写字母(a~z)组成的字符串.请编写一个字符串过滤程序,若字符串中出现多个相同的字符,将非首次出现的字符过滤掉.比如字符串“abacacde”过滤结果为“abcde”.要求实现函 ...

  5. Java和C++的区别

    这是一个Java语言和C++语言之间的比较. 目录 [隐藏]  1 设计目标 2 语言特性 2.1 语法 2.2 语义 2.3 资源管理 2.4 库 2.5 运行时 2.6 模板 vs. 泛型 2.7 ...

  6. NOIP2015 子串 (DP+优化)

    子串 (substring.cpp/c/pas) [问题描述] 有两个仅包含小写英文字母的字符串 A 和 B.现在要从字符串 A 中取出 k 个 互不重 叠 的非空子串,然后把这 k 个子串按照其在字 ...

  7. 10个强大的Apache开源模块

    1.单点登录模块 LemonLDAP LemonLdap可以很棒地实现Apache的SSO功能,并且可以处理超过 20 万的用户请求.LemonLdap支持Java, PHP, .Net, Perl, ...

  8. nyoj 27 水池数目

    水池数目 时间限制:3000 ms  |  内存限制:65535 KB 难度:4   描述 南阳理工学院校园里有一些小河和一些湖泊,现在,我们把它们通一看成水池,假设有一张我们学校的某处的地图,这个地 ...

  9. ECharts中文显示为Unicode码

    后台遍历出的数据,在ECharts的js中引用为Unicode码 解决方案: <s:property>标签的escape属性默认值为true,即不解析html代码,直接将其输出. 若想要输 ...

  10. 关于python文件转为exe文件

    一.简介 py2exe是一个将python脚本转换成windows上的可独立执行的可执行程序(*.exe)的工具,这样,你就可以不用装python而在windows系统上运行这个可执行程序. py2e ...