Big Data, Hadoop & Tworzenie Tabeli w Hive

W poprzednim poście umieściłem info jak załadować dane do hdfs, Teraz by je przeanalizować za pomocą SQL potrzebujemy stworzyć odpowiednią Tabelę w HIVE.

By nie było zbyt pięknie najpierw musimy pobrać Jar’a który pozwoli nam obsłużyć format danych w naszych plikach( z danymi z Twittera).

http://files.cloudera.com/samples/hive-serdes-1.0-SNAPSHOT.jar

 

Jeśli mamy już Jara w jakimś przystępnym miejscu to możemy zalogować się do konsoli Hive. W sandboxie do którego się logowaliśmy przez http, mamy też GUI do obsługi hive, jednakże zalecam skorzystanie z  shella ze względu na lepszą czytelność komunikatów błędów

[root@sandbox conf]# hive

Powinno się pokazać coś takiego:

Logging initialized using configuration in jar:file:/usr/lib/hive/lib/hive-common-0.12.0.2.0.6.0-76.jar!/hive-log4j.properties

SLF4J: Class path contains multiple SLF4J bindings.

SLF4J: Found binding in [jar:file:/usr/lib/hadoop/lib/slf4j-log4j12-1.7.5.jar!/org/slf4j/impl/StaticLoggerBinder.class]

SLF4J: Found binding in [jar:file:/usr/lib/hive/lib/slf4j-log4j12-1.7.5.jar!/org/slf4j/impl/StaticLoggerBinder.class]

SLF4J: See http://www.slf4j.org/codes.html#multiple_bindings for an explanation.

SLF4J: Actual binding is of type [org.slf4j.impl.Log4jLoggerFactory]

hive>

najpierw dodajemy Jara do Hive:

hive> ADD JAR /usr/local/jakubjars/hive-serdes-1.0-SNAPSHOT.jar;

Wydaje się że trzeba go dodawać po każdym logowaniu co jest upierdliwe, ale jeszcze nie znalazłem miejsca gdzie można by zapisać to na trwałe.

Teraz tworzymy tabele:

CREATE EXTERNAL TABLE tweets (
id BIGINT,
created_at STRING,
source STRING,
favorited BOOLEAN,
retweet_count INT,
retweeted_status STRUCT<
text:STRING,
user:STRUCT<screen_name:STRING,name:STRING>>,
entities STRUCT<
urls:ARRAY<STRUCT<expanded_url:STRING>>,
user_mentions:ARRAY<STRUCT<screen_name:STRING,name:STRING>>,
hashtags:ARRAY<STRUCT<text:STRING>>>,
text STRING,
user STRUCT<
screen_name:STRING,
name:STRING,
friends_count:INT,
followers_count:INT,
statuses_count:INT,
verified:BOOLEAN,
utc_offset:INT,
time_zone:STRING>,
in_reply_to_screen_name STRING)
ROW FORMAT SERDE 'com.cloudera.hive.serde.JSONSerDe'
LOCATION '/dzejkop/flume/tweets';

 

 

To na co warto zwrócić uwagę to fakt iż zagnieżdżone dane zostały zapisane w postaci struktur. Daje to ciekawe możliwości. Według dokumentacji tabela może zawierać dodatkowe nieuwzględnione tutaj pola pod warunkiem że będą one miały nazwę i typ zgodny z danymi JSON od Twittera.

Teraz możemy wykonać przykładowe zapytanie SQL w Hive:

hive> select user.screen_name, user.followers_count c from tweets order by c desc;

powinno nam pokazać nazwy użytkowników I informacje o tym ile posiadają followersów. Zapytanei to nie posiada grupowania więc nazwy userów powinny wystąpić tyle razy ile Tweetów wpadło w nasze sidła. Po wykonaniu zapytania pojawią się różne napisy, zostanie stworzony odpowiedni job, który obrobi dane. Finałow finałów powinniśmy zobaczyć wyniki:

sabou35876529   139
sabou35876529   139
sabou35876529   139
sabou35876529   139
sabou35876529   139
sabou35876529   139
sabou35876529   139
Mister_Ka       137
Mister_Ka       137
Mister_Ka       137
Mister_Ka       137

