Magamról

Saját fotó
Főiskolai, majd egyetemi diplomamunkáimtól kezdve világ életemben, adatok, adatbázisok, adattárházak (leginkább Oracle) környékén mozogtam. Mostanság adattárházasként, adatbányászként élem napjaimat.

2013. június 3., hétfő

Data Science: Amazon Web Services(=AWS) kihívások


v1.1 (2013.06.03, 18:50)

Az elmúlt 1-2 napban volt módom közelebbről is szemügyre venni  a tárgybeli AWS-cuccot.

Legelőször is, ezúton is köszönöm egyik kollégám inicializáló segítségét hozzá. Minden - olykor hülye - kérdésemre türelmesen válaszolt, amikor elveszettnek hittem magamat az információs káoszban. Múlhatatlan érdemei vannak abban, hogy egyrészt az élvezkedős fázisig hamar eljutottam, illetve, hogy egyáltalán az egész AWS egyik kedvenc topikom lett :)

Minden (adatbányász)kollégának aki még nem látta közelebbről ajánlom, akkor is, ha fizetni kell érte (10-20 USD-ből már egész sok mindent lehet csinálni), akkor is, ha maga a fizetés nem éppen sportszerű az Amazonnál.

Ínycsiklandozásként:
Apache Mahout: létezik egy elég hosszú k-means-es tutorial, ha valaki Amazon Elastic MapReduce-szal akarna adatbányászkodni. Csak annyit akartam evvel jelezni előljáróban, hogy adatbányász szemmel sem hülyeség a cucc. ;) Sőt, ha belegondolunk csupa számokból álló security igényeket is kielégítő dataseteken tudhatunk AWS-sel adatbányászkodni.

Az egész AWS-ben tulajdonképpen csak ez az egyetlen kifogásom volt: a fizetés, végül nem is a saját pénzemből lubickoltam az élvezetekben, hanem a munkahelyem accountjának terhére, amiben nyilván nem az összeg nagysága, meg a lehetőség nagyvonalúsága az elsődlegesen érdekes feature, hanem, hogy ilyen AWS-accountja volt/van a munkahelyemnek, instant használhatóan. :)

Szóval a fizetést illető kifogásaim:
- Visa Electron logos bankkártyával lehet fizetni korlátlanul, csak sajnos nekem nem olyan van.
- Maestro logos kártyával lehet fizetni, ha UK kibocsátású.Mi ez a kétszeres diszkrimináció?
- Nincs fizetési folyamatban feltüntetve, hogy mely bankkártyákkal lehet fizetni, kuglizni kell egy eldugott helyig
- Megtévesztő hibaüzenet (ami arra utal, hogy nálam van a hiba, hogy nem tudok fizetni, holott nem is). Emiatt volt egy tökfelesleges banki köröm, hogy minden limit jól van-e beállítva, van-e elérhető pénz, stb. És persze, hogy nem nálam volt a hiba.

Ami még lehet nem szimpatikus az AWS-ben:
- Ami nekem kellett Amazon Elastic MapReduce (EMR) és Pig az nincs trial verzióban kipróbálhatóan.
Amazon Webservices - Free-FAQ
- A free accounthoz is kell érvényes bankkártyaszám, lásd ehhez szintén a fenti problémát.Viszont ha valaki diák, akkor 100 USD-ig tudhat kerethez jutni:
AWS in Education
- Kézzel le kell állítani (nem elfelejteni) a munkamenetet,különben ketyeg a számla orrvérzésig és amihez nem elég a kliensoldali böngészőt bezárni természetesen. Lehet játszani a kis bankkártya-limit megadásával is,de az meg más kényelmetlenséggel üthet vissza.
Hogy ennek a szivatásnak - az ügyfél-kopasztási célzaton felül - mi értelme, azt nem igazán értem. Nem riasztja el a felhasználókat ez a durva eljárás? Nem cél, hogy jöjjenek a felhasználók? Nem az volt eddig mindig a trendi, hogy ha valami jól működött az pont a fizetés?

Az hogy mennyire éri meg az AWS használata, az nem lehet tárgya ennek a blogposztnak, hiszen ez jóval nagyobb téma, különben sem látok rá egyelőre a magam részéről a szükséges mértékben a cost-benefit topik lényeget érintő részleteire.

