Hadoop 2.X HDFS源码剖析

Hadoop 2.X HDFS源码剖析

暂无评价综合评分的显示会考虑用户真实性等多项因素,每部作品出现综合评分的时间不定。
8.836 评价豆瓣读书
免费试读

作品简介

《Hadoop 2.X HDFS源码剖析》以Hadoop 2.6.0源码为基础,深入剖析了HDFS 2.X中各个模块的实现细节,包括RPC框架实现、Namenode实现、Datanode实现以及HDFS客户端实现等。

《Hadoop 2.X HDFS源码剖析》一共有5章,其中第1章从总体上介绍了HDFS的组件、概念以及典型的流程,同时详细介绍了HDFS各个组件间RPC接口的定义。第2章介绍了Hadoop RPC框架的实现,Hadoop RPC是HDFS各个组件间通信所依赖的底层框架,可以理解为HDFS的神经系统。第3~5章分别介绍了Namenode、Datanode以及HDFS客户端这三个组件的实现细节,同时穿插介绍了HDFS 2.X的新特性,例如Namenode HA、Federation Namenode等。

阅读《Hadoop 2.X HDFS源码剖析》可以帮助读者从架构设计与源码实现角度了解HDFS 2.X,同时还能学习HDFS 2.X框架中优秀的设计思想、设计模式、Java语言技巧以及编程规范等。这些对于读者全面提高自己的技术水平有很大的帮助。

徐鹏:2005-2012年在北京邮电大学完成本科以及硕士的学习,目前就职于今日头条担任基础架构研发工程师。长期关注大数据处理、分布式系统的研究以及Hadoop相关技术的应用与开发。

