我正在尝试编写一个 MapReduce 作业来解析 CSV 文件,将数据存储在 HBase 中,并一次性执行 reduce 函数。理想情况下我想要
- Mapper输出好的记录到HBase Table GOOD
- Mapper输出坏记录到HBase表BAD
- Mapper 使用 key 将所有好的数据发送到 reducer
- 还想更新第三个表以指示存在新数据。该表将包含有关数据和日期的基本信息。每个 CSV 文件很可能只有一两条记录。
我知道如何使用 HBase MultiTableOutputFormat
执行 1 和 2,但不确定如何执行 3 和 4。
非常感谢任何有关如何执行此操作的指示。
我对如何做到这一点有一些想法:
对于 1 和 2,我将 ImmutableBytesWriteable
作为键,MultiTableOutputFormat
负责从 Mapper 进行存储。但是对于 3,我希望键是文本。
对于 #4,我应该在 Mapper 中通过以下方式执行此操作吗
- 扫描第三个 HBase 表以获取条目,如果没有则填充,否则跳过。我不喜欢这样,因为感觉效率很低。
- 或者我应该在 Mapper 中维护一个列表并在 Mapper 清理方法中写入 HBase?
- 有更好的方法吗?
最佳答案
mapper 通过设置 KeyValueTextInputFormat 读取 csv。
在 mapper 代码中,有一些逻辑来区分好记录和坏记录,并使用 Put(Hbase Api calls ) 将它们放入 Hbase 中。
在映射器设置中,可以初始化 hbaseTable 的处理程序。
可以使用 context.write(key,value) 将好的记录传递给 reducer,并在 reducer 中收集
关于java - Hadoop 映射器输出到 HBase 表和一个缩减器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24519288/