Korzystając z sandboxa, możemy też wykonywać zapytania, jednakże każdorazowo do każdego zapytania musimy wskazać Jara.

Cloudera i HortonWorks

Mając już mgliste pojęcie o tym czym jest Flume można by się zastanowić do czego go użyć. Dość powszechnym przykładem w sieci jest wykorzystanie API strumieniowego Twittera do zapisu logów w HDFS wraz z późniejszym wykorzystaniem HIVE by odpytywać zebrane informacje za pomocą SQL (Teraz wiadomo dlaczego się tym zająłem;) ). Nie mniej by zebrać to wszystko do przysłowiowej kupy i uruchomić trzeba się trochę napocić. Najwięcej opisów/tutoriali pochodzi ze stron Cloudera, jest to firma/organizacja która rozwija rozwiązania oparte o Hadoop’a i żyje z wdrożeń i szkoleń (dodatkowo to oni napisali końcówkę do obsługi Twittera dla Flume). Jej bezpośrednim konkurentem jest Hortonworks, który w mojej ocenie posiada bardziej otwartą politykę (więcej materiałów jest dostępnych za darmo). Obydwie organizacje oferują gotowe obrazy do virtualbox z w pełni skonfigurowanymi środowiskami (Hadoop, Hive itp.). Obydwa środowiska oczywiście nie zawierają Flume ;). Ja osobiście bardziej przekonałem się do środowiska dostarczanego przez Hortonworks i oto środowisko opieram poniższą instrukcję/tutorial.

 

Zanim zaczniesz chciałbym uprzedzić, iż będzie potrzebna znajomość środowiska linux.

Jeśli jest gotowy czytaj dalej: Konfiguracja Wirtualki – HortonWorks Sandbox

Big Data & Flume – zbieranie danych

Ostatnimi czasy modne stało się hasło Big Data. Powstało wiele narzędzi i rozwiązań wspierających analizy danych w sposób który do tej pory był praktycznie niedostępny dla większości organizacji. Wraz ze wspomnianymi narzędziami pojawiły się możliwości analizy online (w momencie gdy dane się pojawią). Dodatkowo w dość łatwy sposób można wykorzystać źródła danych których struktura znacząco odbiega od tak zwanych płaskich tabel.

Dość popularnym frameworkiem (kombajnem) do obsługi Big Data stał się Hadoop tworzony przez Apache foundation. Nie jest to typowa baza danych a raczej zestaw narzędzi napisany w javie, którego celem jest zarządzanie danymi znajdującymi się na wielu różnych maszynach(tworzenie farm) dzięki czemu jesteśmy wstanie obrabiać naprawdę duże zbiory danych.

Jedną z aplikacji która współpracuje z Hadoop’em  jest Flume. Generalnie można powiedzieć że to aplikacja stworzona do przekazywania różnych zdarzeń. Cała koncepcja programu skupia się na 3 głównych bytach:

Sources – Są to źródła, końcówki, które zbierają/nasłuchują na zdarzenia. Np. powstanie wpisu w logu. Już dziś w standardowym pakiecie FLume mamy do dyspozycji kilka zaimplementowanych źródeł. Jeśli nie spełniają one naszych oczekiwań, przy znajomości języka Java możemy tworzyć w dość przystępny sposób obsługę innych źródeł. W sieci pojawiają się także projekty w których powstają biblioteki do obsługi różnych źródeł (np. Twitter).

Channels – Kanały, pozwalają zarządzać transferem informacji do źródeł di sinków (destynacji). Źródła dodają informacje do kanału a ‘sinks’ je z niego usuwają. Tak więc kanał staje się buforem na dane. Mamy do wyboru kilka różnych kanałów oraz wiele opcji konfiguracyjnych.

Sinks – Destynacje, gdy zbierzemy już dane ze źródła (z kanału) należy je gdzieś zapisać. Podobnie jak w przypadku źródeł, mamy do dyspozycji wiele gotowych implementacji. Pierwotnym ‘Sinkiem’ był hdfs, czyli system plików używanych przez Hadoop.

Postaram się tutaj przedstawić podstawy konfiguracji Flume, oraz możliwości analizy danych zbieranych przez to narzędzie.

Czytaj dalej  Cloudera i HortonWorks , czyli kolejna część tego kursu.