2015-05-07 17 views
5

Sto provando a scrivere un programma che richiede un enorme set di dati e quindi esegue alcune query su di esso utilizzando mapreduce. Ho un codice come questo:Hadoop scrive su un nuovo file dal programma di mappatura

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

Quello che sto cercando di fare è di costruire un indexfile nel mapper. che verrebbe utilizzato per accedere a specifiche aree del file di input da parte dei mappatori. I mappatori leggono una parte del file di input in base all'indice e quindi stampano la parte letta e il numero di righe lette sull'output. Sto usando un mappatore con 9 riduttori.

  • La mia domanda va, è possibile creare/scrivere su un file diverso dal file di output nella funzione mappa e anche, può un riduttore di leggere un file che è aperta nel mapper? Se sì, sono sulla strada giusta o totalmente sbagliato o forse mapreduce non è il modo per questo? Mi scuso se questa domanda sembra troppo noob ma in realtà sono un noob in hadoop. Cercando di imparare. grazie

risposta

0

Sei sicuro che stai utilizzando un singolo mapper? Perché Hadoop crea un numero di mappatori molto vicino al numero di divisioni di input (more details).

Anche il concetto di suddivisione dell'input è molto importante: significa che file di dati molto grandi sono suddivisi in diversi chunck, ciascuno dei chunck assegnato a un mappatore. Quindi, a meno che non siate completamente sicuri che sia utilizzato un solo mapper, non sarete in grado di controllare quale parte del file state lavorando e non sarete in grado di controllare alcun tipo di indice globale.

Detto questo, utilizzando un singolo mapper in MapReduce è lo stesso che non usare affatto MapReduce :) Forse l'errore è mio, e presumo che tu abbia un solo file da analizzare, è che il caso ?

Nel caso in cui si dispone di file diversi grandi dati i cambiamenti di scenario, e potrebbe avere senso per creare un singolo mapper per ogni file, ma si dovrà creare il proprio InputSplit e l'override del metodo isSplitable restituendo sempre false.

+0

Grazie. Sì, ho un file di 50 GB. Quindi l'opzione migliore è senza MapReduce? – uchman21

+0

A causa delle tue esigenze, sembra che il grande file di dati non possa essere diviso. Quindi, IMHO non ha senso usare MapReduce dato che si costringerà solo un mappatore, che alla fine è lo stesso di un singolo processo "tradizionale". La potenza di MapReduce deriva dalla suddivisione di un problema in problemi più piccoli, il cui processo è distribuito lungo un cluster di macchine. – frb

Problemi correlati