SparkOnHBase-projektet i Cloudera Labs slogs nyligen samman med Apache HBase-trunken. I det här inlägget kan du lära dig projektets historia och hur framtiden ser ut för den nya HBase-Spark-modulen.
SparkOnHBase skickades först till Github i juli 2014, bara sex månader efter Spark Summit 2013 och fem månader efter att Apache Spark först skickades till CDH. Den konferensen var en stor vändpunkt för mig, eftersom jag för första gången insåg att MapReduce-motorn hade en mycket stark konkurrent. Spark var på väg att gå in i en spännande ny fas i sin livscykel med öppen källkod, och bara ett år senare används den i massiv skala på 100-tals om inte 1000-tals företag (med 200+ av dem som gör det på Clouderas plattform).
SparkOnHBase kom till en enkel kundförfrågan om att ha en nivå av interaktion mellan HBase och Spark liknande den som redan finns tillgänglig mellan HBase och MapReduce. Här är en snabb sammanfattning av funktionaliteten som var i omfattning:
- Full åtkomst till HBase på en karta eller minska scenen
- Möjlighet att göra en bulkbelastning
- Möjlighet att utföra massoperationer som hämta, lägga, ta bort
- Förmåga att vara en datakälla för SQL-motorer
Den första utgåvan av SparkOnHBase byggdes för en Cloudera-kunder som hade gått med på att låta arbetet bli offentligt. Tack och lov fick jag tidigt hjälp från andra Clouderans och HBase PMC-medlemmar Jon Hsieh och Matteo Bertozzi, och Spark PMC-medlemmen Tathagata Das, för att se till att designen skulle fungera både för basen Apache Spark och Spark Streaming.
Det dröjde inte länge innan andra kunder började använda SparkOnHBase – framför allt Edmunds.com med sin Spark Streaming-applikation i realtid för Super Bowl Sunday. När andra företag hoppade på, stod det snabbt klart att en enda projektansvarig (nämligen:jag) inte skulle skala. Lyckligtvis, vid den tiden, hade Cloudera nyligen annonserat Cloudera Labs, som visade sig vara det perfekta hemmet för projektet. Enkelt uttryckt är Cloudera Labs en virtuell behållare för framväxande ekosystemprojekt som är unga när det gäller deras företagsberedskap, utveckling och ambition, men som är mycket efterfrågade av användare som vill prova den senaste tekniken. SparkOnHBase blev ett Cloudera Labs-projekt i sinom tid.
Idag är jag glad att kunna rapportera att SparkOnHBase nyligen har anslutit sig till HBase-stammen (HBASE-13992). HBASE-13992 lägger till SparkOnHBase till HBase-kärnan under ett nytt namn, HBase-Spark-modulen. Jag vill tacka HBase VP Andrew Purtell för hans uppmuntran och "öppna dörren" för HBASE-13992 och PMC-medlemmen Sean Busbey för hans mentorskap och vägledning. Jag vill också tacka Elliott Clark, Enis Soztutar, Michael Stack, Nicolas Liochon, Kostas Sakellis, Ted Yu, Lars Hofhansl och Steve Loughran för deras kodrecensioner. (Som du kan se var SparkOnHBase en autentisk gemenskapsinsats.)
Noterbart, med HBASE-13992 kunde jag lägga till Spark och Scala-kod till Apache HBase-projektet för första gången någonsin. Det var superkul att ha förmånen att bygga det första Scala-enhetstestet i HBases historia!
Låt oss nu dyka in i de tekniska detaljerna.
Inuti HBASE-13992
I HBASE-13992 kommer du att se att det mesta av originalkoden och designen från SparkOnHBase lämnas oförändrade. Den grundläggande arkitekturen gäller fortfarande, genom att kärndelen av koden är designad för att få ett HBase-anslutningsobjekt i varje Spark Executor.
Även om grunderna kvarstår, finns det tre stora skillnader mellan HBASE-13992-patchen och Cloudera Labs SparkOnHBase-projektet:
- HBase API:er: HBASE-13992 använder alla nya HBase 1.0+ API:er.
- RDD- och DStream-funktioner: Ett av de största klagomålen om SparkOnHBase relaterade till hur funktioner utfördes; Spark-älskare ville göra HBase-actions direkt från en RDD eller DStream. I HBASE-13992 är den förmågan inbakad via enhetstester och exempel. Dessutom finns det kodexempel på HBase-funktioner direkt från RDD:er längre fram i detta inlägg, så att du kan få en känsla för hur API:erna kommer att se ut.
- Lätt
foreach
ochmap
funktioner: Nu är det ännu enklare att göraforeachPartition
s ochmapPartition
s med en HBase-anslutning. Ett exempel kommer senare i det här inlägget.
Låt oss nu ta en snabb minut och gå igenom skillnaderna mellan SparkOnHBase-kodbasen och HBASE-13992-patchen. Här är ett snabbt exempel på bulkDelete
från SparkOnHBase:
val hbaseContext =new HBaseContext(sc, config);hbaseContext.bulkDelete[Array[Byte]](rdd, tabellnamn, putRecord => putRecord = putRecord = putRecord => putRecord = putRecord = putRecord = putRecord = putRecord = putRecord =Observera att i det här exemplet anropar vi en funktion direkt från HBaseContext-objektet, även om operationen verkligen exekveras på RDD. Så låt oss nu titta på HBase-Spark-modulen för samma kod:
val hbaseContext =new HBaseContext(sc, config)rdd.hbaseBulkDelete(hbaseContext, tableName, putRecord => new Delete(preputRecord ), putRecord => new Delete(preputRecord ),Den stora skillnaden är att
hbaseBulkDelete
metoden kommer direkt ur RDD. Dessutom lämnar detta tillvägagångssätt dörren öppen för följande alternativ med en framtida JIRA:val hbaseContext =new HBaseContext(sc, config)rdd.hbaseBulkDelete(tableName)Det här är så rent som jag kan få det för tillfället, men målet är att göra det ännu mer enkelt och rent.
Låt oss också ta en snabb titt på foreach- och kartfunktionerna i HBASE-13992. Du kan se i
ForeachPartition
exempel nedan att vi har en iterator och en HBaseConnection
objekt. Detta ger oss full kraft att göra vad som helst med HBase när vi upprepar våra värderingar:val hbaseContext =new HBaseContext(sc, config)rdd.hbaseForeachPartition(hbaseContext, (it, conn) => { val bufferedMutator =conn.getBufferedMutator(TableName.valueOf("t1")) buffert buffert ) bufferedMutator.close() })Slutligen, här är ett exempel på en kartpartitionsfunktion där vi kan få ett anslutningsobjekt när vi itererar över våra värden:
val getRdd =rdd.hbaseMapPartitions(hbaseContext, (it, conn) => { val table =conn.getTable(TableName.valueOf("t1")) var res =mutable.MutableList[String]() ... })Framtida arbete
Följande JIRA finns på min TO DO-lista:
HBASE-14150 – Lägg till
BulkLoad
funktionalitet till HBase-Spark ModuleSnart kommer vi att kunna göra bulklaster direkt från RDD:er med kod som ser så enkel ut som:
rdd.HBasebulkload (TableName, T => {SEQ ((ny KeyFamilyQualifier (T.RowKey, T.Family, T.Qualifier), T.Value)). iterator}, StagingFolder)HBASE-14181 – Lägg till Spark DataFrame DataSource till HBase-Spark-modulen
Med den här patchen kommer vi att direkt kunna integrera Spark SQL med HBase och göra coola saker som filter och kolumnval pushdown, tillsammans med scan-range pushdown. Målet med att få Spark SQL och HBase-interaktion är så enkelt som följande:
val df =sqlContext.load("org.apache.hadoop.hbase.spark", Karta("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' och B_FIELD ') eller " + "(KEY_FIELD <='get3' och B_FIELD ='8')").foreach(r => println(" - " + r))Det finns andra JIRA som är utformade för att göra koden lättare att använda och göra enhetstestet mer omfattande. Mitt personliga mål är att kunna rapportera tillbaka i ett uppföljande blogginlägg med alla stora framsteg vi gör. Syftet är att förvandla Spark till den förstklassiga medborgare som den förtjänar att vara med avseende på HBase, och ytterligare befästa den som MapReduce-ersättningen i branschen. Genom att ersätta MapReduce med Spark kan vi göra ännu mer bearbetning på HBase-kluster, utan att lägga till oro för att det kommer att bli mer disk IO-konflikt.
Det kommer att ta tid innan HBase-Spark-modulen gör det till en release av HBase. Under tiden finns det planer på att backporta en del av koden från HBase-Spark-modulen till SparkOnHBase i Cloudera Labs. För närvarande fungerar SparkOnHBase på CDH 5.3 och 5.4, och målet kommer att vara att uppdatera SparkOnHBase med HBase-Spark-modulförskotten för den kommande CDH minor releasen senare under 2015.
Ted Malaska är en lösningsarkitekt på Cloudera, en bidragsgivare till Spark, Apache Flume och Apache HBase, och en medförfattare till O'Reilly-boken, Hadoop Application Architectures.