zoukankan      html  css  js  c++  java
  • hadoop-InputFormat-Split-任务并行度

    首先来看 MapReduce 流程图

    一个 map,一个 reduce,中间靠 shuffle 连接,shuffle 左边被划分到 map,右边被划分到 reduce

    InputFormat

    input 是个文件,进入 mapper 后变成一行一行,如何实现的呢?

    在 hadoop 中实现的方法叫 inputFormat;

    它先对 原始文件进行 切片 Split,然后把每个 Split 转换成 line

    mapreduce 是个分布式计算框架,它如何实现并行呢?

    比如 1G 的数据假设划分 8 份,每份128M,那 1M 的数据呢,也划分 8 份,每份才128K,感觉不靠谱,

    到底如何划分,就是我们所说的 InputFormat 中的 Split

    Split 与 MapTask 并行度

    在 hadoop中,MapTask 并行度是靠 Split 决定的,有多少个 Split,就有多少个 task 并行;

    那如何 Split 呢?

    首先明确两点:

    1. HDFS 上数据文件是以 block 存储的,一个 block 默认 128M

    2. Split 是逻辑上的切分,而不会像 block 一样进行物理切分

    Split 方式分析

    假设 HDFS 上有个文件 300M,分为 3 个 block 存储,两个block 128M,另一个 44M;

    假设我们按 100M 进行切分,如图

    我们知道 hadoop 任务调度有个原则叫数据本地化,就是说尽量把任务发配到存放所需数据的节点上,从而避免网络传输;

    上面的划分方式,仅仅是 300M 的数据,就传输了 28+56=84M, 显然效率不会高

    假设我们按 block 进行切分,如图

    虽然每个任务 处理的数据量稍微大了点,但是避免了网络传输,效率比较高 

    总结:

    1.  MapTask 的并行度由切片数决定

    2. 一个 切片对应一个 MapTask

    3. 默认情况下,切片大小=BlockSize,这种方式也是比较高效的

    4. 切片时不考虑数据集整体,而是针对单个文件进行切片

    如一个数据集有3个文件,一个 300M,一个 50M,一个20M,那么第一个文件切3份,第二个文件切1份,第三个文件切1份,彼此独立切分,互不影响

  • 相关阅读:
    Log4j,Log4j2,logback,slf4j日志学习(转)
    MultipartFile类
    @Transactional(转)
    redis序列化和反序列化
    redis常见问题(转)
    为什么说Redis是单线程的以及Redis为什么这么快!(转)
    Numpy 用法小结
    正则表达式使用小结
    Hive 窗口函数、分析函数
    Hive UDF开发实例学习
  • 原文地址:https://www.cnblogs.com/yanshw/p/12020855.html
Copyright © 2011-2022 走看看