Az előadás letöltése folymat van. Kérjük, várjon

Az előadás letöltése folymat van. Kérjük, várjon

Magasszintű nyelvek MR alapokon

Hasonló előadás


Az előadások a következő témára: "Magasszintű nyelvek MR alapokon"— Előadás másolata:

1 Magasszintű nyelvek MR alapokon
Hive és Pig Kazi Sándor Magasszintű nyelvek MR alapokon 2014.

2 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 Deklaratív(abb) környezet Eltolódik a programozási feladat hangsúlya Az a kérdés, mit szeretnénk Kevésbé kérdés (de néha kérdés), hogy pontosan hogyan is HiveQL és Pig Latin Megjelenhetnek sémainformációk (félig-meddig) Típus megkötések Tárolási formátumok Jogosultságok

3 Mikor melyik? – Hive / Pig
Mindkettő MR framework feletti A Hive jó nekünk, ha Lekérdezésekhez Az adat már betöltve, ennek egy struktúrált kivonata kell Adott kérdések megválaszolására SQL-ből készülünk átszokni A HiveQL-nél alacsony a belépési küszöb A Pig jó nekünk, ha ETL (Extract-Transform-Load) folyamatokhoz Adatelőkészítésre elemzés előtt Hosszú műveletsorok véghezvitelére Gyakran együtt használják őket Nem teljesen váltják ki egymás funkcionalitásban Pl.: Yahoo, Facebook

4

5 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ó

6 Alapok – Mi a Hive Adattá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

7 Alapok – Architektúra Metastore Metaadatok az adatokról Metadatok az adatbázisról Táblák Típusos oszlopok Összetett adatstruktúrák is (0NF) Partíciók Statikus illetve dinamikus partíciók Dinamikus partíciók alaphelyzetben kikapcsolva Gyorsítja a partíciókra irányuló lekérdezéseket Vödrök (Buckets) Hash partíciók Gyorsítja a join műveleteket

8 Hive – Kliensek CLI: Command Line Interface HWI: Hive Web Interface
Editor, History, Table/Database browser JDBC, ODBC, Thrift Adatbázishozzáférés sztandard interfé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ális query építés, import/export, stb. FluidShell – saját szkriptkörnyezet

9 Adatbetöltés – In/External
Internal Adatok ténylegesen a Hive struktúrájában Adatstruktúra törlésekor az adat is elveszik CREATE 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 el CREATE EXTERNAL TABLE <name> …;

10 Adatbetöltés – Adattípusok
Leírás Méret Példa TINYINT Egész 1 B 99, 99Y SMALLINT 2 B 99, 99S INT 4 B 99 BIGINT 8 B 99, 99L BOOLEAN Bool 1 b True FLOAT Lebegőpontos szám DOUBLE 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<…, …>

11 Adatbetöltés – Formátum
Háromféle határoló karakter (delimiter) Sor (default: soremelés, \n) Oszlop (default: ^A, \001) Összetett struktú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ás ROW FORMAT lehetőség is (SerDe)…

12 Cloudera Impala Impala 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-SQL Tehát a Hive és az Impala egyirányba mozognak Csökken az együttes létjogosultságuk Apache Drill

13 HiveQL – Változók Négy namespace hivevar --define key=value
--hivevar key=value hiveconf --hiveconf key=value system env (bent read only) -- értékadás SET [<namespace>:]<key>=<value>; -- lekérdezés SET [<namespace>:]<key>; -- alapértelmezett namespace: hivevar

14 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>];

15 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>);

16 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> BUCKETS szé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

17 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' FROM <table> [<alias>] INSERT … [INSERT …] …;

18 HiveQL – Lekérdezések Klózok SELECT FROM WHERE GROUP BY HAVING
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

19 HiveQL – Mintavételezés
Mintavé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

20 HiveQL – Nézetek -- nem materializá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>;

21 HiveQL – Indexek CREATE 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] INDEX EXPLAIN [EXTENDED] SELECT …;

22 HiveQL – Függvények SHOW 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]

23 HiveQL – Streaming SELECT TRANSFORM (<columns>) USING <program> AS <columns> FROM …; Pl.: SELECT TRANSFORM (column1, column2) USING '/bin/cat' AS newcolumn1, newcolumn2 FROM a;

24 HiveQL – Jogosultságok
SET hive.security.authorization.enabled=true; SET system:user.name; SHOW GRANT <entity> [ON …]; <entity>: USER <user>, GROUP <group>, ROLE <role> CREATE ROLE <role>; GRANT ROLE <role> TO <entity>; REVOKE ROLE … FROM …; GRANT <priv> TO <entity>; <priv>: ALL, ALTER, CREATE, DROP, INDEX, LOCK, SELECT, SHOW_DATABASE, UPDATE SET TBLPROPERTIES(<name>=<value>) SET TBLPROPERTIES("PARTITION_LEVEL_PRIVILEGE"="TRUE") hive.security.authorization.createtable.owner.grants hive.security.authorization.createtable.user.grants

