Hadoop配置机架感知(Python脚本)

2019-03-28 13:41|来源: 网络

昨天QQ群里提了一个Hadoop运行效率分配的问题,总结一下,写个文章。集群使用hadoop-1.0.3

有些hadoop集群在运行的时候,不完全是绝对平均的分配,不过需要尽可能平均的分配任务,避免某一台或者某几台服务器任务过重,其他服务器无事可做。这个,一方面是需要用到balancer,一个就是机架感知了。

通常,balancer是自动启动的。而机架感知则需要单独配置和编写脚本。不过,机架感知,不是说是感知哪个服务器坏了,是根据机架位置的拓扑结构来选取服务器进行任务的权重分配。

机架感知需要自己写一个脚本,然后放到hadoop的core-site.xml配置文件中,用namenode和jobtracker进行调用。

python代码摘自竹叶青的博客

#!/usr/bin/python
#-*-coding:UTF-8 -*-
import sys

rack = {"hadoop-node-31":"rack1",
                                "hadoop-node-32":"rack1",
                                "hadoop-node-33":"rack1",
                                "hadoop-node-34":"rack1",
                                "hadoop-node-49":"rack2",
                                "hadoop-node-50":"rack2",
                                "hadoop-node-51":"rack2",
                                "hadoop-node-52":"rack2",
                                "hadoop-node-53":"rack2",
                                "hadoop-node-54":"rack2",
                                "192.168.1.31":"rack1",
                                "192.168.1.32":"rack1",
                                "192.168.1.33":"rack1",
                                "192.168.1.34":"rack1",
                                "192.168.1.49":"rack2",
                                "192.168.1.50":"rack2",
                                "192.168.1.51":"rack2",
                                "192.168.1.52":"rack2",
                                "192.168.1.53":"rack2",
                                "192.168.1.54":"rack2",
                                }

if __name__=="__main__":
        print "/" + rack.get(sys.argv[1],"rack0")

按照老赵的博客,由于hadoop没有明确的说明机架感知是感知IP还是感知主机名,所以就都写上了。然后将脚本赋予可执行权限chmod +x RackAware.py,并放到bin/目录下。

然后打开conf/core-site.html
放入一下代码

     < property >
         < name >topology.script.file.name </ name >
         < value >/opt/modules/hadoop/hadoop-1.0.3/bin/RackAware.py </ value >
<!--机架感知脚本路径-->
     </ property >
     < property >
         < name >topology.script.number.args </ name >
         < value >20 </ value >
<!--机架服务器数量,由于我写了20个,所以这里写20-->
     </ property >


然后重启hadoop的namenode和jobtracker,可以在logs里看下namenode和jobtracker的日志,看到机架感知功能已经启用了。

namenode日志

2012-06-08 14:42:19,174 INFO org.apache.hadoop.hdfs.StateChange: BLOCK* NameSystem.registerDatanode: node registration from 192.168.1.49:50010 storage DS-1155827498-192.168.1.49-50010-1338289368956
2012-06-08 14:42:19,204 INFO org.apache.hadoop.net.NetworkTopology: Adding a new node: /rack2/192.168.1.49:50010
2012-06-08 14:42:19,205 INFO org.apache.hadoop.hdfs.StateChange: BLOCK* NameSystem.registerDatanode: node registration from 192.168.1.53:50010 storage DS-1773813988-192.168.1.53-50010-1338289405131
2012-06-08 14:42:19,226 INFO org.apache.hadoop.net.NetworkTopology: Adding a new node: /rack2/192.168.1.53:50010
2012-06-08 14:42:19,226 INFO org.apache.hadoop.hdfs.StateChange: BLOCK* NameSystem.registerDatanode: node registration from 192.168.1.34:50010 storage DS-2024494948-127.0.0.1-50010-1338289438983
2012-06-08 14:42:19,242 INFO org.apache.hadoop.net.NetworkTopology: Adding a new node: /rack1/192.168.1.34:50010
2012-06-08 14:42:19,242 INFO org.apache.hadoop.hdfs.StateChange: BLOCK* NameSystem.registerDatanode: node registration from 192.168.1.54:50010 storage DS-767528606-192.168.1.54-50010-1338289412267

......


2012-06-08 14:42:49,492 INFO org.apache.hadoop.hdfs.StateChange: STATE* Network topology has 2 racks and 10 datanodes
2012-06-08 14:42:49,492 INFO org.apache.hadoop.hdfs.StateChange: STATE* UnderReplicatedBlocks has 0 blocks
2012-06-08 14:42:49,642 INFO org.apache.hadoop.hdfs.server.namenode.FSNamesystem: ReplicateQueue QueueProcessingStatistics: First cycle completed 0 blocks in 0 msec
2012-06-08 14:42:49,642 INFO org.apache.hadoop.hdfs.server.namenode.FSNamesystem: ReplicateQueue QueueProcessingStatistics: Queue flush completed 0 blocks in 0 msec processing time, 0 msec clock time, 1 cycles


