hadoop split

文件上传到HDFS前,InputFormat接口的getSplits方法会将文件划分切割成为若干个可序列化的split。

InputFormat主要用于描述输入数据的格式,它提供以下连个功能:

数据切分:按照某个规则策略将输入的数据切分成若干个split,以便确定Map Task的个数以及对应的split;

为Mapper提供输入数据:给定某个split,能将其解析成一个个的key/value对。

      getSplits主要完成数据的切分功能,把输入的数据切分成numSplits个inputSplit,inputSplit有以下两个特点

             逻辑切分:它至少在逻辑上切分输入的数据,并不会再磁盘上将其切分存储,InputSplit只记录切分之后分片的元数据信息,比如起始位置长度以及所在节点列表等

              可序列化:在Hadoop中,对象的序列化主要有两个作用,进程间通信和永久存储。InputSplit的可序列化主要是为了进程间的通讯。作业提交到JobTracker之前,   Client会调用作业的InputFormat中的getSplits方法,并且将得到的InputSplit序列化到文件中。当JobTracker对提交上来的作业初始化的时候可以直接读取该文件,然后解析所有的InputSplit并且创建MapTask

        getRecordReader方法返回一个RecordReader对象,该对象将输入的InputSplit解析成若干个key/value对,MapReduce框架在Map Task执行过程中,会不断的调用RecordReader对象中的方法,迭代获取key/value对并交给map函数处理。



一个大数据的文件一般要划分为若干个split,因此,处理一个split的时间远远小于处理整个大数据文件的时间,根据木桶效应,整个Map处理的速度则是由群集中所有运行map节点的最慢的那个节点决定,如果将splits分成较为细粒度的数据大小,而同时对不同的节点计算机根据其速度分配splits个数,可以获得更好的负载均衡。

一般大多数的split与HDFS中的block大小相同,可以使Map可以在存储有当前数据的节点上运行本地的任务,而不需要通过网络进行跨节点的任务调度。



你可能感兴趣的:(hadoop,split)