HDFS 负载均衡策略


1. Hadoop HDFS介绍

Hadoop 分布式文件系统(Hadoop Distributed File System),简称 HDFS,被设计成适合运行在通用硬件上的分布式文件系统。它和现有的分布式文件系统有很多的共同点。HDFS 是一个高容错性的文件系统,提供高吞吐量的数据访问,非常适合大规模数据集上的应用。

2. HDFS 副本摆放策略

  • 第一副本:放置在上传文件的DataNode上,如果是集群外提交,则随机挑选一台磁盘不太慢、CPU不太忙的节点上。

  • 第二副本:放置在于第一个副本不同的机架的节点上

  • 第三副本:与第二个副本相同机架的不同节点上

  • 如果还有更多的副本:随机放在节点中

副本摆放策略
  • 需要注意的是:

HDFS中存储的文件的副本数由上传文件时设置的副本数决定。

无论以后怎么更改系统副本系数,这个文件的副本数都不会改变;

在上传文件时优先使用启动命令中指定的副本数,如果启动命令中没有指定则使用 hdfs-site.xml 中 dfs.replication 设置的默认值

3. HDFS 负载均衡

  • Hadoop的HDFS集群非常容易出现机器与机器之间磁盘利用率不平衡的情况,例如:当集群内新增、删除节点,或者某个节点机器内硬盘存储达到饱和值。当数据不平衡时,Map任务可能会分配到没有存储数据的机器,这将导致网络带宽的消耗,也无法很好的进行本地计算。

  • 当HDFS负载不均衡时,需要对HDFS进行数据的负载均衡调整,即对各节点机器上数据的存储分布进行调整。从而,让数据均匀的分布在各个DataNode上,均衡IO性能,防止热点的发生。

  • 进行数据的负载均衡调整,必须要满足如下原则:

  1. 数据平衡不能导致数据块减少,数据块备份丢失

  2. 管理员可以中止数据平衡进程

  3. 每次移动的数据量以及占用的网络资源,必须是可控的

  4. 数据均衡过程,不能影响namenode的正常工作

4. HDFS 数据负载均衡原理

数据均衡过程的核心是一个数据均衡算法,该数据均衡算法将不断迭代数据均衡逻辑,直至集群内数据均衡为止。该数据均衡算法每次迭代的逻辑如下:

步骤分析如下:

  1. 数据均衡服务(Rebalancing Server)首先要求 NameNode 生成 DataNode 数据分布分析报告,获取每个DataNode磁盘使用情况
  2. Rebalancing Server汇总需要移动的数据分布情况,计算具体数据块迁移路线图。数据块迁移路线图,确保网络内最短路径
  3. 开始数据块迁移任务,Proxy Source Data Node复制一块需要移动数据块
  4. 将复制的数据块复制到目标DataNode上
  5. 删除原始数据块
  6. 目标DataNode向Proxy Source Data Node确认该数据块迁移完成
  7. Proxy Source Data Node向Rebalancing Server确认本次数据块迁移完成。然后继续执行这个过程,直至集群达到数据均衡标准
  • DataNode 分组

在第2步中,HDFS会把当前的DataNode节点,根据阈值的设定情况划分到Over、Above、Below、Under四个组中。在移动数据块的时候,Over组、Above组中的块向Below组、Under组移动。四个组定义如下:

  • Over 组 :此组中的DataNode的均满足

DataNode_usedSpace_percent > Cluster_usedSpace_percent + threshold

  • Above 组:此组中的DataNode的均满足

Cluster_usedSpace_percent + threshold > DataNode_ usedSpace _percent > Cluster_usedSpace_percent

  • Below 组:此组中的DataNode的均满足

Cluster_usedSpace_percent > DataNode_ usedSpace_percent > Cluster_ usedSpace_percent – threshold

  • Under 组 :此组中的DataNode的均满足

Cluster_usedSpace_percent – threshold > DataNode_usedSpace_percent

5. HDFS 数据自动平衡脚本

  • 在Hadoop中,包含一个 start-balancer.sh 脚本,通过运行这个工具,启动HDFS数据均衡服务。

  • 该工具可以做到热插拔,即无须重启计算机和 Hadoop 服务。

  • 启动命令为:Hadoop_home/bin/start-balancer.sh –threshold

  • 影响Balancer的几个参数:

  • -threshold

    • 默认设置:10,参数取值范围:0-100
    • 参数含义:判断集群是否平衡的阈值。理论上,该参数设置的越小,整个集群就越平衡
  • dfs.balance.bandwidthPerSec

    • 默认设置:1048576(1M/S)
    • 参数含义:Balancer运行时允许占用的带宽

示例如下:


# 启动数据均衡,默认阈值为 10%
$Hadoop_home/bin/start-balancer.sh

# 启动数据均衡,阈值 5%
bin/start-balancer.sh –threshold 5

# 停止数据均衡
$Hadoop_home/bin/stop-balancer.sh

# 该脚本不允许多进程运行
<!-- 在hdfs-site.xml文件中可以设置数据均衡占用的网络带宽限制 -->
<!-- 默认是 1MB/s,速度越快完成任务时间也越短,但是这也对机器进程速度有要求。 -->
<property>
    <name>dfs.balance.bandwidthPerSec</name>
    <value>1048576</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>

注意事项:

  1. 阈值越小表示集群内各节点的 DFS 使用率越相近,每次需要的数据均衡时间也越久。
  2. 当应用程序正在使用集群,即对集群进行读写文件操作时,无法达到过于小的阈值。
  3. 每次数据节点的数据迁移交互不会超过 10GB 或者指定的阈值大小数据块。每一个交互过程不会大于 20 分钟。
  4. 上文说明的修改最大移动数据块速度值需要重新启动 HDFS 服务才能生效。
  5. 数据平衡是一个逐渐迭代的过程,可以通过查看输出日志知道这个过程

6. 失败分析

  1. 脚本自动退出条件
  2. 集群内数据已经达到平衡条件了。
  3. 没有数据块可以被移动。
  4. 连续三次迭代中都没有数据块移动。
  5. NameNode 交互失败;
  6. 另外已经有数据平衡进程启动。
  • 失败信息输出

The cluster is balanced. Exiting…
 No block can be moved. Exiting...
 No block has been moved for 3 iterations. Exiting...
 Received an IO exception: failure reason. Exiting...
 Another balancer is running. Exiting...

文章作者: hnbian
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 hnbian !
评论
 上一篇
一次HDFS balance的记录 一次HDFS balance的记录
背景前段时间由于集群磁盘吃紧做了一次对HDFS上文件副本缩减的操作,导致集群的DataNode间数据不均衡,所以需要做一次rebalance。 1. balance参数介绍hdfs balancer –help table {
2019-08-30
下一篇 
Spark  任务调度解析 Spark 任务调度解析
1. Spark任务调度流程图 2 DAGScheduler2.1 DAGScheduler 介绍 DAG:Directed Acyclic Graph ,有向无环图 高级调度器,面向阶段调度。(map阶段、reduce阶段)(st
2019-08-26
  目录