b2c信息网

您现在的位置是:首页 > 明日新闻 > 正文

明日新闻

namenode源码阅读(namenode概念)

hacker2022-10-07 17:20:21明日新闻74
本文目录一览:1、如何利用hadoopRPC框架实现和NameNode的交互2、

本文目录一览:

如何利用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

发表评论

评论列表

  • 边侣冢渊(2022-10-08 04:09:37)回复取消回复

    地选择了最小配置。在这种默认模式下所有3个XML文件均为空。当配置文件为空时,Hadoop会完全运行在本地。伪分布模式在“单节点集群”上运行Hadoop,其中所有的守护进程都运行在同一台机器上。3、节点交互不同:单机模式因为不需要与其他

  • 孤鱼悸初(2022-10-07 21:27:22)回复取消回复

    类负责处理所有到达NN的RPC call,他负责将请求转化为NN的方法的调用,因此也可以看出它们的实现分层是很清晰的。 @Override // ClientProtocol public boolean checkPermissi