2015-05-07 19 views
5

Büyük bir veri kümesi alan ve daha sonra mapreduce kullanarak bazı sorgular çalıştıran bir program yazmaya çalışıyorum. Ben yapmaya çalışıyorum neHadoop eşleştiriciden yeni bir dosyaya yazıyor

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

eşleştiricisindeki bir indexfile oluşturmaktır: Böyle bir kodu var. Bu, giriş dosyasının belirli alanlarına haritalayıcılar tarafından erişmek için kullanılacaktır. Haritalayıcılar, giriş dosyasının bir kısmını dizine dayalı olarak okur ve daha sonra okunan parçayı ve çıktıya okunan satır sayısını yazdırır. 9 redüktörlü bir mapper kullanıyorum.

  • Sorum o harita işlevinde çıktı dosyadan farklı bir dosyaya yazma/oluşturmak mümkündür ve aynı zamanda, bir redüktör eşleştiricisindeki açık olan bir dosyayı okuyabilir, gider? Eğer evet ise, doğru yolda mıyım yoksa tamamen yanlış mıyım, belki de mapreduce bunun için bir yol değil mi? Bu soru çok noob sesleniyorsa özür dilerim ama ben aslında hadoop içinde bir noob'um. Öğrenmeye çalışmak. teşekkürler

cevap

0

Tek bir mapper kullandığınızdan emin misiniz? Çünkü Hadoop, girdi bölmelerinin sayısına çok yakın bir dizi haritacı yaratır (more details).

Girdi bölme kavramı da çok önemlidir: çok büyük veri dosyaları, her bir eşleştirmeyi bir eşleştiriciye atanmış birkaç parçaya bölündüğü anlamına gelir. Bu nedenle, yalnızca bir eşleştiricinin kullanıldığından emin olmadıkça, üzerinde çalıştığınız dosyanın hangi kısmını denetleyemeyeceğiniz ve herhangi bir global dizini denetleyemeyeceğinizden emin olabilirsiniz.

MapReduce'taki tek bir mapper kullanarak MapReduce'u kullanmamanın aynı olduğu söylenir :) Belki de hata benimdir ve analiz edilmesi gereken tek bir dosyanız olduğunu varsayardım. ? durumda

Eğer birkaç büyük veri senaryo değişiklikleri dosyaları var ve her dosya için tek bir mapper oluşturmak mantıklı olabilir, ancak InputSplit kendi oluşturmak zorunda kalacak ve her zaman false döndürerek isSplitable yöntemini geçersiz.

+0

Teşekkürler. Evet, 50GB boyutunda bir dosyam var. Yani en iyi seçenek MapReduce olmadan gitmek mi? – uchman21

+0

İhtiyaçlarınız nedeniyle, büyük veri dosyasının bölünemeyeceği anlaşılıyor. Dolayısıyla, IMHO'nun MapReduce'u kullanmanın bir anlamı yoktur, çünkü sadece bir eşleştirmeyi zorlayacaksınız, nihayetinde tek bir "geleneksel" sürece sahip olmaktan farklıdır. MapReduce'un gücü, bir problemi bir küme makineleri boyunca dağıtılan daha küçük problemlere ayırmaktan kaynaklanır. – frb