最近突然觉得, 很多掌握的都还是很浅的原理,需要更深入细粒度去了解整个分布式系统的运转机制。于是。。开始作死而又作死而又作死的源码之旅。
Hadoop包的功能总共有下列几类:
tool:提供一些命令行工具,如DistCp,archive
mapreduce,:Hadoop的Map/Reduce实现
filecache:提供HDFS文件的本地缓存,用于加快Map/Reduce的数据访问速度
fs:文件系统的抽象,可以理解为支持多种文件系统实现的统一文件访问接口
hdfs:HDFS,Hadoop的分布式文件系统实现
ipc:一个简单的IPC的实现,依赖于IO提供的编解码功能
io:表示层,将各种数据编码/解码,方便在网络上的传输
net:封装部分网络功能,如DNS,socket
security:用户和用户组信息
conf:系统的配置参数
metrics:系统攻击数据的收集,用于网管范畴
util:工具类
record:根据DDL自动生成他们的编码函数,目前可以提供C++和java
http:基于Jetty的HTTP Servlet,用户通过浏览器可以观察文件系统的一些状态信息和日志
log:提供HTTP访问日志的HTTP Servlet
一、RPC
它是一种通过网络从远程计算机程序上请求服务,而不需要了解底层网络技术的协议。RPC协议假定某些传输协议的存在,如TCP或UDP,为通信程序之间携带信息数据。
RPC采用客户机/服务器模式,请求程序就是一个客户机,而服务提供程序就是一个服务器。例如HDFS的通信就包括:
1、Client-NameNode之间,其中NameNode是服务器。
2、Client-DataNode之间,其中DataNode是服务器。
3、DataNode-NameNode之间,其中NameNode是服务器。
4、DataNode-DataNode之间,其中某一个DataNode是服务器,另一个是客户端。
org.apache.hadoop.rpc中包含Client类和Server类。Server类是一个抽象类,类RPC封装了Server,利用反射,把某个对象的方法开放出来,变成RPC中的服务器。
二、DataNode与NameNode
一个HDFS集群可能包含上千DataNode节点,这些DataNode定时与NameNode通信,为了减轻NameNode的负担,NameNode上并不永久保存DataNode上那些数据块信息,而是通过DataNode启动时上报,来更新NameNode上的映射表。
相关包:org.apache.hadoop.hdfs.server.common、org.apache.hadoop.hdfs.server.datanode...
所有和数据块相关的操作,都在FSDataset相关的类中进行处理,一个DataNode上可以指定多个Storage来存储数据块,由于HDFS规定了一个目录能存放Block的数目,所以一个storage上存在多个目录。对应的,FSDataset中用FSVolume来对应一个Storage,FSDir对应一个目录,所有的FSVolume由FSVolumeSet管理,FSDataset中通过一个FSVolumeSet对象,就可以管理它的所有存储空间。
相关包:org.apache.hadoop.hdfs.server.dataNode.fsDataSet
NameNode作为系统文件目录的管理者,DataNode关注的是数据块,NameNode保存的主要信息是文件名-数据块,数据块-DataNode列表。 DataNode实现了InterDatanodeProtocol和ClientDatanodeProtocol,剩下的,由NameNode实现。
相关包:org.apache.hadoop.hdfs.server.protocol、org.apache.hadoop.hdfs.protocol、org.apache.hadoop.hdfs.server.namenode (重点FSNamesystem.java)
三、MapReduce
相关包:org.apache.hadoop.mapreduce.JobContext、org.apache.hadoop.mapreduce、org.apache.hadoop.mapreduce.lib.*(包含inputFomat等..)
这些还是很小的一部分,但是一点一点深入好了~