知识点
相关文章
更多最近更新
更多Hadoop机架感知与balancer
2019-03-28 13:20|来源: 网络
版本:Apache Hadoop 1.0.3
Hadoop集群节点通常会跨很多个机架,增加节点的情况时有发生,而且很多时候节点的磁盘容量还不统一,有大有小,所以集群节点非常容易出现磁盘利用不平衡的情况,一些节点的磁盘快用光了,另外一些节点磁盘容量还剩余很多。这会导致一些问题,首先是一些机器磁盘读写很频繁,另外一些机器很闲;MR任务分配到一个没有相应数据块的节点上时,需要从其它机器上拿数据,占用大量的网络带宽,又拖慢了任务执行的时间。
如何尽量避免这些情况的发生呢?首先要配置机架感知,把一部分数据分配到其它机架内的节点上;即使这样还不够,仍然会出现不数据存放不平衡的现象,我们还需要balancer。
balancer的话,可以使用命令bin/start-balancer.sh -threshold N。
balancer过程有点复杂,但是有一点,再平衡时会优先考虑同一机架内的节点。例如有两个机架,机架1和机架2,其中节点A位于机架1内,当集群再平衡时,系统会优先把节点A的数据块平衡到机架1中的其它节点,而不是机架2的节点。这样,当再平衡结束时,会导致数据块在整个HDFS集群中的分布仍然不平衡。所以在建设Hadoop集群时应该考虑到这个情况,最好把磁盘容量大的节点和磁盘容量小的节点混合安排进一个机架。
我们重点来看机架感知。
Hadoop在设计时考虑到数据的安全与高效,数据文件默认在HDFS上存放三份,存储策略为本地一份,同机架内其它某一节点上一份,不同机架的某一节点上一份。这样如果本地数据损坏,节点可以从同一机架内的相邻节点拿到数据,速度肯定比从跨机架节点上拿数据要快;同时,如果整个机架的网络出现异常,也能保证在其它机架的节点上找到数据。
那么Hadoop是如何确定任意两个节点是位于同一机架,还是跨机架的呢?答案就是机架感知。
HDFS集群在启动时会检查机架感知配置,根据配置对节点进行一次扫描转换,得到节点的机架ID,相同ID的节点肯定位于同一机架。问题是,Hadoop并不能智能识别节点位于哪个机架,它需要我们告诉集群哪些节点属于哪些机架,然后集群才能得到这些节点的机架ID。我们需要配置一下,使机架感知生效。
在core-site.xml中有一个参数,topology.script.file.name,该参数通常指定一个脚本,用来输出节点与机架的对应关系。最简单的示例是hadoop wiki中的一个脚本,参考:http://wiki.apache.org/hadoop/topology_rack_awareness_scripts。
-
#!/bin/bash
-
-
HADOOP_CONF=/etc/hadoop/conf
-
-
while [ $# -gt 0 ] ; do
-
nodeArg=$1
-
exec< ${HADOOP_CONF}/topology.data
-
result=""
-
-
while read line ; do
-
ar=( $line )
-
if [ "${ar[0]}" = "$nodeArg" ] ; then
-
result="${ar[1]}"
-
fi
-
done
-
-
shift
-
-
if [ -z "$result" ] ; then
-
echo -n "/default/rack "
-
else
-
echo -n "$result "
-
fi
-
done
topology.data的格式为:节点(ip或主机名) /交换机xx/机架xx
需要注意的是,在Namenode上,该文件中的节点必须使用IP,使用主机名无效,而Jobtracker上,该文件中的节点必须使用主机名,使用IP无效。这经过了本人的亲自试验。
相关问答
更多-
关于hadoop的问题,进来看看呀[2023-07-31]
java是执行文件,不是目录 java path默认是java_home/bin/目录 这个目录底下应该 java和javac等文件 -
网页游戏单机架设教程?[2022-05-23]
真封神目前都是封包服务端 开不起外网 单机的都可以的 架设比较简单 mysql数据库架设 附加一下数据库 里面四个文件 L W R U 分别点一下就可以了 江南 -
hadoop集群实际应用搭建用到的服务器哪种比较好,塔式的、机架式还是刀片的?[2021-10-03]
IBM 新出的PowerLinux 很适合应用服务器。性价比很高。可以考虑。 -
它没有从导出的变量中获取类名。 您可以尝试从脚本中注释掉这一行并尝试: export HADOOP_OPTS=”-Djava.security.krb5.realm= -Djava.security.krb5.kdc=” Its not getting the class name from the exported variable. You can try commenting out this line from the script and try: export HADOOP_OPTS=”-Dj ...
-
分析Hadoop(Profiling Hadoop)[2022-02-05]
Hadoop有asm 3.2而我使用的是ASM 5.在ASM5中,ClassVisitor是一个超类,而在3.2中它是一个接口。 出于某种原因,错误是Throwable(信任Shevek),catch块只捕获异常。 任何hadoop日志都没有捕获throwable错误。 因此,调试非常困难。 使用jar jar链接修复asm版本问题,现在一切正常。 如果你正在使用Hadoop并且某些东西不起作用并且没有日志显示任何错误,那么请尝试抓住Throwable。 阿伦 Hadoop had asm 3.2 and ... -
您在hadoop-env.sh中错误地设置了JAVA_HOME。 给出java_home的绝对路径。你可以使用下面的命令找出java当前的java路径: alternatives --config java 它将提供您已安装的所有Java版本并选择正确的版本并将此java路径设置为hadoop-env.sh,如下所示: export JAVA_HOME=/usr/java/jdk1.*/bin 另一种方法是将$ JAVA_HOME设置为用户的.bashrc。 所以不需要设置为hadoop-env.sh ...
-
当节点数少于复制因子时,HDFS如何复制?(How does HDFS replicate when there are less nodes than the replication factor?)[2021-09-17]
它会认为这些块不够复制,并且会继续抱怨它,它会永久地尝试将它们带到预期的复制因子。 HDFS系统有一个参数(复制因子 - 默认为3),它告诉namenode每个块应该如何复制(在默认情况下,根据给定的副本放置策略,每个块应该在整个集群中复制3次) 。 在系统设法按复制因子指定的次数复制每个块之前,它将继续尝试这样做。 It will consider the blocks as under-replicated and it will keep complaining about that and it w ... -
平衡器如何在HDFS中工作?(How does balancer work in HDFS?)[2022-01-16]
机架感知和数据本地化是一个YARN概念。 HDFS平衡器只关心平衡Datanode使用情况。 如果你有3台机器,默认情况下有3个副本,那么每台机器都可以保证有1个副本,因此有2个机架,你几乎可以保证有机架位置。 无论如何,节点位置比机架感知更高效。 如果节点之间的集群速度为10 GB,则数据局部性是一个有争议的问题。 这就是为什么AWS仍然可以合理地处理S3中的数据,例如,数据位置处理不可用 Rack awareness & data locality is a YARN concept. The HDFS ... -
平衡器不在hdfs HA中工作(Balancer not working in hdfs HA)[2022-12-21]
发布答案可能对某人有用。 此解决方案有效: balancer-not-working-in-hdfs-ha.html 请记住删除单个NN的rpc,不要触摸HA设置。 Posting the answer maybe it will be useful for someone. This solution works: balancer-not-working-in-hdfs-ha.html Just, please remember to delete rpc for single NN and don't ... -
只需给他们其他子网,如rack1 192.168.1。*,rack2 192.168.2。*等等。 Hadoop会认识到这一点。 Just give them other subnets, like rack1 192.168.1.*, rack2 192.168.2.* and so on. Hadoop will recognize this.