利用单机Hadoop上的所有核心

时间:2015-10-01 08:49:23

标签: hadoop io disk titan utilization

目前我正在使用Hadoop(Titan版本0.5.4,Hadoop版本2.6.0)将数据加载到Titan图表中。我正在使用单服务器(伪分布式)Hadoop集群,目的是扩展到具有相同硬件的更多计算机的完整集群。我正在尝试以这样一种方式设置Hadoop,以便获得完整的核心利用率。到目前为止,虽然我已经使用良好的配置参数进行了一些不错的设置,但是当Hadoop正在执行并将数据加载到Titan图中时,我看不到我机器上所有内核的完全利用率。

情况如下。我正在使用的机器具有以下硬件规格:

  • CPU:32核
  • RAM:256GB
  • 交换内存:32GB
  • 驱动器:8x128GB SSD,4x2TB HDD

我使用Hadoop加载到Titan图中的数据具有以下规范:

  • 总大小:848MB
  • 分为四个文件(487MB,142MB,219MB和1.6MB),每个文件包含一种类型的顶点,以及所有顶点属性和传出边。

在设置Hadoop集群时,我尝试使用一些逻辑推理将Hadoop的配置参数设置为他们(我认为是)的最佳设置。请参阅下面的推理。

  • 我的机器有32个核心,所以理论上我可以把我的输入大小分成几个大小足以最终大约32个chuncks的块。因此,对于848MB的输入,我可以将dfs.block.size设置为32MB,这将导致大约(848MB / 32MB~)27个块。
  • 为了确保每个map任务都收到一个chunck,我将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个核心,这可能已经太多了。因此,对于mapreduce,将此参数设置为32可能更好?你觉得怎么样?

在这些假设之后,我最终得到以下配置。

HD​​FS-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

预先感谢您的回复!

1 个答案:

答案 0 :(得分:0)

将yarn-site.xml中的此参数设置为您加工的多个核心:

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

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