2010-06-06 13 views
6

Harita ile bu algoritmanın uygulanmasında yardıma ihtiyacım var. Büyük bir veri setinden geçecek bazı metin dosyalarını okuyacağım ve bu satırlarda belirli terimleri arayabilecek bir algoritma var. Java'da uygulamam var ama kod yazmayı istemedim, öyle görünmüyor ki, benim için onu uygulamak için birini arıyordum, ama gerçekte çok fazla yardıma ihtiyacım var! Bu benim projem için planlanmadı, ancak veri seti çok büyük oldu, bu yüzden öğretmen bunu böyle yapmam gerektiğini söyledi.Hadoop MapReduce

DÜZENLEME Ben verisi seti Hadoop küme üzerinde olduğu (i versiyonunu previos açıklık yoktu) ve ben MapReduce okuyordum onun MapReduce uygulaması

yapmak ve ben ilk yapmak thaught gerekir standart uygulama ve daha sonra haritacı ile daha az/daha kolay olacaktır. Ancak, algoritma oldukça aptalca ve özel bir şey olmadığı ve haritayı azalttığı için ... ... aklımı buralarda dolamıyorum. Gördüğünüz gibi Yani burada

,

LIST termList (there is method that creates this list from lucene index) 
FOLDER topFolder 

INPUT topFolder 
IF it is folder and not empty 
    list files (there are 30 sub folders inside) 
    FOR EACH sub folder 
     GET file "CheckedFile.txt" 
     analyze(CheckedFile) 
    ENDFOR 
END IF 


Method ANALYZE(CheckedFile) 

read CheckedFile 
WHILE CheckedFile has next line 
    GET line 
    FOR(loops through termList) 
      GET third word from line 
      IF third word = term from list 
     append whole line to string buffer 
    ENDIF 
ENDFOR 
END WHILE 
OUTPUT string buffer to file 

Ayrıca benim algoritmanın sözde kod kısaca "analiz" oluşturulacak, yeni bir dosya adı verilen sahiptir her zaman olduğu, ben bu mapreduce anlaşılmaktadır zordur birçok çıktıya yazmak ???

Ben mapreduce sezgi anlamak ve benim örnek MapReduce için son derece uygundur görünüyor, ama bunu yapmak için geldiğinde, açıkçası yeterince bilmiyorum ve ben TAKıLMA değilim!

Lütfen yardım edin.

cevap

3

Boş bir redüktör kullanabilir ve işinizi dosya başına tek bir mapper çalıştıracak şekilde bölümleyebilirsiniz. Her bir haritacı kendi çıktı dosyasını çıktı klasörünüzde oluşturacaktır.

+0

Merhaba! Cevap için teşekkürler! Ama anladığımdan emin değilim: Bana biraz daha bilgi verebilir misin? Bunun gibi bazı örnekler var mı? – Julia

2

Harita azaltın kolayca bazı güzel Java 6 eşzamanlılık özellikler, özellikle Gelecek, çağrılabilir ve ExecutorService kullanılarak uygulanır.

Sana bulduk her dosya için yeni bir çağrılabilir oluşturmak ve uygulamakla hizmetine sunmaları gerekecektir
public class FileAnalyser implements Callable<String> { 

    private Scanner scanner; 
    private List<String> termList; 

    public FileAnalyser(String filename, List<String> termList) throws FileNotFoundException { 
    this.termList = termList; 
    scanner = new Scanner(new File(filename)); 
    } 

    @Override 
    public String call() throws Exception { 
    StringBuilder buffer = new StringBuilder(); 
    while (scanner.hasNextLine()) { 
     String line = scanner.nextLine(); 
     String[] tokens = line.split(" "); 
     if ((tokens.length >= 3) && (inTermList(tokens[2]))) 
     buffer.append(line); 
    } 
    return buffer.toString(); 
    } 

    private boolean inTermList(String term) { 
    return termList.contains(term); 
    } 
} 

belirtilen şekilde bir dosya analiz edecek bir çağrılabilir yarattı. Gönderimin sonucu, dosya ayrıştırmasının sonucunu almak için daha sonra kullanabileceğimiz bir Gelecek'dir.

public class Analayser { 

    private static final int THREAD_COUNT = 10; 

