Spekuloval jsem před časem o výhodách nasazení HADOOP řešení jako náhradě za několik existujících a velmi pomalých ETL úloh. Výsledky experimentu je možné najít zde - v minulém článku. Jestli otázkou tehdy bylo, zda tehdejší úlohy je vhodné nahradit řešením HADOOP/MR nebo nikoliv, nyní experimenty už vedly k ověřování jak by dále zpracování urychlil SPARK. Tzn. budu zde popisovat srovnání implementace dvou jednoduchých (dle mého názoru typických skeletů) ETL úloh, vždy naprosto stejně implementovaných v Hadoop MR a Spark RDD.
Nejdříve musím přesněji definovat ETL úlohu. Jedná se o takovou úlohu, která na vstupu zpracovává velký objem dávkových dat (je už vhodná paralelizace zpracování dat, vyžadující škálovatelnost úložného diskového prostoru), skládající se typicky z operace načítání, mapování, join/tag, reduce, filter, nezřídka sort, ukládání do cílového úložiště. Velký objem dat na výstupu není vyloučený. Typy úloh charakteristické pro ML, AI, regrese, zpracování datasetů pro vědecký výzkum není předmětem tohoto článku. Důvod je jednoduchý – jsou to úlohy typicky pro Spark, srovnávání s Hadoop MR nedává vůbec smysl.
Když se zaměříme na vyhledávání srovnání obou technologií, to nejčastější a notoricky opakované, na co zcela určitě narazíte je toto:
Zde chci ihned podotknout a kontrovat komentářům – až na výjimky, tvrzení běžně neurčují, u jakých typů úloh tomu tak (hypoteticky) může být. Dá se tedy očekávat, že na základě takového tvrzení i typicky ETL úlohy mohou být na SparkRDD rychlejší v porovnání s Hadoop MR. Nenašel jsem nikde žádné výsledky reálného a podrobného srovnání jednoduchých úloh, které by to potvrzovaly.
Z tohoto důvodu jsem provedl několik experimentů. Implementoval 3 páry jednoduchých úloh (Hadoop/MR a Spark/RDD), vybrané a navržené speciálně proto, aby ukázaly, jak jsou tato tvrzení pravdivá. Bohužel ani v jednom případě provedených experimentů a srovnávání SPARK zdaleka nesplnil očekávání dle dokola opakovaných tvrzení (viz. výše : 100×10×3 rychlejší). Zde je ale nutné ještě jednou zopakovat – jednalo se vždy o případy implementace typicky ETL úloh. Jednoduché operace, náročné ale na objem zpracovávaných dat.
Z předchozích experimentů jsem vycházel z poznání, že pokud úloha běžela (dlouho) na jednom stroji (ETL job napsaný v Javě – single thread), stejná logika implementovaná v MR a přenesená do experimentálního clusteru 1+3, způsobila nárůst režie a zpracování pak v Hadoop mini-clusteru trvalo 3 až 5× déle. To je první cena co platíte, když migrujete na Hadoop. To platilo pro jednoduché úlohy typu MAP-SIDE-JOIN. U jiných typů ETL úloh to bylo ještě déle, dokonce i 40× u typu reduce-side-join. To samo o sobě ale není překvapení. Nicméně, nárůst režie byla pořád přijatelná cena za to, co dostanete k tomu. Je to především snadná škálovatelnost díky HDFS a paralelnímu zpracování, vyřešení fault-tolerance apod. Logicky tedy, ihned další otázkou bylo, kam až se musí s velikostí clusteru jít, aby to mělo (hlavně) udržitelný ekonomický smysl a jaké zvětšování clusteru přinese zpracování v “rozumném čase”. Přechodem na cluster 1+3 v podstatě, i v tom lepším případě, došlo k degradaci výkonu na úroveň 11% výkonu (paralelizované řešení při takto malé velikosti clusteru zpracuje za trojnásobný čas to samé, co zvládl předtím jeden dedikovaný stroj). Při takové ztrátě ihned položíte otázku, je něco rychlejšího než Hadoop? Snad ano, Spark to ale bohužel většinou není…
Experimenty jsem provedl v prostředí AWS. Tam jde testovací úlohy spouštět “izolovaně od produkčních prostředí“. Především proto, že šlo snadno parametrizovat testy, experimentovat s různou velikostí clusteru, používaného HW (počet jader a paměti) apod. Na clusteru v jeden okamžik jsem vždy spouštěl pouze jednu úlohu, aby výsledný čas reflektoval pouze jednu úlohu a nebyl ovlivněný úlohou jinou (což v produkčním, nebo v limitovaném testovacím prostředí v reálných podmínkách je nemyslitelné). Další výhodou testování s využitím cloudových služeb (Azure, GCP, AWS) je, že lze snadno předpokládat, že je vše odladěné a ani jedna z technologií není hendikepována třeba špatným nastavením apod.
Pro účely testu a srovnávání byly použité (účelově) tyto úlohy, pokaždé implementované jak v HADOOP/MR, tak i v SPARK/RDD (Scala, případně PySpark).
POZN: Na základě reakcí v komentářích zde musím zdůraznit – cílem je srovnat Hadoop a Spark. Proto každý typ úlohy musel být implementován v Hadoop/MR a též to samé I v Spark/RD (Scala). Navíc úlohy byly vybírány tak, aby je bylo možné smysluplně rozložit na elementární (a v ohledu na výsledky) izolovatelné kroky. Jedině tento přístup umožní dekompozici faktorů výsledků srovnávání. V opačném případě by to bylo jako srovnávat “jablka s hruškama”.
Závěry dělám z testování v prostředí Amazon AWS v rámci POC, každý typ úlohy zpracovával 200GB vstupní soubor, použitý HW (pokud neuvádím v textu jinak) m5×.large (master i nodes). Srovnání nejsrozumitelněji prezentuje níže uvedený graf. Z celkového množství testů předkládám výsledky z testování na 3. velikostech clusteru (1+7 modře, 1+12 červeně a 1+15 žlutě), hodnoty reprezentují délku zpracování úlohy, vedle sebe jsou výsledky HADOOP vs SPARK, pro vybrané typy úloh.
Při srovnání úloh map and reduce Spark nedosahoval lepších výsledků (snad dokonce byl i mírně horší). Tzn.
I přes zklamání, že Spark asi není tím ultimátním řešením pro výrazné zrychlení ETL úloh, jeden typ úlohy dal záměrně Spark technologii šanci excelovat. Když se pozorně zaměříte na srovnání úlohy pro určení hodnoty čísla PI (π MONTECARLO MapAndReduce), uvidíte, že Spark dokončil úlohu za zlomek času potřebného na stejné zpracování Hadoopem. Spark provedl v maximálně možné míře veškeré toky dat a operace v paměti, oproti tomu Hadoop provedl operaci map(), uložil mezivýsledky na disk a pak následně vše znovu načetl pro zpracování v kroku reduce(). Proto je zde SPARK dosahuje takového zkrácení času zpracování.
Jednoduše : U úloh zpracovávajících velký objem vstupních dat, kde nelze veškeré zpracování provést jen v operační paměti, pouze v případě operaci reduce() lze provést ve velké míře v operační paměti, bude Spark zřetelně rychlejší než Hadoop. Buď ušetříte zde a SPARK bude rychlejší, nebo je jedno, zda provedete implementaci v Hadoop MR nebo Spark RDD.
Zjednodušeně, rozhoduje pouze a jen tento řádek:
POZN: Na základě jednoho komentáře zde je ještě dobré doplnit, že pokud v rámci zpracování úlohy aplikujete několik cyklů map-reduce, bude Spark též s velmi pravděpodobně rychlejší, nebo alespoň implementace jednodušší. V případě řešení Hadoop to lze realizovat pouze kaskádou samostatných MR procesů (vyžadujících načítání a ukládání dat mezi kroky/úlohami), což Spark díky způsobu zpracování nevyžaduje (viz DAG).
Poznámka na konec: Toto je druhý, mírně přepracovaný obsah článku. Na základě komentářů od čtenářů jsem v některých pasážích udělal změny pro lepší srozumitelnost, zdůraznil některá fakta a zakomponoval i některé z podnětů z komentářů. Oproti prvním článku jsem se rozhodl komentáře pod článkem ponechat. Doporučuji si je pročíst a udělat si úsudek svůj.
Díky za článek, jedinou podobnou práci (bez těch marketingových keců) jsem našel zde, je sice staršího data, ale stále určitě relevantní k vašemu článku: 2015_LiuLu_MS.pdf. Jsou tam pěkně udělané grafy zátěže memory a cpu, tam je pak pěkně vidět, kde je Spark pomalejší a kde rychlejší (viz. rozdíl zpracování Hadoop "na disku" a Spark "v paměti").
Díky za komentář a link. Samotný dokument jsem neviděl, ale ty výsledky srovnání jsem už viděl publikované (bez kontextu toho paperu to publikoval asi ještě někdo jiný). Až na vyjímky, ani tam ale výsledky rozhodně neukazují, že je Spark tak rychlý, jak se obecně tvrdí. Když jsem dělal své experimenty, chtěl jsem hlavně vidět tu problematiku odděleně. Tzn. jak jedou úlohy které čistě závisí na práci s diskem (bez možnosti vykonat operace pouze v RAM), sort(), join() apod. Je potěšující, že v dokumenty uvedené výsledky spíš výsledky tohoto experimentu potvrzují, než vyvraceji :).
PS: Sorry pokud ten popis experimentů působí jako "marketingové kecy". Záměrem bylo zmínit relevantní informaci, kde jsem experimenty dělal a na jakém konkretním HW. Nic tendenčně ve prospěch "Ama....u". Z toho co bylo dostupné mi vybraná služba pro experimenty byla nejpřístupnější.
Ten experiment je od zacatku blbe navrzeny. Neni divu, ze to vyjde +/- stejne, kdyz obe reseni delaji +/- to same.
Doporucuji precist minimalne prvni paper o RDD, kde je vysvetleno, proc muze byt RDD (spark) o rad az dva rychlejsi nez MR (hadoop). Zjednodusene by se dalo rict, ze je to zpusobem, jak resi fault-tolerance. MR uklada data mezi jednotlivymi kroky na disk, aby se k nim v pripade vypadku uzlu dalo vratit. RDD uklada pouze informaci o tom, jakymi kroky se k danemu useku dat (partition) da dopocitat v pripade, ze dany uzel vypadne. Coz vyrazne redukuje mnozstvi operaci zapisu, kterou jsou u HDFS opravdu neskutecne pomale.
Pokud mam ulohu, ktera se sklada z jedne operace map (flatMap), musi Hadoop i Spark nacist data do pameti, transformovat a ulozit, neni tam misto pro zadne optimalizace zapisu. Pokud mam ulohu, ktera se sklada z fazi map a reduce, MR (hadoop) dela jeste mezikrok (combiner, byl pouzit?), ktery opet urcitym zpusobem redukuje mnozstvi zapsanych dat na disk, takze rozdily se stiraji. Proto u takto jednoduchych transformaci je v podstate jedno, jestli pouzijes Hadoop nebo Spark.
Spark dava smysl u algoritmu, kde ten pocet kroku je vetsi, typicky u iterativnich algoritmu, kde vystup jednoho kroku vypoctu je vstupem dalsiho kroku. Tam se opravdu projevi to, ze po kazdem kroku neni potreba vsechno ulozit na disk. U uloh, ktere resim (analyza tabulkovych dat), to dava zrychleni opravdu nekde mezi 10x az 100x (podle velikosti dat a algoritmu).
Díky za komentář. Můj záměr a celá ta evoluce těch experimentů probíhala přesně naopak. Aby ty samé řešení předvedly kdo (a jak moc) je rychleší. Na začátku (a myslím jsem to i v textu zmiňoval), jsem chtěl porovnat implementaci stejné úlohy na Hadoop/MR a Spark/RDD. Očekával jsem, že Spark opravdu ukáže, že je snad až 100x rychlejší, že je 10x rychlejší s diskem, a že sort() provede 3x rychleji. No a teprve pak se dostavil výsledek. Že to vyšlo v podstatě stejně, a nedá se říct, že je Spark rychlejší v porovnáním s Hadoop jak se tvrdí (u ETL úloh), byl výsledek jedno velké zklamání.
Fault tolerance jsem vůbec neřešil, dokonce jsem v případě incidentů výsledky ihned ignoroval, abych jejich vliv eliminoval při srovnávání. Spark padá častěji a Hadoop skoro vůbec (tzn. tam by to spíš stejně bylo v neprospěch Spark). Souhlasím pak s tím, jak zmiňujete, že v rámci RDD (resp. spíše díky DAG!!!!!), SPARK může dosahovat lepších výsledků. Vracím se ale k tvrzení v článku: jestli to někde ale může zafungovat, bude to vždy na řádku co jsem naznačil. V průběhu kroku map() se u srovnávacích implementací DAG neprojeví na rychlosti, roli to začne hrát až ve zpracování následujících kroků (pozn. samozřejmě u stejné implementace na obou, u úloh kde data troughput je výrazně nad možnosti zpracování pouze v RAM, nebo podobných ETL).
A díky za zmínku "iterativních algoritmů" a více kroků v rámci jedné implementace. Právě tam DAG dá Spark(u) vyniknout. Sice to okamžitě vylučuje Hadoop ze hry (omezení pouze jedoho cyklu M-R), v kontextu ale "na co se soustředit aby Spark dával smysl implementovat místo Hadoop" je to velmi vhodná připomínka
Aby ty samé řešení předvedly kdo (a jak moc) je rychleší. Na začátku (a myslím jsem to i v textu zmiňoval), jsem chtěl porovnat implementaci stejné úlohy na Hadoop/MR a Spark/RDD.
Kdybyste se podival na to, jak a z ceho vychazi Spark, musel by vam ten vysledek byt zjevny uz od zacatku. Je to neco jako kdybyste vzal maturanta a profesora matematiky a dal jim resit ulohy z Belouna. V takovem pripade by se taky ukazalo, ze profesor matematiky neni zase o tolik lepsi nez ten maturant. Protoze to, co na tech vypoctech trva dlouho, neni vypocet samotny, ale ta rezie okolo, jako nacteni zadani a zapsani vysledku.
Že to vyšlo v podstatě stejně, a nedá se říct, že je Spark rychlejší v porovnáním s Hadoop jak se tvrdí (u ETL úloh), byl výsledek a velké zklamání.
Na zaklade tri trivialnich pripadu nemuzes generalizovat. Pokud mas ulohu, ktera je jednoduchy map, nedava to smysl, pokud ale tech transformaci potrebujes provest vic, dava Spark smysl.
Fault tolerance jsem vůbec neřešil, dokonce jsem v případě incidentů výsledky ihned ignoroval, abych jejich vliv eliminoval při srovnávání. Spark padá častěji a Hadoop skoro vůbec
Jeste jednou si precti, co jsem napsal vys. Konkretni pady nejsou vubec podstatne. Podstatne je to, ze zpusob, jakym se resi fault tolerance, se promita do architektury a prubehu vypoctu, bez ohledu na to, jestli v prubehu vypoctu doslo k padu. Jinymi slovy, protoze Spark neuklada kompletni data mezi jednotlivymi kroky, usetri se nemale mnozstvi zapisu. Pokud ale mas jeden nebo dva kroky, ten prinos se nema sanci projevit.
Vracím se ale k tvrzení v článku: jestli to někde ale může zafungovat, bude to vždy na řádku co jsem naznačil.
Ale hlavne to muze zafungovat na jinem typu ulohy. Mimochodem, na tom Hadoopu pouzils combiner? V takovem pripade by chovani melo byt hodne podobne Sparku (zapisuje se jen redukovana cast daneho bloku dat).
díky za zmínku "iterativních algoritmů" a více kroků v rámci jedné implementace. ... Sice to okamžitě vylučuje Hadoop ze hry (omezení pouze jedoho cyklu M-R),
Ale proc? Do doby nez se objevil Spark, se to delalo tak, ze data, co vypadla z map nebo reduce, se nasmerovala do dalsi iterace. Bylo to pochopitelne brutalne pomale, a proto se mimo jine objevil Spark.
je to velmi důležitá připomínka, která by měla být zmíněna poblíž všech těch závěrů, co bych si přál aby si čtenáři z článku převzali. S dovolením Váši zmínku zapracuji do textu článku. OK?
Ano, imho by se sluselo to tam mit od zacatku, protoze jinak ctenar muze nabyt dojmu, ze rychlost Sparku je jen marketingovy blud.
Ke komentářům:
Na začátku mi bylo zjevné jen jedno – že se Spark porovnává s Hadoopem a uvádí se, jak je rychlejší než Hadoop. Přitom experimenty v počátku v podstatě nedávaly vůbec důvod k přechodu na Spark. Dokážete třeba předložit opravdu důkaz, že je 10x rychlejší v práci s diskem při zpracování stejné implementace úlohy? Já osobně chápu význam takového tvrzení tak, že pomalá a náročná úloha z důvodu diskových operací, kterou implementuji v Spark/RDD, by měla být 10x rychlejší. V uvedené analogii a kontextu experimentu by zmíněné tvrzení a vystřízlivění bylo: “Professor je 10x rychlejší” a pak, když jak uvádíte, by professor nebyl rychlejší, zklamání z toho tvrzení by bylo opět analogicky to samé a stejné. Profesor vs. student, Spark vs Hadoop, není tak rychlý jak se tvrdí.
Připomínku k pádům, resp. k řešení fault-tolerance a relevanci k experimentům (I přes skutečnost, že jsem se naopak snažil problematické běhy úloh vyřadit a zcela eliminovat vliv na výsledky) prosím ještě více rozveďte, nebo upřesněte. Moje neporozumění Vašeho komentáře vychází z poznatků, že filosofie zpracování dat v RDD je založena na acyklických grafech (DAG). Tento přístup umožní rozložit (rozplánovat) celou úlohu do meších úloh granularizovaných optimálně pro umožnění distribuovat práci po nodech clusteru a současně i do kroků (partikulárních operací jako map, transformace, join, …apod). To vše (v podobě plánu) se připraví ještě před začátkem zpracovánání dat a node(s) začnou zpracovávat data podle své části plánu. Plán je až tak podrobný, že v průběhu zpracování každého kroku zpracování je zřetelné, jaké fragmenty dat jsou potřebné a pracuje se jen s tím (nepotřebné se ignoruje a tím dochází ke zrychlení zpracování). Následně kdykoliv v průběhu zpracovávání - když node spadne, vezme se jeho “plán” a přiřadí se jinému. Tuto eventualitu jsem vždy ignoroval a význam popisované “fault-tolerance” spíš vidím až v oblasti a případech srovnání možností “self-recovery” (takže Hadoop z kola ihned ven).
Možná, podle části kde v souvislosti o rychlosti Sparku uvádíte – cituji “paper o RDD, kde je vysvetleno, proc muze byt RDD (spark) o rad az dva rychlejsi nez MR (hadoop). Zjednodusene by se dalo rict, ze je to zpusobem, jak resi fault-tolerance”.
Tohle je spíš lépe vztahovat přímo k DAG než k “fault-tolerance”, nebo se pletu? Tzn. potřebu upřesnění vidím především v tom, že Spark by mohl být rychlejší o řád až dva nikoliv díky faul-tolerance, ale díky tomu, ze používá DAG. Až z toho pak přece teprve vyplývá potenciál rychlejšího zpracovávání dat, současně s elegantním vyřešením požadavků na fault-tolerance. Souhlasíte, nebo poukazujete na něco jiné?
Dokážete třeba předložit opravdu důkaz, že je 10x rychlejší v práci s diskem při zpracování stejné implementace úlohy?
Nezlob se, ale nemam v planu vyhazovat cas a penize za to, abych zjistil, jak extra pomaly je Hadoop. Pokud te to zajima, navod, jak takovy experiment zkonstruovat, jsem ti nabidl vyse.
Já osobně chápu význam takového tvrzení tak, že pomalá a náročná úloha z důvodu diskových operací, kterou implementuji v Spark/RDD, by měla být 10x rychlejší.
Stale to nechapes. Uloha, ktere vyuziva diskove operace a celkove vyuziti diskovych operaci jsou dve naprosto odlisne veci. V prvnim pripade se jedna o diskove operace nutne ke zpracovani samothne ulohy, v druhem pripade o operace, ktere zahrnuji i rezii celeho systemu. A to je presne to misto, kde je Spark lepsi nez Hadoop.
Tuto eventualitu jsem vždy ignoroval a význam popisované “fault-tolerance” spíš vidím až v oblasti a případech srovnání možností “self-recovery”
To je ale zasadni problem, na ktery se tu snazim celou dobu upozornit. Hadoop fault-tolerance zajistuje tim, ze vsechna data jsou po provedeni kazdeho kroku materializovana na disk, coz muze znamenat obrovske mnozstvi diskovych operaci bez ohledu na to, jestli k nejakemu padu doslo, nebo ne. Spark si mezi kroky uklada jen jednotlive transformace (DAG, chces-li), cimz se vyrazne eliminuje mnozstvi diskovych operaci.
Tohle je spíš lépe vztahovat přímo k DAG než k “fault-tolerance”, nebo se pletu? Tzn. potřebu upřesnění vidím především v tom, že Spark by mohl být rychlejší o řád až dva nikoliv díky faul-tolerance, ale díky tomu, ze používá DAG.
Pletes se, precti si ten paper: https://www.usenix.org/system/files/conference/nsdi12/nsdi12-final138.pdf
RDDs provide an interface based on coarse-grained transformations (e.g., map, filter and join) that apply the same operation to many data items. This allows them to efficiently provide fault tolerance by logging the transformations used to build a dataset (its lineage) rather than the actual data.
A protoze diskove operace jsou ty nejpomalejsi, tak toto je opravdu klicova vlasnost. DAG (zminene "transformation used") je jen zpusob, jak popsat operaci s daty. To zrychleni je hlavne v tom, ze u slozitejsi transformaci neni potreba materializovat jednotlive kroky (jako u hadoop), aby byla zajistena fault-tolerance.
Až z toho pak přece teprve vyplývá potenciál rychlejšího zpracovávání dat, současně s elegantním vyřešením požadavků na fault-tolerance.
Ta kauzalita je tam presne opacne. Neni problem sestavit operace (DAG), to dela kazdy programovaci jazyk, ale zajistit efektivni fault-tolerance. Nejjednodusi je delat checkpoints, a po kazdem kroku ulozit vsechna data, aby se v pripade vypadku k nim dalo vratit. Pokud se ale data maji ukladat ve vice instancich (HDFS), je to brutalne pomale, proto Spark prisel jen s ukladanim transformaci a ty jsou prave ve forme DAG.
Dava to smysl, u distribuovanych systemu se musi s vypadky uzlu nezbytne pocitat, ale i tak nastavaji jen zridka. U MR je zotaveni po vypadku uzlu rychlejsi (proste data cte jiny uzel), ale je to za cenu toho, ze bezne operace jsou nasobne pomalejsi nez by bylo nutne (protoze se vse musi zapsat na disk).
Do dalšího vývoje tohoto vlákna z pozice autora článku a moderování směru diskuze jsem se rozhodl už dál nestupovat. Význam DAG, kauzalitu, včetně porozumění anglického textu (a pak i okolního kontextu odkud pochází) chápu rozdílně.
Za komentáře však, veškeré další příspěvky a názory ( to i od jiných čtenářů) však budu vděčný. Ponechávám proto další diskuzi nadále otevřenou.
Význam DAG, kauzalitu, včetně porozumění anglického textu (a pak i okolního kontextu odkud pochází) chápu úplně rozdílně.
To je problem. Podivej se jeste treba na jeden z uplne prvnich clanku z roku 2010: https://amplab.cs.berkeley.edu/wp-content/uploads/2011/06/Spark-Cluster-Computing-with-Working-Sets.pdf
Klicove slovo DAG tam nenajdes ani jednou, za to fault tolerance se to jen hemzi.
(a pak i okolního kontextu odkud pochází)
Jaky okolni kontext mas na mysli?
Tohle celé vypadá špatně, nechceš se někdy stavit na meetup/školení a popovídat jak to vypadá v praxi?
200GB dat je strašně málo, abys vyrovnal režii, kterou to má, hadoop a spark pořizovat na tahle malá data nemá často smysl, ta výhoda nastává až daleko dál. ETL, která v praxi výdám mají deset, dvacet a více stages, pak přesně MR selhává, důvod už vysvětlili ostatní.
Čteš všechna data a ty někam přesouváš, tam není moc výhoda těhle technologií, v praxi vidím používání sloupcových datových souborů, velké datové sady, z kterých se filtruje zlomek, který se dále zpracovává a spojuje s jinýma datama.
Dal jsi si s tím práci, ale jde vidět, že máš velké nedostatky v praxi s těmito nástroji. Připrav si daleko složitější příklady, nějaké komplikovanější ETL na zpracování dat, pak uvidíš rozdíl. Vidím v tvém popisu spousty nejasností, zmíňka, že zvednutí paměti z 32GB na 64GB nepomhla může být způsobeno komprimací ukazatelů u JVM. Rychlejší pyspark oproti scale je zajímavé vzhledem k tomu, že se na pozadí stejně spouští scala a práce se do ní překládá.
Chybí mi tady s jakými parametry sparková úloha běžela, stejně tak chybí stejná informace u hadoopu.
Popsaný experiment a získané výsledky jen reflektují to, že doporučení dodavatelů technologií bývají hodně “naučené”, odpovědi na konkrétní měřitelné parametry fádní. Spíš doměnky než fakta, případně pel-mel všeho co příjde na mysl. Tohle je třeba to, co já tvrdím že je špatně. Kdybych měl takové odpovědi místo pochybností, neměl bych důvod se srovnáváním zabývat.
Jistě si vzpomeneš, že v diskuzích a příspěvcích k minulého článku se objevovaly hlavně výtky, že Spark je 100x rychlejší a nemá cenu zkoumat Hadoop a jednotlivé typy úloh, které se typicky v ETL používají. Jeden první z takových výstřelů byl právě od Tebe.
Z toho co jsme spolu diskutovali tehdy, experiment nyní ukázal, že u jednostupňových ETL úloh Spark přínos mít nebude. Čas zpracování se u popsaných ETL úloh nezkrátí. Na základě tvého komentáře i další komunikace, naopak Spark neměl mít v Hadoopu žádnou konkurenci. Optimum rychlost/cena lze z výsledků experiment očekávat již při clusteru velikosti 1+10, nikoliv jak jsi uváděl že se to “bude lámat” řádově u 100 a více. Neustále jsi omílal vysoké režie, nedokázal jsi je ale vůbec kvantifikovat. Takže jak nyní uvádíš “200GB dat je strašně málo, abys vyrovnal režii, kterou to má” – to vycházíš ze zkušeností, víš, nebo tipuješ? Velikost 200GB zcela eliminuje zkreslující vliv režie na popisované výsledky. To není doměnka, to je ověřená skutečnost jako u spousty dalších faktů, které jsem v článku uvedl.
Když si projdeš Ty, a i ostatní čtenáři vsechny příspěvky a komentáře, jsou v článku uvedené výsledky, metodika i řešené úlohy jen zpochybňovány (pokud vůbec jsou ještě relevantní k zaměření článku). Nikde jsem ale doposud neviděl konstruktivní konfrontaci přímo výsledků, metodiky, smyslu experimentu. Vše je to o tom, že je "něco" špatně (nebo dokonce vše), nesouvisející nebo tématicky hodně vzdálený link, zpochybňování teoretických a praktických znalostí, ...nebo odkazy na jiné nesourodé technologie, ...prostě téměř vždy "celkově KO".
Co je tedy vlasně špatně? Na základě jednoho experimentu dokážu lépe odhadovat režie, požadavky na HW, performance, Spark nasadit tam kde skutečně bude lepší než Hadoop (nikoliv dle bludu 100/10/3x). Tím pádem mohu lépe odhadnout pořizovací a provozní náklady, škálovat celé řešení, lépe plánovat další rozvoj. Nemusím spoléhat jen na výstřely od pasu. Mám exaktní, měřitelné a zdokumentované podklady. I když bych zjistl, že něco z toho je nepřesné, napravím to a zase mám bázi na které mohu dál stavět. Toto je tím co dle Tebe "celé vypadá špatně"?
tohle je již pokročilé téma nad úroveň toho, jaká je u meetupů poptávka, ptej se, lidi, kteří to znají z praxe tam jsou.
Tady jsi připravil ideální situaci pro hadoop, opřel jsi se o výkon disků a čekal jsi, že spark bude 100x rychlejší? Zkus svůj test upravit následně a sleduj jak se mění rozdíly i pro jednostupňovou úlohu:
- zvyš počet soubor na desítky tisíc, hadoop má velké problémy s mnoho soubory a neumí je efektivně združovat, spark se s tím vypořádává lépe
- nenačítej celou bázi dat, ale její část (tj. začni filtrovat, v praxi málokdy vidím potřebu načíst úplně vše), použij jiný formát souborů pro spark (parquet, orc), kde díky sloupcovému uspořádání si dobře rozumí s filtrováním
- přidej Hive metastore, udělej z toho tabulku, soubory rozděl do partitions a napočítej statistiky
- spark dobře neumí využít hodně paměti pro jeden proces, rozděl úlohu na tisíce executorů, každému stačí málo paměti a využij škálování do šířky, v tomhle spark exceluje proti MR
Test jsi si napsal už s nějakým předpokladem a jen jsi prokázal, že spark funguje obdobně jako MR pro čtení všeho z disku.
MR v praxi selhává ve prospěch sparku právě z důvodu, že nemáš nikdy vše ideální. Úlohy jsou složité, data mají vysokou granualitu, potřebuješ filtrovat, na clusteru máš nemalou zátěž atd.
Při nabídkách řešení nad hadoopem vždy děláme výkonnostní testy podle plánovaných úloh a jedná se o reálná měření, nedělají to tak ale všichni. Spark není vždy tou správnou volbou a opět se rozhoduji podle potřeb, dnes jsou již na výběr i další nástroje.
Tohle je velice nešťastný článek. Souhlasil bych s autorem snad jen v tom, že pro něj Hadoop ani Spark nebudou tím, co hledá. A pak s tím, že opravdu existují úlohy, kde to má smysl a objem vstupu a složitost transformace a počítání jsou takové, že na jednom stroji je to nepraktické.
Dopručil bych ke čtení např. Anatomy of flawed microbenchmark https://www.ibm.com/developerworks/library/j-jtp02225/index.html a pak zamyšlení jestli má smysl měřit počítání Pí pomocí Monte Carlo nebo zpracovávat 200GB dat a vyvozovat závěry o Hadoopu či Sparku. K tomu druhému snad také https://www.chrisstucchio.com/blog/2013/hadoop_hatred.html z roku 2013. Dnes jsme zase jinde. Měřit na AWS a zahazovat výsledky, které nezapadají do (pochybně) zvolené koncepce měření.
Neodhadnu nyní co tím míníš, když píšeš "že pro něj Hadoop ani Spark nebudou tím, co hledá". Domnívám se, že jsi to jen četl zrychleně a spoustu podstatných informací jsi přehlédnul. Nehledal jsem řešení, srovnával jsem, hledal jsem dál možnosti jak by už existující H/MR řešení Spark dále urychlil.
Opodstatnění zahrnutí úlohy odhadu čísla PI do experimentu, objem dat použitých pro test, stejně jako zmínka o zahazování výsledků, AWS,...to vše by bylo možné opět vysvětlovat, doporučuji ale raději pozorně vše ještě jednou přečíst..