前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Hadoop HDFS 数据平衡原理

Hadoop HDFS 数据平衡原理

作者头像
我脱下短袖
发布于 2019-12-23 07:20:05
发布于 2019-12-23 07:20:05
2.8K00
代码可运行
举报
文章被收录于专栏:算法无遗策算法无遗策
运行总次数:0
代码可运行

来源:IBM 本文章介绍HDFS数据平衡以及测试结果,我觉得写得非常不错,建议食用

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

数据平衡期望满足的需求

当集群内新增、删除节点,或者某个节点机器内硬盘存储达到饱和值时,我们需要对 Hadoop 底层负责存储数据的 HDFS 进行数据的负载均衡调整,也可以说是各节点机器上数据的存储分布调整。当数据不平衡时,由于 Map 任务可能会被分配给没有存储数据的机器,这会最终导致网络带宽的消耗。另一方面,当一些数据节点数据完全满载时,新的数据块只会被存放在有空余数据的节点机器上,造成了并行读取的可能性。

我们所希望的方式必须满足先决条件:

  1. 数据平衡不会导致数据块减少,数据块备份丢失;
  2. 管理员可以中止数据平衡进程;
  3. 每次数据块移动的大小应该是可控的,这样可以放置阻塞网络;
  4. namenode 不会因为数据平衡服务而导致过于繁忙。

Hadoop 提供的自带工具可以来完成这个任务,并且该工具可以做到热插拔,即无须重启计算机和 Hadoop 服务。$Hadoop_Home/bin 目录下的 start-balancer.sh 脚本就是该任务的启动脚本。

Hadoop HDFS 数据自动平衡原理

数据平衡过程由于平衡算法的原因造成它是一个迭代的、周而复始的过程。每一次迭代的最终目的是让高负载的机器能够降低数据负载,所以数据平衡会最大程度上地使用网络带宽。下图 1 数据平衡流程交互图显示了数据平衡服务内部的交互情况,包括 NameNode 和 DataNode。

图 1. 数据平衡流程交互图

图 1 所示步骤分析如下:

  1. 数据平衡服务首先要求 NameNode 生成 DataNode 数据分布分析报告。
  2. 选择所有的 DataNode 机器后,要求 NameNode 汇总数据分布的具体情况。
  3. 确定具体数据块迁移路线图,保证网络内最短路径,并且确保原始数据块被删除。
  4. 实际开始数据块迁移任务。
  5. 数据迁移任务完成后,通过 NameNode 可以删除原始数据块。
  6. NameNode 在确保满足数据块最低副本条件下选择一块数据块删除。
  7. NameNode 通知数据平衡服务任务全部完成。

HDFS 数据在各个数据节点间可能保存的格式不一致。当存放新的数据块 (一个文件包含多个数据块) 时,NameNode 在选择数据节点作为其存储地点前需要考虑以下几点因素:

  1. 当数据节点正在写入一个数据块时,会自动在本节点内保存一个副本。
  2. 跨节点备份数据块。
  3. 相同节点内的备份数据块可以节约网络消耗。
  4. HDFS 数据均匀分布在整个集群的数据节点上。

Hadoop HDFS 数据自动平衡脚本使用方法

运行 start-balancer.sh 脚本

格式:$Hadoop_home/bin/start-balancer.sh –threshold<threshold>

清单 1. 运行脚本
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
$Hadoop_home/bin/start-balancer.sh
启动数据平衡,默认阈值为 10%
bin/start-balancer.sh –threshold 5
启动数据平衡,阈值 5%
如何停止数据平衡:
$Hadoop_home/bin/stop-balancer.sh

hdfs-site.xml 文件里可以设置每秒钟数据节点间移动数据块的最大速度。

清单 2. 设置数据块移动速度
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<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>

上面默认是 1MB/s,速度越快完成任务时间也越短,但是这也对机器进程速度有要求。

注意事项:

  1. 阈值越小表示集群内各节点的 DFS 使用率越相近,每次需要的数据均衡时间也越久。
  2. 当应用程序正在使用集群,即对集群进行读写文件操作时,无法达到过于小的阈值。
  3. 每次数据节点的数据迁移交互不会超过 10GB 或者指定的阈值大小数据块。每一个交互过程不会大于 20 分钟。
  4. 上文说明的修改最大移动数据块速度值需要重新启动 HDFS 服务才能生效。
  5. 数据平衡是一个逐渐迭代的过程,可以通过查看输出日志知道这个过程,
