【问题标题】:How to extract key,value pairs from hbase SequenceFile using mapreduce?如何使用 mapreduce 从 hbase SequenceFile 中提取键值对?
【发布时间】:2016-10-16 00:15:47
【问题描述】:

我使用Hbase Export utility tool 将hbase 表作为SequenceFile 导出到HDFS。

现在我想使用 mapreduce 作业来处理这个文件:

public class MapSequencefile {
        public static class MyMapper extends Mapper<LongWritable, Text, Text, Text>{
            @Override
            protected void map(LongWritable key, Text value,
                    Mapper<LongWritable, Text, Text, Text>.Context context)
                    throws IOException, InterruptedException {
                System.out.println(key+"...."+value);
            }
        }

        public static void main(String[] args) throws IOException, InterruptedException, ClassNotFoundException {  

            Configuration conf = new Configuration();
            Job job = Job.getInstance(conf , MapSequencefile.class.getSimpleName());

            job.setJarByClass(MapSequencefile.class);
            job.setNumReduceTasks(0);
            job.setMapperClass(MyMapper.class);
            job.setMapOutputKeyClass(Text.class);
            job.setMapOutputValueClass(Text.class);
            job.setInputFormatClass(SequenceFileInputFormat.class); //use SequenceFileInputFormat
            FileInputFormat.setInputPaths(job, "hdfs://192.16.31.10:8020/input/");
            FileOutputFormat.setOutputPath(job, new Path("hdfs://192.16.31.10:8020/out/"));
            job.waitForCompletion(true);
        }  
}

但它总是抛出这个异常:

Caused by: java.io.IOException: Could not find a deserializer for the Value class: 'org.apache.hadoop.hbase.client.Result'. Please ensure that the configuration 'io.serializations' is properly configured, if you're using custom serialization.
    at org.apache.hadoop.io.SequenceFile$Reader.init(SequenceFile.java:1964)
    at org.apache.hadoop.io.SequenceFile$Reader.initialize(SequenceFile.java:1811)
    at org.apache.hadoop.io.SequenceFile$Reader.<init>(SequenceFile.java:1760)
    at org.apache.hadoop.io.SequenceFile$Reader.<init>(SequenceFile.java:1774)
    at org.apache.hadoop.mapreduce.lib.input.SequenceFileRecordReader.initialize(SequenceFileRecordReader.java:54)
    at org.apache.hadoop.mapred.MapTask$NewTrackingRecordReader.initialize(MapTask.java:548)

我能做些什么来修复这个错误?

【问题讨论】:

  • 嗨,这个解决方案解决了你的问题吗?我也面临同样的问题。你能建议我一些出路吗?

标签: hadoop mapreduce hbase sequencefile


【解决方案1】:

我假设您正在使用它来进行导出:

$ bin/hbase org.apache.hadoop.hbase.mapreduce.Export &lt;tablename&gt; &lt;outputdir&gt; [&lt;versions&gt; [&lt;starttime&gt; [&lt;endtime&gt;]]]

如本 HBase 页面所述:http://hbase.apache.org/0.94/book/ops_mgt.html#export

查看source code for org.apache.hadoop.hbase.mapreduce.Export 你可以看到它设置:

job.setOutputFormatClass(SequenceFileOutputFormat.class);
job.setOutputKeyClass(ImmutableBytesWritable.class);
job.setOutputValueClass(Result.class);

这与您的错误一致(值是 Result 对象):

Could not find a deserializer for the Value class: 'org.apache.hadoop.hbase.client.Result'

所以你的地图签名需要改为:

Mapper&lt;ImmutableBytesWritable, Result, Text, Text&gt;

您需要在项目中包含正确的 HBase 库,以便它可以访问:

org.apache.hadoop.hbase.client.Result

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-03-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多