Проектът SparkOnHBase в Cloudera Labs наскоро беше обединен в багажника на Apache HBase. В тази публикация научете историята на проекта и как изглежда бъдещето на новия модул HBase-Spark.
SparkOnHBase беше изпратен за първи път в Github през юли 2014 г., само шест месеца след Spark Summit 2013 и пет месеца след като Apache Spark беше изпратен за първи път в CDH. Тази конференция беше голяма повратна точка за мен, защото за първи път осъзнах, че двигателят на MapReduce има много силен конкурент. Spark беше на път да навлезе във вълнуваща нова фаза в своя жизнен цикъл с отворен код и само една година по-късно се използва в огромен мащаб в 100, ако не и 1000 компании (като над 200 от тях правят това на платформата на Cloudera).
SparkOnHBase излезе от обикновена заявка на клиента за ниво на взаимодействие между HBase и Spark, подобно на това, което вече е налично между HBase и MapReduce. Ето кратко обобщение на функционалността, която беше в обхвата:
- Пълен достъп до HBase в етап на карта или намаляване
- Възможност за насипно натоварване
- Възможност за извършване на групови операции като получаване, поставяне, изтриване
- Възможност да бъде източник на данни за SQL машини
Първоначалната версия на SparkOnHBase е създадена за клиенти на Cloudera, които са се съгласили да позволят работата да стане публична. За щастие, получих ранна помощ от колегите Clouderans и членовете на HBase PMC Джон Хсие и Матео Бертоци и члена на Spark PMC Татагата Дас, за да се уверя, че дизайнът ще работи както за базовия Apache Spark, така и за Spark Streaming.
Не след дълго други клиенти започнаха да използват SparkOnHBase – най-вече Edmunds.com със своето приложение Spark Streaming в реално време за Super Bowl Sunday. Когато други компании се включиха, бързо стана ясно, че един-единствен поддържащ проект (а именно:аз) няма да се мащабира. За щастие по това време Cloudera наскоро обяви Cloudera Labs, която се оказа идеалният дом за проекта. Казано по-просто, Cloudera Labs е виртуален контейнер за нововъзникващи екосистемни проекти, които са млади по отношение на тяхната готовност, развитие и амбиция, но са много търсени от потребителите, които искат да изпробват най-новите технологии. SparkOnHBase се превърна в проект на Cloudera Labs своевременно.
Днес се радвам да съобщя, че SparkOnHBase наскоро беше ангажиран с магистрала на HBase (HBASE-13992). HBASE-13992 добавя SparkOnHBase към ядрото на HBase под ново име, модулът HBase-Spark. Искам да благодаря на вицепрезидента на HBase Андрю Пъртел за неговото насърчение и „отваряне на вратата“ за HBASE-13992 и члена на PMC Шон Бъзби за неговото наставничество и насоки. Също така искам да благодаря на Елиът Кларк, Енис Созтутар, Майкъл Стек, Николас Лиохон, Костас Сакелис, Тед Ю, Ларс Хофхансл и Стив Логран за техните прегледи на кода. (Както можете да видите, SparkOnHBase беше автентично усилие на общността.)
По-специално, с HBASE-13992 успях да добавя Spark и Scala код към проекта Apache HBase за първи път. Беше супер забавно да имам привилегията да създам първия единичен тест на Scala в историята на HBase!
Сега нека се потопим в техническите подробности.
Вътре в HBASE-13992
В HBASE-13992 ще видите, че повечето от оригиналния код и дизайн от SparkOnHBase са оставени непроменени. Основната архитектура все още е валидна, тъй като основната част на кода е проектирана да получи обект за връзка HBase във всеки Spark Executor.
Докато основите остават, има три основни разлики между пластира HBASE-13992 и проекта Cloudera Labs SparkOnHBase:
- API на HBase: HBASE-13992 използва всички нови API на HBase 1.0+.
- Функции RDD и DStream: Едно от най-големите оплаквания относно SparkOnHBase, свързано с това как се изпълняват функциите; Любителите на Spark искаха да правят HBase действия направо от RDD или DStream. В HBASE-13992 тази способност е вградена чрез единични тестове и примери. Освен това по-късно в тази публикация има примери за код за функции на HBase директно извън RDD, така че можете да усетите как ще изглеждат API.
- Лесно
foreach
иmap
функции: Сега е още по-лесно да направитеforeachPartition
s иmapPartition
s с HBase връзка. Пример ще последва по-късно в тази публикация.
Сега, нека отделим една бърза минута и да преминем през разликите между кодовата база на SparkOnHBase и пачката HBASE-13992. Ето един бърз пример за bulkDelete
от SparkOnHBase:
val hbaseContext =new HBaseContext(sc, config);hbaseContext.bulkDelete[Array[Byte]](rdd, tableName, >Забележете, че в този пример извикваме функция направо от обекта HBaseContext, въпреки че операцията наистина се изпълняваше на RDD. Така че сега нека разгледаме модула HBase-Spark за същия код:
val hbaseContext =new HBaseContext(sc, config)rdd.hbaseBulkDelete(hbaseContext, tableName, putRecord => ново Изтриване (putRecord),Голямата разлика е, че
hbaseBulkDelete
методът идва направо от RDD. Освен това този подход оставя отворена вратата за следните опции с бъдеща JIRA:val hbaseContext =нов HBaseContext(sc, config)rdd.hbaseBulkDelete(tableName)Това е толкова чисто, колкото мога да го получа засега, но целта е да го направя още повече просто и чисто.
Нека също така да разгледаме бързо функциите foreach и map в HBASE-13992. Можете да видите в
ForeachPartition
пример по-долу, че имаме итератор и HBaseConnection
обект. Това ще ни даде пълната власт да правим каквото и да било с HBase, докато преглеждаме нашите стойности:val hbaseContext =new HBaseContext(sc, config)rdd.hbaseForeachPartition(hbaseContext, (it, conn) => { val bufferedMutator =conn.getBufferedMutator(TableName.valueOf("t1"))) ) bufferedMutator.close() })И накрая, ето пример за функция за разделяне на карта, където можем да получим обект на връзка, докато преглеждаме нашите стойности:
val getRdd =rdd.hbaseMapPartitions(hbaseContext, (it, conn) => { val table =conn.getTable(TableName.valueOf("t1")) var res =mutable.MutableList[String] () })Бъдеща работа
Следните JIRA са в моя списък със задачи:
HBASE-14150 – Добавете
BulkLoad
функционалност към HBase-Spark модулаСкоро ще можем да извършваме групови зареждания направо от RDD с код, който изглежда толкова прост като:
rdd.hbaseBulkLoad (tableName, t => { Seq((new KeyFamilyQualifier(t.rowKey, t.family, t.qualifier), t.value) t.value t.value ).HBASE-14181 – Добавете източник на данни Spark DataFrame към HBase-Spark модул
С тази корекция ще можем директно да интегрираме Spark SQL с HBase и да правим страхотни неща като натискане на филтър и избор на колони, заедно с натискане на диапазон на сканиране. Целта на взаимодействието на Spark SQL и HBase е толкова проста, колкото следното:
val df =sqlContext.load("org.apache.hadoop.hbase.spark", Карта("hbase.columns.mapping" -> "КЛЮЧОВО_ПОЛЕ STRING :key, A_FIELD STRING c:a, B_FIELD STRING c:b) ,", "hbase.table" -> "t1"))df.registerTempTable("hbaseTmp")sqlContext.sql("ИЗБЕРЕТЕ КЛЮЧОВО_ПОЛЕ ОТ hbaseTmp " + "WHERE " + "(KEY_FIELD' и B'_3 ' ') или " + "(KEY_FIELD <='get3' и B_FIELD ='8')").foreach(r => println(" - " + r))Има и други JIRA, предназначени да направят кода по-лесен за използване и да направят единичния тест по-изчерпателен. Моята лична цел е да мога да докладвам в последваща публикация в блога с целия голям напредък, който постигаме. Целта е да превърне Spark в първокласния гражданин, който заслужава да бъде по отношение на HBase, като допълнително го утвърди като заместител на MapReduce в индустрията. Замяната на MapReduce със Spark ще ни позволи да извършим още повече обработка на HBase клъстери, без да добавяме притеснения, че ще има повече спорове за дисково IO.
Ще отнеме време, преди модулът HBase-Spark да влезе в версия на HBase. Междувременно има планове за обратно пренасяне на част от кода от модула HBase-Spark в SparkOnHBase в Cloudera Labs. Понастоящем SparkOnHBase работи на CDH 5.3 и 5.4 и целта ще бъде да актуализира SparkOnHBase с напредъка на модула HBase-Spark за предстоящата минорна версия на CDH по-късно през 2015 г.
Тед Маласка е архитект на решения в Cloudera, сътрудник на Spark, Apache Flume и Apache HBase и съавтор на книгата на O’Reilly, Архитектури на приложения Hadoop.