作品目录

  1. 前言
  2. 如何阅读本书
  3. 本书代码
  4. 致谢
  5. 第1章 HDFS
  6. 1.1 HDFS概述
  7. 1.1.1 HDFS体系结构
  8. 1.1.2 HDFS基本概念
  9. 1.数据块(Block)
  10. 2.名字节点(Namenode)
  11. 3.数据节点(Datanode)
  12. 4.客户端
  13. 5.HDFS通信协议
  14. 1.2 HDFS通信协议
  15. 1.2.1 Hadoop RPC接口
  16. 1.ClientProtocol
  17. 2.ClientDatanodeProtocol
  18. 3.DatanodeProtocol
  19. 4.InterDatanodeProtocol
  20. 5.NamenodeProtocol
  21. 1.2.2 流式接口
  22. 1.DataTransferProtocol
  23. 2.Active Namenode和Standby Namenode间的HTTP接口
  24. 1.3 HDFS主要流程
  25. 1.3.1 HDFS客户端读流程
  26. 1.3.2 HDFS客户端写流程
  27. 1.3.3 HDFS客户端追加写流程
  28. 1.3.4 Datanode启动、心跳以及执行名字节点指令流程
  29. 1.3.5 HA切换流程
  30. 第2章 Hadoop RPC
  31. 2.1 概述
  32. 2.1.1 RPC框架概述
  33. 2.1.2 Hadoop RPC框架概述
  34. 1.通信模块
  35. 2.客户端Stub程序
  36. 3.服务器端Stub程序
  37. 2.2 Hadoop RPC的使用
  38. 2.2.1 Hadoop RPC使用概述
  39. 2.2.2 定义RPC协议
  40. 1.ClientProtocol协议
  41. 2.ClientNamenodeProtocolPB协议
  42. 3.ClientNamenodeProtocolTranslatorPB类
  43. 4.ClientNamenodeProtocolServerSideTranslatorPB类
  44. 2.2.3 客户端获取Proxy对象
  45. 1.非HA模式
  46. 2.HA模式
  47. 2.2.4 服务器获取Server对象
  48. 1.构造NameNodeRpcServer
  49. 2.获取BlockingService对象
  50. 3.构造Server对象
  51. 2.3 Hadoop RPC实现
  52. 2.3.1 RPC类实现
  53. 2.3.2 Client类实现
  54. 1.Client发送请求与接收响应流程
  55. 2.内部类——Call
  56. 3.内部类——Connection
  57. 2.3.3 Server类实现
  58. 1.Reactor模式
  59. 2.Server类设计
  60. 3.Server类实现
  61. 第3章 Namenode(名字节点)
  62. 3.1 文件系统目录树
  63. 3.1.1 INode相关类
  64. 1.INode抽象类
  65. 2.INodeWithAdditionalFields类
  66. 3.INodeDirectory类
  67. 4.INodeFile类
  68. 5.INodeReference
  69. 3.1.2 Feature相关类
  70. 1.SnapshotFeature实现
  71. 2.FileUnderConstructionFeature实现
  72. 3.1.3 FSEditLog类
  73. 1.transactionId机制
  74. 2.FSEditLog状态机
  75. 3.EditLogOutputStream
  76. 4.EditLogInputStream
  77. 5.FSEditLog.log()方法
  78. 3.1.4 FSImage类
  79. 1.保存命名空间
  80. 2.FSImage.loadFSImage()
  81. 3.加载fsimage文件
  82. 4.加载editlog文件
  83. 5.检查点机制
  84. 3.1.5 FSDirectory类
  85. 1.addChild()
  86. 2.addBlock()
  87. 3.setOwner()
  88. 3.2 数据块管理
  89. 3.2.1 Block、Replica、BlocksMap
  90. 1.Block类
  91. 2.BlockInfo类
  92. 3.BlockInfoUnderConstruction类
  93. 4.BlocksMap类
  94. 5.Replica类状态
  95. 6.Block类状态
  96. 3.2.2 数据块副本状态
  97. 1.BlockManager数据结构
  98. 2.数据块副本状态(done)
  99. 3.2.3 BlockManager类(done)
  100. 1.ReplicationMonitor
  101. 2.增、删、改、查数据块
  102. 3.块汇报
  103. 3.3 数据节点管理
  104. 3.3.1 DatanodeDescriptor
  105. 1.DatanodeId
  106. 2.DatanodeInfo
  107. 3.DatanodeDescriptor
  108. 3.3.2 DatanodeStorageInfo
  109. 3.3.3 DatanodeManager
  110. 1.DatanodeManager字段
  111. 2.添加和撤销Datanode
  112. 3.Datanode的启动
  113. 4.Datanode的心跳
  114. 3.4 租约管理
  115. 3.4.1 LeaseManager.Lease
  116. 3.4.2 LeaseManager
  117. 1.添加租约——addLease()
  118. 2.检查租约——FsNamesystem.checkLease()
  119. 3.租约更新——renewLease()
  120. 4.删除租约——removeLease()
  121. 5.租约检查——Monitor线程
  122. 6.租约恢复——Monitor线程发起
  123. 7.租约恢复——其他方式发起
  124. 3.5 缓存管理
  125. 3.5.1 缓存概念
  126. 3.5.2 缓存管理命令
  127. 3.5.3 HDFS集中式缓存架构
  128. 3.5.4 CacheManager类实现
  129. 3.5.5 CacheReplicationMonitor
  130. 3.6 ClientProtocol实现
  131. 3.6.1 创建文件
  132. 3.6.2 追加写文件
  133. 3.6.3 创建新的数据块
  134. 1.分析状态——analyzeFileState()
  135. 2.分配数据节点——chooseTarget4NewBlock()
  136. 3.提交上一个数据块——commitOrCompleteLastBlock()
  137. 4.添加一个新的数据块
  138. 3.6.4 放弃数据块
  139. 3.6.5 关闭文件
  140. 3.7 Namenode的启动和停止
  141. 3.7.1 安全模式
  142. 1.SafeModeInfo
  143. 2.开启复制和删除数据块功能
  144. 3.安全模式管理
  145. 3.7.2 HDFS High Availability
  146. 1.HA架构
  147. 2.HA配置
  148. 3.管理命令
  149. 4.源码实现
  150. 3.7.3 名字节点的启动
  151. 3.7.4 名字节点的停止
  152. 第4章 Datanode(数据节点)
  153. 4.1 Datanode逻辑结构
  154. 4.1.1 HDFS 1.X架构
  155. 4.1.2 HDFS Federation
  156. 4.1.3 Datanode逻辑结构
  157. 4.2 Datanode存储
  158. 4.2.1 Datanode升级机制
  159. 1.升级操作
  160. 2.回滚操作
  161. 3.升级提交操作
  162. 4.临时状态
  163. 4.2.2 Datanode磁盘存储结构
  164. 4.2.3 DataStorage实现
  165. 1.Storage类继承关系
  166. 2.StorageInfo
  167. 3.Storage.StorageState
  168. 4.Storage.StorageDirectory
  169. 5.Storage
  170. 6.DataStorage
  171. 7.BlockPoolSliceStorage
  172. 4.3 文件系统数据集
  173. 4.3.1 Datanode上数据块副本的状态
  174. 4.3.2 BlockPoolSlice实现
  175. 1.BlockPoolSlice的字段
  176. 2.BlockPoolSlice的方法
  177. 4.3.3 FsVolumeImpl实现
  178. 1.FsVolumeSpi接口定义
  179. 2.FsVolumeImpl的字段和方法
  180. 4.3.4 FsVolumeList实现
  181. 4.3.5 FsDatasetImpl实现
  182. 1.ReplicaMap
  183. 2.ReplicaInfo
  184. 3.FsDatasetSpi
  185. 4.FsDatasetImpl
  186. 4.4 BlockPoolManager
  187. 4.4.1 BPServiceActor实现
  188. 1.BPServiceActor的字段
  189. 2.构造方法与工作线程控制方法
  190. 3.工作线程run()方法
  191. 4.4.2 BPOfferService实现
  192. 1.BPOfferService的字段(done)
  193. 2.BPOfferService的方法
  194. 4.4.3 BlockPoolManager实现
  195. 1.BlockPoolManager的字段(done)
  196. 2.refreshNamenodes()方法(done)
  197. 4.5 流式接口
  198. 4.5.1 DataTransferProtocol定义
  199. 4.5.2 Sender和Receiver
  200. 1.DataTransferProtocol调用流程
  201. 2.Sender类
  202. 3.Receiver类
  203. 4.5.3 DataXceiverServer
  204. 1.DataXceiverServer的初始化
  205. 2.run()方法
  206. 4.5.4 DataXceiver
  207. 1.run()方法
  208. 2.DataTransferProtocol的实现
  209. 4.5.5 读数据
  210. 1.DataXceiver.readBlock()
  211. 2.数据块的传输格式
  212. 3.BlockSender实现
  213. 4.零拷贝数据传输
  214. 5.节流器
  215. 4.5.6 写数据(done)
  216. 1.DataXceiver.writeBlock()(done)
  217. 2.BlockReceiver(done)
  218. 3.BlockReceiver.PacketResponder
  219. 4.处理结果上报名字节点
  220. 4.5.7 数据块替换、数据块拷贝和读数据块校验
  221. 4.5.8 短路读操作
  222. 4.6 数据块扫描器
  223. 4.6.1 DataBlockScanner实现
  224. 4.6.2 BlockPoolSliceScanner实现
  225. 4.7 DirectoryScanner
  226. 4.8 DataNode类的实现
  227. 4.8.1 DataNode的启动
  228. 4.8.2 DataNode的关闭
  229. 第5章 HDFS客户端
  230. 5.1 DFSClient实现
  231. 5.1.1 构造方法
  232. 5.1.2 关闭方法
  233. 5.1.3 文件系统管理与配置方法
  234. 5.1.4 HDFS文件与目录操作方法
  235. 5.1.5 HDFS文件读写方法
  236. 5.2 文件读操作与输入流
  237. 5.2.1 打开文件
  238. 1.DistributedFileSystem.open()
  239. 2.HDFS客户端输入流
  240. 3.DFSClient.open()
  241. 5.2.2 读操作——DFSInputStream实现
  242. 1.InputStream.read()
  243. 2.BlockReader
  244. 3.HasEnhancedByteBufferAccess.read()
  245. 4.关闭输入流
  246. 5.3 文件短路读操作
  247. 1.FS-2246
  248. 2.HDFS-347
  249. 5.3.1 短路读共享内存
  250. 5.3.2 DataTransferProtocol
  251. 1.requestShortCircuitShm()
  252. 2.requestShortCircuitFds()
  253. 3.releaseShortCircuitFds()
  254. 5.3.3 DFSClient短路读操作流程
  255. 1.ShortCircuitShm类
  256. 2.DfsClientShm类
  257. 3.DfsClientShmManager类
  258. 4.ShortCircuitReplica类
  259. 5.ShortCircuitCache类
  260. 5.3.4 Datanode短路读操作流程
  261. 1.RegisteredShm类
  262. 2.ShortCircuitRegistry类
  263. 5.4 文件写操作与输出流
  264. 5.4.1 创建文件
  265. 1.DistributedFileSystem.create()
  266. 2.DFSClient.create()
  267. 5.4.2 写操作——DFSOutputStream实现
  268. 1.write()方法
  269. 2.DataStreamer线程
  270. 3.ResponseProcessor线程
  271. 5.4.3 追加写操作
  272. 5.4.4 租约相关
  273. 5.4.5 关闭输出流
  274. 5.5 HDFS常用工具
  275. 5.5.1 FsShell实现
  276. 5.5.2 DFSAdmin实现
  277. 参考文献