jobtracker 日志

2012-06-08 14:50:42,728 INFO org.apache.hadoop.net.NetworkTopology: Adding a new node: /rack2/hadoop-node-52
2012-06-08 14:50:42,731 INFO org.apache.hadoop.mapred.JobTracker: Adding tracker tracker_hadoop-node-52:localhost.localdomain/127.0.0.1:33999 to host hadoop-node-52
2012-06-08 14:50:42,753 INFO org.apache.hadoop.net.NetworkTopology: Adding a new node: /rack1/hadoop-node-34
2012-06-08 14:50:42,754 INFO org.apache.hadoop.mapred.JobTracker: Adding tracker tracker_hadoop-node-34:localhost.localdomain/127.0.0.1:37025 to host hadoop-node-34
2012-06-08 14:50:42,773 INFO org.apache.hadoop.net.NetworkTopology: Adding a new node: /rack2/hadoop-node-51

相关问答

更多
  • 同样建议不要用cygwin,总会出现各种意想不到的错误。 非要在windows上做,就在虚拟机上做(vmware workstation),安装教程网上各种。
  • hadoop配置[2022-10-16]

    不是你的环境变量的问题。不知道楼主有没有看Hadoop官网上的介绍。Hadoop所使用的jdk需要修改 conf/hadoop-env.sh 文件,在其中设置 JAVA_HOME 环境变量: export JAVA_HOME="C:\Program Files\Java\jdk1.5.0_01” (因为路径中 Program Files 中间有空格,一定要用双引号将路径引起来) 这里必须是修改Hadoop的conf/hadoop-env.sh 文件,和机器的环境变量没有关系。 有中文文档的。在Hadoop目 ...
  • 刚接触的话就换成root用户试试,原因是没有执行权限,或者将hadoop安装目录的所有权限赋予给当前用户
  • 看来我使用的是不正确的罐子。 所以,首先我取代了那些。 然后,我刚刚用hadoop conf文件创建了一个新目录。 格式化namenode。 最后它奏效了。 :) It seems I was using incorrect jars. So, first I replaced those. Then, I just created a new directory with hadoop conf files. Formatted the namenode. Finally it worked. :)
  • 我已经解决了这个难题,因为在线删除了修改Configuration要求,并且只是基于自定义的Hadoop配置* .xml文件集。 起初我编写了Java类,它将附加层的配置添加到org.apache.hadoop.conf.Configuration默认资源中。 它的静态初始化附加配置默认resoutces: public class Configurator { static { // We initialize needed Hadoop configuration layer ...
  • 它很可能是相对路径的问题。 尝试: DEFINE CMD `python moo.py` ship('/local/path/to/moo.py'); 它也可能是读/写/执行权限的问题。 The problem was that i used ship() function instead of cache() while ship() works file - passing local files from the master to the slaves cache() is used by the ...
  • 有关您的选项,请参阅https://docs.python.org/2/library/commands.html ,包括如何获取返回状态(如果出现错误)。 你缺少的基本代码是 import commands hdir_list = commands.getoutput('hadoop fs -ls hdfs://mydirectory') 是:在2.6中弃用,在2.7中仍然有用,但从Python 3中删除。如果这困扰你,请切换到 os.command () ...或者更好的 ...
  • 只需给他们其他子网,如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.
  • 猪可以以两种模式运行: 本地模式。 在这种模式下,根本不使用Hadoop集群。 所有进程都在单个JVM中运行,文件从本地文件系统中读取。 要以本地模式运行Pig,请使用以下命令: pig -x local MapReduce模式。 在此模式下,Pig将脚本转换为MapReduce作业并在Hadoop集群上运行它们。 这是默认模式。 群集可以是本地的或远程的。 Pig使用HADOOP_MAPRED_HOME环境变量在本地计算机上查找Hadoop安装(请参阅安装Pig )。 如果要连接到远程集群,则应在pi ...
  • 目前尚不清楚您使用的是什么Python库,但假设您使用PySpark,您可以在客户端机器上复制或配置HADOOP_CONF_DIR ,并且可以与任何外部Hadoop系统进行通信。 至少,您需要配置core-site.xml以与HDFS和hive-site.xml进行通信以与Hive进行通信。 如果您使用的是PyHive库 ,则只需连接到user@hiveserver2:1000 It's not clear what Python library you are using, but assuming Py ...