MapReduce程序开发中的FileInputFormat与TextInputFormat

2016年4月3日20:17:44

                                                             MapReduce程序开发中的FileInputFormat与TextInputFormat

                                                                                                   作者:数据分析玩家

       在MapReduce程序的开发过程中,往往需要用到FileInputFormat与TextInputFormat,但是这两个类究竟是用来做什么的,在源代码的追踪过程中,我们会发现TextInputFormat这个类继承自FileInputFormat,FileInputFormat这个类继承自InputFormat,而在InputFormat的源代码中:
       * Split-up the input file(s) into logical {@link InputSplit}s, each of
       * which is then assigned to an individual {@link Mapper}.
通过这段源代码:我们可以大致知道:InputFormat这个类会将文件file按照逻辑进行划分,划分成的每一个split切片将会被分配给一个Mapper任务,而在MapReduce的原理运行中:
        

我们可以发现确实是这样的,文件先被切分成split块,而后每一个split切片对应一个Mapper任务
下面:我们将对FileInputFormat与TextInputFormat这两个类的具体功能进行阐述

FileInputFormat这个类先对输入文件进行逻辑上的划分,以64M为单位,将原始数据从逻辑上分割成若干个split,每个split切片对应一个Mapper任务


对于FileInputFormat这个类,我们需要注意:FileInputFormat这个类只划分比HDFS的block块大的文件,所以FileInputFormat划分的结果是这个文件或者是这个文件中的一部分.如果一个文件的大小比block块小,将不会被FileInputFormat这个类进行逻辑上的划分,此时每一个小文件都会当做一个split块并分配一个Mapper任务,导致效率低下.这也是Hadoop处理大文件的效率要比处理很多小文件的效率高的原因。

当FileInputFormat这个类将文件file切分成block块之后,TextInputFormat这个类随后将每个split块中的每行记录解析成一个一个的键值对,即<k1,v1>.


综上:我们可以简单理解为FileInputFormat这个类是将文件file切分成split块,而TextInputFormat这个类是负责将每一行记录解析为键值对<k1,v1>.

                                                                                                                                                                                        2016年4月3日21:13:05




       



  • 7
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
MapReduce是一种分布式计算框架,可以方便地处理大规模数据集。在HadoopMapReduce被广泛应用于数据处理和分析。下面是一个基于MapReduce的文件合并和去重的实现方法。 假设我们有一批文本文件需要合并,并且这些文件可能包含重复的数据记录。我们需要使用MapReduce来实现这个任务。 首先,我们需要定义MapReduce的输入和输出格式。对于输入,我们将每个文件作为一个输入记录,并将文件的内容作为值。对于输出,我们将每个不重复的记录作为一个输出记录,并将记录的内容作为值。 接下来,我们需要实现Map和Reduce函数。Map函数将每个输入记录解析为多个数据记录,并将它们映射到键-值对。对于我们的文件合并和去重任务,我们可以使用文件的每一行作为一个输入记录,并将行内容作为值。在Map函数,我们将每个行内容作为键,并将一个固定的值作为值。这样,Map函数将为每个不同的行内容生成一个键-值对。 Reduce函数将相同键的所有值合并为一个输出记录,并将输出记录写入输出文件。对于我们的文件合并和去重任务,Reduce函数将接收到每个不同行内容的键-值对,并将它们合并为一个输出记录。输出记录的键是行内容,值是固定的值。 下面是一个伪代码实现: ```python class MergeAndDeduplicationMapper extends Mapper<LongWritable, Text, Text, Text> { public void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException { // 将每一行作为一个键,将固定的值作为值 String[] lines = value.toString().split("\n"); for (String line : lines) { context.write(new Text(line), new Text("1")); } } } class MergeAndDeduplicationReducer extends Reducer<Text, Text, Text, Text> { public void reduce(Text key, Iterable<Text> values, Context context) throws IOException, InterruptedException { // 将相同的键合并为一个输出记录 context.write(key, new Text("1")); } } // 配置作业并运行 job.setInputFormatClass(TextInputFormat.class); job.setOutputFormatClass(TextOutputFormat.class); job.setOutputKeyClass(Text.class); job.setOutputValueClass(Text.class); job.setMapperClass(MergeAndDeduplicationMapper.class); job.setReducerClass(MergeAndDeduplicationReducer.class); FileInputFormat.addInputPath(job, new Path(inputPath)); FileOutputFormat.setOutputPath(job, new Path(outputPath)); job.waitForCompletion(true); ``` 在上面的代码,我们使用TextInputFormat作为输入格式,并使用TextOutputFormat作为输出格式。我们还指定了Mapper和Reducer类,并设置了输入和输出键-值的类型。最后,我们将输入和输出路径添加到作业,并运行作业。 在运行MapReduce作业后,我们将得到一个合并并去重后的输出文件,其包含所有不同的行内容。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一只懒得睁眼的猫

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值