sql >> Database teknologi >  >> NoSQL >> HBase

Apache Spark Kommer til Apache HBase med HBase-Spark Module

SparkOnHBase-projektet i Cloudera Labs blev for nylig fusioneret ind i Apache HBase-stammen. I dette indlæg kan du lære projektets historie og hvordan fremtiden ser ud for det nye HBase-Spark-modul.

SparkOnHBase blev først skubbet til Github i juli 2014, kun seks måneder efter Spark Summit 2013 og fem måneder efter, at Apache Spark første gang blev sendt til CDH. Den konference var et stort vendepunkt for mig, fordi jeg for første gang indså, at MapReduce-motoren havde en meget stærk konkurrent. Spark var ved at gå ind i en spændende ny fase i sin open source-livscyklus, og blot et år senere bliver den brugt i massiv skala på 100-vis ikke 1000-vis af virksomheder (med 200+ af dem gør det på Clouderas platform).

SparkOnHBase kom til at være ud af en simpel kundeanmodning om at have et niveau af interaktion mellem HBase og Spark svarende til det, der allerede er tilgængeligt mellem HBase og MapReduce. Her er en hurtig oversigt over den funktionalitet, der var i omfang:

  • Fuld adgang til HBase på et kort eller reducere etape
  • Evne til at udføre en massebelastning
  • Evne til at udføre massehandlinger som f.eks. hent, put, slet
  • Evne til at være en datakilde for SQL-motorer

Den første udgivelse af SparkOnHBase blev bygget til en Cloudera-kunde, der havde accepteret at tillade, at arbejdet blev offentligt. Heldigvis fik jeg tidlig hjælp fra andre Clouderans og HBase PMC-medlemmer Jon Hsieh og Matteo Bertozzi og Spark PMC-medlem Tathagata Das for at sikre, at designet ville fungere både for base Apache Spark såvel som Spark Streaming.

Det varede ikke længe, ​​før andre kunder begyndte at bruge SparkOnHBase - især Edmunds.com med sin real-time Spark Streaming-applikation til Super Bowl Sunday. Da andre virksomheder hoppede ombord, stod det hurtigt klart, at en enkelt projektvedligeholder (nemlig:mig) ikke ville skalere. Heldigvis havde Cloudera på det tidspunkt for nylig annonceret Cloudera Labs, som viste sig at være det perfekte hjem til projektet. Forenklet sagt er Cloudera Labs en virtuel beholder til nye økosystemprojekter, der er unge i forhold til deres virksomhedsberedskab, udvikling og ambitioner, men som er i høj efterspørgsel af brugere, der ønsker at prøve de nyeste teknologier. SparkOnHBase blev til et Cloudera Labs-projekt med tiden.

I dag er jeg glad for at kunne rapportere, at SparkOnHBase for nylig blev forpligtet til HBase-stammen (HBASE-13992). HBASE-13992 tilføjer SparkOnHBase til HBase-kernen under en ny betegnelse, HBase-Spark-modulet. Jeg vil gerne takke HBase VP Andrew Purtell for hans opmuntring og "åbne døren" for HBASE-13992 og PMC medlem Sean Busbey for hans mentoring og vejledning. Jeg vil også gerne takke Elliott Clark, Enis Soztutar, Michael Stack, Nicolas Liochon, Kostas Sakellis, Ted Yu, Lars Hofhansl og Steve Loughran for deres kodeanmeldelser. (Som du kan se, var SparkOnHBase en autentisk fællesskabsindsats.)

Med HBASE-13992 var jeg især i stand til at tilføje Spark og Scala-kode til Apache HBase-projektet for første gang nogensinde. Det var supersjovt at have det privilegium at bygge den første Scala-enhedstest i HBases historie!

Lad os nu dykke ned i de tekniske detaljer.

Inde i HBASE-13992

I HBASE-13992 vil du se, at det meste af den originale kode og design fra SparkOnHBase forbliver uændret. Den grundlæggende arkitektur holder stadig, idet kernedelen af ​​koden er designet til at få et HBase-forbindelsesobjekt i hver Spark Executor.

Selvom det grundlæggende er tilbage, er der tre store forskelle mellem HBASE-13992-patchen og Cloudera Labs SparkOnHBase-projektet:

  • HBase API'er: HBASE-13992 bruger alle de nye HBase 1.0+ API'er hele vejen igennem.
  • RDD- og DSream-funktioner: En af de største klager over SparkOnHBase var relateret til, hvordan funktioner blev udført; Spark-elskere ønskede at lave HBase-handlinger direkte fra en RDD eller DSream. I HBASE-13992 er denne funktion indbygget via enhedstests og eksempler. Desuden er der kodeeksempler på HBase-funktioner direkte fra RDD'er senere i dette indlæg, så du kan få en fornemmelse af, hvordan API'erne vil se ud.
  • Nem foreach og map funktioner: Nu er det endnu nemmere at lave foreachPartition s og mapPartition s med en HBase-forbindelse. Et eksempel følger senere i dette indlæg.

