Projekt SparkOnHBase v Cloudera Labs byl nedávno začleněn do kmene Apache HBase. V tomto příspěvku se dozvíte o historii projektu a o tom, jak vypadá budoucnost nového modulu HBase-Spark.
SparkOnHBase byl poprvé odeslán na Github v červenci 2014, pouhých šest měsíců po Spark Summit 2013 a pět měsíců poté, co byl Apache Spark poprvé odeslán v CDH. Ta konference pro mě byla velkým zlomem, protože jsem si poprvé uvědomil, že engine MapReduce má velmi silného konkurenta. Spark se chystal vstoupit do vzrušující nové fáze svého životního cyklu s otevřeným zdrojovým kódem a jen o rok později se používá v masivním měřítku ve 100, ne-li 1000 společnostech (přičemž více než 200 z nich tak činí na platformě Cloudera).
SparkOnHBase vzešel z jednoduchého požadavku zákazníka na úroveň interakce mezi HBase a Spark podobnou té, která je již dostupná mezi HBase a MapReduce. Zde je rychlý souhrn funkcí, které byly v rozsahu:
- Plný přístup k HBase na mapě nebo zmenšení fáze
- Možnost hromadného zatížení
- Možnost provádět hromadné operace, jako je získat, vložit, odstranit
- Schopnost být zdrojem dat pro stroje SQL
Počáteční vydání SparkOnHBase bylo vytvořeno pro zákazníky Cloudera, kteří souhlasili s tím, že umožní zveřejnění díla. Naštěstí jsem dostal včasnou pomoc od kolegů Clouderanů a členů HBase PMC Jona Hsieha a Mattea Bertozziho a člena Spark PMC Tathagata Dase, abych se ujistil, že návrh bude fungovat jak pro základní Apache Spark, tak pro Spark Streaming.
Netrvalo dlouho a SparkOnHBase začali používat další zákazníci – zejména Edmunds.com s aplikací Spark Streaming v reálném čase pro neděli Super Bowl. Když se k tomu přidaly další společnosti, rychle se ukázalo, že jediný správce projektu (jmenovitě:já) se nebude škálovat. Naštěstí v té době Cloudera nedávno oznámila Cloudera Labs, což se ukázalo jako ideální domov pro projekt. Zjednodušeně řečeno, Cloudera Labs je virtuální kontejner pro vznikající ekosystémové projekty, které jsou mladé, pokud jde o připravenost podniku, vývoj a ambice, ale jsou velmi žádané uživateli, kteří chtějí vyzkoušet nejnovější technologie. SparkOnHBase se v pravý čas stal projektem Cloudera Labs.
Dnes s radostí mohu oznámit, že SparkOnHBase byl nedávno vázán na kmen HBase (HBASE-13992). HBASE-13992 přidává SparkOnHBase k jádru HBase pod novým názvem, modulem HBase-Spark. Chci poděkovat viceprezidentovi HBase Andrew Purtellovi za jeho povzbuzení a „otevření dveří“ pro HBASE-13992 a členovi PMC Seanu Busbeymu za jeho mentoring a vedení. Také bych chtěl poděkovat Elliott Clarkovi, Enis Soztutar, Michael Stack, Nicolas Liochon, Kostas Sakellis, Ted Yu, Lars Hofhansl a Steve Loughran za jejich recenze kódu. (Jak můžete vidět, SparkOnHBase byla autentická komunita.)
Je pozoruhodné, že s HBASE-13992 jsem byl schopen vůbec poprvé přidat kód Spark a Scala do projektu Apache HBase. Byla to super zábava mít tu čest postavit první test jednotky Scala v historii HBase!
Nyní se pojďme ponořit do technických detailů.
Uvnitř HBASE-13992
V HBASE-13992 uvidíte, že většina původního kódu a designu ze SparkOnHBase zůstala nezměněna. Základní architektura stále platí v tom, že základní část kódu je navržena tak, aby v každém Spark Executoru získala objekt připojení HBase.
Zatímco základy zůstávají, existují tři hlavní rozdíly mezi opravou HBASE-13992 a projektem Cloudera Labs SparkOnHBase:
- HBase API: HBASE-13992 používá všechna nová rozhraní API HBase 1.0+.
- Funkce RDD a DStream: Jedna z největších stížností na SparkOnHBase se týkala způsobu provádění funkcí; Milovníci Sparku chtěli dělat akce HBase přímo z RDD nebo DSstreamu. V HBASE-13992 je tato schopnost zavedena prostřednictvím testů jednotek a příkladů. Dále v tomto příspěvku jsou příklady kódu funkcí HBase přímo z RDD, takže si můžete udělat představu o tom, jak budou rozhraní API vypadat.
- Snadné
foreach
amap
funkce: Nyní je ještě jednodušší provéstforeachPartition
s amapPartition
s připojením HBase. Příklad bude následovat později v tomto příspěvku.
Nyní si na krátkou chvíli projdeme rozdíly mezi základnou kódu SparkOnHBase a opravou HBASE-13992. Zde je rychlý příklad bulkDelete
ze SparkOnHBase:
val hbaseContext =new HBaseContext(sc, config);hbaseContext.bulkDelete[Array[Byte]](rdd, název_tabulky, putRecord => new Delete 4), předVšimněte si, že v tomto příkladu voláme funkci přímo z objektu HBaseContext, i když operace byla skutečně prováděna na RDD. Nyní se tedy podívejme na modul HBase-Spark pro stejný kód:
val hbaseContext =new HBaseContext(sc, config)rdd.hbaseBulkDelete(hbaseContext, název_tabulky, putRecord => new Delete (putRecord), před 4Velký rozdíl je v tom, že
hbaseBulkDelete
metoda vychází přímo z RDD. Tento přístup také ponechává dveře otevřené následujícím možnostem s budoucím JIRA:val hbaseContext =new HBaseContext(sc, config)rdd.hbaseBulkDelete(tableName)Tohle je tak čisté, jak to zatím dokážu, ale cílem je udělat to ještě více jednoduché a čisté.
Podívejme se také rychle na funkce foreach a map v HBASE-13992. Můžete to vidět v
ForeachPartition
příklad níže, že máme iterátor a HBaseConnection
objekt. To nám dá plnou moc dělat s HBase cokoli, když budeme opakovat naše hodnoty:val hbaseContext =new HBaseContext(sc, config)rdd.hbaseForeachPartition(hbaseContext, (it, conn) => { val bufferedMutator =conn.getBufferedMutator(TableName.valueOf("t1")) buffered M ... sh ) bufferedMutator.close() })Nakonec je zde příklad funkce mapového oddílu, kde můžeme získat objekt připojení, když iterujeme naše hodnoty:
val getRdd =rdd.hbaseMapPartitions(hbaseContext, (it, conn) => { val table =conn.getTable(TableName.valueOf("t1")) var res =mutable.MutableList[String]() ... })Budoucí práce
Následující JIRA jsou na mém seznamu TO DO:
HBASE-14150 – Přidejte
BulkLoad
funkčnosti modulu HBase-SparkBrzy budeme moci provádět hromadné načítání přímo z RDD s kódem, který vypadá stejně jednoduše jako:
rdd.hbaseBulkLoad (název_tabulky, t => { Seq((new KeyFamilyQualifier(t.rowKey, t.family, t.qualifier), t.value, t.value)). erHBASE-14181 – Přidání zdroje dat Spark DataFrame do modulu HBase-Spark
S touto opravou budeme moci přímo integrovat Spark SQL s HBase a dělat skvělé věci, jako je posunutí filtru a výběru sloupců, spolu s posunutím rozsahu skenování. Cíl získat interakci Spark SQL a HBase je stejně jednoduchý jako následující:
val df =sqlContext.load("org.apache.hadoop.hbase.spark", Map("hbase.columns.mapping" -> "KEY_FIELD STRING :key, A_FIELD STRING c:a, B_FIELD STRING c:b ,", "hbase.table" -> "t1"))df.registerTempTable("hbaseTmp")sqlContext.sql("SELECT KEY_FIELD FROM hbaseTmp " + "WHERE " + "(KEY_FIELD ='get1' a B'3FIELD ') nebo " + "(KEY_FIELD <='get3' a B_FIELD ='8')").foreach(r => println(" - " + r))Existují další JIRA navržené tak, aby usnadnily používání kódu a učinily test jednotky komplexnějším. Mým osobním cílem je, abych mohl v následném příspěvku na blogu informovat o všem velkém pokroku, kterého dosahujeme. Cílem je proměnit Spark v prvotřídního občana, kterým si zaslouží být s ohledem na HBase, a dále jej upevnit jako náhradu MapReduce v tomto odvětví. Nahrazení MapReduce za Spark nám umožní provádět ještě více zpracování na clusterech HBase, aniž bychom se museli obávat, že dojde k většímu sporu o vstupy a výstupy disku.
Než se modul HBase-Spark dostane do verze HBase, bude to chvíli trvat. Mezitím se plánuje zpětná portace části kódu z modulu HBase-Spark do SparkOnHBase v Cloudera Labs. V současné době SparkOnHBase funguje na CDH 5.3 a 5.4 a cílem bude aktualizovat SparkOnHBase pomocí modulů HBase-Spark pro nadcházející menší verzi CDH později v roce 2015.
Ted Malaska je Solutions Architect ve společnosti Cloudera, přispěvatel do Spark, Apache Flume a Apache HBase a spoluautor knihy O’Reilly, Hadoop Application Architectures.