MapReduce的InputFormat数据输入

1.Job提交流程和切片源码详解

1.Job提交流程和切片源码详解
(1) job提交流程源码详解

waitForCompletion()
submit();
// 1建立连接
       connect(); 
              // 1)创建提交job的代理
              new Cluster(getConfiguration());
                     // (1)判断是本地yarn还是远程
                     initialize(jobTrackAddr, conf);
       // 2 提交job
submitter.submitJobInternal(Job.this, cluster)
       // 1)创建给集群提交数据的Stag路径
       Path jobStagingArea = JobSubmissionFiles.getStagingDir(cluster, conf);
       // 2)获取jobid ,并创建job路径
       JobID jobId = submitClient.getNewJobID();
       // 3)拷贝jar包到集群
copyAndConfigureFiles(job, submitJobDir);  
       rUploader.uploadFiles(job, jobSubmitDir);
// 4)计算切片,生成切片规划文件
writeSplits(job, submitJobDir);
       maps = writeNewSplits(job, jobSubmitDir);
              input.getSplits(job);
// 5)向Stag路径写xml配置文件
writeConf(conf, submitJobFile);
       conf.writeXml(out);
// 6)提交job,返回提交状态
status = submitClient.submitJob(jobId, submitJobDir.toString(), job.getCredentials());

在这里插入图片描述
(2) FileInputFormat源码解析
① 找到你数据存储的目录。
② 开始遍历处理(规划切片)目录下的每一个文件
③ 遍历第一个文件ss.txt

  • a)获取文件大小fs.sizeOf(ss.txt)
    b)计算切片大小computeSliteSize(Math.max(minSize,Math.min(maxSize,blocksize)))=blocksize=128M
    c)默认情况下,切片大小=blocksize
    d)开始切,形成第1个切片:ss.txt—0:128M 第2个切片ss.txt—128:256M 第3个切片ss.txt—256M:300M(每次切片时,都要判断切完剩下的部分是否大于块的1.1倍,不大于1.1倍就划分一块切片
    e)将切片信息写到一个切片规划文件中
    f)整个切片的核心过程在getSplit()方法中完成
    g)数据切片只是在逻辑上对输入数据进行分片,并不会再磁盘上将其切分成分片进行存储。InputSplit只记录了分片的元数据信息,比如起始位置、长度以及所在的节点列表等
    h)注意:block是HDFS物理上存储的数据,切片是对数据逻辑上的划分

④ 提交切片规划文件到yarn上,yarn上的MrAppMaster就可以根据切片规划文件计算开启maptask个数。

2.InputFormat接口实现类

MapReduce任务的输入文件一般是存储在HDFS里面。输入的文件格式包括:基于行的日志文件、二进制格式文件等。这些文件一般会很大,达到数十GB,甚至更大。那么MapReduce是如何读取这些数据的呢?下面我们首先学习InputFormat接口。
InputFormat常见的接口实现类包括:TextInputFormat、KeyValueTextInputFormat、NLineInputFormat、CombineTextInputFormat和自定义InputFormat等。
(1) TextInputFormat
TextInputFormat是默认的InputFormat。每条记录是一行输入。键是LongWritable类型,存储该行在整个文件中的字节偏移量。值是这行的内容,不包括任何行终止符(换行符和回车符)。

Rich learning form
Intelligent learning engine
Learning more convenient
From the real demand for more close to the enterprise
(0,Rich learning form)
(19,Intelligent learning engine)
(47,Learning more convenient)
(72,From the real demand for more close to the enterprise)

(2) KeyValueTextInputFormat
每一行均为一条记录,被分隔符分割为key,value。可以通过在驱动类中设置conf.set(KeyValueLineRecordReader.KEY_VALUE_SEPERATOR, " ");来设定分隔符。默认分隔符是tab(\t)。

line1 ——>Rich learning form
line2 ——>Intelligent learning engine
line3 ——>Learning more convenient
line4 ——>From the real demand for more close to the enterprise
(line1,Rich learning form)
(line2,Intelligent learning engine)
(line3,Learning more convenient)
(line4,From the real demand for more close to the enterprise)

(3) NLineInputFormat
如果使用NlineInputFormat,代表每个map进程处理的InputSplit不再按block块去划分,而是按NlineInputFormat指定的行数N来划分。即输入文件的总行数/N=切片数,如果不整除,切片数=商+1。

Rich learning form
Intelligent learning engine
Learning more convenient

例如,如果N是2,则每个输入分片包含两行。开启2个maptask。

(0,Rich learning form)
(19,Intelligent learning engine)

另一个 mapper 则收到后两行:

(47,Learning more convenient)
(72,From the real demand for more close to the enterprise)

(4) CombineTextInputFormat切片机制
默认情况下TextInputformat对任务的切片机制是按文件规划切片,不管文件多小,都会是一个单独的切片,都会交给一个maptask,这样如果有大量小文件,就会产生大量的maptask,处理效率极其低下。

  1. a.最好的办法,在数据处理系统的最前端(预处理/采集),将小文件先合并成大文件,再上传到HDFS做后续分析。 b.
    补救措施:如果已经是大量小文件在HDFS中了,可以使用另一种InputFormat来做切片(CombineTextInputFormat),它的切片逻辑跟TextFileInputFormat不同:它可以将多个小文件从逻辑上规划到一个切片中,这样,多个小文件就可以交给一个maptask。
    c. 优先满足最小切片大小,不超过最大切片大小
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值