Lad os nu tage et hurtigt minut og gennemgå forskellene mellem SparkOnHBase-kodebasen og HBASE-13992-patchen. Her er et hurtigt eksempel på bulkDelete fra SparkOnHBase:

val hbaseContext =new HBaseContext(sc, config);hbaseContext.bulkDelete[Array[Byte]](rdd,                  tabelNavn,                   putRecord => ny Slet (optag ),                           putRecord =>                        putRecord =>                             putRecord =>    (optag ); 

Bemærk i dette eksempel, at vi kalder en funktion direkte fra HBaseContext-objektet, selvom operationen virkelig blev udført på RDD'en. Så lad os nu se på HBase-Spark-modulet for den samme kode:

val hbaseContext =new HBaseContext(sc, config)rdd.hbaseBulkDelete(hbaseContext,                  tabelnavn,                  putRecord => new Delete(preputRecord ),                   putRecord => new Delete(preputRecord ),    

Den store forskel er, at hbaseBulkDelete metoden kommer direkte ud af RDD. Denne tilgang lader også døren stå åben for følgende muligheder med en fremtidig JIRA:

val hbaseContext =new HBaseContext(sc, config)rdd.hbaseBulkDelete(tableName)

Dette er så rent, som jeg kan få det lige nu, men målet er at gøre det endnu mere enkelt og rent.

Lad os også tage et hurtigt kig på foreach- og kortfunktionerne i HBASE-13992. Du kan se i ForeachPartition eksempel nedenfor, at vi har en iterator og en HBase Connection objekt. Dette vil give os fuld magt til at gøre hvad som helst med HBase, mens vi gentager vores værdier:

val hbaseContext =new HBaseContext(sc, config)rdd.hbaseForeachPartition(hbaseContext, (it, conn) => {      val bufferedMutator =conn.getBufferedMutator(TableName.valueOf("t1"))              buffet )      bufferedMutator.close()    })

Endelig er her et eksempel på en kortpartitionsfunktion, hvor vi kan få et forbindelsesobjekt, når vi itererer over vores værdier:

val getRdd =rdd.hbaseMapPartitions(hbaseContext, (it, conn) => {       val table =conn.getTable(TableName.valueOf("t1")       var res =mutable.MutableList[String]()       ... })

Fremtidigt arbejde

Følgende JIRA'er er på min TO DO-liste:

HBASE-14150 – Tilføj BulkLoad funktionalitet til HBase-Spark Module

Snart vil vi være i stand til at udføre massebelastninger direkte fra RDD'er med kode, der ser så simpel ud som:

 rdd.hbasebulkload (tablename, t => {seq ((ny KeyFamilyqualifier (t.rowkey, t.family, t.qualifier), t.value)). Iterator}, iscenesættelsesfolder) 

HBASE-14181 – Føj Spark DataFrame DataSource til HBase-Spark-modulet

Med denne patch vil vi være i stand til direkte at integrere Spark SQL med HBase og lave seje ting som filter og kolonnevalg pushdown sammen med scan-range pushdown. Målet med at få Spark SQL og HBase interaktion er så simpelt som følgende:

val df =sqlContext.load("org.apache.hadoop.hbase.spark",      Kort("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' og B_FIELD ') eller " +      "(KEY_FIELD <='get3' og B_FIELD ='8')").foreach(r => println(" - " + r))

Der er andre JIRA'er designet til at gøre koden nemmere at bruge og gøre enhedstesten mere omfattende. Mit personlige mål er at kunne melde tilbage i et opfølgende blogindlæg med alle de store fremskridt, vi gør. Målet er at gøre Spark til den førsteklasses borger, som den fortjener at være i forhold til HBase, og styrke den yderligere som MapReduce-erstatningen i branchen. Udskiftning af MapReduce med Spark vil give os mulighed for at udføre endnu mere behandling på HBase-klynger, uden at det giver bekymring for, at der vil være mere disk IO-stridigheder.

Det vil tage tid, før HBase-Spark-modulet gør det til en udgivelse af HBase. I mellemtiden er der planer om at backportere noget af koden fra HBase-Spark-modulet til SparkOnHBase i Cloudera Labs. I øjeblikket fungerer SparkOnHBase på CDH 5.3 og 5.4, og målet vil være at opdatere SparkOnHBase med HBase-Spark-modulets fremskridt til den kommende CDH-minor-udgivelse senere i 2015.

Ted Malaska er Solutions Architect hos Cloudera, bidragyder til Spark, Apache Flume og Apache HBase og medforfatter til O'Reilly-bogen, Hadoop Application Architectures.


  1. Brug af .sort med PyMongo

  2. MongooseError - Operation `users.findOne()` buffering timeout efter 10000ms

  3. Planlæg Node.js-job hvert femte minut

  4. Opret en note-app til Android med MongoDB Stitch