目前我正在使用Hadoop(Titan版本0.5.4,Hadoop版本2.6.0)将数据加载到Titan图表中。我正在使用单服务器(伪分布式)Hadoop集群,目的是扩展到具有相同硬件的更多计算机的完整集群。我正在尝试以这样一种方式设置Hadoop,以便获得完整的核心利用率。到目前为止,虽然我已经使用良好的配置参数进行了一些不错的设置,但是当Hadoop正在执行并将数据加载到Titan图中时,我看不到我机器上所有内核的完全利用率。
情况如下。我正在使用的机器具有以下硬件规格:
我使用Hadoop加载到Titan图中的数据具有以下规范:
在设置Hadoop集群时,我尝试使用一些逻辑推理将Hadoop的配置参数设置为他们(我认为是)的最佳设置。请参阅下面的推理。
dfs.block.size
设置为32MB,这将导致大约(848MB / 32MB~)27个块。mapred.min.split.size
的值设置为比块大小小一点,并将mapred.max.split.size
设置为比块大小多一点(for示例分别为30MB和34MB。mapred.child.java.opts
设置为值-Xmx1024m
,以便为每个任务(例如每个映射器/缩减器)提供1GB的内存。鉴于我的机器总共有256GB内存 - 从中减去一些用于其他目的而保留大约200GB的内存 - 我最终可能会得到(200GB / 1GB =)200个映射器和缩减器。或者,当我给每个任务2GB内存时,我最终会得到100个映射器和缩减器。我猜,给每个任务的内存量也取决于输入的大小。无论如何,这导致mapred.tasktracker.map/reduce.tasks.maximum
的值大约为100,考虑到我只有32个核心,这可能已经太多了。因此,对于map
和reduce
,将此参数设置为32可能更好?你觉得怎么样?在这些假设之后,我最终得到以下配置。
HDFS-site.xml中
<configuration>
<property>
<name>dfs.replication</name>
<value>1</value>
</property>
<property>
<name>dfs.block.size</name>
<value>33554432</value>
<description>Specifies the sizeof data blocks in which the input dataset is split.</description>
</property>
</configuration>
mapred-site.xml中
<configuration>
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
<description>The runtime framework for executing MapReduce jobs. Can be one of local, classic or yarn.</description>
</property>
<property>
<name>mapred.child.java.opts</name>
<value>-Xmx2048m</value>
<description>Java opts for the task tracker child processes.</description>
</property>
<property>
<name>mapred.tasktracker.map.tasks.maximum</name>
<value>32</value>
<description>The maximum number of map tasks that will be run simultaneously by a tasktracker.</description>
</property>
<property>
<name>mapred.tasktracker.reduce.tasks.maximum</name>
<value>32</value>
<description>The maximum number of reduce tasks that will be run simultaneously by a tasktracker.</description>
</property>
<property>
<name>mapred.min.split.size</name>
<value>31457280</value>
<description>The minimum size chunk that map input should be split into.</description>
</property>
<property>
<name>mapred.max.split.size</name>
<value>35651584</value>
<description>The maximum size chunk that map input should be split into.</description>
</property>
<property>
<name>mapreduce.job.reduces</name>
<value>32</value>
<description>The default number of reducers to use.</description>
</property>
<property>
<name>mapreduce.job.maps</name>
<value>32</value>
<description>The default number of maps to use.</description>
</property>
</configuration>
纱-site.xml中
<configuration>
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
<property>
<name>yarn.nodemanager.aux-services.mapreduce.shuffle.class</name>
<value>org.apache.hadoop.mapred.ShuffleHandler</value>
</property>
<property>
<name>yarn.scheduler.minimum-allocation-mb</name>
<value>2048</value>
<description>The minimum allocation for every container request at the RM, in MBs.</description>
</property>
</configuration>
使用这些设置执行Hadoop并不能在我的单台计算机上提供完整的核心利用率。并非所有核心都在所有MapReduce阶段都忙碌。在Hadoop执行期间,我还使用iostat
命令查看了IO吞吐量(iostat -d -x 5 3
给出了3个间隔为5秒的报告)。这样一份报告的样本如下所示。
Device: rrqm/s wrqm/s r/s w/s rkB/s wkB/s avgrq-sz avgqu-sz await r_await w_await svctm %util
sda 0.00 0.07 0.02 0.41 0.29 2.37 12.55 0.01 16.92 5.18 17.43 2.47 0.10
sdb 0.07 2.86 4.90 10.17 585.19 1375.03 260.18 0.04 2.96 23.45 8.55 1.76 2.65
sdc 0.08 2.83 4.89 10.12 585.48 1374.71 261.17 0.07 4.89 30.35 8.12 2.08 3.13
sdd 0.07 2.83 4.89 10.10 584.79 1374.46 261.34 0.04 2.78 26.83 6.71 1.94 2.91
sde 0.00 0.00 0.00 0.00 0.05 0.80 278.61 0.00 10.74 2.55 32.93 0.73 0.00
sdf 0.00 0.00 0.00 0.00 0.05 0.80 283.72 0.00 10.30 1.94 33.09 0.68 0.00
sdg 0.00 0.00 0.00 0.00 0.05 0.80 283.83 0.00 10.24 1.99 32.75 0.68 0.00
sdh 0.00 0.00 0.00 0.00 0.05 0.80 284.13 0.00 10.29 1.96 32.99 0.69 0.00
sdi 0.00 0.00 0.00 0.00 0.05 0.80 284.87 0.00 17.89 2.35 60.33 0.74 0.00
sdj 0.00 0.00 0.00 0.00 0.05 0.80 284.05 0.00 10.30 2.01 32.96 0.68 0.00
sdk 0.00 0.00 0.00 0.00 0.05 0.80 284.44 0.00 10.20 1.99 32.62 0.68 0.00
sdl 0.00 0.00 0.00 0.00 0.05 0.80 284.21 0.00 10.50 2.00 33.71 0.69 0.00
md127 0.00 0.00 0.04 0.01 0.36 6.38 279.84 0.00 0.00 0.00 0.00 0.00 0.00
md0 0.00 0.00 14.92 36.53 1755.46 4124.20 228.57 0.00 0.00 0.00 0.00 0.00 0.00
我不是磁盘利用率方面的专家,但是这些值可能意味着我在某处受到IO限制,例如在磁盘上 sdb , sbc 或 SDD
编辑:可以使用sar
命令更好地指示CPU利用率和IO吞吐量。以下是5个报告的结果,5秒aprt(sar -u 5 5
):
11:07:45 AM CPU %user %nice %system %iowait %steal %idle
11:07:50 AM all 12.77 0.01 0.91 0.31 0.00 86.00
11:07:55 AM all 15.99 0.00 1.39 0.56 0.00 82.05
11:08:00 AM all 11.43 0.00 0.58 0.04 0.00 87.95
11:08:05 AM all 8.03 0.00 0.69 0.48 0.00 90.80
11:08:10 AM all 8.58 0.00 0.59 0.03 0.00 90.80
Average: all 11.36 0.00 0.83 0.28 0.00 87.53
预先感谢您的回复!
答案 0 :(得分:0)
将yarn-site.xml中的此参数设置为您加工的多个核心:
<property>
<name>yarn.scheduler.maximum-allocation-vcores</name>
<value>32</value>
</property>
然后从hadoop-examples jar运行pi并使用资源管理器的网页观察有多少映射器同时被执行