Nyilván sokféle fizetési konstrukció van, nyilván van bőven költségoptimalizálásra lehetőség, sőt még olyan is van, hogy erőforrás lehet licitálni.Hogy egy adott konfigurációért csak egy adott összeget akar az ügyfél fizetni és inkább kivárja, amíg ez rendelkezésére áll.

Az AWS használatbavétele így tehát minimum három lépésből áll:

1.lépés: URL-től - AWS grafikus consolig, plusz saját username, saját jelszó. Ugye ennek a legutálatosabb része a taglalt fizetési eljárás kiépítése.És ahogy említettem vagy saját maga csinálja végig az ember, vagy kap a munkahelyi AWS-rendszergazdástól egy levelet a fenti (+egyéb) infókkal.
Viszont ennek a lépésnek a végső jutalma az alábbi gyönyörűséges képernyő:

2.lépés:
Én csak töredékét használtam ki az AWS-nek: Elastic Mapreduce (Hive és Pig), S3, IAM

Az utóbbi IAM-re (felhasználó+jogosultság) egy szót sem vesztegetnék a továbbiakban, részint percekre álltam csak meg ott, doksinézegetéssel együtt is, részint mert annyira most nem volt fontos nekem.

Az S3 az hétköznapian szólva tárhely(szolgáltatás), én elsősorban idementettem az elemzéseim outputját. Akinek saját dataset-je van, az nyilván fel is akar tölteni ide, aztán innen dolgozni.

Megjegyzendő,hogy az S3-nak van egy kényelmetlenebb vonása: nem igazán támogatott a rekurzív könyvtár- / file-tartatalom mozgatása. Windows alá ami free S3-browsert kipróbáltam az mind hulladék volt, egyik sem működött nálam. Igaz, hogy a működő fizetősek sem drágák (pár 10 dollárért már komolyat lehet kapni), de akkor megint kezdődik a fizetés sztori, amit az AWS után nagyon megutáltam 1-2 hét perspektivájában ;)

Az S3-browser használatához/konfigjához három dolog kell
- a S3-bucket címe, amit az Amazon ad
- Az accountunkhoz tartozó "access" illetve "secret" key. Ezt mailben kapjuk vagy közvetlenül az Amazontól, vagy a munkahelyi AWS rendszergazdától.

És akkor jöjjön az Amazon Elastic MapReduce előkészületek:

Windows 8-as kliens PC-ről dolgoztam, free eszközökkel:
(1) Mozilla Firefox v21.0 böngésző
(2) Putty (elsősorban, mint SSH-klienssel). Ezt lehet GUI-n keresztül konfigolni, nekem szimpatikusabb volt a mellékelt plink-es parancssori verzió használata.Továbbá ugyan a plink mindenhez elég lehet, hiszen mint említettem a Putty, mint SSH-kliens miatt szükséges, de a Putty terminál kicsit felhasználóbarátabb, mint a cmd.exe, így érdemesebb lehet a kombinált használat.
(3) WinSCP(filetranszrfer célból)
 (+1) Hive-hoz létezik jelenleg v0.8.1-es verziójú JDBC-driver, aminek befaragása után egy SQL Workbench/J vagy SQuirreL-lel gyönyörűen lehet SQL-ezni is.

Sajnos pluszba kell egy "key pair", ahhoz, hogy Putty-olni lehessen az AWS használatát illetően.
Getting a Key Pair
Ez nem megkerülhető, ráadásul az Amazon által adott .pem file-t konvertálni kell a Putty segédprogramjával (Puttygen), de ez nem olyan drámai a valóságban, mint ahogy hangzik.

Mondjuk a mögötte lévő technikai magyarázat már tényleg komplikáltabb: a plink segítségével egy tunnelt építünk, azaz a localhost egy portját mappeljük evvel az Amazon szerverének egy portjára. Az architektúra érdekessége/sajátossága, hogy a monitorozás proxybeállításaival jó esetben nem kell küzdeni pluszban, de ha igen akkor előkerülhet például az okos foxyproxy (Mozilla Firefox Add-On).

