Hadoop技术内幕
2013-4
机械工业出版社
蔡斌,陈湘萍
无
【前言】 为什么写本书互联网使得信息的采集、传播速度和规模达到空前的水平,实现了全球的信息共享与交互,它已经成为信息社会必不可少的基础设施,同时也带来了多方面的新挑战。2003年,Google发表了《Google File System》,介绍了Google海量数据处理使用的文件系统,使互联网时代的数据存储发生了革命性的变化。而Doug Cutting等人在Nutch项目上应用GFS和MapReduce思想,并演化为Hadoop项目,经过多年的发展,最终形成了包含多个相关项目的软件生态系统,开创了海量数据处理的新局面。Hadoop正是为了解决互联网时代的海量数据存储和处理而设计、开发的。简单地讲,Hadoop是一个可以更容易开发和并行处理大规模数据的分布式计算平台,它的主要特点是:扩展能力强、成本低、高效率、可靠。目前,Hadoop的用户已经从传统的互联网公司,扩展到科学计算、电信行业、电力行业、生物行业以及金融公司,并得到越来越广泛的应用。Hadoop作为一个优秀的开源项目,提供了一些文档和所有的源代码,但是,对于很多开发人员,仅仅通过一些简单的例子或教程学习使用Hadoop的基本功能是远远不够的。同时,随着云计算和大数据的发展,产业界正在经历一次重大变革,特别是基于云计算的海量数据处理,改变着我们思考的方式和习惯,开发者们越来越有必要去了解Hadoop的架构与设计原理。本书从源代码的层面上对Hadoop的公共工具Common和Hadoop的分布式文件系统HDFS进行了介绍,帮助广大开发者从架构与设计原理的角度去理解Hadoop,从而为更好地使用和扩展Hadoop打下坚实的基础。同时,Hadoop是一个使用Java语言实现的优秀系统,从事Java和分布式计算相关技术的开发者们能从它的源码实现中看到许多优秀的设计思想、对各种设计模式的灵活运用、语言的使用技巧以及编程规范等。这些都有助于加深开发者们对Java相关技术,尤其是Hadoop的理解,从而提高自己的开发水平,拓展自己的技术视野,为工作带来帮助。读者对象Hadoop开发人员对这部分读者来说,本书的内容能够帮助他们加深对Hadoop的理解,通过全面了解Hadoop,特别是HDFS的实现原理,为进一步优化、定制和扩展Hadoop提供坚实基础。学习分布式技术的读者Hadoop是一个得到广泛应用的大型分布式系统,开放的源代码中包含了大量分布式系统设计原理和实现,读者可以通过本书,充分学习、体验和实践分布式技术。学习Java语言的中高级读者Hadoop使用Java语言实现,它充分利用了Java的语言特性,并使用了大量的标准库和开源工具,很多功能的设计和实现非常优秀,是极佳的学习Java技术的参考资料。本书的主要内容本书主要分为三个部分。第一部分(第1章)对如何建立Hadoop的开发、分析环境做了简单的介绍。对于Hadoop这样复杂、庞大的项目,一个好的开发环境可以让读者事半功倍地学习、研究源代码。第二部分(第2~5章)主要对Hadoop公共工具Common的实现进行研究。分别介绍了Hadoop的配置系统、面向海量数据处理的序列化和压缩机制、Hadoop使用的远程过程调用,以及满足Hadoop上各类应用访问数据的Hadoop抽象文件系统和部分具体文件系统。第三部分(第6~9章)对Hadoop分布式文件系统进行了详细的分析。这部分内容采用总-分-总的结构,第6章介绍了HDFS各个实体和实体间接口,第7章和第8章分别详细地研究了数据节点和名字节点的实现原理,第9章通过对客户端的解析,回顾HDFS各节点间的配合,完整地介绍了一个大规模数据存储系统的实现。通过本书,读者不仅能全面了解Hadoop的优秀架构和设计思想,而且还能从Hadoop,特别是HDFS的实现源码中一窥Java开发的精髓和分布式系统的精要。勘误和支持由于作者的水平有限,编写时间跨度较长,同时开源软件的演化较快,书中难免会出现一些错误或者不准确的地方,恳请读者批评指正。如果大家有和本书相关的内容需要探讨,或有更多的宝贵意见,欢迎通过caibinbupt@qq.com和我们联系,希望能结识更多的朋友,大家共同进步。书中的源代码文件可以从华章网站下载。致谢感谢机械工业出版社华章公司的编辑杨福川和白宇,杨老师的耐心和支持让本书最终得以出版,白老师的很多建议使本书的可读性更强。感谢腾讯数据平台部的张文郁、赵重庆和徐钊,作为本书的第一批读者和Hadoop专家,他们的反馈意见让本书增色不少。感谢和我们一起工作、研究和应用Hadoop的腾讯数据平台部,以及IBM中国研究中心和中山大学的领导和同事们,本书的很多内容是对实际项目的总结。最后,作者向支持本书写作的家人深表谢意,感谢他们的耐心和理解。
《Hadoop技术内幕:深入解析Hadoop Common和HDFS架构设计与实现原理》内容简介:“Hadoop技术内幕”共两册,分别从源代码的角度对“Common+HDFS”和MapReduce的架构设计与实现原理进行了极为详细的分析。《Hadoop技术内幕:深入解析Hadoop Common和HDFS架构设计与实现原理》由腾讯数据平台的资深Hadoop专家、X-RIME的作者亲自执笔,对Common和HDFS的源代码进行了分析,旨在为Hadoop的优化、定制和扩展提供原理性的指导。除此之外,《Hadoop技术内幕:深入解析Hadoop Common和HDFS架构设计与实现原理》还从源代码实现中对分布式技术的精髓、分布式系统设计的优秀思想和方法,以及Java语言的编码技巧、编程规范和对设计模式的精妙运用进行了总结和分析,对提高读者的分布式技术能力和Java编程能力都非常有帮助。《Hadoop技术内幕:深入解析Hadoop Common和HDFS架构设计与实现原理》适合Hadoop的二次开发人员、应用开发工程师、运维工程师阅读。
全书共9章,分为三部分:第一部分(第1章)主要介绍了Hadoop源代码的获取和源代码阅读环境的搭建;第二部分(第2~5章)对Hadoop公共工具Common的架构设计和实现原理进行了深入分析,包含Hadoop的配置信息处理、面向海量数据处理的序列化和压缩机制、Hadoop的远程过程调用,以及满足Hadoop上各类应用访问数据的Hadoop抽象文件系统和部分具体文件系统等内容;第三部分(第6~9章)对Hadoop的分布式文件系统HDFS的架构设计和实现原理进行了详细的分析,这部分内容采用了总分总的结构,第6章对HDFS的各个实体和实体间接口进行了分析;第7章和第8章分别详细地研究了数据节点和名字节点的实现原理,并通过第9章对客户端的解析,回顾了HDFS各节点间的配合,完整地介绍了一个大规模数据存储系统的实现。
海报:
蔡斌,资深Hadoop技术专家,基于Hadoop的开源项目X-RIME的作者之一。国内Hadoop应用和源代码研究领域的先驱之一,有10余年开发经验,先后任职于朗讯科技、IBM中国研究院等国内外知名企业,目前担任腾讯数据平台部的高级工程师,从事Hadoop相关技术的研究、应用和实施,实战经验非常丰富。对分布式计算、电信增值业务、网络管理等领域有深刻的认识和理解,拥有近10项发明专利,其中两项为美国专利,大部分与海量数据处理相关。近期关注海量数据的流式处理、Hadoop上的大数据应用与挖掘等。陈湘萍,北京大学计算机系博士,目前就职于中山大学,专注于Hadoop、云计算、软件中间件、模型驱动的软件工程等技术的研究和实践。拥有发明专利5项,参与1项国家电子行业标准的制定,发表学术论文10余篇。
前言 第一部分环境准备 第1章源代码环境准备/2 1.1什么是Hadoop/2 1.1.1Hadoop简史/2 1.1.2Hadoop的优势/3 1.1.3Hadoop生态系统/4 1.2准备源代码阅读环境/8 1.2.1安装与配置JDK/8 1.2.2安装Eclipse/9 1.2.3安装辅助工具Ant/12 1.2.4安装类UNIXShell环境Cygwin/13 1.3准备Hadoop源代码/15 1.3.1下载Hadoop/15 1.3.2创建Eclipse项目/16 1.3.3Hadoop源代码组织/18 1.4小结/19 第二部分Common的实现 第2章Hadoop配置信息处理/22 2.1配置文件简介/22 2.1.1Windows操作系统的配置文件/22 2.1.2Java配置文件/23 2.2HadoopConfiguration详解/24 2.2.1Hadoop配置文件的格式/24 2.2.2Configuration的成员变量/26 2.2.3资源加载/27 2.2.4使用get*和set*访问/设置配置项/32 2.3Configurable接口/34 2.4小结/35 第3章序列化与压缩/36 3.1序列化/36 3.1.1Java内建序列化机制/36 3.1.2Hadoop序列化机制/38 3.1.3Hadoop序列化机制的特征/39 3.1.4HadoopWritable机制/39 3.1.5典型的Writable类详解/41 3.1.6Hadoop序列化框架/48 3.2压缩/49 3.2.1Hadoop压缩简介/50 3.2.2Hadoop压缩API应用实例/51 3.2.3Hadoop压缩框架/52 3.2.4Java本地方法/61 3.2.5支持Snappy压缩/65 3.3小结/69 第4章Hadoop远程过程调用/70 4.1远程过程调用基础知识/70 4.1.1RPC原理/70 4.1.2RPC机制的实现/72 4.1.3Java远程方法调用/73 4.2Java动态代理/78 4.2.1创建代理接口/78 4.2.2调用转发/80 4.2.3动态代理实例/81 4.3JavaNIO/84 4.3.1Java基本套接字/84 4.3.2JavaNIO基础/86 4.3.3JavaNIO实例:回显服务器/93 4.4Hadoop中的远程过程调用/96 4.4.1利用HadoopIPC构建简单的分布式系统/96 4.4.2HadoopIPC的代码结构/100 4.5HadoopIPC连接相关过程/104 4.5.1IPC连接成员变量/104 4.5.2建立IPC连接/106 4.5.3数据分帧和读写/111 4.5.4维护IPC连接/114 4.5.5关闭IPC连接/116 4.6HadoopIPC方法调用相关过程/118 4.6.1Java接口与接口体/119 4.6.2IPC方法调用成员变量/121 4.6.3客户端方法调用过程/123 4.6.4服务器端方法调用过程/126 4.7HadoopIPC上的其他辅助过程/135 4.7.1RPC.getProxy()和RPC.stopProxy()/136 4.7.2RPC.getServer()和Server的启停/138 4.8小结/141 第5章Hadoop文件系统/142 5.1文件系统/142 5.1.1文件系统的用户界面/142 5.1.2文件系统的实现/145 5.1.3文件系统的保护控制/147 5.2Linux文件系统/150 5.2.1Linux本地文件系统/150 5.2.2虚拟文件系统/153 5.2.3Linux文件保护机制/154 5.2.4Linux文件系统API/155 5.3分布式文件系统/159 5.3.1分布式文件系统的特性/159 5.3.2基本NFS体系结构/160 5.3.3NFS支持的文件操作/160 5.4Java文件系统/162 5.4.1Java文件系统API/162 5.4.2URI和URL/164 5.4.3Java输入/输出流/166 5.4.4随机存取文件/169 5.5Hadoop抽象文件系统/170 5.5.1Hadoop文件系统API/170 5.5.2Hadoop输入/输出流/175 5.5.3Hadoop文件系统中的权限/179 5.5.4抽象文件系统中的静态方法/180 5.5.5Hadoop文件系统中的协议处理器/184 5.6Hadoop具体文件系统/188 5.6.1FileSystem层次结构/189 5.6.2RawLocalFileSystem的实现/191 5.6.3ChecksumFileSystem的实现/196 5.6.4RawInMemoryFileSystem的实现/210 5.7小结/213 第三部分Hadoop分布式文件系统 第6章HDFS概述/216 6.1初识HDFS/216 6.1.1HDFS主要特性/216 6.1.2HDFS体系结构/217 6.1.3HDFS源代码结构/221 6.2基于远程过程调用的接口/223 6.2.1与客户端相关的接口/224 6.2.2HDFS各服务器间的接口/236 6.3非远程过程调用接口/244 6.3.1数据节点上的非IPC接口/245 6.3.2名字节点和第二名字节点上的非IPC接口/252 6.4HDFS主要流程/254 6.4.1客户端到名字节点的文件与目录操作/254 6.4.2客户端读文件/256 6.4.3客户端写文件/257 6.4.4数据节点的启动和心跳/258 6.4.5第二名字节点合并元数据/259 6.5小结/261 第7章数据节点实现/263 7.1数据块存储/263 7.1.1数据节点的磁盘目录文件结构/263 7.1.2数据节点存储的实现/266 7.1.3数据节点升级/269 7.1.4文件系统数据集的工作机制/276 7.2流式接口的实现/285 7.2.1DataXceiverServer和DataXceiver/286 7.2.2读数据/289 7.2.3写数据/298 7.2.4数据块替换、数据块拷贝和读数据块检验信息/313 7.3作为整体的数据节点/314 7.3.1数据节点和名字节点的交互/314 7.3.2数据块扫描器/319 7.3.3数据节点的启停/321 7.4小结/326 第8章名字节点实现/327 8.1文件系统的目录树/327 8.1.1从i—node到INode/327 8.1.2命名空间镜像和编辑日志/333 8.1.3第二名字节点/351 8.1.4FSDirectory的实现/361 8.2数据块和数据节点管理/365 8.2.1数据结构/366 8.2.2数据节点管理/378 8.2.3数据块管理/392 8.3远程接口ClientProtocol的实现/412 8.3.1文件和目录相关事务/412 8.3.2读数据使用的方法/415 8.3.3写数据使用的方法/419 8.3.4工具dfsadmin依赖的方法/443 8.4名字节点的启动和停止/444 8.4.1安全模式/444 8.4.2名字节点的启动/449 8.4.3名字节点的停止/454 8.5小结/454 第9章HDFS客户端/455 9.1认识DFSClient/455 9.1.1DFSClient的构造和关闭/455 9.1.2文件和目录、系统管理相关事务/457 9.1.3删除HDFS文件/目录的流程/459 9.2输入流/461 9.2.1读数据前的准备:打开文件/463 9.2.2读数据/465 9.2.3关闭输入流/475 9.2.4读取HDFS文件数据的流程/475 9.3输出流/478 9.3.1写数据前的准备:创建文件/481 9.3.2写数据:数据流管道的建立/482 9.3.3写数据:数据包的发送/486 9.3.4写数据:数据流管道出错处理/493 9.3.5写数据:租约更新/496 9.3.6写数据:DFSOutputStream.sync()的作用/497 9.3.7关闭输出流/499 9.3.8向HDFS文件写入数据的流程/500 9.4DistributedFileSystem的实现/506 9.5HDFS常用工具/508 9.5.1FsShell/508 9.5.2DFSAdmin/510 9.6小结/511
版权页: 插图: 1.Connection IPC连接(Connection)是IPC客户端和服务器关系的一个抽象,一个IPC客户端在调用服务器上的方法前,需要和服务器建立一个连接。由于客户端对连接的抽象与服务器端对连接的抽象不太一样,连接必须区分为客户端连接类Client.Connection和服务器连接类Server.Connection,它们各自提供了客户端和服务器管理连接需要的相关信息和方法。Hadoop的远程过程调用使用TCP协议进行通信,IPC连接建立在TCP连接之上。 (1)COnnectionld 为了提高通信效率,客户端会复用到服务器的连接,并通过连接标识ConnectionId区分不同的连接。Connectionld类图如图4.14所示。 □address是远端服务器的地址,类型是InetSocketAddress,也就包括了主机名和服务器的监听地址。 □ticket的类型是UserGroupInformation。UserGrouplnformation在org.apache.hadoop.security包中定义,由类名即可知道,它包含了用户和用户所在用户组的一些信息。 □protocol属性的类型是Class,它保存的是IPC接口对应的类对象(注意:Class类的实例表示正在运行的Java应用程序中的类和接口)。 在上述三个成员变量都相等的情况下,ConnectionId相等。连接复用指具有相同ConnectionId的多个IPC客户端共享同一个IPC连接。如果Connectionld中的成员变量有不同(如用或不用ticket),创建到同一IPC服务器上同一IPC接口的两个客户端,则这两个客户端会分别使用不同的IPC连接。连接复用一方面可以减少Hadoop IPC服务器/客户端上资源的占用,同时节省了复用连接客户端建立IPC连接的时间。 (2)ConnectionHeader 与IPC连接相关的另一个类是连接消息头ConnectionHeader,它在ConnectionHeader,java中定义。ConnectionHeader是客户湍与服务器间TCP连接建立后交换的第一条消息,携带的内容包括Connectionld中的用户信息和IPC接口信息(ConnectionHeader当然不需要携带服务器地址),这两个域用于检查服务器是否实现了IPC接口,并确认客户端有权利使用这个接口。
《Hadoop技术内幕:深入解析Hadoop Common和HDFS架构设计与实现原理》编辑推荐:(1)腾讯资深Hadoop技术专家撰写,EasyHadoop和51CTO等专业技术社区联袂推荐!(2)从源代码角度深入分析Common和HDFS的架构设计与实现原理,为Hadoop的优化、定制和扩展提供原理性指导。(3)从源代码中参透分布式技术精髓和分布式系统设计的优秀思想和方法。
无
错误太多,直接从博客上拷贝的,只是加了点源代码。
什么年头的书呀,里面的配置环境竟然是xp的,我去了》》》!
这个系列中,董西城老师的关于mapreduce和yarn框架的两本我已经买了,还是挺好的,这本也想买的,可是看了一些在线试读,就不想买了,前面那几段,不是从其他书上抄过来的么?
当然亚马逊本身的送货和订货都挺好的,以后看到计数内幕啊,深入啊,都是骗子!这个就是这里抄一段,那里抄一段,处处都是浅尝辄止。
第二章看完感觉一般般吧,想找些配置的详细信息,比如我想扩展Configuration的方法(我想直接set一个类,类里面含有信息),但是没有这方面的东西,其他章节还没有看,希望物有所值吧
挺不错的干货,虽然看不太懂
对于hdfs的源码理解有一定的帮助,不过这本书是基于1.0hadoop版本的
内容有些概括,不详细。
书很一般,有大量的章节没有什么意义,只能当参考书,遇到不懂的时候,可以翻开看看,或许有些意想之外的收获,但是直接看的话,可能会很无聊,出书的老师。。。可能没把写书放在心上
总的来说还可以。。毕竟市面上可供选择的也比较少
对于学习hadoop很有效,质量也很好
好书,实用,确实管用
这本书讲得很透彻,和一些博客的内容深度差不多
查礼竟然推荐这本书,真被商业化了?这本书工具书都算不上,更别说。。。还竟然敢叫内幕?“This man must be crazy"
全面了解了hadoop的内幕,真心觉得中大的教授挺好的