Pokazywanie postów oznaczonych etykietą Pig. Pokaż wszystkie posty
Pokazywanie postów oznaczonych etykietą Pig. Pokaż wszystkie posty

środa, 1 września 2010

Pig, nie taki znowu leniwy zwierzak...


Tak wiem, tym razem powinienem opisać konfiguracje klastra Hadoop, ale nie mogłem się oprzeć pokusie zabawy dzieckiem korporacji Yahoo. Pig, bo o nim mowa, to platforma oraz język wysokiego poziomu do pisania Jobów MapReduce. Wyczytałem na jednej z marketingowych prezentacji, że używając Piga wystarczy 5% kodu, oraz 5% czasu, który musielibyśmy poświęcić, aby osiągnąć ten sam efekt w Javie. Brzmi nieźle.

Tradycyjnie zaczynamy od instalacji.

Pig pobieramy z tego adresu.
Rozpakowujemy paczkę. 
Sprawdzamy czy działa poleceniem:
bin/pig -help

Pig może działać w dwóch trybach:
1. Lokalnym - nie potrzebuje uruchomionego Hadoopa
bin/pig -x local
2. MapReduce - używa uruchomionego klastra:
W pliku <pig_home>/bin/pig.sh dodajemy zmienne środowiskowe:
PIG_PATH=<pig_home>
PIG_CLASSPATH=$PIG_PATH/pig-0.7.0-core.jar:<hadoop_home>/conf
PIG_HADOOP_VERSION=0.20.2
Uruchamiamy poleceniem:
bin/pig
lub
bin/pig -x mapreduce

To co właśnie widzimy, to konsola, grunt umożliwiająca pisanie skryptów. Kolejną możliwością jest uruchamianie skryptów z pliku:
bin/pig skrypt.pig
Możemy również wywołać skrypt z kodu Javowego.

Spróbujmy napisać skrypt, który zrobi dokładnie to samo, co testowy Job MapReduce, czyli zliczy wystąpienie poszczególnych słów w pliku.
Uruchamiamy konsole grunt:
bin/pig
Załadujemy dane poleceniem:
fs -copyFromLocal conf pig_test_data
Tak wygląda skrypt:
rawData = load 'pig_test_data';
words = foreach rawData generate flatten(TOKENIZE($0)) as word;
filteredWords = filter words by word matches '\\w+';
groupedWords = group filteredWords by word;
countedWords = foreach groupedWords generate COUNT(filteredWords), group;
orderedCountedWords = order countedWords by $0 desc;
store orderedCountedWords into 'pig_test_data_output/char_freq';

Wyniki sprawdzamy poleceniem:
fs -cat pig_test_data_output/char_freq/part-r-00000
Po szczegóły dotyczące składni języka Pig odysłam do naprawdę niezłej dokumentacji.

czwartek, 12 sierpnia 2010

Jak to robią wielcy...

Ostatnio przeglądając blogosferę natknąłem się na informacje na temat ilości przetwarzanych danych przez portale które można uznać za wielkie. Muszę przyznać, że zrobiło to na mnie spore wrażenie, mianowicie obecnie Facebook posiada 36 petabajtów danych, a do końca roku spodziewa się wzrostu do około 50 petabajtów, Google gromadzi każdego dnia 400 terabajtów logów (dane z 2007 roku). Zacząłem się zastanawiać, jak można sobie poradzić z taką ilością różnych danych, jak je przechowywał, filtrować, oraz nimi zarządzać. Okazało się, że inżynierowie Google wymyślili oraz opublikowali dokumentacje do dwóch technologii które potrafią sobie z tym poradzić, są to:

  • MapReduce
  • GFS (Google File System)
Na postawie tej dokumentacji Yahoo stworzyło, oraz udostępniło na licencji Apache platformę o nazwie Hadoop. Hadoop to zbiór 8 narzędzi, mnie jak na razie interesuje 5 z nich:

