ś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.

Brak komentarzy: