2015-10-01 47 views
0

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

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

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

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

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

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

  • 我的机器有32个核心,所以理论上我可以把我的输入大小分成大小足够大的块,最终大概有32块。因此,对于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以给每个任务(例如每个映射器/缩减器)1GB的内存。考虑到我的机器总共有256GB内存 - 将其中的一些从内存中减去以备其他用途留下200GB左右的内存 - 我最终可能会得到总计(200GB/1GB =)200个映射器和reducer。或者,当我给每个任务2GB的内存时,我最终会得到总共100个映射器和缩减器。给我的每个任务的内存量也取决于输入大小,我猜。无论如何,这导致mapred.tasktracker.map/reduce.tasks.maximum的值大约为100,这可能已经太多了,因为我只有32个内核。因此,对于mapreduce,可能将此参数设置为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现场。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命令(iostat -d -x 5 3给出了三次5秒间隔的报告)来查看IO吞吐量。下面显示了这样一份报告的样本。

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秒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

设置此参数纱-site.xml中的核心数量,你机器有:

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

然后运行从Hadoop的例子罐子PI与资源管理器的网页许多映射器是如何被执行观察在同一时间

+0

是否还有一个控制台版本的资源管理器,我可以使用,这给了我的网页相同的信息?我无法访问图形用户界面。 – Froodooo

+0

我在执行过程中(例如'http:// machine:8088/ws/v1/cluster/metrics')查询了ResourceManager API,发现* containersPending *的值大于零,表示容器正在等待然后才能执行,而我的机器上仍有空闲的内核。这表明并非所有内核都在同时执行作业。 – Froodooo

+0

我不认为有任何。你可以尝试使用像lynx这样的控制台浏览器,或者使用gui连接另一台机器。您是否运行了pi示例,或者您仍在使用自己的应用程序/数据进行测试?我在问,因为在某些情况下,您的自定义数据不可拆分(当您的工作使用较少的资源时可能会出现其他情况)。使用pi进行测试,您会丢弃应用程序或数据的问题。 – facha