导航:首页 > 源码编译 > hadooprpc源码分析

hadooprpc源码分析

发布时间:2022-07-31 05:54:53

A. hadoop生态系统哪个组建源码容易读懂

从Hadoop 0.20版本开始,原来Hadoop项目的Core部分更名为Hadoop Common。
Common为Hadoop的其他项目提供了一些常用工具,主要包括系统配置工具Configuration、远程过程调用RPC、序列化机制和Hadoop抽象文件系统FileSystem等。
它们为在通用硬件上搭建云计算环境提供基本的服务,并为运行在该平台上的软件开发提供了所需的API。

B. 如何利用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. 类
这个类是将对ClientProtocol中方法的调用转化为RPC调用Namenode的服务,并将调用参数转化为PB的类型。 所以,我们需要在ClientProtocol增加checkPermission方法,并在这个类中进行Override
在ClientProtocol中增加
@Idempotent
public boolean checkPermission(String src)
throws AccessControlException, FileNotFoundException,
UnresolvedPathException, IOException;

在类中
@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. 类
该类是server端用来将生成的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实现的理解

C. hadoop yarn源码怎么进行修改

第一个阶段:学习hadoop基本使用和基本原理,从应用角度对hadoop进行了解和学习
这是第一个阶段,你开始尝试使用hadoop,从应用层面,对hadoop有一定了解,比如你可以使用hadoop shell对hdfs进行操作,使用hdfs API编写一些程序上传,下载文件;使用MapRece API编写一个数据处理程序。一旦你对hadoop的基本使用方法比较熟悉了,接下来可以尝试了解它的内部原理,注意,不需要通过阅读源代码了解内部原理,只需看一些博客,书籍,比如《Hadoop权威指南》,对于HDFS而言,你应该知道它的基本架构以及各个模块的功能;对于MapRece而言,你应该知道其具体的工作流程,知道partition,shuffle,sort等工作原理,可以自己在纸上完整个画完maprece的流程,越详细越好。
在这个阶段,建议你多看一些知名博客,多读读《hadoop权威指南》(可选择性看相关的几章)。如果你有实际项目驱动,那是再好不过了,理论联系实际是最好的hadoop学习方法;如果你没有项目驱动,那建议你不要自己一个人闷头学,多跟别人交流,多主动给别人讲讲,最好的学习方式还是“讲给别人听”。
============
第二个阶段:从无到入门,开始阅读hadoop源代码
这个阶段是最困苦和漫长的,尤其对于那些没有任何分布式经验的人。 很多人这个阶段没有走完,就放弃了,最后停留在hadoop应用层面。
这个阶段,第一件要做的事情是,选择一个hadoop组件。如果你对分布式存储感兴趣,那么你可以选择HDFS,如果你读分布式计算感兴趣,你可以选择MapRece,如果你对资源管理系统感兴趣,你可以选择YARN。
选择好系统后,接下来的经历是最困苦的。当你把hadoop源代码导入eclipse或intellij idea,沏上一杯茶,开始准备优哉游哉地看hadoop源代码时,你懵逼了:你展开那数不尽的package和class,觉得无从下手,好不容易找到了入口点,然后你屁颠屁颠地通过eclipse的查找引用功能,顺着类的调用关系一层层找下去,最后迷失在了代码的海洋中,如同你在不尽的压栈,最后栈溢出了,你忘记在最初的位置。很多人经历过上面的过程,最后没有顺利逃出来,而放弃。
如果你正在经历这个过程,我的经验如下:首先,你要摸清hadoop的代码模块,知道client,master,slave各自对应的模块(hadoop中核心系统都是master/slave架构,非常类似),并在阅读源代码过程中,时刻谨记你当前阅读的代码属于哪一个模块,会在哪个组件中执行;之后你需要摸清各个组件的交互协议,也就是分布式中的RPC,这是hadoop自己实现的,你需要对hadoop RPC的使用方式有所了解,然后看各模块间的RPC protocol,到此,你把握了系统的骨架,这是接下来阅读源代码的基础;接着,你要选择一个模块开始阅读,我一般会选择Client,这个模块相对简单些,会给自己增加信心,为了在阅读代码过程中,不至于迷失自己,建议在纸上画出类的调用关系,边看边画,我记得我阅读hadoop源代码时,花了一叠纸。注意,看源代码过程中,很容易烦躁不安,建议经常起来走走,不要把自己逼得太紧。
在这个阶段,建议大家多看一些源代码分析博客和书籍,比如《Hadoop技术内幕》系列丛书(轩相关网站:Hadoop技术内幕)就是最好的参考资料。借助这些博客和书籍,你可以在前人的帮助下,更快地学习hadoop源代码,节省大量时间,注意,目前博客和书籍很多,建议大家广泛收集资料,找出最适合自己的参考资料。
这个阶段最终达到的目的,是对hadoop源代码整体架构和局部的很多细节,有了一定的了解。比如你知道MapRece Scheler是怎样实现的,MapRece shuffle过程中,map端做了哪些事情,rece端做了哪些事情,是如何实现的,等等。这个阶段完成后,当你遇到问题或者困惑点时,可以迅速地在Hadoop源代码中定位相关的类和具体的函数,通过阅读源代码解决问题,这时候,hadoop源代码变成了你解决问题的参考书。
============
第三个阶段:根据需求,修改源代码。
这个阶段,是验证你阅读源代码成效的时候。你根据leader给你的需求,修改相关代码完成功能模块的开发。在修改源代码过程中,你发现之前阅读源代码仍过于粗糙,这时候你再进一步深入阅读相关代码,弥补第二个阶段中薄弱的部分。当然,很多人不需要经历第三个阶段,仅仅第二阶段就够了:一来能够通过阅读代码解决自己长久以来的技术困惑,满足自己的好奇心,二来从根源上解决解决自己遇到的各种问题。 这个阶段,没有太多的参考书籍或者博客,多跟周围的同事交流,通过代码review和测试,证明自己的正确性。
============
阅读hadoop源代码的目的不一定非是工作的需要,你可以把他看成一种修养,通过阅读hadoop源代码,加深自己对分布式系统的理解,培养自己踏实做事的心态。

