2015-10-20 76 views
0

我有一个mapreduce作业,可导出hbase表的纯文本。我正在模拟带有hbase并且不运行任何reducer的Export类。另外,我只是为这个键写了一个空字符串。事情是这样的:小型映射器零件文件

public void map(ImmutableBytesWritable key, Result value, Context context) throws IOException, InterruptedException { 
    List<Cell> cells = value.listCells(); 
    for(Cell cell : cells) { 
     context 
      .write(new Text(""), new Text(CellUtil.cloneValue(cell))); 
    } 
} 

这工作得很好,但我在然而,许多分裂的怜悯中有HBase的表方面的输出映射文件(例如部分M-NNNNN)的数量。

有没有办法在mapreduce作业中合并输出映射文件?

我已经考虑过使用一个1-50之间的随机整数作为键,然后使用一个reducer,然后在写出HDFS之前剥掉键,但是这看起来像是一个黑客。

回答

1

无论您的输入如何,我知道您要合并所有的地图输出。以下是选项。

  1. getmerge shell命令 - 这会将合并文件提供给本地目录。
  2. 使输入不可拆分,因此只有一个映射器运行和一个映射器输出 - 由于您正在阅读HBase,因此使用单个映射器执行整个工作可能不是一个好的选择。
  3. 写一个reducer并设置map reduce只有一个reducer,这就是你在做什么。

鉴于您与HBase的联系,1,3是不错的选择。不知道为什么你认为它是黑客。您可以使用行键作为映射器输出键而不是随机整数。

+0

如果我使用rowkey,我认为它会以相同的问题结束,因为这些密钥都非常不同,对吧? – javamonkey79

+1

您将获得每个映射器的一个输出文件。既然你需要分裂,你无法避免这种情况。行键正在自然移动以维护唯一键。由于您只配置一个reducer,因此所有mapper输出文件都将被引导至一个reducer。因此只有一个输出文件。 – Ramzy

+0

谢谢,我会尝试其中的一些 – javamonkey79