MapReduce-文本输入

1.TextInputFormat

TextInputFormat是默认的InputFormat。每条记录是一行输入。键是LongWritable类型,存储该行在整个文件中的字节偏移量。值是这行的内容,不包括任何行终止符(换行符和回车符),它被打包成一个Text对象。
一般情况下,很难取得行号,因为文件按字节而不是按行切分为分片。每个分片单独处理。在分片内知道行号是可能的,但在文件中是不可能的。

输入分片与HDFS块之间的关系
FileInputFormat定义的逻辑记录有时并不能很好地匹配HDFS的文件快。例如,TextInputFormat的逻辑记录是以行为单位的,name有可能某一行会跨文件块存放。虽然这对程序的功能没有什么影响,如行不会丢失或出错,但这种现象应该引起注意,因为这意味着那些本地化的map(即map运行在输入数据所在的主机上)会执行一些远程的读操作。由此而来的额外开销一般不是特别明显。

2.关于KeyValueTextInputFormat

TextInputFormat的键,即每一行在文件中的字节偏移量,通常并不是特别有用。通常情况下,文件中的每一行是一个键/值对,使用某个分界符进行分隔,比如制表符。例如以下数据,用KeyValueTextInputFormat处理比较合适。
Line1 content1
Line2 content2
可以通过mapreduce.input.keyvaluelinerecordreader.key.value.separator属性来指定分隔符。它的默认值是一个制表符。与TextInputFormat类似,输入是一个包含4条记录的分片,不过此时的键是每行排在制表符之前的Text序列:
Line1,content1
Line2,content2

3.关于NLineInputFormat

通过TextInputFormat和KeyValueTextInputFormat,每个mapper收到的输入行数不同。行数取决于输入分片的大小和行的长度。如果希望mapper收到固定行数的输入,需要将NLineInputFormat作为InputFormat。与TextInputFormat一样,键是文件中行的字节偏移量,值是行本身。
N是每个mapper收到的输入行数。N设置为1(默认值)时,每个mapper正好收到一行输入。mapreduce.input.lineinputformat.linespermap属性实现N值的设定。
通常来说,对少量输入行执行map任务是比较抵消的(任务初始化的额外开销造成的),但有些应用程序会对少量数据做一些扩展的计算任务,然后产生输出。仿真例子:通过生成一个指定输入参数的输入文件,每行一个参数,便可以执行一个参数扫描分析:并发运行一组仿真实现,看模型是如何随参数不同而变化的。
另一个例子是用Hadoop引导从多个数据源(如数据库)加载数据。创建一个种子输入文件,记录所有的数据源,一行一个数据源。然后每个mapper分到一个数据源,并从这些数据源中加载数据到HDFS中。这个作业不需要reduce阶段,所以reduce的数据应该被设成0.MapReduce作业就可以处理加载到HDFS中的数据。

猜你喜欢

转载自www.cnblogs.com/EnzoDin/p/9503176.html