zoukankan      html  css  js  c++  java
  • [Hadoop] mapper数量的控制

    确定map任务数时依次优先参考如下几个原则:

    1)      每个map任务使用的内存不超过800M,尽量在500M以下

    比如处理256MB数据需要的时间为10分钟,内存为800MB,此时如果处理128MB时,内存可以减小为400MB,则选择每一个map的处理数据量为128MB

    2)      每个map任务运行时间控制在大约20分钟,最好1-3分钟

    比如处理256MB数据需要的时间为30分钟,内存为200MB,则应该考虑减小map的计算时间,比如将每一个map的处理数据量设置为128MB,将时间减小为15分钟。

    3)      每个map任务处理的最大数据量为一个HDFS块大小(目前为256MB),一个map任务处理的输入不能跨文件

    比如指定map任务数为N,输入数据总量为S。如果S / N > 256MB,平台会自动增加map任务数使每个map任务处理数据量不超过256MB;如果S / N < 256MB,平台认为每个map任务最多处理S/N大小的数据,但是一个map任务的输入不能跨文件,所以可能有的文件切分到最后一部分时较小于S/N,那么下一个map任务的输入小于平均,最终的map任务数大于N。最终实际运行的map任务数可以在JobTracker监控页面查看。

    4)      map任务总数不超过平台可用的任务槽位

    如果在一个map处理256MB时就能将平台可用的任务槽位占满,此时不应该再增加map任务数。

    ~ 《Hadoop-v2_Streaming 使用手册》

    可以通过 -D mapred.map.tasks=mapper个数 来调整

    (也可以通过mapred.max.split.size(ex. =512000000)调节逻辑块的大小。但是对于hadoop streaming: split size大小是被自动优化过的默认值,只调split.size参数可能不能生效,可以配合调inputformat等)

    block size和split size的区别

    block size是hdfs中每个数据块的物理大小,比如64MB, 128MB

    一般来说,mapper在split时默认按照block size来分的,那么mapper的个数就是 data_size / block_size 向上取整。

    split size是可以人为指定的逻辑块的大小,当希望mapper数量小一些的时候,可以把split size指定的大一些,这样 data_size / split_size 向上取整之后就是新的mapper个数。

    为什么要调整mapper的个数

    每个mapper相当于可以执行并行计算的工人,mapper多一些,就多一些数据被并行计算,这样看起来似乎mapper多一些运行的更快;

    但是要考虑到由于集群资源限制,有时候并不是设置的所有mapper都可以并行执行,是先执行一些mapper,完成一个mapper再调度新的mapper,这样就有任务调度时候的时间开销。

    (1) 如果每个mapper分到的数据比较小,那么这个mapper执行是比较快的,比如几十秒,那么hadoop就要去调度执行其他的mapper,这里有个调度任务的时间。

    如果mapper数量非常大,而每个mapper执行时间又很短,那么可能很大一部分时间不是用于执行任务了,而是用于调度了,这样总的运行时间就会较长,不够高效。

    看上面的tip提到的每个mapper运行时间的建议,一般可以通过调节split size的大小,即控制给每个mapper的数据大小,来调节每个mapper的运行时间,进而提高运行效率。

    (2) 如果每个mapper分到的数据比较大,一方面是内存占用比较大,容易爆内存;另一方面,如果单个mapper运行时间过长,这个mapper压力是比较大的,如果可以多设置一些mapper,可以更好的实现并行运算,进而提高效率。

  • 相关阅读:
    LeetCode_167. Two Sum II
    LeetCode_160. Intersection of Two Linked Lists
    LeetCode_155. Min Stack
    LeetCode_141. Linked List Cycle
    LeetCode_136. Single Number
    LeetCode_125. Valid Palindrome
    HTML解析类 ,让你不使用正则也能轻松获取HTML相关元素 -C# .NET
    .net 根据匿名类生成实体类,根据datatable生成实体类,根据sql生成实体类
    将form表单元素转为实体对象 或集合 -ASP.NET C#
    ASP.NET 图片上传工具类 upload image简单好用功能齐全
  • 原文地址:https://www.cnblogs.com/shiyublog/p/13500564.html
Copyright © 2011-2022 走看看