D. CDH版的hadoop有没有源码提供

首先,不得不说,hadoop发展到现在这个阶段,代码已经变得非常庞大臃肿,如果你直接阅读最新版本的源代码,难度比较大,需要足够的耐心和时间,所以,如果你觉得认真一次,认真阅读一次hadoop源代码,一定要有足够的心理准备和时间预期。 其次,需要注意,阅读Hadoop源代码的效率,因人而异,如果你有足够的分布式系统知识储备,看过类似的系统,则能够很快地读它的源代码进行通读,并快速切入你最关注的局部细节,比如你之前看过某个分布式数据库的源代码,对分布式系统的网络通信模块,调度模块等有一定了解,这对阅读hadoop源代码有极大帮助;如果你是一个初学者,对hadoop一无所知,只了解一些java语法,那阅读hadoop源代码是极具挑战的一件事情,尤其是从无到开始入门的过程,是极度煎熬和困惑的,这时候需要你在阅读代码过程中,不断补充缺乏的相关知识(比如RPC,NIO,设计模式等),循序渐进,直到入门。 接下来进入主题,说一下阅读源代码的个人经验。由于我也是从无到入门,再到修改源代码,逐步过渡的,所以,对于很多人而言,具有借鉴意义。 ============ 第一个阶段:学习hadoop基本使用和基本原理,从应用角度对hadoop进行了解和学习 这是第一个阶段,你开始尝试使用hadoop,从应用层面,对hadoop有一定了解,比如你可以使用hadoop shell对hdfs进行操作,使用hdfs API编写一些程序上传,下载文件;使用MapRece API编写一个数据处理程序。一旦你对hadoop的基本使用方法比较熟悉了,接下来可以尝试了解它的内部原理,注意,不需要通过阅读源代码了解内部原理,只需看一些博客,书籍,比如《Hadoop权威指南》,对于HDFS而言,你应该知道它的基本架构以及各个模块的功能;对于MapRece而言,你应该知道其具体的工作流程,知道partition,shuffle,sort等工作原理,可以自己在纸上完整个画完maprece的流程,越详细越好。 在这个阶段,建议你多看一些知名博客,多读读《hadoop权威指南》(可选择性看相关的几章)。如果你有实际项目驱动,那是再好不过了,理论联系实际是最好的hadoop学习方法;如果你没有项目驱动,那建议你不要自己一个人闷头学,多跟别人交流,多主动给别人讲讲,最好的学习方式还是“讲给别人听”。 ============ 第二个阶段:从无到入门,开始阅读hadoop源代码 这个阶段是最困苦和漫长的,尤其对于那些没有任何分布式经验的人。 很多人这个阶段没有走完,就放弃了,最后停留在hadoop应用层面。 这个阶段,第一件要做的事情是,选择一个hadoop组件。如果你对分布式存储感兴趣,那么你可以选择HDFS,如果你读分布式计算感兴趣,你可以选择MapRece,如果你对资源管理系统感兴趣,你可以选择YARN。 选择好系统后,接下来的经历是最困苦的。当你把hadoop源代码导入eclipse或intellij idea,沏上一杯茶,开始准备优哉游哉地看hadoop源代码时,你懵逼了:你展开那数不尽的package和class,觉得无从下手,好不容易找到了入口点,然后你屁颠屁颠地通过eclipse的查找引用功能,顺着类的调用关系一层层找下去,最后迷失在了代码的海洋中,如同你在不尽的压栈,最后栈溢出了,你忘记在最初的位置。很多人经历过上面的过程,最后没有顺利逃出来,而放弃。 如果你正在经历这个过程,我的经验如下:首先,你要摸清hadoop的代码模块,知道client,master,slave各自对应的模块(hadoop中核心系统都是master/slave架构,非常类似),并在阅读源代码过程中,时刻谨记你当前阅读的代码属于哪一个模块,会在哪个组件中执行;之后你需要摸清各个组件的交互协议,也就是分布式中的RPC,这是hadoop自己实现的,你需要对hadoop RPC的使用方式有所了解,然后看各模块间的RPC protocol,到此,你把握了系统的骨架,这是接下来阅读源代码的基础;接着,你要选择一个模块开始阅读,我一般会选择Client,这个模块相对简单些,会给自己增加信心,为了在阅读代码过程中,不至于迷失自己,建议在纸上画出类的调用关系,边看边画,我记得我阅读hadoop源代码时,花了一叠纸。注意,看源代码过程中,很容易烦躁不安,建议经常起来走走,不要把自己逼得太紧。 在这个阶段,建议大家多看一些源代码分析博客和书籍,比如《Hadoop技术内幕》系列丛书(轩相关网站:Hadoop技术内幕)就是最好的参考资料。借助这些博客和书籍,你可以在前人的帮助下,更快地学习hadoop源代码,节省大量时间,注意,目前博客和书籍很多,建议大家广泛收集资料,找出最适合自己的参考资料。 这个阶段最终达到的目的,是对hadoop源代码整体架构和局部的很多细节,有了一定的了解。比如你知道MapRece Scheler是怎样实现的,MapRece shuffle过程中,map端做了哪些事情,rece端做了哪些事情,是如何实现的,等等。这个阶段完成后,当你遇到问题或者困惑点时,可以迅速地在Hadoop源代码中定位相关的类和具体的函数,通过阅读源代码解决问题,这时候,hadoop源代码变成了你解决问题的参考书

