mapreduce - oeuvre - outils hadoop



Exécution de MapReduce sur Hbase Exported Table thorws Impossible de trouver un désérialiseur pour la classe Value: 'org.apache.hadoop.hbase.client.Result (1)

Donc je vais répondre à ma question voici ce qui était nécessaire pour le faire fonctionner

Parce que nous utilisons HBase pour stocker nos données et que 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. Inside setUp définit la variable io.serializations

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

J'ai pris la sauvegarde de la table Hbase en utilisant l'outil utilitaire Hbase Export.

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 lancer mapreduce pour lire la valeur clé du fichier de sortie, mais obtenir l'exception ci-dessous

java.lang.Exception: java.io.IOException: Impossible de trouver un deserializer pour la classe Value: 'org.apache.hadoop.hbase.client.Result'. Assurez-vous que la configuration 'io.serializations' est correctement configurée, si vous utilisez une sérialisation personnalisée. à org.apache.hadoop.mapred.LocalJobRunner $ Job.run (LocalJobRunner.java:406) Causé par: java.io.IOException: Impossible de trouver un deserializer pour la classe Value: 'org.apache.hadoop.hbase.client .Résultat'. Assurez-vous que la configuration 'io.serializations' est correctement configurée, si vous utilisez une sérialisation personnalisée. à 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) sur org.apache.hadoop.io.SequenceFile $ Reader. (SequenceFile.java:1774) sur 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 de 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 de 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 {
    }
  }