2017-08-17 3 views
0

J'ai pris la sauvegarde de la table Hbase en utilisant l'outil utilitaire Hbase Export.Courir MapReduce sur thorws Tableau Hbase Exporté Impossible de trouver un désérialiseur pour la classe de valeur: « org.apache.hadoop.hbase.client.Result

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

Cela a démarré dans mapreduce et transféré toutes mes données de table dans le dossier de sortie. Selon le document, le format de fichier du fichier ouotput est un fichier de séquence. Donc, j'ai couru sous le code pour extraire ma clé et la valeur du fichier.

Maintenant, je veux courir MapReduce lire la valeur de clé à partir du fichier de sortie, mais faire exception ci-dessous

java.lang.Exception: java.io.IOException: Impossible de trouver un désérialiseur pour la valeur class: 'org.apache.hadoop.hbase.client.Result'. S'il vous plaît vérifier que la configuration « » io.serializations est correctement configuré, si vous êtes à l'aide sérialisation personnalisée. at org.apache.hadoop.mapred.LocalJobRunner $ Job.run (LocalJobRunner.java:406) Causée par: java.io.IOException: Impossible de trouver un deserializer pour la classe Value: 'org.apache.hadoop.hbase .client.Result '. S'il vous plaît assurer que la configuration « io.serializations » est correctement configuré , si vous utilisez sérialisation personnalisé. à org.apache.hadoop.io.SequenceFile $ Reader.init (SequenceFile.java:1964) à org.apache.hadoop.io.SequenceFile $ Reader.initialize (SequenceFile.java:1811) à org.apache. hadoop.io.SequenceFile $ Reader. (SequenceFile.java:1760) à org.apache.hadoop.io.SequenceFile $ Reader. (SequenceFile.java:1774) à org.apache.hadoop.mapreduce.lib.input. SequenceFileRecordReader.initialize (SequenceFileRecordReader.java:50) à org.apache.hadoop.mapred.MapTask $ NewTrackingRecordReader.initialize (MapTask.java:478) à org.apache.hadoop.mapred.MapTask.runNewMapper (MapTask.java: 671) à org.apache.hadoop.mapred.MapTask.run (MapTask.java:330)

Voici mon code pilote

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; 
    } 
} 

Voici mon code mappeur

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 { 
    } 
    } 

Répondre

0

Je vais donc répondre à ma question ici est ce qu'il fallait pour le faire fonctionner

Parce que nous utilisons HBase pour stocker nos données et ce réducteur affiche son résultat dans la table HBase, Hadoop nous dit qu'il ne sait pas comment sérialiser nos données. C'est pourquoi nous devons l'aider. A l'intérieur Permet de créer les io.serializations variables

hbaseConf.setStrings("io.serializations", new String[]{hbaseConf.get("io.serializations"), MutationSerialization.class.getName(), ResultSerialization.class.getName()});