E. 求Hadoop技术内幕-董西成书籍电子版百度云资源

《Hadoop技术内幕:深入解析MapRece架构设计与实现原理》网络网盘txt 最新全集下载:

链接: https://pan..com/s/1q6JdsLpoTjaYW2goyjkc2Q

提取码:NQCM

《Hadoop技术内幕:深入解析MapRece架构设计与实现原理》内容简介:“Hadoop技术内幕”共两册,分别从源代码的角度对“Common+HDFS”和“MapRece的架构设计和实现原理”进行了极为详细的分析。《Hadoop技术内幕:深入解析MapRece架构设计与实现原理》由Hadoop领域资深的实践者亲自执笔,首先介绍了MapRece的设计理念和编程模型,然后从源代码的角度深入分析了RPC框架、客户端、JobTracker、TaskTracker和Task等MapRece运行时环境的架构设计与实现原理,最后从实际应用的角度深入讲解了Hadoop的性能优化、安全机制、多用户作业调度器和下一代MapRece框架等高级主题和内容。《Hadoop技术内幕:深入解析MapRece架构设计与实现原理》适合Hadoop的二次开...

F. 学习hadoop必须有java基础吗

作者:markxiao
链接:https://www.hu.com/question/34185054/answer/149007333
来源:知乎
着作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

