0

目前我正在使用 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 限制,例如在磁盘sdbsbcsdd上?

编辑:也许可以通过使用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

提前感谢您的回复!

4

1 回答 1

0

在 yarn-site.xml 中将此参数设置为您机器拥有的内核数:

<property>
<name>yarn.scheduler.maximum-allocation-vcores</name>
<value>32</value>
</property>

然后从 hadoop-examples jar 运行 pi 并使用资源管理器的网页观察同时执行了多少个映射器

于 2015-10-01T10:48:37.260 回答