Het SparkOnHBase-project in Cloudera Labs is onlangs samengevoegd met de Apache HBase-trunk. Leer in dit bericht de geschiedenis van het project en hoe de toekomst eruitziet voor de nieuwe HBase-Spark-module.
SparkOnHBase werd voor het eerst naar Github gepusht in juli 2014, slechts zes maanden na Spark Summit 2013 en vijf maanden nadat Apache Spark voor het eerst in CDH werd verzonden. Die conferentie was een groot keerpunt voor mij, omdat ik me voor het eerst realiseerde dat de MapReduce-engine een zeer sterke concurrent had. Spark stond op het punt een opwindende nieuwe fase in zijn open source levenscyclus in te gaan, en slechts een jaar later wordt het op grote schaal gebruikt bij honderden, zo niet duizenden bedrijven (waarvan meer dan 200 op het platform van Cloudera).
SparkOnHBase kwam voort uit een eenvoudig verzoek van een klant om een interactieniveau tussen HBase en Spark te hebben dat vergelijkbaar is met het niveau dat al beschikbaar is tussen HBase en MapReduce. Hier is een korte samenvatting van de functionaliteit die binnen het bereik viel:
- Volledige toegang tot HBase op een kaart of een verkleinde etappe
- Mogelijkheid om een bulklading te doen
- Mogelijkheid om bulkbewerkingen uit te voeren, zoals ophalen, plaatsen, verwijderen
- Mogelijkheid om een gegevensbron te zijn voor SQL-engines
De eerste release van SparkOnHBase was gebouwd voor klanten van Cloudera die ermee hadden ingestemd om het werk openbaar te maken. Gelukkig kreeg ik vroege hulp van mede Clouderans en HBase PMC-leden Jon Hsieh en Matteo Bertozzi, en Spark PMC-lid Tathagata Das, om ervoor te zorgen dat het ontwerp zowel voor de basis Apache Spark als voor Spark Streaming zou werken.
Het duurde niet lang voordat andere klanten SparkOnHBase gingen gebruiken, met name Edmunds.com met zijn realtime Spark Streaming-applicatie voor Super Bowl Sunday. Toen andere bedrijven aan boord sprongen, werd al snel duidelijk dat een enkele projectbeheerder (namelijk:ik) niet zou schalen. Gelukkig had Cloudera op dat moment onlangs Cloudera Labs aangekondigd, wat het perfecte huis voor het project bleek te zijn. Simpel gezegd, Cloudera Labs is een virtuele container voor opkomende ecosysteemprojecten die jong zijn in termen van bedrijfsgereedheid, ontwikkeling en ambitie, maar waar veel vraag naar is door gebruikers die de nieuwste technologieën willen uitproberen. SparkOnHBase werd te zijner tijd een Cloudera Labs-project.
Vandaag ben ik verheugd te kunnen melden dat SparkOnHBase onlangs is toegezegd aan de HBase-trunk (HBASE-13992). HBASE-13992 voegt SparkOnHBase toe aan HBase core onder een nieuwe naam, de HBase-Spark-module. Ik wil HBase VP Andrew Purtell bedanken voor zijn aanmoediging en "het openen van de deur" voor HBASE-13992 en PMC-lid Sean Busbey voor zijn mentorschap en begeleiding. Ook wil ik Elliott Clark, Enis Soztutar, Michael Stack, Nicolas Liochon, Kostas Sakellis, Ted Yu, Lars Hofhansl en Steve Loughran bedanken voor hun codebeoordelingen. (Zoals je kunt zien, was SparkOnHBase een authentieke inspanning van de gemeenschap.)
Met name met HBASE-13992 kon ik voor het eerst Spark- en Scala-code toevoegen aan het Apache HBase-project. Het was superleuk om het voorrecht te hebben om de eerste Scala-eenheidstest in de geschiedenis van HBase te bouwen!
Laten we nu in de technische details duiken.
Binnen HBASE-13992
In HBASE-13992 ziet u dat de meeste originele code en het ontwerp van SparkOnHBase ongewijzigd blijven. De basisarchitectuur geldt nog steeds, in die zin dat het kerngedeelte van de code is ontworpen om een HBase-verbindingsobject in elke Spark Executor te krijgen.
Hoewel de basis blijft bestaan, zijn er drie grote verschillen tussen de HBASE-13992-patch en het Cloudera Labs SparkOnHBase-project:
- HBase API's: HBASE-13992 maakt overal gebruik van alle nieuwe HBase 1.0+ API's.
- RDD- en DStream-functies: Een van de grootste klachten over SparkOnHBase had betrekking op de manier waarop functies werden uitgevoerd; Spark-liefhebbers wilden HBase-acties rechtstreeks vanuit een RDD of DStream maken. In HBASE-13992 is die mogelijkheid ingebakken via unittests en voorbeelden. Verder zijn er later in dit bericht codevoorbeelden van HBase-functies direct van RDD's, zodat u een idee krijgt van hoe de API's eruit zullen zien.
- Eenvoudig
foreach
enmap
functies: Nu is het nog makkelijker omforeachPartition
. te doen s enmapPartition
s met een HBase-aansluiting. Een voorbeeld volgt later in dit bericht.
Laten we nu even de tijd nemen om de verschillen tussen de SparkOnHBase-codebasis en de HBASE-13992-patch door te nemen. Hier is een snel voorbeeld van bulkDelete
van SparkOnHBase:
val hbaseContext =new HBaseContext(sc, config);hbaseContext.bulkDelete[Array[Byte]](rdd, tableName, putRecord => new Delete(putRecord),Merk op dat we in dit voorbeeld een functie rechtstreeks uit het HBaseContext-object aanroepen, ook al werd de bewerking echt uitgevoerd op de RDD. Laten we nu eens kijken naar de HBase-Spark-module voor dezelfde code:
val hbaseContext =new HBaseContext(sc, config)rdd.hbaseBulkDelete(hbaseContext, tableName, putRecord => new Delete(putRecord), 4)Het grote verschil is dat de
hbaseBulkDelete
methode komt rechtstreeks uit de RDD. Deze aanpak laat ook de deur open voor de volgende opties met een toekomstige JIRA:val hbaseContext =nieuwe HBaseContext(sc, config)rdd.hbaseBulkDelete(tableName)Dit is zo schoon als ik het nu kan krijgen, maar het doel is om het nog meer te maken eenvoudig en schoon.
Laten we ook even kijken naar de foreach- en kaartfuncties in HBASE-13992. U kunt zien in de
ForeachPartition
voorbeeld hieronder dat we een iterator en een HBaseConnection
hebben voorwerp. Dit geeft ons de volledige macht om alles met HBase te doen terwijl we onze waarden herhalen:val hbaseContext =new HBaseContext(sc, config)rdd.hbaseForeachPartition(hbaseContext, (it, conn) => { val bufferedMutator =conn.getBufferedMutator(TableName.valueOf("t1")) ... ator. ) bufferedMutator.close() })Ten slotte is hier een voorbeeld van een kaartpartitiefunctie waarmee we een verbindingsobject kunnen krijgen terwijl we onze waarden herhalen:
val getRdd =rdd.hbaseMapPartitions(hbaseContext, (it, conn) => { val table =conn.getTable(TableName.valueOf("t1")) var res =mutable.MutableList[String]() ... })Toekomstig werk
De volgende JIRA's staan op mijn TO DO-lijst:
HBASE-14150 –
BulkLoad
toevoegen functionaliteit naar HBase-Spark-moduleBinnenkort kunnen we bulkladingen rechtstreeks van RDD's doen met code die er zo eenvoudig uitziet als:
rdd.hbaseBulkLoad (tableName, t => { Seq((new KeyFamilyQualifier(t.rowKey, t.family, t.qualifier), t.value)).HBASE-14181 – Spark DataFrame-gegevensbron toevoegen aan HBase-Spark-module
Met deze patch kunnen we Spark SQL rechtstreeks integreren met HBase en coole dingen doen, zoals pushdown voor filter- en kolomselectie, samen met pushdown voor scanbereik. Het doel van Spark SQL- en HBase-interactie is zo simpel als het volgende:
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' en B_FIELD <'3 ') of " + "(KEY_FIELD <='get3' en B_FIELD ='8')").foreach(r => println(" - " + r))Er zijn andere JIRA's die zijn ontworpen om de code gebruiksvriendelijker te maken en de unittest uitgebreider te maken. Mijn persoonlijke doel is om in een vervolgblog verslag te kunnen doen van alle geweldige vorderingen die we maken. Het doel is om van Spark de eersteklas burger te maken die het verdient te zijn met betrekking tot HBase, en het verder te verstevigen als de MapReduce-vervanging in de branche. Door MapReduce te vervangen door Spark kunnen we nog meer verwerking op HBase-clusters doen, zonder ons zorgen te hoeven maken dat er meer disk-IO-conflicten zullen zijn.
Het zal enige tijd duren voordat de HBase-Spark-module een release van HBase maakt. In de tussentijd zijn er plannen om een deel van de code van de HBase-Spark-module te backporten naar SparkOnHBase in Cloudera Labs. Momenteel werkt SparkOnHBase op CDH 5.3 en 5.4, en het doel is om SparkOnHBase bij te werken met de HBase-Spark-module-vooruitgangen voor de aankomende CDH minor release later in 2015.
Ted Malaska is Solutions Architect bij Cloudera, levert een bijdrage aan Spark, Apache Flume en Apache HBase, en is co-auteur van het O'Reilly-boek, Hadoop-toepassingsarchitecturen.