2012-11-19 18 views
6

Szukałem aplikacji Hadoop intensywnie wykorzystującej dyski do testowania działania I/O w Hadoop, ale nie mogłem znaleźć takiej aplikacji, która utrzymywałaby wykorzystanie dysku powyżej, powiedzmy 50% lub taka aplikacja, która faktycznie utrzymuje dysk zajęty. Próbowałem randomwriter, ale to zaskakująco nie jest dysk I/O intensywny.Zapisywanie do pliku w HDFS w Hadoop

Napisałem więc mały program, aby utworzyć plik w Mapperie i napisać do niego jakiś tekst. Ta aplikacja działa dobrze, ale wykorzystanie jest wysokie tylko w węźle głównym, który jest również węzłem nazwy, śledzeniem zadań i jednym z urządzeń podrzędnych. Wykorzystanie dysku jest NIL lub nieistotne w innych śledzących zadania. Nie mogę zrozumieć, dlaczego dysk I/O jest tak niski w śledzeniu zadań. Czy ktokolwiek mógłby mnie popchnąć we właściwym kierunku, jeśli robię coś nie tak? Z góry dziękuję.

Oto mój przykładowy segment kodu, który napisałem w pliku WordCount.java tworzyć i pisać UTF ciąg do Plik-

Configuration conf = new Configuration(); 
FileSystem fs = FileSystem.get(conf); 
Path outFile; 
while (itr.hasMoreTokens()) { 
    word.set(itr.nextToken()); 
    context.write(word, one); 
    outFile = new Path("./dummy"+ context.getTaskAttemptID()); 
    FSDataOutputStream out = fs.create(outFile); 

    out.writeUTF("helloworld"); 
    out.close(); 
    fs.delete(outFile); 
    } 
+0

W przypadku testów porównawczych I/O możesz również rzucić okiem na TestDFSIO: http://answers.oreilly.com/topic/460-how-to-benchmark-a-hadoop-cluster/ –

+0

@LorandBendig Zrobiłem, najwyższe wykorzystanie dysku dla TestDFSIO, które znalazłem dla mojej grupy 14 węzłów, wynosi zaledwie 2,4%, a średnia wynosi około 0,07%. Zmierzam wykorzystanie dysku z polecenia _iostat_, zadanie zostało uruchomione na około 300 sekund. Czy jest coś naprawdę głupiego, co robię i czego nie znam? –

+0

Możesz grać z parametrami (nr plików, rozmiar), ale myślę, że już to zrobiłeś. Istnieją dalsze testy, które możesz wypróbować, opisane tutaj bardzo dobrze: http://www.michael-noll.com/blog/2011/04/09/benchmarking-and-stress-testing-an-hadoop-cluster-with-terasort -testdfsio-nnbench-mrbench/ –

Odpowiedz

0

OK. Musiałem być naprawdę głupi, bo wcześniej nie sprawdzałem. Rzeczywistym problemem było to, że wszystkie moje węzły danych naprawdę nie działały. Ponownie sformatowałem namenodę i wszystko wróciło na miejsce, otrzymałem 15-20% wykorzystania, co nie jest złe dla WC. Uruchomę go dla TestDFSIO i zobaczę, czy mógłbym wykorzystać ten dysk jeszcze bardziej.

1

myślę, że każdy mechanizm, który tworzy obiekty java na komórkę w każdym wierszu, i uruchom wszelkie operacje serializacji obiektów java, zanim zapisanie ich na dysku ma małą szansę na wykorzystanie IO.
W mojej ocenie serializacja działa z prędkością kilku MB na sekundę lub nieco więcej, ale nie 100 MB na sekundę.
To, co udało ci się uniknąć na warstwach wyjściowych, było całkiem słuszne. Rozważmy teraz, jak pisać do HDFS. Dane są zapisywane na lokalnym dysku za pośrednictwem lokalnego datanodu, a następnie synchronicznie z innymi węzłami w sieci, w zależności od współczynnika replikacji. W takim przypadku nie można zapisać większej ilości danych w HDFS, niż w przepustowości sieci. Jeśli twój klaster jest względnie mały, rzeczy stają się warte. W przypadku klastra z trzema węzłami i potrójnej replikacji wszystkie dane będą przesyłane do wszystkich węzłów, tak aby łączna przepustowość zapisu w klastrze HDFS wyniosła około 1 GB - w przypadku takiej sieci.
Proponuję więc:
a) Zmniejszyć współczynnik replikacji do 1, a tym samym przestać być związany przez sieć.
b) Napisać większe porcje danych w jednym wywołaniu do odwzorowania

+0

Zmieniłem współczynnik replikacji na 1 i zmieniłem rozmiar bloku odpowiednio na 1KB i 1MB. Moje obserwacje mówią, że zmniejszenie mapy działa bardzo wolno, a IO jest wysokie jedynie w węźle głównym. Próbowałem też raz napisać w programie odwzorowującym, inaczej niż w powyższym kodzie, gdzie piszę do pliku po znalezieniu każdego słowa. Mimo to zachowanie pozostało takie samo. –

+0

Ilu twórców map uruchamia się jednocześnie? i co to jest pasmo dysku na obserwowany węzeł? –

+0

Rozpoczęte zadania mapy = 3, Rozpoczęte zmniejszanie zadań = 1, mapowane.tasktracker.map.tasks.maximum = 2, mapred.tasktracker.reduce.tasks.maximum = 2. Wykorzystanie dysku na 3 węzłach wynosi prawie 0, a na węźle głównym 100%. –