如何高效的阅读Hadoop源代码?Hadoop的源代码写的怎么样?

个人谈谈阅读hadoop源代码的经验。

首先,不得不说,hadoop发展到现在这个阶段,代码已经变得非常庞大臃肿,如果你直接阅读最新版本的源代码,难度比较大,需要足够的耐心和时间,所以,如果你觉得认真一次,认真阅读一次hadoop源代码,一定要有足够的心理准备和时间预期。

其次,需要注意,阅读Hadoop源代码的效率,因人而异,如果你有足够的分布式系统知识储备,看过类似的系统,则能够很快地读它的源代码进行通读,并快速切入你最关注的局部细节,比如你之前看过某个分布式数据库的源代码,对分布式系统的网络通信模块,调度模块等有一定了解,这对阅读hadoop源代码有极大帮助;如果你是一个初学者,对hadoop一无所知,只了解一些java语法,那阅读hadoop源代码是极具挑战的一件事情,尤其是从无到开始入门的过程,是极度煎熬和困惑的,这时候需要你在阅读代码过程中,不断补充缺乏的相关知识(比如RPC,NIO,设计模式等),循序渐进,直到入门。

接下来进入主题,说一下阅读源代码的个人经验。由于我也是从无到入门,再到修改源代码,逐步过渡的,所以,对于很多人而言,具有借鉴意义。

============
第一个阶段:学习hadoop基本使用和基本原理,从应用角度对hadoop进行了解和学习

这是第一个阶段,你开始尝试使用hadoop,从应用层面,对hadoop有一定了解,比如你可以使用hadoop shell对hdfs进行操作,使用hdfs API编写一些程序上传,下载文件;使用MapReduce API编写一个数据处理程序。一旦你对hadoop的基本使用方法比较熟悉了,接下来可以尝试了解它的内部原理,注意,不需要通过阅读源代码了解内部原理,只需看一些博客,书籍,比如《Hadoop权威指南》,对于HDFS而言,你应该知道它的基本架构以及各个模块的功能;对于MapReduce而言,你应该知道其具体的工作流程,知道partition,shuffle,sort等工作原理,可以自己在纸上完整个画完mapreduce的流程,越详细越好。

在这个阶段,建议你多看一些知名博客,多读读《hadoop权威指南》(可选择性看相关的几章)。如果你有实际项目驱动,那是再好不过了,理论联系实际是最好的hadoop学习方法;如果你没有项目驱动,那建议你不要自己一个人闷头学,多跟别人交流,多主动给别人讲讲,最好的学习方式还是“讲给别人听”。

============
第二个阶段:从无到入门,开始阅读hadoop源代码

这个阶段是最困苦和漫长的,尤其对于那些没有任何分布式经验的人。 很多人这个阶段没有走完,就放弃了,最后停留在hadoop应用层面。
这个阶段,第一件要做的事情是,选择一个hadoop组件。如果你对分布式存储感兴趣,那么你可以选择HDFS,如果你读分布式计算感兴趣,你可以选择MapReduce,如果你对资源管理系统感兴趣,你可以选择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源代码整体架构和局部的很多细节,有了一定的了解。比如你知道MapReduce Scheduler是怎样实现的,MapReduce shuffle过程中,map端做了哪些事情,reduce端做了哪些事情,是如何实现的,等等。这个阶段完成后,当你遇到问题或者困惑点时,可以迅速地在Hadoop源代码中定位相关的类和具体的函数,通过阅读源代码解决问题,这时候,hadoop源代码变成了你解决问题的参考书。

============
第三个阶段:根据需求,修改源代码。

这个阶段,是验证你阅读源代码成效的时候。你根据leader给你的需求,修改相关代码完成功能模块的开发。在修改源代码过程中,你发现之前阅读源代码仍过于粗糙,这时候你再进一步深入阅读相关代码,弥补第二个阶段中薄弱的部分。当然,很多人不需要经历第三个阶段,仅仅第二阶段就够了:一来能够通过阅读代码解决自己长久以来的技术困惑,满足自己的好奇心,二来从根源上解决解决自己遇到的各种问题。 这个阶段,没有太多的参考书籍或者博客,多跟周围的同事交流,通过代码review和测试,证明自己的正确性。

============
阅读hadoop源代码的目的不一定非是工作的需要,你可以把他看成一种修养,通过阅读hadoop源代码,加深自己对分布式系统的理解,培养自己踏实做事的心态。

===========

选自我的知乎:http://www.zhihu.com/question/29690410/answer/45588479

原创文章,转载请注明: 转载自董的博客

本文链接地址: http://dongxicheng.org/mapreduce-nextgen/how-to-read-hadoop-code-effectively/




——————————————————————————————————————————————————



Hadoop的源代码写的怎么样?


作为认真阅读过hadoop源代码的人,我个人觉得有必要跟大家分享一下这方面的体会。

