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。

  1. #!/bin/bash
  2.  
  3. HADOOP_CONF=/etc/hadoop/conf
  4.  
  5. while [ $# -gt 0 ] ; do
  6. nodeArg=$1
  7. exec< ${HADOOP_CONF}/topology.data
  8. result=""
  9.  
  10. while read line ; do
  11. ar=( $line )
  12. if [ "${ar[0]}" = "$nodeArg" ] ; then
  13. result="${ar[1]}"
  14. fi
  15. done
  16.  
  17. shift
  18.  
  19. if [ -z "$result" ] ; then
  20. echo -n "/default/rack "
  21. else
  22. echo -n "$result "
  23. fi
  24. done

topology.data的格式为:节点(ip或主机名)  /交换机xx/机架xx

需要注意的是,在Namenode上,该文件中的节点必须使用IP,使用主机名无效,而Jobtracker上,该文件中的节点必须使用主机名,使用IP无效。这经过了本人的亲自试验。

相关问答

更多
  • java是执行文件,不是目录 java path默认是java_home/bin/目录 这个目录底下应该 java和javac等文件
  • 真封神目前都是封包服务端 开不起外网 单机的都可以的 架设比较简单 mysql数据库架设 附加一下数据库 里面四个文件 L W R U 分别点一下就可以了 江南
  • 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有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系统有一个参数(复制因子 - 默认为3),它告诉namenode每个块应该如何复制(在默认情况下,根据给定的副本放置策略,每个块应该在整个集群中复制3次) 。 在系统设法按复制因子指定的次数复制每个块之前,它将继续尝试这样做。 It will consider the blocks as under-replicated and it will keep complaining about that and it w ...
  • 机架感知和数据本地化是一个YARN概念。 HDFS平衡器只关心平衡Datanode使用情况。 如果你有3台机器,默认情况下有3个副本,那么每台机器都可以保证有1个副本,因此有2个机架,你几乎可以保证有机架位置。 无论如何,节点位置比机架感知更高效。 如果节点之间的集群速度为10 GB,则数据局部性是一个有争议的问题。 这就是为什么AWS仍然可以合理地处理S3中的数据,例如,数据位置处理不可用 Rack awareness & data locality is a YARN concept. The HDFS ...
  • 发布答案可能对某人有用。 此解决方案有效: 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.