java - 紧凑型映射器零件文件

标签 java hadoop mapreduce hbase

我有一个导出 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 输出。以下是选项。

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

鉴于您与 HBase 的链接,1,3 是不错的选择。不确定您为什么将其视为 Hack。您可以使用行键作为映射器输出键而不是随机整数。

关于java - 紧凑型映射器零件文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33226665/

相关文章:

java - EntityManager createQuery 上的 QuerySyntaxException hibernate 无效路径

xml - 包含有关调度程序,任务跟踪程序和作业跟踪程序通信的信息的文件

hadoop - 编写MapReduce作业以同时下载文件?

java - Reducer 在 mapper 完成之前启动

java - 类不存在:终端中的Mapreduce程序

java - 在 Java 中复制对象

java - 计算以相同子串开头和结尾的最大子串的长度

hadoop - hadoop中的 block 大小

javascript - 使用 underscore.js 可以减少返回数组?

java - 我一直遇到错误,但是无论我做什么,我似乎都无法修复它们。