Skip to content

Hdfs introduction

Hadoop Distributed File System(i.e. HDFS), is a distributed file system. It has the below components: - NameNode:stores metadata(e.g. filename, folder archi, file properties, etc.), and the block list, block distribution in datanode of each file

  • DataNode:stores data blocks of each file, it manages also the checksum of the data blocks

  • Secondary NameNode:It backs up the metadata of the NameNode periodically.

  • Client:

Namenode(master node)

管理 HDFS 的名称空间; 配置副本策略; 管理数据块(Block)映射信息; 处理客户端读写请求。

DataNode(Slave/worker node)

存储实际的数据块;

执行数据块的读/写操作。

Secondary NameNode

It's not a fail-over NameNode. When NameNode is down, it can't replace NameNode directly and resume service. It can help namenode to rebuild and resume service

It can also share the workload of the NameNode(merge Fsimage and Edits periodically and push them to the NameNode)

hdfs client

It runs on the user's machine. It's main job:

  1. 文件切分。文件上传 HDFS 的时候,Client 将文件切分成一个一个的 Block,然后进行上传;

  2. 与 NameNode 交互,获取文件的位置信息;

  3. 与 DataNode 交互,读取或者写入数据;

  4. Client 提供一些命令来管理 HDFS,比如 NameNode 格式化命令;

  5. Client 可以通过一些命令来访问 HDFS,比如对 HIDFS 增删查改操作;

Pros and cons

Pros

  • 高容错率: 数据自动保存多个副本。它通过增加副本的形式提高容错性。 某一个副本丢失以后,它可以自动恢复。

  • 数据规模:能够处理数据规模达到 GB、TB、甚至 PB 级别的数据;

  • 文件规模:能够处理百万规模以上的文件数量,数量相当之大。

  • 可构建在廉价机器上,通过多副本机制,提高可靠性。

Cons

  • 不适合低延时数据访问,比如毫秒级的存储数据,是做不到的。

  • 无法高效的对大量小文件进行存储: 存储大量小文件的话,它会占用 NameNode 大量的内存来存储文件目录和块信息。这样是不可取的,因为 NameNode 的内存总是有限的; 小文件存储的寻址时间会超过读取时间,它违反了 HDFS 的设计目标。

  • 不支持并发写入、文件随机修改: 一个文件只能有一个写,不允许多个线程同时写. 仅支持数据 append(追加),不支持文件的随机修改。

网络拓扑节点距离计算

在 HDFS 写数据的过程中,NameNode 会选择距离待上传数据最近距离的 DataNode 接收数据。节点距离:两个节点到达最近的共同祖先的距离总和。

机架感知(副本存储节点选择)

机架感知官方说明:https://hadoop.apache.org/docs/stable/hadoop-project-dist/hadoop-hdfs/HdfsDesign.html#Data_Replication

第一个副本在 Client 所处的节点上。如果客户端在集群外,随机选一个。

第二个副本在另一个机架的随机一个节点

第三个副本在第二个副本所在机架的随机节点

NN 和 2NN 的工作机制

Fsimage 和 Edits 解析

NameNode 被格式化之后,将在 ${HAOOP_HOME}/data/dfs/name/current目录中产生如下文件

fsimage_oooooooooooooooooo0
fsimage_ooo00000ooooo000000. md5
seen_txid
VERSION
  1. Fsimage 文件: HDFS 文件系统元数据的一个永久性的检查点,其中包含 HDFS 文件系统的所有目录和文件 inode 的序列化信息。

  2. Edits 文件:存放 HDFS 文件系统的所有更新操作的路径,文件系统客户端执行的所有写操作首先会被记录到 Edits 文件中。

  3. seen_txid文件保存的是一个数字,就是最后一个edits_的数字

  4. 每次 NameNode 启动的时候都会 将 Fsimage 文件读入内存,加载 Edits 里面的更新操作,保证内存中的元数据信息是最新的、同步的,可以看成 NameNode 启动的时候就将 Fsimage 和 Edits 文件进行了合并。

Commands to view the fsimage and edits

# 基本语法
## 查看镜像文件
hdfs oiv -p 文件类型 -i 镜像文件 -o 转换后文件输出路径

cd /opt/bigdata/hadoop-3.2.3/data/dfs/name/current/
hdfs oiv -p XML -i fsimage_0000000000000000256 -o /opt/fsimage.xml

## 查看编辑日志
hdfs oev -p 文件类型 -i 编辑日志 -o 转换后文件输出路径

cd /opt/bigdata/hadoop-3.2.3/data/dfs/name/current/
hdfs oev -p XML -i edits_0000000000000000001-0000000000000000154 -o /opt/edits.xml

datanode and namenode working

https://xie.infoq.cn/article/e57aeb4f16ce643a4dfb91ebe

<!--DN向NN汇报当前解读信息的时间间隔,默认6小时-->
<property>
  <name>dfs.blockreport.intervalMsec</name>
  <value>21600000</value>
  <description>Determines block reporting interval in milliseconds.</description>
</property>
<!--DN扫描自己节点块信息列表的时间,默认6小时-->
<property>
  <name>dfs.datanode.directoryscan.interval</name>
  <value>21600</value>
  <description>Interval in seconds for Datanode to scan data directories and
  reconcile the difference between blocks in memory and on the disk.
  Support multiple time unit suffix(case insensitive), as described
  in dfs.heartbeat.interval.If no time unit is specified then seconds
  is assumed.
  </description>
</property>

<!---->
<property>
  <name>dfs.namenode.heartbeat.recheck-interval</name>
  <value>300000</value>
  <description>
    This time decides the interval to check for expired datanodes.
    With this value and dfs.heartbeat.interval, the interval of
    deciding the datanode is stale or not is also calculated.
    The unit of this configuration is millisecond.
  </description>
</property>
<!---->
<property>
  <name>dfs.heartbeat.interval</name>
  <value>3</value>
  <description>
    Determines datanode heartbeat interval in seconds.
    Can use the following suffix (case insensitive):
    ms(millis), s(sec), m(min), h(hour), d(day)
    to specify the time (such as 2s, 2m, 1h, etc.).
    Or provide complete number in seconds (such as 30 for 30 seconds).
    If no time unit is specified then seconds is assumed.
  </description>
</property>