HDFS—核心设计

原文作者:jiangw-Tony

原文地址:HDFS基础使用

1、HDFS心跳机制(heartbeat)

  1. Hadoop 是 Master/Slave 结构,Master 中有 NameNode 和 ResourceManager,Slave 中有Datanode 和 NodeManager。
  2. Master 启动的时候会启动一个 IPC(Inter-Process Comunication,进程间通信)server 服务,等待 slave 的链接。
  3. Slave 启动时,会主动链接 master 的 ipc server 服务,并且每隔 3 秒链接一次 master,这个间隔时间是可以调整的,参数为 dfs.heartbeat.interval,这个每隔一段时间去连接一次的机制,我们形象的称为心跳。Slave 通过心跳汇报自己的信息给 master,master 也通过心跳给 slave 下达命令。
  4. NameNode 通过心跳得知 Datanode 的状态,ResourceManager 通过心跳得知 NodeManager 的状态。
  5. 如果 master 长时间都没有收到 slave 的心跳,就认为该 slave 挂掉了。

Namenode 感知到 Datanode 掉线死亡的时长计算:

HDFS 默认的超时时间为 10 分钟+30 秒。这里暂且定义超时时间为 timeout,计算公式为:timeout = 2 * heartbeat.recheck.interval + 10 * dfs.heartbeat.interval

而默认的 heartbeat.recheck.interval 大小为 5 分钟,dfs.heartbeat.interval 默认的大小为 3 秒。需要注意的是 hdfs-site.xml 配置文件中的 heartbeat.recheck.interval 的单位为毫秒,dfs.heartbeat.interval 的单位为秒。所以,举个例子,如果heartbeat.recheck.interval 设置为 5000(毫秒),dfs.heartbeat.interval设置为 3(秒,默认),则总的超时时间为 40 秒。

<property>
    <name>heartbeat.recheck.interval</name>
    <value>5000</value>
</property>
<property>
    <name>dfs.heartbeat.interval</name>
    <value>3</value>
</property>

2、HDFS安全模式

问题引出:集群启动后,可以查看目录,但是上传文件时报错,打开web页面可看到namenode正处于 safemode 状态,怎么处理?

解释:safemode 是 namenode 的一种状态(active/standby/safemode 安全模式)

namenode 进入安全模式的原理

1. namenode 发现集群中的 block 丢失率达到一定比例时(0.1%),namenode 就会进入安全模式,在安全模式下,客户端不能对任何数据进行操作,只能查看元数据信息(比如 ls/mkdir),这个丢失率是可以手动配置的,默认是 dfs.safemode.threshold.pct=0.999f

2.如何退出安全模式?

  • 找到问题所在,进行修复(比如修复宕机的 datanode)
  • 或者可以手动强行退出安全模式(但是并没有真正解决问题)

在 hdfs 集群正常冷启动时,namenode 也会在 safemode 状态下维持相当长的一段时间,此时你不需要去理会,等待它自动退出安全模式即可

正常启动的时候进入安全的原理:

namenode 的内存元数据中,包含文件路径、副本数、blockid,及每一个 block 所在datanode 的信息,而 fsimage 中,不包含 block 所在的 datanode 信息,那么,当 namenode冷启动时,此时内存中的元数据只能从 fsimage 中加载而来,从而就没有 block 所在的datanode 信息——>就会导致 namenode 认为所有的 block 都已经丢失——>进入安全模式——>datanode 启动后,会定期向 namenode 汇报自身所持有的 blockid 信息,——>随着datanode 陆续启动,从而陆续汇报 block 信息,namenode 就会将内存元数据中的 block 所在 datanode 信息补全更新——>找到了所有 block 的位置,从而自动退出安全模式。

安全模式常用操作命令

# 强制 NameNode 退出安全模式
hdfs dfsadmin -safemode leave 
# 进入安全模式
hdfs dfsadmin -safemode enter 
# 查看安全模式状态
hdfs dfsadmin -safemode get 
# 等待,一直到安全模式结束
hdfs dfsadmin -safemode wait 

如果你使用的版本是 2.X 之前的版本,那么这个 hdfs 命令可以替换成 hadoop,它们都在 bin目录下。

3、HDFS副本存放策略

1.作用数据分块存储和副本的存放,是保证可靠性和高性能的关键。

2.方法:将每个文件的数据进行分块存储,每一个数据块又保存有多个副本,这些数据块副本分布在不同的机器节点上。

3.存放说明

在多数情况下,HDFS 默认的副本系数是 3。Hadoop 默认对 3 个副本的存放策略如下图,其中 Block1,Block2,Block3 分别表示 Block的三个副本:

  • 第一个 block 副本放在和 client 所在的 node 里(如果 client 不在集群范围内,则这第一个 node是随机选取的,系统会尝试不选择哪些太满或者太忙的 node)。
  • 第二个副本放置在与第一个节点不同的机架中的 node 中(近乎随机选择,系统会尝试不选择哪些太满或者太忙的 node)。
  • 第三个副本和第二个在同一个机架,随机放在不同的 node 中。

4.修改副本数

第一种方式:修改集群文件 hdfs-site.xml

<property>
    <name>dfs.replication</name>
    <value>1</value>
</property>

第二种方式:命令设置 bin/hadoop fs -setrep -R 1 /

4、负载均衡

机器与机器之间磁盘利用率不平衡是 HDFS 集群非常容易出现的情况,尤其是在 DataNode 节点出现故障或在现有的集群上增添新的 DataNode 的时候。分析数据块分布和重新均衡 DataNode 上的数据分布的工具:

sbin/start-balancer.sh

sbin/start-balancer.sh -threshold 5

自动进行均衡非常慢,一天能移动的数据量在 10G-10T 的级别,很难满足超大集群的需求。原因:HDFS 集群默认不允许 balance 操作占用很大的网络带宽,这个带宽是可以调整的

hdfs dfsadmin -setBalanacerBandwidth newbandwidth

hdfs dfsadmin -setBalanacerBandwidth 10485760

该数值的单位是字节,上面的配置是 10M/s,默认是 1M/s。另外,也可以在 hdfs-site.xml 配置文件中进行设置:

<property>
    <name>dfs.balance.bandwidthPerSec</name>
    <value>10485760</value>
    <description> Specifies the maximum bandwidth that each datanode can utilize for the balancing purpose in term of the number of bytes per second. </description>
</property>
# 机器容量最高的那个值 和 最低的那个值得差距 不能超过 10%

sbin/start-balancer.sh -t 10%    

猜你喜欢

转载自blog.csdn.net/sanmi8276/article/details/113065244
今日推荐