知识点
相关文章
更多最近更新
更多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")
#-*-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 >
< 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
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
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
相关问答
更多-
hadoop配置出错问题[2022-11-13]
同样建议不要用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目 ... -
ubuntu下配置hadoop不能正常运行。。求帮忙[2023-01-29]
刚接触的话就换成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. :)
-
Python的Spark自定义Hadoop配置(PySpark)?(Custom Hadoop Configuration for Spark from Python (PySpark)?)[2022-11-09]
我已经解决了这个难题,因为在线删除了修改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 ...
-
来自python的Hadoop命令(Hadoop commands from python)[2022-08-21]
有关您的选项,请参阅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 ...
-
配置hadoop-client连接到其他机器/服务器中的hadoop(Configure hadoop-client to connect to hadoop in other machine/server)[2021-11-20]
目前尚不清楚您使用的是什么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 ...