namenode源码阅读(namenode概念)
本文目录一览:
如何利用hadoop RPC框架实现和NameNode的交互
在此之前,我们需要准备:
hadoop的源码
protobuf 2.5版本
JDK
hadoop 2.x版本中采用了Protocol Buffer (简称protobuf)作为序列化和反序列化的工具,所以我们在修改源码时需要按照相应规则编写message来实现数据的传输。
什么是protobuf?
protobuf是Google 公司内部的混合语言数据标准,它很适合做数据存储或 RPC 数据交换格式。是一种可用于通讯协议、数据存储等领域,并且和语言无关、平台无关、可扩展的序列化结构数据格式。 简单说来 Protobuf 的主要优点就是:简单,快。
安装protobuf和编译hadoop的过程网上的资料很多,我就直接跳过了,我们可以通过Idea导入hadoop的Maven项目,方便对源码的修改
1. 修改proto文件,定义message和service
假设我们现在要实现的是一个检查某个文件或文件夹权限是否符合755,并对客户端返回boolean值。 这是一个属于Client和NameNode交互的一个方法,所以我们在Idea中ctrl+shift+N快速的找到ClientNamenodeProtocol.proto,添加对应的message(结构化数据被称为message)
message CheckPermissionRequestProto {
required string src = 1;
}
message CheckPermissionResponseProto {
required bool checkPerm = 1;
}
我们在这个文件中会看到除了string、bool类型的前面会有三种消息成员的规则,他们的含义分别是:
required:这个域在消息中必须刚好有1个
optional:这个域在消息中可以有0或1个
repeated:这个域在消息中可以有从多个,包括0个
在文件中找到service,并添加方法checkPermission方法
service ClientNamenodeProtocol {
......
rpc checkPermission(CheckPermissionRequestProto) returns(CheckPermissionResponseProto);
}
接下来编译,编译之后你可以在ClientNamenodeProtocolProtos类(编译后生成)的接口ClientNamenodeProtocol,看到新增加的方法了。
2. ClientNamenodeProtocolPB文件
这个接口是client用来和NameNode进行交互的,它继承了ClientNamenodeProtocol接口,即新生成的接口也在其中,这里不用做修改
3. ClientNamenodeProtocolTranslatorPB类
这个类是将对ClientProtocol中方法的调用转化为RPC调用Namenode的服务,并将调用参数转化为PB的类型。 所以,我们需要在ClientProtocol增加checkPermission方法,并在这个类中进行Override
在ClientProtocol中增加
@Idempotent
public boolean checkPermission(String src)
throws AccessControlException, FileNotFoundException,
UnresolvedPathException, IOException;
在ClientNamenodeProtocolTranslatorPB类中
@Override
public boolean checkPermission(String src) throws AccessControlException,
FileNotFoundException, UnresolvedPathException, IOException {
CheckPermissionRequestProto req = CheckPermissionRequestProto.newBuilder()
.setSrc(src).build();
try {
return rpcProxy.checkPermission(null,req).getCheckPerm();
} catch (ServiceException e) {
throw ProtobufHelper.getRemoteException(e);
}
}
注意:要把CheckPermissionRequestProto进行import,否则编译你懂的。
相应的我们也需要在NameNodeRpcServer类中Override该方法,因为NamenodeProtocols继承了ClientProtocol,这类负责处理所有到达NN的RPC call,他负责将请求转化为NN的方法的调用,因此也可以看出它们的实现分层是很清晰的。
@Override // ClientProtocol
public boolean checkPermission(String src)
throws AccessControlException, FileNotFoundException, UnresolvedPathException, IOException {
return namesystem.checkPermission(src);
}
4. ClientNamenodeProtocolServerSideTranslatorPB类
该类是server端用来将ClientNamenodeProtocolTranslatorPB生成的PB格式的数据转化为本地调用的数据类型,所以增加改方法
@Override
public CheckPermissionResponseProto checkPermission(RpcController controller,
CheckPermissionRequestProto req)
throws ServiceException {
try {
boolean result = server.checkPermission(req.getSrc());
return CheckPermissionResponseProto.newBuilder().setCheckPerm(result).build(); //将结果返回
} catch (IOException e) {
throw new ServiceException(e);
}
}
这里的server就是NameNodeRpcServer,相当于调用NameNodeRpcServer的checkPermission方法,并在NameNodeRpcServer中调用FSNamesystem完成最后的逻辑
Namesystem类增加方法
boolean checkPermission(String src) throws IOException {
readLock();
try {
HdfsFileStatus fileStatus = getFileInfo(src,false); //这个方法我有做过修改,你们可能不一样
FsPermission fsPermission = new FsPermission((short)0755);
if(fileStatus != null fsPermission.equals(fileStatus.getPermission())) {
return true;
}
} finally {
readUnlock();
}
return false;
}
接下来我就举个例子怎么调用,这只是部分代码,详细的自己看看源码吧。
proxyInfo = NameNodeProxies.createProxy(conf, nameNodeUri,
ClientProtocol.class, nnFallbackToSimpleAuth);
this.namenode = proxyInfo.getProxy();
namenode.checkPermission(src);
5. 最后一步就是编译了
希望通过这个例子能够加深对hadoop实现的理解
node.js 怎么阅读模块的源代码
node_modules文件夹中放的是使用npm安装的模块,一般模块中都有一个index.js的文件,这个是模块的启动文件,如果没有,可以看一下模块中的package.json文件,里面的main字段保存的是启动文件名。
如何系统地学习Node.js?
对于刚接触Node.js的新手来说,第一步无非是打好基础,你需要弄明白以下事情:
JavaScript 的特性和语法。假如你对 JavaScript 还不熟悉的话,推荐书籍及链接:
JavaScript 推荐书籍列表
深入理解JavaScript系列
Node.js 是什么?Node.js与JavaScript的区别是什么?
Node.js的优点?Node.js的缺点?
Node.js适用场景?Node.js不适用的场景?
Node.js的基本语法。Node.js的特性:
单线程
异步 IO
事件驱动
npm 是什么?npm的基本使用
REPL
等等
其实上面的内容,大部分Node.js的书籍都有介绍。基本了解了Node.js后,我们可以写一些 hello world 的程序:
搭建一个 HTTP 服务器,返回 hello, world 。(使用 HTTP 模块)
读取一个 txt 文件,将内容显示到命令行中。(使用 fs 模块)
等等
第二步
你也许想,Node.js 只有那些少得可怜的核心模块能做什么呢?别担心,npm 上目前有近 7W 的第三方模块,月下载量高达 2.1亿 (2014—4—20 数据)… 这才是 Node.js 的活力所在。当你对Node.js已经了解的差不多了,并且按耐不住跃跃欲试了。这个时候,我们不妨用 Node.js 的第三方模块做些好玩的事情:
搭建一个微博网站
搭建一个博客网站
搭建一个在线聊天室
写一个简单的爬虫
调用一些网站的API做一些好玩的东西
等等
但是,并不是说 Node.js 只能做以上事情,几乎其他语言能做的事情 Node.js 都能做,而且有些情况下能做的更好。
第三步
当然,就像学 js 也不能只会用框架一样,学习 Node.js 也不能只会用外部模块。这个时候,我们需要回头深入了解下 Node.js 核心模块的用法。说白了,就是好好看 Node.js 官方 API 文档。看文档是码农必备技能,英语不好的童鞋浏览器装个划词翻译的插件。
第四步
多实践。不管是用核心模块还是外部模块,尝试用 Node.js 解决某个问题或者替换掉以前用其他语言写过的代码。
读源码。这里说的读源码并不是说上来就去读 Node 或者其他较大的框架的源码。这个时候,挑一些简单的只实现某个特定功能的工具模块的源码读,这种模块的代码通常在几百行,阅读起来并不是很困难,但是却能涨不少的姿势。比如:
underscore (学习 JavaScript 的语法和技巧)
等等
第五步
坚持第四步。在使用 Node.js 时发现没有合适的模块选择或者选择的模块功能不尽人意,这个时候你可以尝试去创建一个模块或者修改现有的模块,并且使用 npm 发布自己的模块或者去该模块的 GitHub 上提 PR 。
第六步
多实践。这个就不用解释了
读 Node 源码及较大的框架的源码。提高必备
多关注下 GitHub 上的牛人
重复第1-6步
hadoop单机模式和伪分布式模式的异同
1、运行模式不同:
单机模式是Hadoop的默认模式。这种模式在一台单机上运行,没有分布式文件系统,而是直接读写本地操作系统的文件系统。
伪分布模式这种模式也是在一台单机上运行,但用不同的Java进程模仿分布式运行中的各类结点。
2、配置不同:
单机模式(standalone)首次解压Hadoop的源码包时,Hadoop无法了解硬件安装环境,便保守地选择了最小配置。在这种默认模式下所有3个XML文件均为空。当配置文件为空时,Hadoop会完全运行在本地。
伪分布模式在“单节点集群”上运行Hadoop,其中所有的守护进程都运行在同一台机器上。
3、节点交互不同:
单机模式因为不需要与其他节点交互,单机模式就不使用HDFS,也不加载任何Hadoop的守护进程。该模式主要用于开发调试MapReduce程序的应用逻辑。
伪分布模式在单机模式之上增加了代码调试功能,允许你检查内存使用情况,HDFS输入输出,以及其他的守护进程交互。
扩展资料:
核心架构:
1、HDFS:
HDFS对外部客户机而言,HDFS就像一个传统的分级文件系统。可以创建、删除、移动或重命名文件,等等。存储在 HDFS 中的文件被分成块,然后将这些块复制到多个计算机中(DataNode)。这与传统的 RAID 架构大不相同。块的大小和复制的块数量在创建文件时由客户机决定。
2、NameNode
NameNode 是一个通常在 HDFS 实例中的单独机器上运行的软件。它负责管理文件系统名称空间和控制外部客户机的访问。NameNode 决定是否将文件映射到 DataNode 上的复制块上。
3、DataNode
DataNode 也是在 HDFS实例中的单独机器上运行的软件。Hadoop 集群包含一个 NameNode 和大量 DataNode。DataNode 通常以机架的形式组织,机架通过一个交换机将所有系统连接起来。Hadoop 的一个假设是:机架内部节点之间的传输速度快于机架间节点的传输速度。
参考资料来源:百度百科-Hadoop