清单 3. 日志输出
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
imeStamp Iteration# Bytes Already Moved Bytes LeftTo Move Bytes Being Moved
June 13, 2014 8:48:13 PM 0 0 KB 40.88 TB 2.03 TB
June 13, 2014 8:10:24PM 1 2 TB 38.29 TB 2.01 TB
June 13, 2014 8:31:06PM 2 3.98 TB 36.38 TB 1.98 TB
June 13, 2014 8:54:58PM 3 5.94 TB 34.42 TB 1.96 TB

该脚本不允许多进程运行。

失败原因包括下述因素:

  1. 脚本自动退出条件
  2. 集群内数据已经达到平衡条件了。
  3. 没有数据块可以被移动。
  4. 连续三次迭代中都没有数据块移动。
  5. NameNode 交互失败;
  6. 另外已经有数据平衡进程启动。
清单 4. 失败信息输出
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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...

测试过程及结果

测试集群内有 2 个节点,集群内机器配置完全一致。分别对新增、删除 1 个节点做数据平衡调整。所有的数据平衡测试都是基于阈值 10%,非此默认值会予以特别说明。

集群机器配置说明如表 1 硬件配置表所示:

表 1. 硬件配置表

根据不同测试场景,举例出 18 种测试用例,如表 2 测试用例表所示:

表 2. 测试用例表

测试用例运行前,运行 hadoop dfsadmin –report 命令可以查看当前集群内各 DataNode 的数据存储情况。图 2 节点机器数据负载情况图所示,2 个存活的数据节点,分别使用了 21.71%和 21.48%,整个集群的使用是 22.83%,各节点上的百分比与总集群的百分比差距在 1%左右,小于默认的 10%,表明目前负载均衡。

图 2. 节点机器数据负载情况图

手动让集群内数据分布不均匀后开始测试用例测试,测试结果如表 3 测试结果表所示。

表 3. 测试结果表

其他性能改善方法

来自中国吉林大学的三位学者针对跨机架机器的数据平衡算法进行了深入研究。首先,他们将跨机架的数据节点根据其被使用情况划分为 4 个类型,

  1. 大于平均使用;
  2. 过度使用;
  3. 小于平均使用;
  4. 几乎没有被使用。

跨机架数据平衡步骤如下所示:

  1. 首先,数据从类型 2 机器移动到类型 4 机器;
  2. 其次,数据从类型 2 机器移动到类型 3 机器;
  3. 最后,数据从类型 1 机器移动到类型 3 机器。

以上步骤在负载没有达到指定阈值前会迭代式执行。

从实际测试过程来看,如果一个机架内某些机器负载均衡 (属于类型 1 和类型 3),剩余的机器一部分高负载 (属于类型 2),一部分几乎没有数据 (属于类型 4),但从整体来看该机架可能属于平均负载 (类型 1 和类型 3),所以在迭代过程中,机架内部信息没有被完整地收集清楚并且数据平衡前,该集群不会被加入到本轮迭代的平衡任务中。但是问题是如果错过本轮数据平衡,也许到下一轮迭代时部分机器已经数据超负荷,甚至导致更严重的宕机。

经过一番数学论证后,学者们给出了解决方案,

  1. 过度使用的机器和大于平均使用的机器以升序形式排序;
  2. 小于平均使用的机器和几乎没有使用的机器以降序形式排序。

结合上述算法上的改动后做了一些实验,实验集群包括 A、B、C 三个机架,其中 A 机架包括三台机器 A1、A2、A3,B 机架包括三台机器 B1、B2、B3,C 机架包括两台机器 C1、C2。集群架构图如下图 3 集群拓扑图所示:

图 3. 集群拓扑图

图 4 数据负载表中可以看出,数据平衡之前机架 A 基本达到高负荷,机架 B 内的三台机器数据没有分布均匀,机架 C 内的两台机器使用率达到平均值。

表 4. 数据负载表

基于两种算法的数据平衡测试结果显示,Hadoop 算法运行了 7.56 分钟,改进算法运行了 6.96 分钟。Hadoop 算法最终平衡了机架 A 上的数据,但是花费了 7.56 分钟。改进算法在任务运行 2.05 分钟后即平衡了机架 A 上的数据。所以对比可以看出改进算法的效率较高。具体数据图 4 数据负载分析图。

图 4. 数据负载分析图