载入中

热门划线

  1. HDFS是一个主/从(Master/Slave)体系结构的分布式系统,如图1-1所示,HDFS集群拥有一个Namenode和一些Datanode,用户可以通过HDFS客户端同Namenode和Datanodes交互以访问文件系统。2 人
  2. 默认是128MB2 人
  3. 在HDFS中,所有文件都会被切分成若干个数据块分布在数据节点上存储。同时由于HDFS会将同一个数据块冗余备份保存到不同的数据节点上(一个数据块默认保存3份),所以数据块的一个副本丢失了并不会影响这个数据块的访问。2 人
  4. 在HDFS的读和写操作中,数据块都是最小单元。在读操作中,HDFS客户端会首先到名字节点查找HDFS文件包含的数据块的位置信息,然后根据数据块的位置信息从数据节点读取数据。而在写操作中,HDFS客户端也会首先从名字节点申请新的数据块,然后根据新申请数据块的位置信息建立数据流管道写数据。2 人
  5. 数据节点作为HDFS中的从节点,会不断地向名字节点发送心跳、数据块汇报以及缓存汇报,名字节点会通过心跳、数据块汇报以及缓存汇报的响应向数据节点发送指令,数据节点会执行这些指令,例如创建、删除或者复制数据等。2 人
  6. org.apache.hadoop.hdfs.protocol2 人
  7. •快照相关的操作。2 人
  8. 客户端会调用ClientProtocol.reportBadBlocks()方法向Namenode汇报错误的数据块。当客户端从数据节点读取数据块且发现数据块的校验和并不正确时,就会调用这个方法向Namenode汇报这个错误的数据块信息。2 人
  9. Datanode会使用这个接口与Namenode握手、注册、发送心跳、进行全量以及增量的数据块汇报。Namenode会在Datanode的心跳响应中携带名字节点指令,Datanode收到名字节点指令之后会执行对应的操作。要特别注意的是,Namenode向Datanode下发名字节点指令是没有任何其他接口的,只会通过DatanodeProtocol的返回值来下发命令。2 人
  10. Datanode启动时会首先调用versionRequest()方法与Namenode进行握手。这个方法的返回值是一个NamespaceInfo对象2 人

喜欢这本书的人也喜欢