2017-08-17 10 views
0

Hbaseエクスポートユーティリティツールを使用してHbaseテーブルバックアップを取得しました。HbaseエクスポートテーブルでMapReduceを実行しています。値クラスのデシリアライザが見つかりませんでした: 'org.apache.hadoop.hbase.client.Result

hbase org.apache.hadoop.hbase.mapreduce.Export "FinancialLineItem" "/project/fricadev/ESGTRF/EXPORT" 

これはmapreduceを起動し、すべてのテーブルデータを出力フォルダに転送しました。 ドキュメントごとに、出力ファイルのファイル形式はシーケンスファイルです。 私はファイルからキーと値を抽出するために以下のコードを実行しました。

今私は、出力ファイルからキー値を読み取るためのMapReduceを実行したいが、例外

の下

のjava.lang.Exception取得:にjava.io.IOException:値の デシリアライザが見つかりませんでしたがクラス: 'org.apache.hadoop.hbase.client.Result'。 のカスタムシリアル化を使用している場合は、 の設定 'io.serializations'が正しく設定されていることを確認してください。 at org.apache.hadoop.mapred.LocalJobRunner $ Job.run(LocalJobRunner.java:406) 原因:java.io.IOException:Valueクラスのデシリアライザが見つかりませんでした: 'org.apache.hadoop.hbase .client.Result '。 カスタムシリアル化を使用している場合は、設定 'io.serializations'が正しく に設定されていることを確認してください。 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。 hasoop.io.SequenceFile $ Reader(SequenceFile.java:1760) at org.apache.hadoop.io.SequenceFile $ Reader。(SequenceFile.java:1774) at org.apache.hadoop.mapreduce.lib.input。 (MapTask.java:478) at org.apache.hadoop.mapred.MapTask $ NewTrackingRecordReader.initialize(MapTask.java:478) at org.apache.hadoop.mapred.MapTask.runNewMapper(MapTask.java:SequenceFileRecordReader.java:50) 671) at org.apache.hadoop.mapred.MapTask.run(MapTask.java:330)

ここ

ここに私のドライバコード

package SEQ; 

import org.apache.hadoop.conf.Configured; 
import org.apache.hadoop.fs.FileSystem; 
import org.apache.hadoop.fs.Path; 
import org.apache.hadoop.hbase.client.Result; 
import org.apache.hadoop.hbase.io.ImmutableBytesWritable; 
import org.apache.hadoop.mapreduce.Job; 
import org.apache.hadoop.mapreduce.lib.input.FileInputFormat; 
import org.apache.hadoop.mapreduce.lib.input.SequenceFileInputFormat; 
import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat; 
import org.apache.hadoop.util.Tool; 
import org.apache.hadoop.util.ToolRunner; 
public class SeqDriver extends Configured implements Tool 
{ 
    public static void main(String[] args) throws Exception{ 
     int exitCode = ToolRunner.run(new SeqDriver(), args); 
     System.exit(exitCode); 
    } 

    public int run(String[] args) throws Exception { 
     if (args.length != 2) { 
      System.err.printf("Usage: %s needs two arguments files\n", 
        getClass().getSimpleName()); 
      return -1; 
     } 
     String outputPath = args[1]; 

     FileSystem hfs = FileSystem.get(getConf()); 
     Job job = new Job(); 
     job.setJarByClass(SeqDriver.class); 
     job.setJobName("SequenceFileReader"); 

     HDFSUtil.removeHdfsSubDirIfExists(hfs, new Path(outputPath), true); 

     FileInputFormat.addInputPath(job, new Path(args[0])); 
     FileOutputFormat.setOutputPath(job, new Path(args[1])); 

     job.setOutputKeyClass(ImmutableBytesWritable.class); 
     job.setOutputValueClass(Result.class); 
     job.setInputFormatClass(SequenceFileInputFormat.class); 

     job.setMapperClass(MySeqMapper.class); 

     job.setNumReduceTasks(0); 


     int returnValue = job.waitForCompletion(true) ? 0:1; 

     if(job.isSuccessful()) { 
      System.out.println("Job was successful"); 
     } else if(!job.isSuccessful()) { 
      System.out.println("Job was not successful");   
     } 

     return returnValue; 
    } 
} 

は私マッパーコード

package SEQ; 

import java.io.IOException; 

import org.apache.hadoop.hbase.client.Result; 
import org.apache.hadoop.hbase.io.ImmutableBytesWritable; 
import org.apache.hadoop.io.Text; 
import org.apache.hadoop.mapreduce.Mapper; 

public class MySeqMapper extends Mapper <ImmutableBytesWritable, Result, Text, Text>{ 

    @Override 
    public void map(ImmutableBytesWritable row, Result value,Context context) 
    throws IOException, InterruptedException { 
    } 
    } 

答えて

0

は、だから私はここに私の質問 は、我々が使用しているため、それが

を動作させるために必要だったものですお答えしますですHBaseはデータを保存するためにこの結果をHBaseテーブルに出力し、Hadoopはデータをシリアル化する方法がわからないことを伝えています。それが私たちがそれを助ける必要がある理由です。 setUp内でio.serializations変数を設定する

hbaseConf.setStrings("io.serializations", new String[]{hbaseConf.get("io.serializations"), MutationSerialization.class.getName(), ResultSerialization.class.getName()}); 
関連する問題