25 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: 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

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

27 Apache Pig

28 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ós műveletek Join UDF Szerkezetek Streaming MapReduce Beállítások Preprocesszor Tesztelés

29 Alapok – Mi a Pig Adatkezelő 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)

30 Alapok – Belső működés Kétféle végrehajtási mód Local mode
java -cp $PIGDIR/pig.jar org.apache.pig.Main -x local script.pig Lehetnek Warning-ok az outputban Prototípus gyártáshoz MapReduce mode java -cp $PIGDIR/pig.jar:$HCONF org….Main script.pig Végrehajtás szakaszai: Input: Pig latin kód (data flow language) Irányított, körmentes gráf MapReduce workflow

31 Alapok – WordCount

32 Interfészek – Grunt és Hue
Grunt 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 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

33 Interfészek – Egyéb ElephantBird Mindenféle Input- és OutputFormatok 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ő

34 Adatmodell – Típusok Skalár típusok Int 10 long 1000L float 6.9f 3.2e-3f double e-3 chararray 'string' 'elso\nmasodik\u0001' bytearray - Komplex típusok map: (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

35 Adatmodell – Sémák Adattípusok megadására van lehetőség (séma)
dataset = 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 double Egyszerű 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();

36 Pig Latin – Alapok Az utasításokat ;-vel zárjuk
Aliasokat / 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ánlott Rontja az olvashatóságot Nem tudja segíteni a memóriakezelést Angol betűvel kezdődő alfanumerikus nevek (_ is megengedett) Case sensitive is, meg nem is Kulcsszavak NEM Relá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

37 Pig Latin – Input / Output
LOAD <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ületre DESCRIBE <alias>; séma kiírása Alias szinte bármi elé mehet: [<alias> = ] Globok: ?, *, [abc], [a-z], [^abc], [^a-z], \*, {ab, cd}

38 Pig Latin – Relációs 1/2 FOREACH <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

39 Pig Latin – Relációs 2/2 ORDER <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és JOIN <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ámlimit Jelenleg nem azt csinálja, amit a head parancs… :( SAMPLE <alias> <ratio>; -- véletlen mintavétel <cmd> PARALLEL <num>; -- reducerek száma <cmd> bármilyen RANK <alias> BY <orderexpr>; -- sorszámozás

40 Pig Latin – UDF Vannak beépített function-ök Csomó hasznos dolog már library-ből elérhető PiggyBank, DataFu UDF = User Defined Function Java class használata REGISTER <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(…) …

41 Pig Latin – Szerkezetek
FOREACH … Flatten: lista kisimítása (~ keresztszorzat, Hive explode()) “?:” operátorral és az isEmpty()-vel kezelhető az üres lista is Beágyazott foreach daily = LOAD 'NYSE_daily' AS (exchange, symbol); grpd = GROUP daily BY exchange uniqcnt = 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 (!!!)

42 Pig Latin – Streaming STREAM <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-nal DEFINE ex `example.pl` ship('example.pl'); highdivs = STREAM divs THROUGH ex AS (a, b); Egyéb szükséges fájlok átadása DEFINE ex `example.pl` ship('example.pl', 'other.pm'); Distributed Cache DEFINE ex `ex.pl` cache('/data/shared/data#exdata'); Input, Output DEFINE ex `ex.pl abc def` input('abc') output('def');

43 Pig Latin – MapReduce Alap 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és LOAD 'output' AS <alias> `<package>.<class> input output`;

44 Pig Latin – Beállítások
SET <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ében REGISTER partpkg.jar; users = LOAD 'users' AS (id, age, zip); grp = GROUP users BY id PARTITION BY partpkg.part PARALLEL 10;

45 Pig Latin – Preprocesszor
Paraméterbehelyettesítés yesterday = FILTER daily BY date == '$DATE'; Ha nincs megadva futtatáskor, hibát kapunk… pig -p DATE= 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) neve elé $-jelet kell írni Elő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 namespace Egy fájl csak egyszer lehet (makró kell a töbszöröshöz)

46 Pig – Tesztelés A sémát tudjuk ellenőrizni egy-egy aliasnál
DESCRIBE <alias>; Ha az nem futásidőben derül ki A 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 is pig -e 'illustrate -script i.pig' v0.8-től kezdődően minden futtatás végén statisztkákat is kapunk Optimalizációs feature-ök kikapcsolhatók a -t <name> paraméterrel SplitFilter, MergeFilter, PushUpFilter, PushDownForEachFlatten, ColumnMapKeyPrune, LimitOptimizer, AddForeach, MergeForeach, LogicalExpressionSimplifier, All


Letölteni ppt "Magasszintű nyelvek MR alapokon"

Hasonló előadás


Google Hirdetések