著作権:この記事はすべての私のブログや庭園共通に属し、複製、元のソース(明記してください https://www.cnblogs.com/mikevictor07/p/12047502.htmlを )、以下は参考のために、個人的な理解です。
書かれたテキスト参考書「Hadoop2.x HDFSのソース解析。」
A、HDFSアーキテクチャ
1、データブロックのブロック
最小記憶部、デフォルトの128メガバイト、大きなファイルストレージに適したアドレス指定およびオーバーヘッドメモリを減少させます。
2、名前ノード
ディレクトリを含むファイルシステムの名前空間、インデックスファイルのデータ・ブロックは、インデックスがより多くのメモリを占有し、より大きな、メモリ内のファイルを格納しています。
同時に、画像ファイルストレージの名前空間(FsImage)と編集は、ログファイル(EditLog)、ログファイルに書き込まれたファイルを変更します。
HAバージョン2.X機能が導入され、典型的には一次EditLogジャーナル複数のノード間の同期によって維持。AMBはZKfailoverControllerスイッチング動作を(手動で切り替えることができる)を添加しました。
3、データノード
データストレージノード、実行ブロックを作成、削除、コピーなどの操作。
4、セカンダリ名前ノード
合併EditLog名前ノードFsImageと時間がかかり、特に大規模なクラスタであるため。そのため、名前ノードからタイミング獲得を担当する二次名前ノード(HTTP)EditLogを追加し、新しいFsImageの名前ノードが返されます合併手続きを完了するために、FsImage、時間のかかる作業にマージ。
二、HDFSの主要なプロセス
2.1クライアントを読みます
1は、コールDistributedFileSystem.openは、ファイルを開く(低レベルDFSClient.openを呼び出す)とHdfsDataInputStreamを作成します。
データノードのデータブロックが配置されているDFSClient.getBlockLocationsを呼び出す2によって取得されたノードリストは、データ・ブロックが読み込まれたときに、接続を確立するために、データブロックを取得する照合選択データノードに応じて、再度名前ノードへの次のデータブロックをフェッチします。サイクルが続きます。
2.2クライアント書かれた手順
1、通过调用DistributedFileSystem.create在底层调用DFSClient.create发送通知namenode创建文件。
2、获取输出流后就可以调用DFSOutputStream写数据,空文件时就会调用Clientprotocol.addBlock向Namenode申请一个数据块并返回LocatedBlock,此对象包含该数据块的所有节点信息,后续即可往其中一节点write数据。
2.3 HA切换流程
Hadoop 2.X之前版本NN存在单点故障,HA功能提供一个active NN与一个standby NN,命名空间实时同步。Active NN修改命名空间时同时通知多数的Quorum Journal Nodes(JNS),standby NN监听JNS中的editlog变化,并与自身的命名空间合并,当发生切换时,需要等待standby合并JNS上的所有editlog后才会进行切换。
ZKFailoverController会实时监控NN的状态,如果active NN处于不可用状态则进行自动主备切换,不需要人工干预,当然管理员也可用DFSHAAdmin命令进行手工切换。
三、NameNode
3.1 文件目录树
HDFS命名空间在内存中以树结构存储,目录与文件抽象为INode节点,目录为INodeDirectory,文件为INodeFile。目录有List<INode> children存储子目录或文件(内部使用二分法做检索),HDFS命名空间存储在本地系统FsImage文件中,启动时加载,与此同时NN会定期合并fsimage与editlog,editlog操作类为FSEditLog。
INodeFile主要成员变量:
private long header = 0L; # 文件头信息
private BlockInfoContiguous[] blocks; # 数据块与数据节点关系
3.2 数据块管理
1、NameNode启动时从fsimage加载文件与数据块之前的关系,数据块存储在哪些节点上具体是由datanode启动时向NN上报数据块信息时才能构建。
2、BlockMap在NN中存储数据块与节点的关系,该关系则由DN上报时更新。
3.3 数据节点管理
1、添加和撤销DN:HDFS提供的dfs.hosts可配置include和exclude,如果节点下线则配置exclude并执行dfsadmin -refreshNodes后NN开始进行撤销,下线的节点数据会复制到其他节点上,此时DN则处于正在被撤销状态,复制完毕后DN状态则变成已撤销。
2、DN启动需要向NN握手、注册于上报数据块,并定期发送心跳包。
3.4 NN的启动与停止
1、NN启动由NameNode类的main方法执行,并调用createNameNode方法进行初始化。调用FSNamesystem.loadFromDisk进行fsimage与editlog。
2、NN的停止则是通过启动时注册JVM的ShutdownHook,当JVM退出时调用,并输出一些退出日志。
四、数据节点DN
HDFS 2.X DN使用Federation架构,可配置多个命名空间,每个命名空间在DN中对应一个池。DN的启动由DataNode类的main方法执行,关闭也是注册了JVM的钩子。
1、DataBlockScanner扫描数据块并检查校检和是否匹配。
2、DirectoryScanner定时扫描内存元数据与磁盘是否有差异,如有则更新内存。
3、IPCServer为RPC服务端,接收Client、NN、DN的RPC请求。
4、DataXceiverServer用于流式数据传输。
4.1 DN磁盘存储与读写
1、DFSStorage管理数据块,管理磁盘存储目录(dfs.data.dir),dfs.data.dir可定义多个存储目录,不同目录磁盘克异构。
2、DataTransferProtocol定义了基于TCP流的数据访问接口,包含Sender和Receiver,流程如下图:
五、HDFS常用工具
1、FsShell : bin/hadoop fs <args>
2、DFSAdmin: bin/hdfs dfsadmin <args>