450 likes | 625 Views
Hive és Pig. Kazi Sándor. Magasszintű nyelvek MR alapokon. 2014. MapReduce – Hive / Pig. Teljes workflow egyben Nem nekünk kell a folyamatok egyes belső állapotait kezelni Optimalizációs lehetőség MapReduce jobok belseje , sorrend Akár a teljes feladat ismert
E N D
Hive és Pig Kazi Sándor Magasszintűnyelvek MR alapokon 2014.
MapReduce – Hive / Pig Teljes workflow egyben Nemnekünkkell a folyamatokegyesbelsőállapotaitkezelni Optimalizációslehetőség MapReducejobokbelseje, sorrend Akár a teljesfeladatismert Deklaratív(abb) környezet Eltolódik a programozásifeladathangsúlya Az a kérdés, mitszeretnénk Kevésbékérdés (de néhakérdés), hogypontosanhogyan is HiveQLés Pig Latin Megjelenhetneksémainformációk (félig-meddig) Típusmegkötések Tárolásiformátumok Jogosultságok
Mikormelyik? – Hive / Pig Mindkettő MR framework feletti A Hive jónekünk, ha Lekérdezésekhez Azadatmárbetöltve, ennekegystruktúráltkivonatakell Adottkérdésekmegválaszolására SQL-bőlkészülünkátszokni A HiveQL-nélalacsony a belépésiküszöb A Pig jónekünk, ha ETL (Extract-Transform-Load) folyamatokhoz Adatelőkészítésreelemzéselőtt Hosszúműveletsorokvéghezvitelére Gyakranegyütthasználjákőket Nemteljesenváltjákkiegymásfunkcionalitásban Pl.: Yahoo, Facebook
Tartalom Alapok • Architektúra Kliensek • 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 Hive AdattárházmegvalósításHadoopfelett • AMapReduce framework felett • Műveletektőlfüggőenlehet MR nélkül • Sémacsakolvasáshoz (OLAP, nem OLTP) • Félstruktúráltadatokon is • Alapvetőensoralapútárolás Mitnem ad a Hive • Nembiztosítgyorsválaszokat ad-hoc lekérdezésekre • Nincsrekordszintű insert/update/delete Sajátlekérdezőnyelv (HiveQL) • SQL-hezhasonlószintaxis • Magasszintű, deklaratív • Az optimizer lényegében a MapReducejobbaldolgozik
Alapok – Architektúra Metastore Metaadatokazadatokról Metadatokazadatbázisról Táblák TípusososzlopokÖsszetettadatstruktúrák is (0NF) Partíciók Statikusilletvedinamikuspartíciók Dinamikuspartíciókalaphelyzetbenkikapcsolva Gyorsítja a partíciókrairányulólekérdezéseket Vödrök (Buckets) Hash partíciók Gyorsítja a join műveleteket
Hive – Kliensek CLI: Command Line Interface HWI: Hive Web Interface • Editor, History, Table/Database browser JDBC, ODBC, Thrift • Adatbázishozzáféréssztandardinterfészeken Hue (Beeswax) – <server>:8000 (default port) • Editor (syntax highlighting, save/load), History, Table/Database browser Qubole – Big Data as a Service • Query Optimizer (Hive): cache, job optmizier Aqua Data Studio • Vizuálisquery építés, import/export, stb. • FluidShell – sajátszkriptkörnyezet
Adatbetöltés– In/External Internal • Adatokténylegesen a Hive struktúrájában • Adatstruktúratörlésekorazadat is elveszik CREATE TABLE <name> …; LOAD DATA INPATH <path> [OVERWRITE]INTOTABLE <name>; External • HDFS, mint külsőadathely • Azadatok a helyükönmaradnak • Adatstruktúratörlésekorcsakazabsztrakciótűnik el CREATEEXTERNALTABLE <name> …; LOADDATAINPATH <path> [OVERWRITE]INTOTABLE <name>;
Adatbetöltés– Formátum Háromfélehatárolókarakter (delimiter) • Sor (default: soremelés, \n) • Oszlop (default: ^A, \001) • Összetettstruktúra (default: ^B, \002) • Map kulcs-érték (default: ^C, \003) CREATE TABLE <name> (…) ROW FORMAT DELIMITED FIELDS TERMINATED BY '\001' COLLECTION ITEMS TERMINATED BY '\002' MAP KEYS TERMINATED BY '\003' LINES TERMINATED BY '\n' STORED AS TEXTFILE; De van másROW FORMAT lehetőség is (SerDe)…
Cloudera Impala Impala • Elosztottadattárház, nem MR felett • MPP azHBaseés a HDFS adatain • SQL • Interaktívleké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-SQL Tehát a Hive ésaz Impala egyiránybamozognak • Csökkenazegyütteslétjogosultságuk Apache Drill
HiveQL– Változók Négy namespace • hivevar --define key=value --hivevar key=value • hiveconf --hiveconf key=value • system --hiveconfkey=value • env(bent read only) -- értékadás SET[<namespace>:]<key>=<value>; -- lekérdezés SET[<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>; SHOWDATABASES [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ábbiklózok a CREATE TABLEután: PARTITIONED BY (<column> <type>, …) statikus/dinamikuspartícionálás(azoszloplistátólkülön) CLUSTERED BY (<column>, …) INTO <b> BUCKETS szétdarabolásértékkészletszerintvödrökbe ROW FORMAT <format> rekordformátum (DELIMITED, SERDE <class>) STORED AS <format> tárolásformátuma (TEXTFILE, …, INPUTFORMAT <format>, …) STORED BY <store> Hive storage handler osztály (SERDE) LOCATION <path> azadathelye (mentéshelye) WITH HINTS <name>=<value> optimalizációshintek
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ések Klózok • SELECT oszlop, számítottérték, alias CASE WHEN <bool> THEN <value> … ELSE … END • FROM tábla, belső select + alias, JOIN, SEMI JOIN, UNION ALL • WHERE CAST(<ertek> AS <tipus>), LIKE, RLIKE • GROUP BY • HAVING • DISTRIBUTE BY / CLUSTER BY partitioning, partitioning + per reducer sort • ORDER BY / SORT BY total order, per reducer sort • LIMIT
HiveQL– Mintavételezés Mintavételezninagyonfontoslehet: • A fejlesztésiidőrövidítésére (tesztelésgyorsítása) • Adatelemzésimódszerektámogatására • … SELECT … FROM <table> TABLESAMPLE(<sample>) <sample> lehetőségek: • BUCKET <n> OUT OF <N> ON rand() • BUCKET<n> OUTOF <N> ON<oszlop> • <percent> PERCENT • HDFS blokknálkisebbetnemtudunkvisszaadni
HiveQL– Nézetek -- nemmaterializált CREATE 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– Indexek CREATEINDEX <index> ONTABLE <table>(<column>, …) [<splitting>] AS {'HBASE' | <handler>} [WITH DEFERRED REBUILD] [IDXPROPERTIES (<name>=<value>, …)] [COMMENT <comment>] [INTABLE <indextable>] [PARTITIONEDBY (<column>, …)]; ALTER INDEX <index> ON TABLE <table> [PARTITION (<column>=<value>, …)] REBUILD; DROPINDEX [IFEXISTS] <index> ON <table>; SHOW [FORMATTED] INDEX ON <table>; EXPLAIN [EXTENDED] SELECT …;
HiveQL– Függvények SHOW FUNCTIONS; DESCRIBE FUNCTION [EXTENDED] <func>; ADDJAR <path>; CREATETEMPORARYFUNCTION <func> AS <class>; DROPTEMPORARYFUNCTION [IFEXISTS] <func>; ADDFILE <file>; CREATETEMPORARYMACRO<name>(<value> <type>) …; 3 User Defined Function (UDF) flag: • Deterministic (true), Stateful (false), Distinctlike (false) Depivotálás: explode(), LATERAL VIEW [OUTER]
HiveQL– Streaming SELECT TRANSFORM (<columns>) USING <program> AS <columns> FROM …; Pl.: SELECT TRANSFORM (column1, column2) USING '/bin/cat' AS newcolumn1, newcolumn2 FROM a;
Hive – Tervezés Table-by-Day minta: CREATE TABLE <table> … PARTITIONED BY (<column>, …); ALTER TABLE <table> ADD PARTITION(<column>=<value>, …); Lehetőleg ne normalizáljunk: • Elevenemcsakrelációsadatokattudunktárolni • NincsUPDATE, nincsreferenciálisintegritásgarancia :( Többszörösolvasás: • a FROMklózelőrehozása, többműveletegyüttesfelsorolása Tömörítés: • Szintemindigérdemes Oszlopalapútárolás: • Ha nagyonsokazoszlopvagykicsiazértékkészlet • RCFilefájltípus
Hive – Konfiguráció hive.cli.print.current.db={true|false} Azaktuálisankiválasztottadatbázisneve a konzolon. hive.stat.retries.max=<number> Maximum újrapróbálkozásokszáma. hive.stat.retries.wait=<millisec> Kétújrapróbálkozásközöttiidő. hive.mapred.mode={strict|nonstrict} Pontosabbilleszkedéselvárása… hive.enforce.bucketing={true|false} Szeletelésautomatizá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ívReduce indítás.
Tartalom Pig • 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ósműveletek • Join • UDF • Szerkezetek • Streaming • MapReduce • Beállítások • Preprocesszor • Tesztelés
Alapok – Mi a Pig Adatkezelőszkriptnyelv • AMapReduce framework felett • Félstruktúráltadatokon is, sokféleadattípuson • A MapReducefelettinatívpárhuzamosíthatóság a cél • Hadoop ETL folyamatoktipikusplatformja Mitnem ad a Pig • Nem SQL, nemegy IDE • Nincsrekordszintű insert/update/delete Sajátszkriptnyelv (Pig latin) • Referenciákbeá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és Kétfélevégrehajtásimód • Local mode java -cp $PIGDIR/pig.jar org.apache.pig.Main -x local script.pig • Lehetnek Warning-ok azoutputban • Prototípusgyártáshoz • MapReduce mode java -cp $PIGDIR/pig.jar:$HCONF org….Main script.pig Végrehajtásszakaszai: • Input: Pig latinkód (data flow language) • Irányított, körmentesgráf • MapReduce workflow
Interfészek – Grunt és Hue Grunt CLI – interaktívparancssorosinterfé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 Hue Web felület Hortonworks: 8000-s port Cloudera: 8888-s port Syntax highlighting Mentés / Betöltés (szkriptek) PIG Helper JAR feltöltés
Interfészek– Egyéb ElephantBird Mindenféle Input- ésOutputFormatok Pig, Hive, HBase, stb. Twitter által open source-olt Pygmalion Apache Cassandra integráció Piglet Ruby integráció Pigpy Python integráció PiggyBank / DataFu Pig UDF (user defined function) kollekciók AWS AWS-en is elérhető
Adatmodell– Típusok Skalártípusok Int 10 long 1000L float 6.9f 3.2e-3f double 6.9 3.2e-3 chararray 'string' 'elso\nmasodik\u0001' bytearray - Komplextípusok map: (chararray, value) dictionary… a value bytearray-ként ['nev'#'Antal', 'foglalkozas'#'mosogepszerelo'] tuple: fix méretű, rendezettelemhalmaz('bob', 92) bag: tuple-ökhalmaza {('alice', 532), ('bob', 92), …} NINCS set típus NULL koncepció, mint az SQL-ben
Adatmodell– Sémák dataset = load 'dataset' as (x:chararray, y:chararray, z:float); Adattípusokmegadására van lehetőség (séma) Bármilyen tuple-re megadható Megadhatóbármilyentuplehalmazra is (pl.: bag) Ha nemadjuk meg akkor a legjobbtippjeiveldolgozik Azalapvetőszámtípus a double Egyszerűtípusokon: as (x:<type>) Komplextí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áslehetséges; null lehetséges) Ahogyprocedurálisanmegszokott: (int)x mdata = load 'mydata' using HCatLoader();
Pig Latin – Alapok Azutasításokat ;-velzárjuk Aliasokat / referenciákathasználunk A = load 'sample_table' (column1, column2, column3); B = filter A by column3 > 0; C = foreach B generate UPPER(column1); dump C; Lehetugyanazt a nevet is használni, de nemajánlott Rontjaazolvashatóságot Nemtudjasegíteni a memóriakezelést Angolbetűvelkezdődőalfanumerikusnevek (_ is megengedett) Case sensitive is, meg nem is Kulcsszavak NEM Relációk, mezők, referenciákésfüggvényeknevei IGEN SQL-stílusbankommentelhetünk -- után a sorkomment /* */ között a blokk-komment
Pig Latin – Input / Output LOAD <file> [USING <loadfunc>] [AS <schema>]; <file>: abszolútvagyrelatív ('home/<username>'-ből) path, object <schema>: sémainformációk (oszlopnevek, típusok) <loadfunc>: valamilyenbetöltésifüggvény • PigStorage: csv, tsvbeolvasás (default) • TextLoader: text beolvasás • HBaseStorage: hbase-bőlolvasás • … STORE <alias> INTO <file> [USING <storefunc>]; DUMP <alias>; -- felületre DESCRIBE <alias>; -- sémakiírása Alias szintebármielémehet: [<alias> = ] Globok: ?, *, [abc], [a-z], [^abc], [^a-z], \*, {ab, cd}
Pig Latin – Relációs 1/2 FOREACH <alias> GENERATE <genexpr>; -- mindenelemre <genexpr>: • Oszlopok, oszlopintervallum (oszlop1..oszlop2), pozíciók ($0) • Függvényeredménye (UDF, ?:, aritmetika) névtelenlesz • Átnevezettoszlop, függvény, stb. (<expr> AS <name>) FILTER <alias> BY <filterexpr>; -- szűrés <filterexpr>: • Hasonlítóoperátorok ==, !=, >, <, >=, <=, IS [NOT] NULL • Reguláriskifejezés: [NOT] <oszl> MATCHES <regexp> GROUP <alias> BY <groupexpr>; -- csoportosítás <groupexpr>: • Kifejezés ~ <genexpr> • Kifejezésekzárójelben, vesszővelelválasztva TipikusanFOREACHésaggregálófüggvényektársaságában
Pig Latin – Relációs 2/2 ORDER <alias> BY<orderexpr>; -- rendezés <orderexpr>: akártöbbfeltételt is felsorolva • OszlopésASCvagyDESC DISTINCT <alias>; -- ismétlődésszűrés JOIN <joinon1> [<jointype>], <joinon2> …; -- illesztés <joinon*>: <alias> BY <cols>, <cols>: kb. <groupexpr> <jointype>: a szokásos, azillesztéstípusa LIMIT <alias> <num>; -- sorszámlimit Jelenlegnemaztcsinálja, amit a head parancs… :( SAMPLE <alias> <ratio>; -- véletlenmintavétel<cmd> PARALLEL <num>; -- reducerekszáma <cmd> bármilyen RANK <alias> BY <orderexpr>; -- sorszámozás
Pig Latin – UDF Vannakbeépített function-ök Csomóhasznosdologmár library-bőlelérhető PiggyBank, DataFu UDF = User Defined Function Java class használata REGISTER <jarpath>; … <package>.<class>(…) …; Névrövidítésdefinícióval: DEFINE <name> <package>.<class>(); Statikus java függvények: DEFINE <name> InvokeFor<javarettype>(<sfunc>, <param>); Python UDF használatpélda (export PYTHONPATH=…): REGISTER example.py USINGjython AS bballudfs; … bballudfs.example(…) …
Pig Latin – Szerkezetek FOREACH … Flatten: listakisimítása (~ keresztszorzat, Hive explode()) “?:” operátorralésazisEmpty()-velkezelhetőazüreslista is Beágyazottforeach daily = LOAD 'NYSE_daily' AS (exchange, symbol); grpd = GROUP daily BY exchange uniqcnt = FOREACHgrpd{ 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 – Streaming STREAM <alias> THROUGH <streamprog> [AS <schema>]; divs= LOAD 'table' AS (a, b); highdivs = STREAMdivsTHROUGH `example.pl` AS (a, b); RövidnévmegadásaDEFINE-nal DEFINE ex `example.pl` ship('example.pl'); divs = LOAD 'table' AS (a, b); highdivs= STREAMdivsTHROUGHex AS(a, b); Egyébszükségesfájlokátadása DEFINE ex `example.pl` ship('example.pl', 'other.pm'); divs = LOAD 'table' AS (a, b); highdivs = STREAMdivsTHROUGH ex AS (a, b); Distributed Cache DEFINE ex `ex.pl` cache('/data/shared/data#exdata'); Input, Output DEFINE ex `ex.pl abcdef` input('abc') output('def');
Pig Latin – MapReduce AlapMapReducehívás MAPREDUCE <jarfile> STORE <alias> INTO 'input' LOAD 'output' AS <alias>; A szokásosLOADésSTOREparaméterekműködnek… Speciálisparaméterezés MAPREDUCE <jarfile> STORE <alias> INTO 'input' LOAD 'output' AS <alias> `<package>.<class> input output`;
Pig Latin – Beállítások SET <param> <value>; SETdefault_parallel 3; SET job.name my_job; users = LOAD 'users'; … A partitioneralaphelyzetbenfelüldefiniálható Kivéve: order és skew join esetében REGISTER partpkg.jar; users = LOAD 'users' AS (id, age, zip); grp = GROUP users BY id PARTITIONBYpartpkg.part PARALLEL 10;
Pig Latin – Preprocesszor Paraméterbehelyettesítés yesterday = FILTER daily BY date == '$DATE'; Ha nincsmegadvafuttatáskor, hibátkapunk… pig -p DATE=2014-12-18 daily.pig Paramfile: <param>=<value> sorok, # a kommentjel Makrók DEFINE <name> (<params>) RETURNS <resalias> {<body>}; A makrótörzsében a paraméterek (out is) neveelé $-jeletkellírni Előnézet is van a -dryrunparaméterthasználva… Pigception [SETpig.import.search.path '<path1>[,…]';] IMPORT '<path>'; Kódbehelyettesítés, egyközös namespace Egyfájlcsakegyszerlehet (makrókell a töbszöröshöz)
Pig – Tesztelés A sémáttudjukellenőrizniegy-egyaliasnál DESCRIBE <alias>; Ha aznemfutásidőbenderülki A Pig igyekszikelrejteni a MapReducerészleteket, de: ASCII-art végrehajtásiterv: pig -x local -e 'explain -script e.pig' Grafikusvégrehajtásiterv: … -dot -out e.dot Ránézhetünkazelőállóadatokstruktúrájára is pig -e 'illustrate -script i.pig' v0.8-től kezdődőenmindenfuttatásvégénstatisztkákat is kapunk Optimalizációs feature-ökkikapcsolhatók a -t <name> paraméterrel SplitFilter, MergeFilter, PushUpFilter, PushDownForEachFlatten, ColumnMapKeyPrune, LimitOptimizer, AddForeach, MergeForeach, LogicalExpressionSimplifier, All