2015-05-07 11 views
5

Ich versuche, ein Programm zu schreiben, das einen großen Datensatz nimmt und dann einige Abfragen auf es mit mapreduce ausführen. Ich habe einen Code wie folgt:Hadoop Schreiben in eine neue Datei von Mapper

public static class MRMapper 
    extends Mapper<LongWritable, Text, Text, IntWritable>{ 
String output2="hdfs://master:9000/user/xxxx/indexln.txt"; 
    FileSystem Phdfs =FileSystem.get(new Configuration()); 
Path fname1=new Path(output2); 
BufferedWriter out=new BufferedWriter(new OutputStreamWriter(Phdfs.create(fname1,true))); 
private final static IntWritable one = new IntWritable(1); 
private Text word = new Text(); 
    long max=0; 

public void map(LongWritable key, Text value, Context context 
       ) throws IOException, InterruptedException { 
    String binln = Long.toBinaryString(0x8000000000000000L | key).substring(1); 
    out2.write(binln+"\n"); 
    out2.flush(); 
    String line = value.toString(); 
    String [] ST = line.split(","); 
        long val=Math.abs(Long.parseLong(ST[2])); 
        if (max < val){ 
            max= val; 
        } 
        else{ 
          word.set(line); 
          context.write(word, val); 
        } 
} 
} 

Was ich versuche ist eine indexfile in den Mapper zu bauen. mit dem die Mapper auf bestimmte Bereiche der Eingabedatei zugreifen würden. Die Mapper lesen einen Teil der Eingabedatei basierend auf dem Index und drucken dann den gelesenen Teil und die Anzahl der gelesenen Zeilen zum Ausgang. Ich benutze einen Mapper mit 9 Reduzierungen.

  • Meine Frage geht, ist es möglich, eine Datei unterscheidet sich von der Ausgabedatei in der Map-Funktion zum Erstellen/schreiben und auch kann, ein Reduktions lesen eine Datei, die in der Mapper geöffnet ist? Wenn ja, bin ich auf dem richtigen Weg oder total falsch oder vielleicht mapreduce ist nicht der Weg dafür? Ich entschuldige mich, wenn diese Frage zu noob klingt, aber ich bin eigentlich ein Noob in hadoop. Versuche zu lernen. Danke

Antwort

0

Sind Sie sicher, dass Sie einen einzigen Mapper verwenden? Da Hadoop eine Reihe von Mappern erstellt, die der Anzahl der Eingabeaufteilungen sehr ähnlich sind (more details).

Das Konzept der Eingangssplit ist auch sehr wichtig: es bedeutet, dass sehr große Datendateien in mehrere Chuncks aufgeteilt sind, wobei jeder Chunck einem Mapper zugeordnet ist. Wenn Sie also nicht sicher sind, dass nur ein Mapper verwendet wird, können Sie nicht steuern, an welchem ​​Teil der Datei Sie arbeiten, und Sie können keinen globalen Index steuern.

Sein sagte, dass durch einen einzelnen Mapper in MapReduce verwendet, ist das gleiche, als nicht MapReduce gar mit :) Vielleicht ist der Fehler meines, und ich nehme an, Sie nur eine Datei analysiert werden müssen, ist, dass der Fall ?

Im Fall haben Sie mehrere große Daten die Szenario Änderungen einreicht, und es könnte sinnvoll sein, einen einzelnen Mapper für jede Datei zu erstellen, aber Sie werden Ihre eigenen InputSplit und überschreiben die isSplitable Methode durch Rücksendung immer false erstellen müssen.

+0

Danke. Ja, ich habe eine Datei der Größe 50GB. Also ist die beste Option, ohne MapReduce zu gehen? – uchman21

+0

Aufgrund Ihrer Bedürfnisse scheint es, dass die große Datendatei nicht aufgeteilt werden kann. Also, IMHO hat es keinen Sinn, MapReduce zu verwenden, da Sie nur einen Mapper erzwingen wollen, was am Ende dasselbe ist, als wenn Sie einen einzigen "traditionellen" Prozess hätten. Die Stärke von MapReduce besteht darin, ein Problem in kleinere Probleme aufzuteilen, deren Prozess über einen Cluster von Maschinen verteilt wird. – frb

Verwandte Themen