hive és pig
Post on 31-Dec-2015
40 Views
Preview:
DESCRIPTION
TRANSCRIPT
Kazi SándorMagasszintű nyelvek MR
alapokon
Hive és Pig
2014.
MapReduce – Hive / PigTeljes workflow egyben
Nem nekünk kell a folyamatok egyes belső állapotait kezelniOptimalizációs lehetőség
MapReduce jobok belseje, sorrendAkár a teljes feladat ismert
Deklaratív(abb) környezetEltolódik a programozási feladat hangsúlya
Az a kérdés, mit szeretnénkKevésbé kérdés (de néha kérdés), hogy pontosan hogyan is
HiveQL és Pig LatinMegjelenhetnek sémainformációk (félig-meddig)
Típus megkötésekTárolási formátumokJogosultságok
Mikor melyik? – Hive / PigMindkettő MR framework felettiA Hive jó nekünk, ha
LekérdezésekhezAz adat már betöltve, ennek egy struktúrált kivonata kell
Adott kérdések megválaszolásáraSQL-ből készülünk átszokni
A HiveQL-nél alacsony a belépési küszöbA Pig jó nekünk, ha
ETL (Extract-Transform-Load) folyamatokhozAdatelőkészítésre elemzés előttHosszú műveletsorok véghezvitelére
Gyakran együtt használják őketNem teljesen váltják ki egymás funkcionalitásbanPl.: Yahoo, Facebook
TartalomAlapok
– ArchitektúraKliensek
– Csomagban– Egyéb
Adatbetölés– Internal/External– Adattípusok– Formátum
Impala
HiveQL– DDL– DML– Lekérdezések– Mintavételezés– Nézetek– Indexek, Végrehajtás– Függvények– Streaming– Jogosultságok
Tervezés, Konfiguráció
Alapok – Mi a HiveAdattárház megvalósítás Hadoop felett
– A MapReduce framework felett• Műveletektől függően lehet MR nélkül
– Séma csak olvasáshoz (OLAP, nem OLTP)– Félstruktúrált adatokon is– Alapvetően soralapú tárolás
Mit nem ad a Hive– Nem biztosít gyors válaszokat ad-hoc lekérdezésekre– Nincs rekord szintű insert/update/delete
Saját lekérdező nyelv (HiveQL)– SQL-hez hasonló szintaxis– Magasszintű, deklaratív– Az optimizer lényegében a MapReduce jobbal dolgozik
Alapok – ArchitektúraMetastore
Metaadatok az adatokrólMetadatok az adatbázisról
TáblákTípusos oszlopokÖsszetett adatstruktúrák is (0NF)
PartíciókStatikus illetve dinamikus partíciók
Dinamikus partíciók alaphelyzetben kikapcsolvaGyorsítja a partíciókra irányuló lekérdezéseket
Vödrök (Buckets)Hash partíciókGyorsítja a join műveleteket
Hive – KliensekCLI: Command Line InterfaceHWI: Hive Web Interface
– Editor, History, Table/Database browserJDBC, ODBC, Thrift
– Adatbázishozzáférés sztandard interfészeken
Hue (Beeswax) – <server>:8000 (default port)– Editor (syntax highlighting, save/load), History, Table/Database
browserQubole – Big Data as a Service
– Query Optimizer (Hive): cache, job optmizierAqua Data Studio
– Vizuális query építés, import/export, stb.– FluidShell – saját szkriptkörnyezet
Adatbetöltés – In/ExternalInternal
– Adatok ténylegesen a Hive struktúrájában– Adatstruktúra törlésekor az adat is elveszikCREATE TABLE <name> …;LOAD DATA INPATH <path> [OVERWRITE] INTO TABLE <name>;
External– HDFS, mint külső adathely– Az adatok a helyükön maradnak– Adatstruktúra törlésekor csak az absztrakció tűnik elCREATE EXTERNAL TABLE <name> …;LOAD DATA INPATH <path> [OVERWRITE] INTO TABLE <name>;
Adatbetöltés – AdattípusokTípus Leírás Méret Példa
TINYINT Egész 1 B 99, 99Y
SMALLINT Egész 2 B 99, 99S
INT Egész 4 B 99
BIGINT Egész 8 B 99, 99L
BOOLEAN Bool 1 b True
FLOAT Lebegőpontos szám 4 B 3.14159
DOUBLE Lebegőpontos szám 8 B 3.14159
DECIMAL Lebegőpontos decimális szám (max 38) 16 B 40004, 1E14
STRING Karaktersorozat … 'String', "String"
VARCHAR Karaktersorozat méretmaximummal … …
CHAR Karakter … …
TIMESTAMP Időbélyeg (10-9 s) … …
DATE Dátum (1 day) … …
BINARY Bittömb … …
STRUCT Struktúra … struct<…, …>
MAP Kulcs-érték struktúra … map<'k', 'v‘, …>
ARRAY Tömb … array<…>
UNIONTYPE Típusok összeolvasztása (OR művelete) … uniontype<…, …>
Adatbetöltés – FormátumHáromféle határoló karakter (delimiter)
1. Sor (default: soremelés, \n)2. Oszlop (default: ^A, \001)3. Összetett struktúra (default: ^B, \002)4. Map kulcs-érték (default: ^C, \003)
CREATE TABLE <name> (…)ROW FORMAT DELIMITEDFIELDS TERMINATED BY '\001'COLLECTION ITEMS TERMINATED BY '\002'MAP KEYS TERMINATED BY '\003'LINES TERMINATED BY '\n'STORED AS TEXTFILE;
De van más ROW FORMAT lehetőség is (SerDe)…
Cloudera ImpalaImpala
– Elosztott adattárház, nem MR felett– MPP az HBase és a HDFS adatain– SQL– Interaktív lekérdező engine– Open source– Disztribúciókban: Cloudera, MapR, AWS
Kapcsolódó Hive jövő– Hive on Spark: HIVE-7292 jira– Stinger.next: from Hive to Hadoop-SQLTehát a Hive és az Impala egyirányba mozognak
• Csökken az együttes létjogosultságukApache Drill
HiveQL – VáltozókNégy namespace
1. hivevar--define key=value--hivevar key=value
2. hiveconf--hiveconf key=value
3. system--hiveconf key=value
4. env (bent read only)-- értékadásSET [<namespace>:]<key>=<value>;-- lekérdezésSET [<namespace>:]<key>;-- alapértelmezett namespace: hivevar
HiveQL – DDL (database)CREATE DATABASE [IF NOT EXISTS] <name>
[LOCATION <path>][COMMENT <comment>];
ALTER DATABASE <name> SET DBPROPERTIES (<key> = <value>);DROP DATABASE [IF EXISTS] <name> [CASCADE];
DESCRIBE DATABASE [EXTENDED] <name>;
SHOW DATABASES [LIKE <pattern>];USE <name>;
SHOW TABLES [IN <database>];
HiveQL – DDL (table)CREATE [EXTERNAL] TABLE [IF NOT EXISTS] [<database>.]<table>(
<column> <type> [COMMENT <comment>], …)[COMMENT <comment>][TBLPROPERTIES (<key> = <value>, …)]…;
ALTER TABLE [<database>.]<table> …;DROP TABLE [IF EXISTS] [<database>.]<table>;
CREATE [EXTERNAL] TABLE [IF NOT EXISTS] [<database>.]<table>LIKE [<database>.]<table>;
CREATE [EXTERNAL] TABLE AS SELECT …;
DESCRIBE [EXTENDED] [<database>.]<table>;SHOW PARTITIONS <partitions> PARTION(<column>=<value>);
HiveQL – DDL (table++)További klózok a CREATE TABLE után:
PARTITIONED BY (<column> <type>, …)statikus/dinamikus partícionálás (az oszloplistától külön)
CLUSTERED BY (<column>, …) INTO <b> BUCKETSszétdarabolás értékkészlet szerint vödrökbe
ROW FORMAT <format>rekordformátum (DELIMITED, SERDE <class>)
STORED AS <format>tárolás formátuma (TEXTFILE, …, INPUTFORMAT <format>, …)
STORED BY <store>Hive storage handler osztály (SERDE)
LOCATION <path>az adat helye (mentés helye)
WITH HINTS <name>=<value>
optimalizációs hintek
HiveQL – DML (load, insert)LOAD DATA [LOCAL] INPATH <path>[OVERWRITE] INTO TABLE <table>[PARTITION (<column>[=<value>], …)]; -- hive.exec.dynamic.partition
INSERT [OVERWRITE] TABLE <table>[PARTITION (<column>[=<value>], …)]SELECT …;
INSERT [OVERWRITE] LOCAL DIRECTORY '/tmp/ca_employees'[PARTITION (<column>[=<value>], …)]SELECT …;
FROM <table> [<alias>]INSERT …[INSERT …]…;
HiveQL – LekérdezésekKlózok
1. SELECToszlop, számított érték, aliasCASE WHEN <bool> THEN <value> … ELSE … END
2. FROMtábla, belső select + alias, JOIN, SEMI JOIN, UNION ALL
3. WHERECAST(<ertek> AS <tipus>), LIKE, RLIKE
4. GROUP BY5. HAVING6. DISTRIBUTE BY / CLUSTER BY
partitioning, partitioning + per reducer sort
7. ORDER BY / SORT BYtotal order, per reducer sort
8. LIMIT
HiveQL – MintavételezésMintavételezni nagyon fontos lehet:
– A fejlesztési idő rövidítésére (tesztelés gyorsítása)– Adatelemzési módszerek támogatására– …
SELECT … FROM <table> TABLESAMPLE(<sample>)
<sample> lehetőségek:– BUCKET <n> OUT OF <N> ON rand()– BUCKET <n> OUT OF <N> ON <oszlop>– <percent> PERCENT
• HDFS blokknál kisebbet nem tudunk visszaadni
HiveQL – Nézetek-- nem materializáltCREATE VIEW [IF NOT EXISTS] <view> AS[COMMENT <comment>][TBLPROPERTIES (<key>=<value>, …)]SELECT …;ALTER VIEW <view> SET TBLPROPERTIES (<key>=<value>, …);DROP VIEW [IF EXISTS] <view>;
SHOW TABLES [IN <database>];DESCRIBE [EXTENDED] [<database>].<view>;
CREATE [EXTERNAL] TABLE [IF NOT EXISTS] [<database>.]<table>LIKE [<database>.]<view>;
HiveQL – IndexekCREATE INDEX <index> ON TABLE <table>(<column>, …)[<splitting>]AS {'HBASE' | <handler>}[WITH DEFERRED REBUILD][IDXPROPERTIES (<name>=<value>, …)] [COMMENT <comment>][IN TABLE <indextable>] [PARTITIONED BY (<column>, …)];
ALTER INDEX <index> ON TABLE <table>[PARTITION (<column>=<value>, …)] REBUILD;DROP INDEX [IF EXISTS] <index>ON <table>;
SHOW [FORMATTED] INDEXON <table>;
EXPLAIN [EXTENDED] SELECT …;
HiveQL – FüggvényekSHOW FUNCTIONS;DESCRIBE FUNCTION [EXTENDED] <func>;
ADD JAR <path>;CREATE TEMPORARY FUNCTION <func> AS <class>;DROP TEMPORARY FUNCTION [IF EXISTS] <func>;ADD FILE <file>;
CREATE TEMPORARY MACRO <name> (<value> <type>) …;
3 User Defined Function (UDF) flag:– Deterministic (true), Stateful (false), Distinctlike (false)
Depivotálás: explode(), LATERAL VIEW [OUTER]
HiveQL – StreamingSELECT TRANSFORM (<columns>)USING <program> AS <columns>FROM …;
Pl.:SELECT TRANSFORM (column1, column2)USING '/bin/cat' AS newcolumn1, newcolumn2FROM a;
Hive – TervezésTable-by-Day minta:
CREATE TABLE <table> … PARTITIONED BY (<column>, …);ALTER TABLE <table> ADD PARTITION(<column>=<value>, …);
Lehetőleg ne normalizáljunk:– Eleve nem csak relációs adatokat tudunk tárolni– Nincs UPDATE, nincs referenciális integritás garancia :(
Többszörös olvasás:– a FROM klóz előrehozása, több művelet együttes felsorolása
Tömörítés:– Szinte mindig érdemes
Oszlop alapú tárolás:– Ha nagyon sok az oszlop vagy kicsi az értékkészlet– RCFile fájltípus
Hive – Konfigurációhive.cli.print.current.db={true|false}
Az aktuálisan kiválasztott adatbázis neve a konzolon.hive.stat.retries.max=<number>
Maximum újrapróbálkozások száma.hive.stat.retries.wait=<millisec>
Két újrapróbálkozás közötti idő.hive.mapred.mode={strict|nonstrict}
Pontosabb illeszkedés elvárása…hive.enforce.bucketing={true|false}
Szeletelés automatizálása íráskor (default: false).mapred.map.tasks.speculative.execution={true|false}
Spekulatív Map indítás.mapred.reduce.tasks.speculative.execution={true|false}
Spekulatív Reduce indítás.
Apache Pig
TartalomPig
– Mi a Pig– Belső működés
Interfész– Grunt, Hue– ElephantBird– Pygmalion, Piglet,
PigPy– DataFu, PiggyBank
Adatmodell– Típusok– Sémák
Pig Latin– Alapok– Input / Output– Relációs műveletek
• Join– UDF– Szerkezetek– Streaming– MapReduce– Beállítások– Preprocesszor– Tesztelés
Alapok – Mi a PigAdatkezelő szkriptnyelv
– A MapReduce framework felett– Félstruktúrált adatokon is, sokféle adattípuson– A MapReduce feletti natív párhuzamosíthatóság a cél– Hadoop ETL folyamatok tipikus platformja
Mit nem ad a Pig– Nem SQL, nem egy IDE– Nincs rekord szintű insert/update/delete
Saját szkriptnyelv (Pig latin)– Referenciák beágyazása, optimalizálás
Célok– Pigs eat anything, Pigs can live (almost) anywhere– Pigs are domestic animals ( ~ user friendly)– Pigs fly ( ~ gyors)
Alapok – Belső működésKétféle végrehajtási mód
– Local modejava -cp $PIGDIR/pig.jar org.apache.pig.Main -x local script.pig» Lehetnek Warning-ok az outputban» Prototípus gyártáshoz
– MapReduce modejava -cp $PIGDIR/pig.jar:$HCONF org….Main script.pig
Végrehajtás szakaszai:1. Input: Pig latin kód (data flow language)2. Irányított, körmentes gráf3. MapReduce workflow
Alapok – WordCount
Interfészek – Grunt és HueGrunt
CLI – interaktív parancssoros interfész (pig parancs)Pig parancsok, HDFS utasítások, job-menedzsment:
cat, clear, fs, sh, cd, cp, copyFromLocal, copyToLocal, dump, describe, aliases, explain, help, history, kill, ls, mv, mkdir, pwd, quit, register, rm, rmf, set, illustrate, run, exec, scriptDone
HueWeb felület
Hortonworks: 8000-s portCloudera: 8888-s port
Syntax highlightingMentés / Betöltés (szkriptek)PIG HelperJAR feltöltés
Interfészek – EgyébElephantBird
Mindenféle Input- és OutputFormatokPig, Hive, HBase, stb.
Twitter által open source-oltPygmalion
Apache Cassandra integrációPiglet
Ruby integrációPigpy
Python integrációPiggyBank / DataFu
Pig UDF (user defined function) kollekciókAWS
AWS-en is elérhető
Adatmodell – TípusokSkalár típusok
Int 10long 1000Lfloat 6.9f 3.2e-3fdouble 6.9 3.2e-3chararray 'string' 'elso\nmasodik\u0001'bytearray -
Komplex típusokmap: (chararray, value) dictionary… a value bytearray-ként
['nev'#'Antal', 'foglalkozas'#'mosogepszerelo']tuple: fix méretű, rendezett elemhalmaz ('bob', 92)bag: tuple-ök halmaza {('alice', 532), ('bob', 92), …}NINCS set típus
NULL koncepció, mint az SQL-ben
Adatmodell – Sémákdataset = load 'dataset' as (x:chararray, y:chararray, z:float);
Adattípusok megadására van lehetőség (séma)Bármilyen tuple-re megadhatóMegadható bármilyen tuplehalmazra is (pl.: bag)Ha nem adjuk meg akkor a legjobb tippjeivel dolgozik
Az alapvető szám típus a doubleEgyszerű típusokon: as (x:<type>)Komplex típusokon
as (x:map[]) as (x:map[int])as (x:tuple()) as (x:tuple(y:int, z:int))as (x:bag{}) as (x:bag{<tuplenev>:(y:int, z:int)})
Castolás (csonkolás lehetséges; null lehetséges)Ahogy procedurálisan megszokott: (int)x
mdata = load 'mydata' using HCatLoader();
Pig Latin – AlapokAz utasításokat ;-vel zárjukAliasokat / referenciákat használunk
A = load 'sample_table' (column1, column2, column3);B = filter A by column3 > 0;C = foreach B generate UPPER(column1);dump C;
Lehet ugyanazt a nevet is használni, de nem ajánlottRontja az olvashatóságotNem tudja segíteni a memóriakezelést
Angol betűvel kezdődő alfanumerikus nevek (_ is megengedett)Case sensitive is, meg nem is
Kulcsszavak NEMRelációk, mezők, referenciák és függvények nevei IGEN
SQL-stílusban kommentelhetünk-- után a sorkomment /* */ között a blokk-komment
Pig Latin – Input / OutputLOAD <file> [USING <loadfunc>] [AS <schema>];
<file>: abszolút vagy relatív ('home/<username>'-ből) path, object<schema>: sémainformációk (oszlopnevek, típusok)<loadfunc>: valamilyen betöltési függvény
• PigStorage: csv, tsv beolvasás (default)• TextLoader: text beolvasás• HBaseStorage: hbase-ből olvasás• …
STORE <alias> INTO <file> [USING <storefunc>];DUMP <alias>; -- felületreDESCRIBE <alias>; -- séma kiírása
Alias szinte bármi elé mehet: [<alias> = ]Globok: ?, *, [abc], [a-z], [^abc], [^a-z], \*, {ab, cd}
Pig Latin – Relációs 1/2FOREACH <alias> GENERATE <genexpr>; -- minden elemre
<genexpr>:• Oszlopok, oszlopintervallum (oszlop1..oszlop2), pozíciók
($0)• Függvény eredménye (UDF, ?:, aritmetika) névtelen lesz• Átnevezett oszlop, függvény, stb. (<expr> AS <name>)
FILTER <alias> BY <filterexpr>; -- szűrés<filterexpr>:
• Hasonlító operátorok ==, !=, >, <, >=, <=, IS [NOT] NULL• Reguláris kifejezés: [NOT] <oszl> MATCHES <regexp>
GROUP <alias> BY <groupexpr>; -- csoportosítás<groupexpr>:
• Kifejezés ~ <genexpr>• Kifejezések zárójelben, vesszővel elválasztva
Tipikusan FOREACH és aggregáló függvények társaságában
Pig Latin – Relációs 2/2ORDER <alias> BY <orderexpr>; -- rendezés
<orderexpr>: akár több feltételt is felsorolva• Oszlop és ASC vagy DESC
DISTINCT <alias>; -- ismétlődésszűrésJOIN <joinon1> [<jointype>], <joinon2> …; -- illesztés
<joinon*>: <alias> BY <cols>,<cols>: kb. <groupexpr><jointype>: a szokásos, az illesztés típusa
LIMIT <alias> <num>; -- sorszámlimitJelenleg nem azt csinálja, amit a head parancs… :(
SAMPLE <alias> <ratio>; -- véletlen mintavétel<cmd> PARALLEL <num>; -- reducerek száma
<cmd> bármilyenRANK <alias> BY <orderexpr>; -- sorszámozás
Pig Latin – UDFVannak beépített function-ökCsomó hasznos dolog már library-ből elérhető
PiggyBank, DataFuUDF = User Defined Function
Java class használataREGISTER <jarpath>;… <package>.<class>(…) …;
Névrövidítés definícióval:DEFINE <name> <package>.<class>();
Statikus java függvények:DEFINE <name> InvokeFor<javarettype>(<sfunc>, <param>);
Python UDF használat példa (export PYTHONPATH=…):REGISTER example.py USING jython AS bballudfs;… bballudfs.example(…) …
Pig Latin – SzerkezetekFOREACH …
Flatten: lista kisimítása (~ keresztszorzat, Hive explode())“?:” operátorral és az isEmpty()-vel kezelhető az üres lista is
Beágyazott foreachdaily = LOAD 'NYSE_daily' AS (exchange, symbol);grpd = GROUP daily BY exchangeuniqcnt = FOREACH grpd {
sym = daily.symbol;uniq_sym = DISTINCT sym;GENERATE group, COUNT(uniq_sym);}
JOIN … USING <mode>;<mode>: 'replicated', 'skewed', 'merge', …
COGROUP <alias1> BY <cols1>, <alias2> BY <cols2> …;UNION <aliases>; -- konkatenálás (!)CROSS <aliases>; -- keresztszorzat (!!!)
Pig Latin – StreamingSTREAM <alias> THROUGH <streamprog> [AS <schema>];
divs = LOAD 'table' AS (a, b);highdivs = STREAM divs THROUGH `example.pl` AS (a, b);
Rövid név megadása DEFINE-nalDEFINE ex `example.pl` ship('example.pl');divs = LOAD 'table' AS (a, b);highdivs = STREAM divs THROUGH ex AS (a, b);
Egyéb szükséges fájlok átadásaDEFINE ex `example.pl` ship('example.pl', 'other.pm');divs = LOAD 'table' AS (a, b);highdivs = STREAM divs THROUGH ex AS (a, b);
Distributed CacheDEFINE ex `ex.pl` cache('/data/shared/data#exdata');
Input, OutputDEFINE ex `ex.pl abc def` input('abc') output('def');
Pig Latin – MapReduceAlap MapReduce hívás
MAPREDUCE <jarfile>STORE <alias> INTO 'input'LOAD 'output' AS <alias>;
A szokásos LOAD és STORE paraméterek működnek…
Speciális paraméterezésMAPREDUCE <jarfile>STORE <alias> INTO 'input'LOAD 'output' AS <alias>`<package>.<class> input output`;
Pig Latin – BeállításokSET <param> <value>;
SET default_parallel 3;SET job.name my_job;users = LOAD 'users';…
A partitioner alaphelyzetben felüldefiniálhatóKivéve: order és skew join esetébenREGISTER partpkg.jar;users = LOAD 'users' AS (id, age, zip);grp = GROUP users BY id PARTITION BY partpkg.partPARALLEL 10;
Pig Latin – PreprocesszorParaméterbehelyettesítés
yesterday = FILTER daily BY date == '$DATE';
Ha nincs megadva futtatáskor, hibát kapunk…pig -p DATE=2014-12-18 daily.pig
Paramfile: <param>=<value> sorok, # a kommentjelMakrók
DEFINE <name> (<params>) RETURNS <resalias> {<body>};
A makró törzsében a paraméterek (out is) neve elé $-jelet kell írniElőnézet is van a -dryrun paramétert használva…
Pigception[SET pig.import.search.path '<path1>[,…]';]IMPORT '<path>';
Kódbehelyettesítés, egy közös namespaceEgy fájl csak egyszer lehet (makró kell a töbszöröshöz)
Pig – TesztelésA sémát tudjuk ellenőrizni egy-egy aliasnál
DESCRIBE <alias>;
Ha az nem futásidőben derül kiA Pig igyekszik elrejteni a MapReduce részleteket, de:
ASCII-art végrehajtási terv:pig -x local -e 'explain -script e.pig'
Grafikus végrehajtási terv:… -dot -out e.dot
Ránézhetünk az előálló adatok struktúrájára ispig -e 'illustrate -script i.pig'
v0.8-től kezdődően minden futtatás végén statisztkákat is kapunkOptimalizációs feature-ök kikapcsolhatók a -t <name> paraméterrel
SplitFilter, MergeFilter, PushUpFilter, PushDownForEachFlatten, ColumnMapKeyPrune, LimitOptimizer, AddForeach, MergeForeach, LogicalExpressionSimplifier, All
top related