gpt4 book ai didi

hadoop - 使用 MultipleOutputs 在 MapReduce 中写入 HBase

转载 作者:可可西里 更新时间:2023-11-01 14:21:37 26 4
gpt4 key购买 nike

我目前有一个 MapReduce 作业,它使用 MultipleOutputs 将数据发送到多个 HDFS 位置。完成后,我使用 HBase 客户端调用(在 MR 之外)将一些相同的元素添加到几个 HBase 表中。使用 TableOutputFormat 将 HBase 输出添加为额外的 MultipleOutputs 会很好。这样,我将分发我的 HBase 处理。

问题是,我无法让它工作。有没有人在 MultipleOutputs 中使用过 TableOutputFormat ...?有多个 HBase 输出?

基本上,我正在设置我的收集器,就像这样....

Outputcollector<ImmutableBytesWritable, Writable> hbaseCollector1 = multipleOutputs.getCollector("hbase1", reporter); 
Outputcollector<ImmutableBytesWritable, Writable> hbaseCollector2 = multipleOutputs.getCollector("hbase2", reporter);
Put put = new Put(mykey.getBytes());
put.add("family".getBytes(), "column".getBytes(), somedata1);
hbaseCollector1.collect(NullWritable.get(), put);

put = new Put(mykey.getBytes());
put.add("family".getBytes(), "column".getBytes(), somedata2);
hbaseCollector2.collect(newImmutableBytesWritable(mykey.getBytes()), put);

我认为这似乎遵循了hbase编写的一般思路。

在我键入此内容时,部分问题可能更多地出现在工作定义中。看起来 MR(和 Hbase)想要一个全局参数集,就像这样....

conf.set(TableOutputFormat.OUTPUT_TABLE, "articles");

提供表名。麻烦的是,我有两个表....

有什么想法吗?

谢谢

最佳答案

我用 3 种不同的方式将数据放入 HBase。最有效(和分布式)的方法是使用 HFileOutputFormat 类。

我按如下方式设置作业...(请注意,这是根据实际代码编辑的,但核心内容仍然存在)

cubeBuilderETLJob.setJobName(jobName);
cubeBuilderETLJob.setMapOutputKeyClass(ImmutableBytesWritable.class);
cubeBuilderETLJob.setMapOutputValueClass(Put.class);
cubeBuilderETLJob.setMapperClass(HiveToHBaseMapper.class);
cubeBuilderETLJob.setJarByClass(CubeBuilderDriver.class);
cubeBuilderETLJob.setInputFormatClass(TextInputFormat.class);
cubeBuilderETLJob.setOutputFormatClass(HFileOutputFormat.class);
HFileOutputFormat.setOutputPath(cubeBuilderETLJob, cubeOutputPath);
HTable hTable = null;
Configuration hConf = HBaseConfiguration.create(conf);
hConf.set("ZOOKEEPER_QUORUM", hbaseZookeeperQuorum);
hConf.set("ZOOKEEPER_CLIENTPORT", hbaseZookeeperClientPort);
hTable = new HTable(hConf, tableName);
HFileOutputFormat.configureIncrementalLoad(cubeBuilderETLJob, hTable);

如我们所见,我的 Mapper 类称为 HiveToHBaseMapper - 不错且原创。 :) 这是它的(再次粗略的)定义

public class HiveToHBaseMapper extends
Mapper<WritableComparable, Writable, ImmutableBytesWritable, Put> {
@Override
public void map(WritableComparable key, Writable val, Context context)
throws IOException, InterruptedException {
Configuration config = context.getConfiguration();
String family = config.get("FAMILY");
Double value = Double.parseDouble(sValue);
String sKey = generateKey(config);
byte[] bKey = Bytes.toBytes(sKey);
Put put = new Put(bKey);
put.add(Bytes.toBytes(family), Bytes.toBytes(column), (value <= 0)
? Bytes.toBytes(Double.MIN_VALUE)
: Bytes.toBytes(value));
ImmutableBytesWritable ibKey = new ImmutableBytesWritable(bKey);
context.write(ibKey, put);
}

我不知道您是否可以使用它来将其放入 MultipleOutputs 或需要创建一个新的 MR 作业。这是我遇到的将数据导入 HBase 的最佳方式。 :)

这有望帮助您找到解决方案的正确方向。

关于hadoop - 使用 MultipleOutputs 在 MapReduce 中写入 HBase,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5983122/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com