Share via


Big Data ve Windows Azure (3.) - Práce s daty - Hive a Pig

HDInsight je implementace Hadoop prostředí v Azure cloudu, které jsme si představili v prvním díle. Pro distribuované zpracování velkých dat nabízí model MapReduce základní abstrakci pro operace map a reduce prováděné jako operace nad sadami dvojic klíč-hodnota. Jak jsme si ukázali v druhém díle, je to poměrně nízkoúrovňové rozhraní, které je pro typické úlohy příliš primitivní. Proto se další projekty z rodiny Hadoop (zejména Hive a Pig) postavené nad souborovým systémem HDFS a frameworkem MapReduce snaží nabídnout mnohem vyšší úroveň abstrakce a tudíž nesrovnatelně vyšší komfort pro práci s daty. Hive nabízí abstrahuje soubory uložené v souborovém systému jako tabulky. Pig pak umožňuje vytvářet toky dat včetně zapojení vlastního JavaScript kódu pro složitější MapReduce operace. Obě dvě technologie si představíme v dnešním posledním díle miniseriálu.

Hive

Hive je distribuovaný datový sklad nad daty uloženými v HDFS nebo jiném kompatibilním souborovém systému. Do uložených dat je možné se dotazovat pomocí HiveQL jazyka, který je velmi podobný standardnímu SQL jazyku (některé věci samozřejmě chybí a jiné specifické věci jsou v něm navíc). Hive se proto někdy s určitou nadsázkou trefně nazývá “relační databáze pro chudé”. Veškeré HiveQL příkazy jsou převáděny do MapReduce jobů běžících nad souborovým systémem, od těchto implementačních detailů jste ale kompletně odstíněni. HiveQL se z logiky věci hodí zejména pro textové soubory s dobře definovanou strukturou, jakými jsou například logy z různých systémů a zařízení.

Oficiální tutoriál pro použití Hive s Azure HDInsight najdete zde. Hezký úvod do Hive a HiveQL je zde. Našel jsem ale zajímavější data pro experimenty. Zajímavější data o statistikách trestných činů používá cvičení v Azure Training Kitu, k dispozici zde (jenom pozor, pokud si stáhnete soubor s daty, je třeba odstranit uvozovky, vymazat první řádek s popisy sloupců a uložit soubor jako ANSI – s uložením textového souboru jako Unicode jsem měl špatnou zkušenost).

Zde je můj cvičný HiveQL skript nad výše zmíněným souborem s kriminálními činy používaném v Azure Training Kitu:

create table crime(ROWID INT, State STRING, City STRING, Year INT, Population INT, ViolentCrime INT, MurderAndNonEgligentManslaughter INT, ForcibleRape INT, Robbery INT, AggravatedAssault INT, PropertyCrime INT, Burglary INT, LarcenyTheft INT, MotorVehicleTheft INT, Arson INT) ROW FORMAT DELIMITED FIELDS TERMINATED BY ',' LINES TERMINATED BY '\n'

load data inpath '/user/hadoop/demo/hive/crime.csv' overwrite into table crime

select * from crime limit 10

select city, max(violentcrime) as maxviolentcrime from crime group by city order by maxviolentcrime desc limit 10

create table crime_results as select city, max(violentcrime) as maxviolentcrime from crime_data group by city order by maxviolentcrime desc

select * from crime_results limit 10

drop table crime

Jak vidíte, syntaxe je velmi podobná běžné SQL syntaxi s rozšířeními pro naloadování dat do tabulky, oddělovače v textových souborech apod.

Tyto příkazy lze spouštět různými způsoby. Nejjednodušší je spuštění jednotlivých příkazů z interaktivní konzole přímo v HDInsight portále:

image

Z hlediska integrace Hive dat do firemních systémů, analýzu, reportování apod. je mimořádně zajímavé využití Hive ODBC ovladače, který lze stáhnout zde a návod k jeho použití je zde. Po jeho instalaci stačí nastavit v systému nový ODBC datový zdroj:

image

Pak je v Excelu nebo jiném reportingovém či analytickém nástroji možné vybrat příslušnou tabulku:

image

A dále pracovat s daty, jako by byla uložena v normální relační databázi:

