• MapReduce深入理解输入和输出格式(1)-输入分片与记录


    一个输入分片( in put split)就是能够被单个map 操作 处理的输入块. 每一个map 操作只处理一个输入分片,并且一个一个地处理每条记录,也就是一个键/值对。输入分片和记录都是逻辑上的,并不必要将它们对应到文件(虽然一般情况下都是这样的)。在数据库中. 一个输入分片可以是一个表 的若干行,而一条记录就是这若干行中的一行(事实上DBlnputFormat 就是这么
    的,它是一种可以从关系数据库获取数据的一种格式).
    ①JobClient通过指定的输入文件的格式来生成数据分片InputSplit;
    ②一个分片不是数据本身,而是可分片数据的引用(你要用它的时候,根据他的应用地址,就找到了原始文件数据);一个InputSplit 有一个以字节为单位的长度以及一组存储位置(即一组主机名).存储位置是为了让 MapReduce 系统将map 操作放在离存储位置最近的机上,而长度是为了将单元 排序以使得最大的单元能够最先得到处理,以提高效率(这也是一种贪心近似算法) 。
    ③InputFormat接口负责生成分片;
    源码位置:org.apache.hadoop.mapreduce.lib.input包(新), org.apache.hadoop.mapred.lib 包(旧)
    查看其中FileInputFormat类中的getSplits()方法;
    computeSplitSize()函数决定分片大小;

    JobClient 调用getSplits() 方法,并以numSplits(如上图所示,新api传入的上下文,自然是可以的,必然含有分割的所有需要的数据) 为参数传入期望的map 任务 数,这个参数将作为一个参考值. InputFormat可以返回一个不同于这个值个数的单元。在计算好实际的分布的个数后,客户端将它们发送到jobtracker 上. jobtracker 会使用它们的存储位置信息将它们调度到相应的tasktracker 上执行。 在tasktracker 上, map 任务会将输入分片传递到InputFormat 的 getRecordReader() 方法中从而获得相应的RecordReader. RecordReader 基本就是记录上的迭代器,map 任务会使用RecordReader 来读取记录并且生成键/值对,然后再传递给map 函数.
    请看Mapper’s run()方法

    当执行了setup(),nextKeyValue()会被上下文重复调用。当所有的split记录遍历之后,map执行cleanup()。
    这边是分片输入的相关知识。

    各种输入类的结构关系图:
  • 相关阅读:
    2016.07.13-map的使用(以leetcode1-Two Sum为例)
    2016.6.26——Maximum Depth of Binary Tree
    centos7下docker发布第一个微服务应用(Eureka)
    centos7下快速安装Nginx服务器
    java队列Queue及阻塞队列
    JConsole连接远程linux服务器配置
    mysql时间与字符串之间相互转换
    Tomcat启动报错:org.apache.catalina.LifecycleException: Failed to start component...java.util.zip.ZipException: error in opening zip file
    java post请求的表单提交和json提交简单小结
    wagon-maven-plugin实现自动打包部署到服务器
  • 原文地址:https://www.cnblogs.com/mrcharles/p/11879842.html
Copyright © 2020-2023  润新知