    public static void main(String[] args) { 

    //All callables will be submitted to this executor service 
    //Play around with THREAD_COUNT for optimum performance 
    ExecutorService executor = Executors.newFixedThreadPool(THREAD_COUNT); 

    //Store all futures in this list so we can refer to them easily 
    List<Future<String>> futureList = new ArrayList<Future<String>>(); 

    //Some random term list, I don't know what you're using. 
    List<String> termList = new ArrayList<String>(); 
    termList.add("terma"); 
    termList.add("termb"); 

    //For each file you find, create a new FileAnalyser callable and submit 
    //this to the executor service. Add the future to the list 
    //so we can check back on the result later 
    for each filename in all files { 
     try { 
     Callable<String> worker = new FileAnalyser(filename, termList); 
     Future<String> future = executor.submit(worker); 
     futureList.add(future); 
     } 
     catch (FileNotFoundException fnfe) { 
     //If the file doesn't exist at this point we can probably ignore, 
     //but I'll leave that for you to decide. 
     System.err.println("Unable to create future for " + filename); 
     fnfe.printStackTrace(System.err); 
     } 
    } 

    //You may want to wait at this point, until all threads have finished 
    //You could maybe loop through each future until allDone() holds true 
    //for each of them. 

    //Loop over all finished futures and do something with the result 
    //from each 
    for (Future<String> current : futureList) { 
     String result = current.get(); 
     //Do something with the result from this future 
    } 
    } 
} 

Örneğim, tamamlanmış ve verimli olmaktan uzaktır. Eğer bitirdikten unsurları kaldırarak, futureList üzerinde döngü tutmak gerçekten büyük buysa, benzer bir şey örneklem büyüklüğü dikkate almamıştım: Bir üretici-tüketici tipi kurulum uygulamak Alternatif

while (futureList.size() > 0) { 
     for (Future<String> current : futureList) { 
     if (current.isDone()) { 
      String result = current.get(); 
      //Do something with result 
      futureList.remove(current); 
      break; //We have modified the list during iteration, best break out of for-loop 
     } 
     } 
} 

nerede prodüktör, hizmet verenlere hizmet sunumunu gönderir ve bir gelecek üretir ve tüketici geleceğin sonucunu alır ve geleceği göz ardı eder.

Bu

belki üretmek gerektirecektir ve tüketici dişlilerini kendilerini ve geleceklerini ekleme/çıkarma için senkronize bir liste olabilir.

Herhangi bir sorunuz lütfen sorunuz.

+0

Merhaba! Önerilen çözüm için çok teşekkür ederim!Üzgünüm, muhtemelen denemedim, problemi çözdüm de. Benim hatam, başlıkta Hadoop'dan bahsettim, ama veri kümemde bir küme çalışan hadoop var, bu yüzden onu Hadoop MaPreduce frameork'a göre uygulamalıyım ... Şimdi gönderimi düzenleyeceğim. Analiz ettiğim veri seti 6GB :/Eşzamanlılık onunla başa çıkmak için çok fazla ????? – Julia

+0

Oops, burada bir noob var: D Kendimi biraz kullanmak için kodumu 100 dosyada, her birinde ~ 61MB, toplamda ~ 6 GB çalıştırdım. Dosya ayrıştırıcınızın ne yaptığını tam olarak bilmediğimden emin değilim ve her satırı tarar ve boş bir dizge döndürdüm. Biraz bildiğimi biliyorum. Performans çok kötü değildi, iş parçacığı havuzu boyutu 100'dü, bu nedenle tüm 100 dosya, yürütme hizmeti tarafından sıraya alınmadan ayrıştırıldı. Atom işlemcimde toplam çalışma süresi 17 dakika oldu. Üzgünüm, sorunuzu doğru cevaplayamadım. Hadoop'la deneyimim yok ama SquareCog'un cevabını okuduktan sonra mantıklı geliyor. –

+0

Merhaba! Çok teşekkür ederim, çok yardımcı oldunuz, çünkü beynim ve zamanım olan hadoop MR ile baş edemiyorum. Bunu yapmak için birkaç tane daha benzer algoritmalar kullanacağım ve bunu yapmak için yetenekli olduğum şekilde denemeliyim. Her yerde hadoop yardımını almalıyım:/ Kodunuzu benimsedim ve Intel 2Ghz'de, iş parçacığı havuzlu 42 sonuçların ayrıştırılması ve sonuçların yeni dosyalara dönüştürülmesi için yaklaşık 20 dakika sürdü, ancak sadece 200Mb'lik verilerde (42 dosya). Yine, ben ayrıştırıcı için bazı değişiklikler yapmak zorunda, bu biraz daha sıkı eşleme, saf "içerir" terimi yapmak zorunda, bu yüzden hepsini çalıştırdığınızda, ben sonuçları bilelim :) – Julia