Foxyproxy
General fül: csillag helyére a saját master dns címe kerül:
ec2*.compute-1.amazonaws.com
Proxy details-fül:
localhost
Socks proxy
Port: 8888
SOCKS v5
URL-patterns-fül:
1.
Pattern name: *ec2*.amazonaws.com*
URL-pattern: *ec2*.amazonaws.com*
2.
Pattern name: *ec2.internal*
URL-pattern: *ec2.internal*
plink.exe -D 8888 hadoop@MY_AMAZON_MASTER_DNS -i my_private.ppk

Putty-konfig portabilitása:
Még egy technikai apróság, ha valaki költöztetni akarja a konfigurálást, akkor mivel a Putty Windows-registry-be tárol (nem elég .rnd-file-t hordozni), ezért hackelni kell (Putty help-ben le van írva a "store configuration in file" szekcióban):
@ECHO OFF
regedit /s putty.reg
regedit /s puttyrnd.reg
start /w putty.exe
regedit /ea new.reg HKEY_CURRENT_USER\Software\SimonTatham\PuTTY
copy new.reg putty.reg
del new.reg
regedit /s puttydel.reg 


AWS-grafikus konzolon Elastic MapReduce jobflow kreálása
Hive-ra vagy Pig-re (amiket én próbáltam).
Lehet HBase és más is.
Pár kérdésre kell válaszolni:
* Név
* Pig
* Interactive (nem batch)
* Key pairhez tartozó név megadása (Puttyoláshoz)
* 1 master, 19 core, 2 tmp small-node (a maximum, amit én értem el)
* bootstrap action lehet "memory-intensive"
* OK-zás
Türelmesnek kell lenni, mert eltart egy darabig a flow-kreálás.
Amint WAITING lesz a flow-status, akkor lehet a Puttyal elkezdeni dolgozni.
Sajnos nem triviális, hogy a flow létrejöjjön, símán lehet FAILED is.
Itt kell TERMINATE-re kattintani, ha már nem dolgozunk és nem akarjuk, hogy ketyegjen a dolláróra.
Alsó képernyőfélen, jobb oldalt látható a MASTER DNS url-je.

A monitorozás eléréséhez (jobtracker:9100 és hadoop filesystem aka hdfs: 9101 ):
plink.exe -L  9100:localhost:9100 -L  9100:localhost:9100 -L 9101:localhost:9101 hadoop@MY_AMAZON_MASTER_DNS -i mprivate.ppk

Ekkor böngészőből a http://localhost:9100 és  http://localhost:9101 címen eléhetők a logok.
Óriási élmény bit szinten permanensen nyomon követni egy lekérdezést: óriási ígéret ez egy Oracle párhuzamos lekérdezés futás-monitorozásához képest.

Foglaljuk össze hol tartunk:
- Van egy accountunk (username+password) az AWS grafikus konzolhoz
- Van mailben érkezett "access" és "secret" key-ünk a username mellé, S3 kliens-odlali eléréséhez
- Van egy fentebb konfigurált kliensünk, ahol "hadoop" a standard Amazon-username, a jelszó a Puttygen-es konvertálásnál általunk megadott jelszó.
- Van egy  MASTER_DNS url-címe

3.lépés: Ez már a csodaország-rész :)

Eljutottunk oda, hogy a Putty-unkban van egy prompt.
PWD(unix): /home/hadoop
Pig (és hadoop-cluster) indítása után:
PWD(hadoop): ip-cim/hdfs

Azaz három filerendszeren keresztül dolgozunk (kliens PC-nket is természetesen beleértve)
A Pig-output az utóbbin keletkezik meg, azt át kell hozni unix-oldalra, onnan WinSCP-vel áthozható már a lokál gépenkre. Vagy S3-ra lehet menteni és onnan például az említett S3-browserrel lehet lementeni.
Pig "grunt"-promptnál fs a kulcsszó evvel lehet: -mkdir, -ls, -rmr (rekurzív könytártörlés), copyToLocal, copyFromLocal, etc parancsokat kiadni.

Grafikus konzolon felül Rubyból és Pythonból is lehet vezérelni scriptekkel az AWS-t
Sokkal több opció érhető el így, mint grafikus konzolon keresztül:
OReilly-Python and AWS Cookbook, 2011.10

