sql >> Databáze >  >> NoSQL >> HBase

Apache Spark přichází do Apache HBase s modulem HBase-Spark

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 a map funkce: Nyní je ještě jednodušší provést foreachPartition s a mapPartition 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
 Vš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 4                

Velký 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 HBase Connection 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-Spark

Brzy 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)).      er                                         

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


  1. Aktualizace MongoDB()

  2. MongoDB $ měsíc

  3. Správa žurnálování v MongoDB

  4. MongoDB:Aktualizace dokumentů pomocí dat ze stejného dokumentu