1. MapReduce - podstawa całej platformy. Wymyślona przez Google koncepcja jest genialna w swojej prostocie, w dwóch słowach chodzi tutaj o to, aby programista w najprostszej wersji dostarczył dwóch klas: mappera i reducera. Mapper na wejściu otrzymuje pewien obiekt z danymi wejściowymi (najczęściej linie z pliku), a na wyjściu produkuje pary klucz=wartość. Instancji mappera może być oczywiście wiele (Facebook ma klaster Hadoopa złożony z 2200 maszyn) gdy mappery skończą prace Hadoop scala klucze tak aby powstały pary klucz = {lista wartości z wszystkich mapperów}, tak z agregowane dane przekazywane są do reducera (także może ich być wiele), który wykonuję jakieś operacje biznesowe i przekazuje wyniki również w formie klucz=wartość.

2. HDSF (Hadoop Distributed File System) - czyli rozproszony system plików. HDSF ma zapewnić szybki odczyt, zapis, oraz replikacje danych. Jak on to robi? Wyobraźmy sobie klaster złożony z 10 komputerów, jeden pełni role NameNode Server, oznacza to, że on wie gdzie i jakie pliki są zapisane, pozostałe 9 tylko przechowują dane. Gdy wgrywamy plik do HDFS zostaje on podzielony na paczki (zazwyczaj 64, lub 128 mb), paczki są równolegle zapisywane na wszystkich maszynach oraz replikowane na określoną przez nas ilość maszyn. Zmniejsza to znacznie ograniczenie związane prędkością zapisu oraz odczytu dysku ponieważ jednocześnie piszemy na wiele dysków na wielu maszynach. Ma to jednak swoje słabe strony, gdy już raz zapiszemy plik w HDSF nie ma możliwości edytowania jego zawartości.

3. Hive - ludzi od Facebooka zaczął uwierać fakt, że do stworzenia joba, który będzie obrabiał dane używając MapReduce potrzebni są programiści, oraz sporo kodu który muszą napisać. Drugim problemem są analitycy danych, którzy chcą stworzyć sobie na bieżąco jakieś statystyki bez potrzeby zaprzęgania do roboty programistów. W odpowiedzi na te problemy powstał Hive, czyli technologia która potrafi opisać jakiś plik lub katalog HDSF-a schemą (stworzyć tabele podobną do tych znanych z baz danych opisującą jakie dane znajdują się w środku), gdy dane są opisane możemy uruchamiać na nich zapytania łudząco podobne do SQL-a, możliwe są nawet JOIN-y pomiędzy "tabelami", a wyniki możemy zapisać w kolejnej "tabeli" czyli tak naprawdę w pliku znajdującym się w HDSF. A i byłbym zapomniał - oczywiście nasze zapytania SQL są tak naprawdę konwertowane do jobów MapReduce.

4. Pig - Yahoo uznało, że Hive to nie do końca to co jest im potrzebne, dlatego powstał Pig. Jest to język, który umożliwia budowanie jobów MapReduce na znacznie wyższym poziomie abstrakcji niż możliwe jest to np. w Javie. Postawiono tutaj na duże możliwości związane nie tylko z przeszukiwaniem danych, ale również z ich przetwarzaniem, kolejnym bardzo ważnym elementem języka jest łatwość integracji z kodem napisanym w Javie, co pozwala na pisanie specyficznych elementów joba.

5. HBase - czyli implementacja BigTable, jest to nierelacyjna baza danych typu klucz=wartość, która wykorzystuje HDFS oraz łatwo integruje się z pozostałymi technologiami.

Ok, przydługi i trochę teoretyczny wstęp mamy za sobą. W kolejnych postach postaram się opisać w praktyczny sposób każdą z wymienionych technologi. Trzymajcie rękę na pulsie ponieważ w następnym wpisie uruchomimy nasz pierwszy klaster Hadoopa.