我有一个导出 hbase 表的纯文本的 mapreduce 作业。我正在模拟 hbase 附带的 Export 类,但不运行任何 reducer 。此外,我只是为键写了一个空字符串。像这样:
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 表中关于输出映射文件数量(例如 part-m-NNNNN)的许多 split 的支配。
有没有办法在 mapreduce 作业中合并输出映射文件?
我考虑过使用一个介于 1-50 之间的随机整数作为 key ,然后使用一个 reducer,然后在写入 HDFS 之前剥离 key ,但这似乎是一种 hack。
最佳答案
无论您输入什么,我都知道您想合并所有 map 输出。以下是选项。
- getmerge shell 命令 - 这会将合并的文件提供给本地目录。
- 使输入不可拆分,因此只有一个映射器运行和一个映射器输出 - 由于您正在阅读 HBase,因此让一个映射器完成整个工作可能不是一个好的选择。
- 编写一个 reducer 并将 map reduce 设置为只有一个 reducer,这就是您正在做的。
鉴于您与 HBase 的链接,1,3 是不错的选择。不确定您为什么将其视为 Hack。您可以使用行键作为映射器输出键而不是随机整数。
关于java - 紧凑型映射器零件文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33226665/