hadoop一般在工业环境大部分是运行在linux环境下,hadoop是用java实现的。所以最好是熟悉linux环境下编程。至于java做到看得懂比较好,遇到问题可以看看源码。
如果不会java,开源的可以用streaming写maprece程序,只用跟stdin和stdout打交道就行了。网络之前开发出了bistreaming,hce组件,用这些组件写c/c++就好了,不清楚有没有开源。
如果你要定制化一些东西,比如inputformat/outputformat之类的,或者你想调用hdfs/yarn的java接口,懂java就很必要了。
至于hadoop学习路径,主要基于我个人的学习路线来说得,可能不一定适合你,仅供参考,我对yarn和hdfs的细节了解不深,可能更多侧重maprece。
(1)实践:了解基本的maprece原理后,可以仿照demo写一些maprece程序,然后查看任务监控页面,了解监控页面一些指标,这个是你分析任务很好的帮手。可以处理一些大的数据量,写完了之后分析监控页面的指标,思考这个任务还有没有优化空间?任务哪部分耗时比较多比较多?如果失败了,你能不能根据日志定位到错误的地方?在此阶段可能会遇到各种各样的问题,比如streaming怎么处理二进制数据,很多小文件导致性能低下。
(2)理论:经过一段时间的实践,对mapce的思想应该比较熟悉了。这个时候可以看看maprece的运行过程,maprece的提交过程是怎么样?map输出阶段有哪些过程?shuffle过程是怎么样?在大数据量情况下怎么保证rece阶段,相同的key的记录在一起的?
(3)读源码阶段:如果你对maprece的使用和调优很熟练了,对源码也有兴趣,就可以看看源码了。上层的有maprece,streaming;基础点的可以看看hdfs,yarn的实现;底层的可以看看hadoop的rpc源码实现。
最后,我只是根据我的经历大致可以划分这三个阶段,三者完全可以穿插进行。

G. 业界主流的RPC框架有哪些Dubbo与Hadoop RPC的区别

Dubbo和Hadoop基本上就是两个领域的产品,没有太大的可比性。唯一能够比较的是Dubbo和Hadoop内部使用的RPC组件:Avro。Avro多用于Hadoop内部,并没有以独立的RPC框架进行推广和运作,因此你很少看到直接使用他的地方。
类似的还有ZooKeeper的内置框架:jute。而Dubbo则是一个完整的RPC解决方案,包括纯粹的远程过程调用,以及简单的服务治理。是阿里巴巴在2012年开源的框架。

H. 如何设计一个rpc框架,从io模型 传输协议 序列化方式综合考虑

在此之前,我们需要准备:
hadoop的源码
protobuf 2.5版本
JDK
hadoop 2.x版本中采用了Protocol Buffer (简称protobuf)作为序列化和反序列化的工具,所以我们在修改源码时需要按照相应规则编写message来实现数据的传输。

阅读全文

与hadooprpc源码分析相关的资料

热点内容
钉邮登录服务器地址 浏览:644
起源编译器适配第二款应用 浏览:433
cad弄断线条命令 浏览:463
怎么恢复手机app的安装包 浏览:300
idea重启项目不编译 浏览:495
程序员那么可爱演员表陆漓妈妈 浏览:127
linuxgadget驱动 浏览:592
华三调用acl的命令 浏览:7
资金流pdf 浏览:929
金融结算法补充条款 浏览:289
什么叫服务器怎么连接 浏览:519
空调压缩机有制冷但室内不是很冷 浏览:837
如何查解压成功 浏览:648
代码编译服务器硬件配置2021 浏览:413
php如何选中相同的进行修改 浏览:623
工行app个人怎么给企业账户转账 浏览:150
汇编与程序员 浏览:666
压缩包解码器下载 浏览:130
爱旅行的预备程序员 浏览:111
安卓qq浏览器怎么转换到ios 浏览:294