目前我正在使用 Hadoop(Titan 版本 0.5.4,Hadoop 版本 2.6.0)将数据加载到 Titan 图中。我正在使用单服务器(伪分布式)Hadoop 集群,目的是扩展到具有相同硬件的更多机器的完整集群。我正在尝试以这样一种方式设置 Hadoop,以便获得完整的核心利用率。到目前为止,虽然我已经用良好的配置参数进行了一些不错的设置,但是当 Hadoop 正在执行并将数据加载到 Titan 图中时,我没有看到我机器上所有内核的充分利用。
情况如下。我正在使用的机器具有以下硬件规格:
- CPU:32核
- 内存:256GB
- 交换内存:32GB
- 驱动器:8x128GB SSD,4x2TB HDD
我使用 Hadoop 加载到 Titan 图中的数据具有以下规格:
- 总大小:848MB
- 拆分为四个文件(487MB、142MB、219MB 和 1.6MB),每个文件包含一种单一类型的顶点,以及所有顶点属性和出边。
在设置 Hadoop 集群时,我尝试使用一些逻辑推理将 Hadoop 的配置参数设置为(我认为是)最佳设置。请参阅下面的推理。
- 我的机器有 32 个内核,所以理论上我可以将输入大小分成块,这些块的大小足以最终得到大约 32 个块。因此,对于 848MB 的输入,我可以设置
dfs.block.size
为 32MB,这将导致大约 (848MB / 32MB ~ ) 27 个块。 - 为了确保每个 map 任务接收一个块,我将值设置为
mapred.min.split.size
比块大小小一点,mapred.max.split.size
比块大小大一点(例如分别为 30MB 和 34MB)。 - 每个任务所需的可用内存对我来说有点模糊。例如,我可以设置
mapred.child.java.opts
为-Xmx1024m
给每个任务(例如每个映射器/减速器)1GB 内存的值。鉴于我的机器总共有 256GB 内存——从中减去一些以保留用于其他目的,剩下大约 200GB 的内存——我最终可能总共有 (200GB / 1GB = ) 200 个映射器和减速器。或者,当我给每个任务 2GB 内存时,我最终会得到总共 100 个映射器和缩减器。我猜,分配给每个任务的内存量也取决于输入大小。无论如何,这会导致mapred.tasktracker.map/reduce.tasks.maximum
大约 100 的值,考虑到我只有 32 个内核,这可能已经太多了。map
因此,也许将此参数设置为 32reduce
可能会更好?你怎么看?
在这些假设之后,我最终得到以下配置。
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>
纱线站点.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
给了我三个 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 秒 ( 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
提前感谢您的回复!