Ha valaki jó bevezető anyagot akar Pig-ről (angolul), természetesen ezen a blogposzton felül :)
Apache Pig - 2012.június 21-i 81 diás remek prezentáció
Amazon Pig-tutorial: Parsing Logs with Apache Pig and Elastic MapReduce 
Apache Pig-doksi (v0.9.1, amit az Amazon támogat, egyébként v11.1 is van már)
Van benne Cookbook, Tutorial, Pig Latin nyelv referenciája, stb.

Hogy én mit mondanék először a Pig-ről:
- Irgalmatlan tömör magasszintű nyelv, ezt mindenki ki is hangsúlyozza, ráadásul ez nem megy az érthetőség illetve használhatóság rovására.
- A Pig Latin referencia ha tartalmaz 50 kulcsszót sokat mondok. Szóval nem egy Java gigakomplexum, azaz kicsi kompakt teljes :)
- Bár nem SQL, de imádja az is, aki szereti az SQL-t, legalább is én.

Adott egy 0.5TB=500 GB-os gráfadatbázis (subject,predicate,object,context attribútumokkal)
Billion Triples Challenge 2010 Dataset
Lehet feltölteni is datasetet, mint említettem. Én a fentebb linkelt eleve fennlévőt használtam.Három verziója is van: Az első 1000 soros kicsi állomány, homokozónak, a második már 10 millió rekordos, a harmadik a 0.5TB-os. Vigyázzunk mikor mire engedjük el Pig-programunkat. ;)
lines = LOAD 's3n://uw-cse-344-oregon.aws.amazon.com/cse344-test-file' USING TextLoader as (line:chararray);
lines = LOAD 's3n://uw-cse-344-oregon.aws.amazon.com/btc-2010-chunk-000' USING TextLoader as (line:chararray);
lines = LOAD 's3n://uw-cse-344-oregon.aws.amazon.com/btc-2010-chunk-*' USING TextLoader as (line:chararray);


Csak azért, hogy lássuk milyen szép és hatékony a Pig, itt egy kidolgozott feladat:
Feladat:
- Vegyük a fenti gráf-adatbázisból az első három attribútumot (triples), és tisztítsuk is meg egy e célra írt Java-s User-Define Function-nel (s3n://uw-cse344-code/myudfs.jar)
- Szűrjük meg a subject-et: '.*rdfabout\\.com.*'
- Keressük meg az összes két hosszú (egyedi) subject-re illeszkedő részgráfot, azaz kell egy attribútum-hatos (subject,predicate,object,subject2,predicate2,object2), ahol subject=object2
- Azaz SQL-eseknek lefordítva, szűrés, self-join, distinct-álás, index nélkül.
- A 10milliósoros datasetre, 1master-19core-2temp small node-ra, 8 percig futott, hozzáértve, hogy teljességgel könnyedén monitorozható volt az egész elejétől a végéig.Úgyhogy van, medium, large, extra-large, hiperszupermegagiga-large konfig is.

Megoldás:
REGISTER s3n://uw-cse344-code/myudfs.jar
lines = LOAD 's3n://uw-cse-344-oregon.aws.amazon.com/cse344-test-file' USING TextLoader as (line:chararray);
--lines = LOAD 's3n://uw-cse344/btc-2010-chunk-000' USING TextLoader as (line:chararray);
ntriples = FOREACH lines GENERATE FLATTEN(myudfs.RDFSplit3(line)) as (subject:chararray,predicate:chararray,object:chararray);
rdfabout = FILTER ntriples by (subject matches '.*rdfabout\\.com.*');
rdfabout_copy = FOREACH rdfabout generate $0 as subject2:chararray, $1 as predicate2:chararray, $2 as object2:chararray PARALLEL 50;
join_result = JOIN rdfabout by object, rdfabout_copy by subject2 PARALLEL 50;
distinct_join_result = DISTINCT join_result;
distinct_join_result_ordered = ORDER distinct_join_result by (predicate);
STORE distinct_join_result_ordered INTO 's3n://ec2-MY_BUCKET.us-west-2.compute.amazonaws.com/join';

Nincsenek megjegyzések:

Megjegyzés küldése