从reduce直接写入hadoop映射文件

Posted

技术标签:

【中文标题】从reduce直接写入hadoop映射文件【英文标题】:Write directly to a hadoop map file from reduce 【发布时间】:2016-02-15 20:44:18 【问题描述】:

我有一个 reduce 方法,根据记录中的时间戳选择文件。

数据中的时间戳可以属于N个不同的天。(比如N=5) 根据日期,选择一个文件,并选择一个带有各自路径的 MapFile Writer。 N 条路径有 N 位作者

 Example : to write record 15-02-2016,Key1,value1 
 A Map File writer object writing to basePath/15-02-2016  will be selected 
and writes key1,value1 using selected writer.

下面是reduce方法

 @Override
 protected void reduce(CompositeKey key,Iterable<SomeDataWritable> dataList,
          Reducer<CompositeKey, SomeDataWritable, Text, OutputWritable>.Context context)
          throws IOException, InterruptedException 
          for(SomeDataWritable data:dataList)
            MyMapFileWriter.write(key.getTimeStamp(),key.getId(),new OutPutWritable(data);
           


MyMapFileWriter.write(long timestamp,Text key,OutPutWritable value)
writer=selectWriter(timestamp)// select writer based on timestamp
writer.append(key,value)

键按 (Day,id) 排序。 Partitioner 基于 Day 和 GroupingComparator 基于 (Day,id) 因此,reduce 调用应获取按 Id 排序的一天的所有记录。 这里可以直接从reduce写入文件吗?

写入map文件的key应该是升序,reduce方法的多个并行调用(在同一个reducer节点上)会导致key乱序吗?

【问题讨论】:

【参考方案1】:

我认为直接通过 writer 写入某些文件并不是一个好主意,因为它与 hadoop 与容错相关的想法不一致:您运行您的作业,某个节点出现故障,hadoop 尝试重新安排作业,但是由于您在没有 hadoop 标准机制的情况下写入文件,因此它无法对部分结果失败执行任何操作(您应该自己处理)。

根据“乱序键”。我不确定我是否理解您的问题,但是一个 reducer 将处理一个 key 的数据,例如一个 reducer 可以处理 key 的数据,另一个 reducer 可以处理 key 等的记录。

如果您理解正确,您应该在配置中指定减少输出路径FileOutputFormat.setOutputPath(job, OUTPUT_PATH),这样输入和输出路径就会不同。在这种情况下,您将在 OUTPUT_PATH 中收到与减速器相关的文件。

【讨论】:

如果一个 reducer 节点上有 3 个容器,并且 reducer 获取 2016-02-02 的所有密钥,比如 和 . 节点上的两个进程是否会尝试写入由键中的同一天值选择的同一文件?我必须根据一天的目录在减速器中写入记录,而 setOutputPath 不能这样做。我可以使用 mutipleOutputs ,每个减速器将写入他们的路径(基于他们收到的日期键)。一个减速器将写入一个路径仅限。 是的,它可能会发生。一键记录。例如 将在一个减速器中处理。但是key , 是不同的,所以它们可以被两个不同的reducer进程处理。 而且看起来最好使用 mutipleOutputs 机制(不使用直接写入 hdfs),因为在这种情况下容错是正确的。

以上是关于从reduce直接写入hadoop映射文件的主要内容,如果未能解决你的问题,请参考以下文章

如何从 spark rdd map 和 reduce 操作写入单个文件

MapReduce

向/从映射文件 C++ 写入和读取

如何自定义一个hadoop mapreducer中reducer输出的时候以csv文件输出。

存储映射--mmap

如何在不使用 map reduce 的情况下使用 lzo 压缩写入 hadoop hdfs