gpt4 book ai didi

java - 使用 MapReduce 作业的 HBase 批量删除

转载 作者:可可西里 更新时间:2023-11-01 14:34:03 27 4
gpt4 key购买 nike

我正在尝试使用 mapreduce 作业从 Hbase 表中删除行。

我收到以下错误。

java.lang.ClassCastException: org.apache.hadoop.hbase.client.Delete cannot be cast to org.apache.hadoop.hbase.KeyValue
at org.apache.hadoop.hbase.mapreduce.HFileOutputFormat$1.write(HFileOutputFormat.java:124)
at org.apache.hadoop.mapred.ReduceTask$NewTrackingRecordWriter.write(ReduceTask.java:551)
at org.apache.hadoop.mapreduce.task.TaskInputOutputContextImpl.write(TaskInputOutputContextImpl.java:85)
at org.apache.hadoop.mapreduce.lib.reduce.WrappedReducer$Context.write(WrappedReducer.java:99)
at org.apache.hadoop.mapreduce.Reducer.reduce(Reducer.java:144)
at org.apache.hadoop.mapreduce.Reducer.run(Reducer.java:164)
at org.apache.hadoop.mapred.ReduceTask.runNewReducer(ReduceTask.java:610)
at org.apache.hadoop.mapred.ReduceTask.run(ReduceTask.java:444)
at org.apache.hadoop.mapred.Child$4.run(Child.java:268)
at java.security.AccessController.doPrivileged(Native Method)
at javax.security.auth.Subject.doAs(Subject.java:396)
at org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.

看起来这是由 configureIncrementalLoad 将输出设置为 KeyValue 引起的。它只有 PutSortReducer 和 KeyValueSortReducer 而没有 DeleteSortReducer。

我的代码:

import java.io.IOException;

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.conf.Configured;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.hbase.HBaseConfiguration;
import org.apache.hadoop.hbase.client.Delete;
import org.apache.hadoop.hbase.client.HTable;
import org.apache.hadoop.hbase.io.ImmutableBytesWritable;
import org.apache.hadoop.hbase.mapreduce.HFileOutputFormat;
import org.apache.hadoop.io.LongWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Job;
import org.apache.hadoop.mapreduce.Mapper;
import org.apache.hadoop.mapreduce.lib.input.FileInputFormat;
import org.apache.hadoop.mapreduce.lib.input.TextInputFormat;
import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;
import org.apache.hadoop.util.GenericOptionsParser;
import org.apache.hadoop.util.Tool;
import org.apache.hadoop.util.ToolRunner;

public class DeleteRows extends Configured implements Tool {

public static class Map extends
Mapper<LongWritable, Text, ImmutableBytesWritable, Delete> {

ImmutableBytesWritable hKey = new ImmutableBytesWritable();
Delete delRow;

@Override
protected void map(LongWritable key, Text value, Context context)
throws IOException, InterruptedException {
hKey.set(value.getBytes());
delRow = new Delete(hKey.get());
context.write(hKey, delRow);
// Update counters
context.getCounter("RowsDeleted", "Success").increment(1);
}
}


@SuppressWarnings("deprecation")
public int run(String[] args) throws Exception {
Configuration conf = new Configuration();
args = new GenericOptionsParser(conf, args).getRemainingArgs();
HBaseConfiguration.addHbaseResources(conf);

Job job = new Job(conf, "Delete stuff!");
job.setJarByClass(DeleteRows.class);

job.setMapperClass(Map.class);
job.setMapOutputKeyClass(ImmutableBytesWritable.class);
job.setMapOutputValueClass(Delete.class);

job.setInputFormatClass(TextInputFormat.class);
FileInputFormat.addInputPath(job, new Path(args[0]));

HTable hTable = new HTable(args[2]);
// Auto configure partitioner and reducer
HFileOutputFormat.configureIncrementalLoad(job, hTable);
FileOutputFormat.setOutputPath(job, new Path(args[1]));

job.waitForCompletion(true);
return (0);
}

public static void main(String[] args) throws Exception {
int exitCode = ToolRunner.run(new DeleteRows(), args);
System.exit(exitCode);
}
}

是否有更好/更快的方法来使用行键删除大量行?显然删除映射器中的每一行是可能的,但我认为这比将删除批量推送到正确的区域服务器要慢。

最佳答案

您的目标是生成内部带有Delete 流(实际上是删除标记为KeyValue)的HFile。这样做的标准方法是使用 HFileOutputFormat。实际上,您只能将 KeyValue 流更改为这种格式,并且有 2 个标准 reducer:PutSortReducerKeyValueSortReducer。将 reduce 任务的数量设置为 0,您实际上将所有 Delete 直接传递给输出格式,这当然是行不通的。

您最明显的选择:

  • 添加你的 reducer DeleteSortReducer。这样的 reducer 非常简单,你几乎可以复制。您只需从 Delete 中提取单个 KeyValue 流并对它们进行排序。 PutSortReducer 是一个很好的例子。 Put 更改未排序,因此这就是需要此类 reducer 的原因。
  • 不是构建Delete 流,而是构建包含删除标记的适当KeyValue 流。这可能是提高速度的最佳选择。

关于java - 使用 MapReduce 作业的 HBase 批量删除,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23256629/

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