结束语

通过本文的学习,读者了解了使用 Hadoop 自带工具对节点内机器数据存储进行平衡工作的方式。本文对其工作原理、工作流程等做了详细描述,从代码角度、交互角度等对数据平衡的设计原理做了深入探讨。读者了解到已经有针对 Hadoop 现有数据平衡算法的优化算法产生,并且通过论文提供的测试数据可以看到改进算法的效率相较 Hadoop 自带算法而言,更快速、更高效。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2019-05-13,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 算法无遗策 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
手把手教你如何用 OpenCV + Python 实现人脸识别
下午的时候,配好了 OpenCV 的 Python 环境,OpenCV 的 Python 环境搭建。于是迫不及待的想体验一下 opencv 的人脸识别,如下文。 必备知识 Haar-like Haar-like 百科释义。通俗的来讲,就是作为人脸特征即可。 Haar 特征值反映了图像的灰度变化情况。例如:脸部的一些特征能由矩形特征简单的描述,如:眼睛要比脸颊颜色要深,鼻梁两侧比鼻梁颜色要深,嘴巴比周围颜色要深等。 opencv api 要想使用 opencv,就必须先知道其能干什么,怎么做。于是 AP
AI研习社
2018/03/28
2.4K0
手把手教你如何用 OpenCV + Python 实现人脸识别
使用python3.7和opencv4.1来实现人脸识别和人脸特征比对以及模型训练
     OpenCV4.1已经发布将近一年了,其人脸识别速度和性能有了一定的提高,这里我们使用opencv来做一个实时活体面部识别的demo
