HDFS的体系结构
-------------------------
1.namenode[守护进程]作用:
管理文件系统名称空间;【fsimage元数据镜像文件】
管理客户端对文件的访问。【edits操作文件】
NameNode执行文件系统命名空间操作,如打开,关闭和重命名文件和目录【edits操作文件】
确定block到DataNode的映射(注意:心跳机制:status和blockreport;默认3秒一次)
2.datanode[守护进程]:
用于管理连接到它们所运行的节点的存储。【block信息:block和block.mate】
负责提供来自文件系统客户端的读取和写入请求
还执行块创建,删除;
3.block:文件被分成一个或多个块,这些块存储在一组DataNode中(默认3份)
元数据
-------------------------
1.查看fsimage文件
$>hdfs oiv -i fsimage_0000000000000000022 -o ~/fs22.xml -p XML
【
<?xml version="1.0"?>
<fsimage>
<NameSection>
<genstampV1>1000</genstampV1>
<genstampV2>1002</genstampV2>
<genstampV1Limit>0</genstampV1Limit>
<!-- 描述当前镜像的最后一个块ID -->
<lastAllocatedBlockId>1073741826</lastAllocatedBlockId>
<!-- 事务ID-对应的是fsimage_0000000000000000022 -->
<txid>22</txid>
</NameSection>
<INodeSection>
<lastInodeId>16390</lastInodeId>
<!-- inode节点描述HDFS文件系统所有信息
我们保留文件/块层次结构的内存中表示。这是一个基本的INode类,它包含文件和文件的公共字段目录inode。
-->
<inode>
<id>16385</id>
<type>DIRECTORY</type>
<name></name>
<mtime>1528043810446</mtime>
<permission>hyxy:supergroup:rwxr-xr-x</permission>
<nsquota>9223372036854775807</nsquota>
<dsquota>-1</dsquota>
</inode>
<inode>
<id>16386</id>
<type>DIRECTORY</type>
<name>user</name>
<mtime>1528043865470</mtime>
<permission>hyxy:supergroup:rwxr-xr-x</permission>
<nsquota>-1</nsquota>
<dsquota>-1</dsquota>
</inode>
<inode>
<id>16387</id>
<type>DIRECTORY</type>
<name>hyxy</name>
<mtime>1528044944833</mtime>
<permission>hyxy:supergroup:rwxr-xr-x</permission>
<nsquota>-1</nsquota>
<dsquota>-1</dsquota>
</inode>
<inode>
<id>16388</id>
<type>DIRECTORY</type>
<name>20180603</name>
<mtime>1528044017284</mtime>
<permission>hyxy:supergroup:rwxr-xr-x</permission>
<nsquota>-1</nsquota>
<dsquota>-1</dsquota>
</inode>
<inode>
<id>16390</id>
<type>FILE</type>
<name>text.txt</name>
<replication>3</replication>
<mtime>1528044017272</mtime>
<atime>1528044016919</atime>
<perferredBlockSize>134217728</perferredBlockSize>
<permission>hyxy:supergroup:rw-r--r--</permission>
<blocks>
<block>
<id>1073741826</id>
<genstamp>1002</genstamp>
<numBytes>12</numBytes>
</block>
</blocks>
</inode>
</INodeSection>
<INodeReferenceSection></INodeReferenceSection>
<SnapshotSection>
<snapshotCounter>0</snapshotCounter>
</SnapshotSection>
<INodeDirectorySection>
<directory>
<parent>16385</parent>
<inode>16386</inode>
</directory>
<directory>
<parent>16386</parent>
<inode>16387</inode>
</directory>
<directory>
<parent>16387</parent>
<inode>16388</inode>
</directory>
<directory>
<parent>16388</parent>
<inode>16390</inode>
</directory>
</INodeDirectorySection>
<FileUnderConstructionSection></FileUnderConstructionSection>
<SnapshotDiffSection>
<diff>
<inodeid>16385</inodeid>
</diff>
</SnapshotDiffSection>
<SecretManagerSection>
<currentId>0</currentId>
<tokenSequenceNumber>0</tokenSequenceNumber>
</SecretManagerSection>
<CacheManagerSection>
<nextDirectiveId>1</nextDirectiveId>
</CacheManagerSection>
</fsimage>
】
hdfs:分布式文件系统【分布式{切块和复本}---文件系统{逻辑上的}】
镜像文件当中包含哪些信息,参照上述XML
2.查看edits文件
$>hdfs oev -i edits_inprogress_0000000000000000040 -o ~/ed.xml
【
<?xml version="1.0" encoding="UTF-8"?>
<EDITS>
<EDITS_VERSION>-63</EDITS_VERSION>
<RECORD>
<OPCODE>OP_START_LOG_SEGMENT</OPCODE>
<DATA>
<TXID>40</TXID>
</DATA>
</RECORD>
<RECORD>
<OPCODE>OP_MKDIR</OPCODE>
<DATA>
<TXID>41</TXID>
<LENGTH>0</LENGTH>
<INODEID>16392</INODEID>
<PATH>/hyxy</PATH>
<TIMESTAMP>1528055285399</TIMESTAMP>
<PERMISSION_STATUS>
<USERNAME>hyxy</USERNAME>
<GROUPNAME>supergroup</GROUPNAME>
<MODE>493</MODE>
</PERMISSION_STATUS>
</DATA>
</RECORD>
</EDITS>
】
分析namenode开启过程
----------------------------
1.默认目录下{hadoop.tmp.dir/dfs/name/current},fsimage文件存储为两个,加载fsimage_txid最后一个。(txid=39)
2.加载edits_txid操作文件至内存中。元数据已全部加载至内存上。(txid=40-41)
3.保存checkpoint(检查点):合并fsimage和edits文件,重新生成新的镜像文件
4.等待接受来自datanode的block report
分析namenode运行过程(内存)
-----------------------------
1.记录对hdfs的编辑操作,追加edits_inprogress_txid
2.更新内存中的元数据;达到一定阈值后,运行checkpoint(检查点)
3.接受来自datanode的心跳信息
checkpoint(检查点机制)相关属性
----------------------------------------
1.checkpoint周期,默认为1小时。
<property>
<name>dfs.namenode.checkpoint.period</name>
<value>3600</value>
<description>
两个定期检查点之间的秒数。
</description>
</property>
2.txid的次数达到1百万次,也执行checkpoint;与周期无关
<property>
<name>dfs.namenode.checkpoint.txns</name>
<value>1000000</value>
<description>
无论'dfs.namenode.checkpoint.period'是否已经过期,Secondary NameNode或CheckpointNode都会为每个'dfs.namenode.checkpoint.txns'事务创建名称空间的检查点。
</description>
</property>
3.每隔60秒检查txid操作次数
<property>
<name>dfs.namenode.checkpoint.check.period</name>
<value>60</value>
<description>
SecondaryNameNode和CheckpointNode会每隔60秒查询NameNode以查询未检查点的事务数量。
</description>
</property>
注意:达到1小时或操作txid大于1百万次或edits文件大于64m???,均可触发checkpoint操作