image

Úplně jinou skupinu tvoří vývojáři, kteří se chtějí k funkcím Hive databáze dostat programově. S výhodou mohou využít Hadoop .NET SDK, které umožňuje:

  • Provádět HiveQL dotazy pomocí objektu HiveConnection (příklad zde)
  • Používat LINQtoHive k pohodlnému silně typovému dotazování do Hive databáze podobně jako např. v Entity Frameworku (příklad zde)
  • Spouštět asynchronně dávky Hive příkazů a volitelně čekat na jejich výsledek (příklad zde). 

Pig

Dalším programem z rodiny Hadoop je Pig. Skládá se z funkcionálního jazyka pro popis datového toku nazývaného Pig Latin a běhového prostředí pro spouštění programů v něm napsaném. Program v Pig Latin je vlastně série datových transformací, které jsou “za oponou” zkonvertovány do programu běžícího v MapReduce prostředí – v podstatě by se dal označit jako ETL (Extract-Transform-Load) nástroj či programovatelnou datovou pumpu pro velké objemy textových souborů. K Pig Latin lze vytvářet extenze pomocí tzv. UDF (User Defined Functions) pomocí řady různých jazyků. Přímo z něj lze rovněž volat MapReduce programy napsané v JavaScriptu. Hodí se tak i pro méně strukturovaná data než Hive.

Pojďme si ukázat příklad skriptu:

crime = LOAD '/user/hadoop/demo/pig/crime.csv' USING PigStorage(',') AS (ROWID:int, State:chararray, City:chararray, Year:int, Population:int, ViolentCrime:int, MurderAndNonEgligentManslaughter:int, ForcibleRape:int, Robbery:int, AggravatedAssault:int, PropertyCrime:int, Burglary:int, LarcenyTheft:int, MotorVehicleTheft:int, Arson:int);

largeCities = LIMIT (ORDER (FILTER crime BY Year == 2008) BY Population DESC) 10;

DUMP largeCities;

burglaries = FOREACH (GROUP crime BY (State,City)) GENERATE group.State, group.City, SUM(crime.Burglary) AS Count;

DESCRIBE burglaries;

burglariesInLargeCities = JOIN largeCities BY (State,City) LEFT, burglaries BY (State,City);

result = FOREACH burglariesInLargeCities GENERATE largeCities::State, largeCities::City, largeCities::Population, burglaries::Count;

STORE result INTO '/user/hadoop/demo/pig/StoredResult';

storedResult = LOAD '/user/hadoop/demo/pig/StoredResult' AS (State:chararray, City:chararray, Population:int, Count:int );

DUMP storedResult;

Tento skript najde 10 největších měst podle počtu obyvatel v roce 2008. Pro těchto 10 měst pak vypočte počet vloupání za celé sledované období. Zajímavé na prostředí Pig je “líné” provádění. Veškeré operace jsou odkládány až na dobu, kdy jsou data skutečně potřeba, což je typicky provedení příkazu DUMP (výpis na obrazovku) anebo STORE (uložení výsledku).

Podrobnou dokumentaci a seznam příkazů najdete na domovské stránce projektu. Tutoriál pro vyzkušení v rámci HDInsight je zde.

Sqoop 

Pro úplnost uveďme ještě jeden nástroj z rodiny kolem Hadoop, a tím je Sqoop (oficiální stránka projektu je zde). Na rozdíl od výše uvedených se jedná o jednoúčelový nástroj, který dokáže přenášet data z relační databáze (např. SQL serveru nebo jiného serveru s JDBC ovladači).

Příklad použití sqoop pro export dat z relační databáze do Hadoop clusteru najdete v tomto tutoriálu. Kompletní příklad pro opačný směr, tedy zpracování dat v Hadoopu a jejich finální import do relační databáze SQL Azure je zde.

Závěrem

V tomto třídílném seriálu jsme se seznámili se základními technologickými bloky technologie HDInsight, tedy implementace Hadoop technologií běžící na Windows Serveru v prostředí Azure Cloudu. Doufám, že vás seriál zaujal a podnítí vás k experimentování s touto zajímavou technologií.

Michael