用户9127725
2022/08/08
2K0
简单人脸识别一之使用opencv+cnn网络实现人脸识别
最近在研究目标检测这个方向,看到网上有很多的人脸识别帖子,所以也想着上上手看看。当时是做了三个模型出来,第一个就是网上很通用普遍的opencv+简单三层cnn网络来实现的,说实话效果真的一般吧!具体的下面再细细陈述。第二个是把三层cnn网络换成了残差网络。因为自己刚好也是学习了残差网络。就想着生搬硬套过来,但效果说实话很迷,时好时坏,把我是整蒙逼了,后面也会提的。最后一个是用opencv+MTCNN+FaceNet来实现的,效果就比较好了,训练速度快,检测人脸的准确率也比前两个模型更好。我接下来会写三篇文章来一一介绍!
全栈程序员站长
2022/08/26
2K0
简单人脸识别一之使用opencv+cnn网络实现人脸识别
干货 | 手把手教你运用Python实现简单的人脸识别
Python里,简单的人脸识别有很多种方法可以实现,依赖于python胶水语言的特性,我们通过调用包可以快速准确的达成这一目的。这里介绍的是准确性比较高的一种。
用户1621951
2019/06/06
1.4K0
干货 | 手把手教你运用Python实现简单的人脸识别
python3+opencv3人脸识别入
https://blog.csdn.net/qq_30310799/article/details/80829930 本文章有circle函数的介绍
py3study
2020/01/10
4300
python+opencv 实现图像人脸检测及视频中的人脸检测
原文链接:https://yetingyun.blog.csdn.net/article/details/108153075 创作不易,未经作者允许,禁止转载,更勿做其他用途,违者必究。
叶庭云
2022/01/10
1.5K0
python+opencv 实现图像人脸检测及视频中的人脸检测
keras实战︱人脸表情分类与识别:人脸检测+情绪分类
脸识别热门,表情识别更加。但是表情识别很难,因为人脸的微表情很多,本节介绍一种比较粗线条的表情分类与识别的办法。 本次讲述的表情分类是识别的分析流程分为: 1、加载pre-model网络与权重; 2、利用opencv的函数进行简单的人脸检测; 3、抠出人脸的图并灰化; 4、表情分类器检测 ---- 一、表情数据集 主要来源于kaggle比赛,下载地址。 在公众号 datadw 里 回复 keras 即可获取。 有七种表情类别: (0=Angry, 1=Disgust, 2=Fear, 3=Happ
机器学习AI算法工程
2018/03/15
3.4K0
keras实战︱人脸表情分类与识别:人脸检测+情绪分类
OpenCV进行人脸识别(Python)
https://gitee.com/mirrors/opencv/tree/4.x/data/haarcascades
码客说
2022/09/27
9760
OpenCV进行人脸识别(Python)
Python制作动态人脸识别:实时人脸检测动效
人脸识别技术在现代社会中应用广泛,从安防监控到手机解锁,都是其典型应用。在这篇博客中,我们将使用Python来实现一个简单的实时人脸检测动效。通过利用OpenCV库,我们能够轻松捕捉摄像头视频流并检测人脸。
屿小夏
2024/09/25
3850
记录一下人脸识别
需要将 haarcascade_frontalface_default.xml haarcascade_eye_tree_eyeglasses.xml 放入当前文件夹 或者你使用绝对路径也可以 这两个文件在\python\Lib\site-packages\cv2\data\ 里面 电脑没有摄像头的话可以使用手机当摄像头 在手机(安卓\IOS都可以)和电脑上面下载iVcam 并用数据线连接起来 下载地址:https://www.e2esoft.cn/ivcam/ 然后我发现我的台式电脑 使用上面那个软件 是0才可以运行 也就是选择笔记本摄像头才可以 如果你选的1 USB摄像头没有反应 不妨试试0 笔记本摄像头
残浔
2023/05/11
4870
记录一下人脸识别
OpenCV与图像处理(七)
以下代码均在python3.6,opencv4.2.0环境下试了跑一遍,可直接运行。
Must
2020/07/28
3820
OpenCV与图像处理(七)
零基础学 OpenCV + Python 图像处理:手把手带你做人脸识别(附代码+典型案例)
零基础学 OpenCV + Python 图像处理:手把手带你做人脸识别(附代码+典型案例)
猫头虎
2025/06/02
1K0
零基础学 OpenCV + Python 图像处理:手把手带你做人脸识别(附代码+典型案例)
Python中使用opencv-python进行人脸检测
之前写过一篇VC++中使用OpenCV进行人脸检测的博客。以数字图像处理中经常使用的lena图像为例,如下图所示:
ccf19881030
2024/05/24
2590
Python中使用opencv-python进行人脸检测
python3+opencv+tkint
其中所使用到的训练参数数据下载地址:https://github.com/opencv/opencv/tree/master/data/haarcascades
py3study
2020/01/17
6760
手把手教你opencv做人脸识别(附源码+文档)
python3.9 pycharm2020 人狠话不多,直接上代码,注释在代码里面,不说废话。
川川菜鸟
2021/10/19
3K0
人眼检测
算法:人眼检测是一种基于机器学习的方法,其中级联函数是从大量正面和负面图像中训练出来的,然后使用它来检测图像中的对象。
裴来凡
2022/05/29
5940
人眼检测
关于OpenCV for Python入门-自带人脸检测算法比较
本来学习OpenCV的目的就是为了做人脸识别、车辆识别、人群计数等等,识别人脸首先要进行人脸检测,OpenCV中内置了Haar Cascade人脸分类器,其中包括haarcascade_frontalface_alt、haarcascade_frontalface_alt_tree、haarcascade_frontalface_alt2、haarcascade_frontalface_default这四种,本文不求甚解,只是从比对上判断一下这几种内置分类器的可用性。
python与大数据分析
2022/04/02
7160
关于OpenCV for Python入门-自带人脸检测算法比较
手把手教你opencv做人脸识别(附源码+文档)
python3.9 pycharm2020 人狠话不多,直接上代码,注释在代码里面,不说废话。
全栈程序员站长
2022/06/27
1.1K0
手把手教你opencv做人脸识别(附源码+文档)
人脸识别技术演进:从几何算法到深度学习的深度剖析
人脸识别技术作为一种生物识别技术,在过去几十年中经历了显著的发展。其发展可以分为几个主要阶段,每个阶段都对应着特定的技术进步和应用模式的变化。
TechLead
2023/12/04
1.3K0
人脸识别技术演进:从几何算法到深度学习的深度剖析
OpenCV检测篇(二):笑脸检测
本文介绍了如何使用OpenCV和CascadeClassifier类进行人脸和笑脸检测。首先,作者通过使用OpenCV库和CascadeClassifier类加载了人脸和笑脸的检测器,并对视频流进行实时人脸和笑脸检测。然后,作者使用CascadeClassifier类加载了人脸检测器,并提取了人脸区域,在人脸区域上进行笑脸检测。最后,作者使用waitKey()函数等待按键,并返回键值。
刘潇龙
2017/04/07
3.3K0
推荐阅读
相关推荐
手把手教你如何用 OpenCV + Python 实现人脸识别
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档