首先,必须要说,对于互联网工程师而言,不管hadoop源代码质量怎么样,是好还是差,我们都不得不看,别无选择,因为hadoop已逐渐成为大数据代名词,成为互联网公司的基础设施和软件,和传统的操作系统一样基础而又重要。另外,有人会问,对于只是使用hadoop的人,有没有必要学习hadoop源代码?这个取决于你个人的兴趣,追求和工作内容。一般而言,hadoop职位分别内核开发工程师(修改hadoop源代码,打patch,加feature等),hadoop运维工程师(遇到hadoop服务问题,比如namenode挂了,主备切换失败,可以采取相应的措施快速解决),hadoop应用开发工程师(在hadoop基础上写一些app,比如写HQL生成报表,写一些数据挖掘算法等),对于前两个岗位,如果你是一个有追求的工程师的话,需要好好看源代码,尤其是运维工程师,不能仅仅依赖于搜索引擎和各种杂七杂八的文档,因为hadoop的很多东西,比如参数配置(hadoop中有几百个配置参数),跟hadoop版本相关,而hadoop版本迭代和发布频繁,很多文档和论坛里的帖子已经失效而无法及时更新,因此,一味的依赖这种二手资料,只会让你浪费更多时间。 这时候,最好的方式是查看源代码,找到相关的类,看一下怎么实现的,问题可以马上解决。你可以把hadoop源代码看成一本巨大的参考手册,遇到问题,就翻到能够给你带来答案的“页”中。

====================== hadoop源代码 ======================

理解了相关背景后,接下来聊聊hadoop源代码质量。

Hadoop源代码质量绝对是开源软件中的佼佼者,从代码规范,到代码组织,再到代码实现技巧。这一点,可以与各种杂七杂八的公司自己开发的软件作对比(提一点,即使是非常有名的公司,挂在自己名下的开源软件代码质量也不高,比如facebook的presto,比如linkedin的azkaban等,提高代码质量和发动更多人关注这些软件,最好的方式是加入apache基金会,成为它的顶级项目),很容易得知。hadoop专门的基金会组织管理和运营,有一整套完善的项目管理流程。可以这么说,如果你把hadoop源代码学到精通,那么学习其他开源软件,尤其是分布式系统,绝对是小case,另外,对你自己从头写一个分布式系统也有巨大帮助。

hadoop源代码中包含着很多有价值的,可以借鉴和学习的宝贵经验,比如:

(1)如果自己实现一个高效的RPC框架(hadoop自己实现了一个RPC框架,这个框架由HDFS,MAPREDUCE,YARN和HBASE公用)
(2)如何对单点的服务实现leader election(包括HDFS,YARN,HBase等都存在单点故障问题,均采用zookeeper实现了准备切换)
(3)如何实现一个分布式存储系统和分布式计算引擎
(4)如何设计一个极简且抽象度高的编程API(记得MapReduce刚刚发布时,很多公司对外公布说,自己公司内部早就有了类似于mapreduce的框架,一直在用。但mapreduce成熟之后,所有公司都弃掉了自己的框架,转而采用hadoop mapreduce,主要原因是他们的框架抽象度不高,使用起来比较麻烦。虽然现在大家使用mapreduce觉得这玩意非常简单,但是这是高度抽象后去繁留简的结果,如果你自己做一个分布式计算框架,能设计出这么精简的编程模型和编程API吗)

====================== hadoop现状 ======================

需要注意的是,hadoop从第一个原型开始,到现在已经有10年左右的时间。目前hadoop代码庞大,学习起来越来越困难,这个跟linux内核发展史差不多。由于hadoop源代码是很多人贡献的,里面多多少少存在代码冗余,且个别功能点的实现比较令人费解。此外,一些hadoop公司的的出现,比如cloudera,hortonworks(已经上市),使得hadoop更新频率越来越快,这些公司的绝大部分工程师每天的任务就是为hadoop贡献代码,全部贡献给社区,这推进了hadoop快速发展,但同时使得hadoop学习成本越来越大,很多中小型公司无法找到合适的技术人员,不得不反过来向这些hadoop公司求助,给他们交比较昂贵的咨询费用。

现在每一行hadoop源代码的提交均要经过很多人的review,从代码规范到实现方式上,都会有很多人在jira(Hadoop YARN – ASF JIRA)上提出各种意见,估计要改上好几遍才可能被merge到主干上,整个流程很低效,但是这样可使hadoop源代码保持很高的水准。

尽管hadoop源代码非常庞大,但仍存在一些非常高效的阅读方式和技巧,但这个话题不是关于如何高效阅读hadoop源代码的,所有就不在这里回答了。

原创文章,转载请注明: 转载自董的博客

本文链接地址: http://dongxicheng.org/mapreduce-nextgen/quality-of-hadoop-code/


  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值