目前,我正在使用hadoop(titanversion0.5.4,hadoopversion2.6.0)将数据加载到titangraph中。我使用的是一个单服务器(伪分布式)hadoop集群,目的是扩展到具有相同硬件的更多机器的完整集群。我正在尝试以这样一种方式设置hadoop,以获得完全的核心利用率。到目前为止,我还以为我已经用很好的配置参数做了一些不错的设置,但是当hadoop正在执行并将数据加载到titan图中时,我并没有看到我的机器上所有内核的充分利用。
情况如下。我使用的机器具有以下硬件规格:
cpu:32核
内存:256gb
交换内存:32gb
驱动器:8x128gb ssd,4x2tb hdd
我正在用hadoop加载到titan图中的数据具有以下规范:
总大小:848mb
拆分为四个文件(487mb、142mb、219mb和1.6mb),每个文件包含一种类型的顶点,以及所有顶点属性和输出边。
在设置hadoop集群时,我尝试使用一些逻辑推理将hadoop的配置参数设置为它们的(我认为是)最佳设置。请看下面的推理。
我的机器有32个核,所以理论上我可以把我的输入大小分成多个chunck,这些chunck的大小足够大,最终大约有32个chunck。所以,对于848mb的输入,我可以设置 dfs.block.size
到32mb,这将导致大约(848mb/32mb~)27个块。
为了确保每个map任务接收一个chunck,我设置了 mapred.min.split.size
略小于块大小,以及 mapred.max.split.size
略大于块大小(例如,分别为30mb和34mb)。
每个任务所需的可用内存对我来说有点模糊。例如,我可以设置 mapred.child.java.opts
价值 -Xmx1024m
为每个任务(例如每个Map器/缩减器)分配1gb内存。考虑到我的机器总共有256gb的内存——减去一些内存以备不时之需,剩下大约200gb的内存——我最终可能会得到总共(200gb/1gb=)200个Map器和还原器。或者,当我给每个任务2gb的内存时,我会得到总共100个Map器和还原器。我想每个任务的内存量也取决于输入的大小。不管怎样,这会导致 mapred.tasktracker.map/reduce.tasks.maximum
大约100个,这可能已经太多了,因为我只有32个核心。因此,可以将这两个参数都设置为32 map
以及 reduce
可能更好?你怎么认为?
在这些假设之后,我最终得到以下配置。
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>
yarn-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
命令( iostat -d -x 5 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
我不是磁盘利用率方面的Maven,但这些值是否意味着我在某个地方受到io限制,例如在磁盘sdb、sbc或sdd上?
编辑:也许可以通过使用 sar
命令。以下是5份报告的结果,大约5秒( 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
提前感谢您的回复!
1条答案
按热度按时间57hvy0tb1#
在yarn-site.xml中将此参数设置为机器具有的芯数:
然后从hadoopexamplesjar运行pi,并通过资源管理器的web页面观察同时执行了多少Map程序