Proyek SparkOnHBase di Cloudera Labs baru-baru ini digabungkan ke dalam trunk Apache HBase. Dalam postingan ini, pelajari sejarah proyek dan seperti apa masa depan modul HBase-Spark baru.
SparkOnHBase pertama kali didorong ke Github pada Juli 2014, hanya enam bulan setelah Spark Summit 2013 dan lima bulan setelah Apache Spark pertama kali dikirimkan dalam CDH. Konferensi itu merupakan titik balik besar bagi saya, karena untuk pertama kalinya saya menyadari bahwa mesin MapReduce memiliki pesaing yang sangat kuat. Spark akan memasuki fase baru yang menarik dalam siklus hidup sumber terbukanya, dan hanya satu tahun kemudian, ini digunakan dalam skala besar di 100-an jika bukan 1000-an perusahaan (dengan 200+ di antaranya melakukannya di platform Cloudera).
SparkOnHBase muncul dari permintaan pelanggan sederhana untuk memiliki tingkat interaksi antara HBase dan Spark serupa dengan yang sudah tersedia antara HBase dan MapReduce. Berikut ringkasan singkat fungsi yang ada dalam cakupan:
- Akses penuh ke HBase di peta atau kurangi tahap
- Kemampuan untuk melakukan beban massal
- Kemampuan untuk melakukan operasi massal seperti ambil, taruh, hapus
- Kemampuan untuk menjadi sumber data untuk mesin SQL
Rilis awal SparkOnHBase dibuat untuk pelanggan Cloudera yang telah setuju untuk mengizinkan karyanya dipublikasikan. Untungnya, saya mendapat bantuan awal dari sesama anggota Clouderans dan HBase PMC Jon Hsieh dan Matteo Bertozzi, serta anggota Spark PMC Tathagata Das, untuk memastikan desain akan berfungsi baik untuk Apache Spark dasar maupun Spark Streaming.
Tidak lama kemudian pelanggan lain mulai menggunakan SparkOnHBase—terutama Edmunds.com dengan aplikasi Spark Streaming real-time untuk Super Bowl Sunday. Ketika perusahaan lain bergabung, dengan cepat menjadi jelas bahwa satu pengelola proyek (yaitu:saya) tidak akan berkembang. Untungnya, pada saat itu, Cloudera baru-baru ini mengumumkan Cloudera Labs, yang ternyata menjadi tempat yang sempurna untuk proyek tersebut. Sederhananya, Cloudera Labs adalah wadah virtual untuk proyek ekosistem baru yang masih muda dalam hal kesiapan, pengembangan, dan ambisi perusahaan, tetapi sangat diminati oleh pengguna yang ingin mencoba teknologi terbaru. SparkOnHBase menjadi proyek Cloudera Labs pada waktunya.
Hari ini, saya dengan senang hati melaporkan bahwa SparkOnHBase baru-baru ini di-commit ke HBase trunk (HBASE-13992). HBASE-13992 menambahkan SparkOnHBase ke inti HBase di bawah moniker baru, modul HBase-Spark. Saya ingin berterima kasih kepada VP HBase Andrew Purtell atas dorongannya dan “membuka pintu” untuk HBASE-13992 dan anggota PMC Sean Busbey atas bimbingan dan bimbingannya. Juga, saya ingin berterima kasih kepada Elliott Clark, Enis Soztutar, Michael Stack, Nicolas Liochon, Kostas Sakellis, Ted Yu, Lars Hofhansl, dan Steve Loughran untuk ulasan kode mereka. (Seperti yang Anda lihat, SparkOnHBase adalah upaya komunitas yang otentik.)
Khususnya, dengan HBASE-13992, saya dapat menambahkan kode Spark dan Scala ke proyek Apache HBase untuk pertama kalinya. Sangat menyenangkan memiliki hak istimewa untuk membangun pengujian unit Scala pertama dalam sejarah HBase!
Sekarang, mari selami detail teknisnya.
Di dalam HBASE-13992
Di HBASE-13992, Anda akan melihat bahwa sebagian besar kode dan desain asli dari SparkOnHBase dibiarkan tidak berubah. Arsitektur dasarnya masih berlaku, karena bagian inti dari kode dirancang untuk mendapatkan objek koneksi HBase di setiap Spark Executor.
Meskipun dasar-dasarnya tetap ada, ada tiga perbedaan utama antara patch HBASE-13992 dan proyek Cloudera Labs SparkOnHBase:
- API HBase: HBASE-13992 menggunakan semua API HBase 1.0+ baru secara keseluruhan.
- Fungsi RDD dan DStream: Salah satu keluhan terbesar tentang SparkOnHBase terkait dengan bagaimana fungsi dijalankan; Pecinta Spark ingin membuat tindakan HBase langsung dari RDD atau DStream. Dalam HBASE-13992, kemampuan itu dimasukkan melalui pengujian unit dan contoh. Selanjutnya, ada contoh kode fungsi HBase langsung dari RDD nanti di posting ini, jadi Anda bisa merasakan seperti apa API itu nantinya.
foreach
yang mudah danmap
fungsi: Sekarang lebih mudah untuk melakukanforeachPartition
s danmapPartition
s dengan koneksi HBase. Contohnya akan menyusul nanti di postingan ini.
Sekarang, mari kita luangkan waktu sebentar dan menelusuri perbedaan antara basis kode SparkOnHBase dan patch HBASE-13992. Berikut adalah contoh singkat dari bulkDelete
dari SparkOnHBase:
val hbaseContext =new HBaseContext(sc, config);hbaseContext.bulkDelete[Array[Byte]](rdd, tableName, putRecord => new Delete(putRecord),
Perhatikan dalam contoh ini kita memanggil fungsi langsung dari objek HBaseContext, meskipun operasi itu benar-benar dijalankan pada RDD. Jadi sekarang mari kita lihat modul HBase-Spark untuk kode yang sama:
val hbaseContext =new HBaseContext(sc, config)rdd.hbaseBulkDelete(hbaseContext, tableName, putRecord => new Delete(putRecord),Perbedaan besarnya adalah
hbaseBulkDelete
metode datang langsung dari RDD. Selain itu, pendekatan ini membuka pintu untuk opsi berikut dengan JIRA masa depan:val hbaseContext =new HBaseContext(sc, config)rdd.hbaseBulkDelete(tableName)Ini sebersih yang saya bisa dapatkan untuk saat ini, tetapi tujuannya adalah untuk membuatnya lebih lebih sederhana dan bersih.
Mari kita juga melihat sekilas fungsi foreach dan map di HBASE-13992. Anda dapat melihat di
ForeachPartition
contoh di bawah ini kita memiliki iterator dan HBaseConnection
obyek. Ini akan memberi kami kekuatan penuh untuk melakukan apa pun dengan HBase saat kami mengulangi nilai-nilai kami:val hbaseContext =new HBaseContext(sc, config)rdd.hbaseForeachPartition(hbaseContext, (it, conn) => { val bufferedMutator =conn.getBufferedMutator(TableName.valueOf("t1")) ... bufferedMutator( ) bufferedMutator.close() })Terakhir, berikut adalah contoh fungsi partisi peta di mana kita bisa mendapatkan objek koneksi saat kita mengulangi nilai kita:
val getRdd =rdd.hbaseMapPartitions(hbaseContext, (it, conn) => { val table =conn.getTable(TableName.valueOf("t1")) var res =mutable.MutableList[String]() ... })Pekerjaan Masa Depan
JIRA berikut ada di daftar TO DO saya:
HBASE-14150 – Tambahkan
BulkLoad
fungsionalitas ke Modul HBase-SparkKami akan segera dapat melakukan pemuatan massal langsung dari RDD dengan kode yang terlihat sederhana seperti:
rdd.hbaseBulkLoad (tableName, t => { Seq((new KeyFamilyQualifier(t.rowKey, t.family, t.qualifier), t.value)). pementasanHBASE-14181 – Tambahkan Spark DataFrame DataSource ke Modul HBase-Spark
Dengan patch ini, kita akan dapat langsung mengintegrasikan Spark SQL dengan HBase dan melakukan hal-hal keren seperti pushdown pemilihan filter dan kolom, bersama dengan pushdown rentang pemindaian. Tujuan mendapatkan interaksi Spark SQL dan HBase sesederhana berikut:
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' dan B_FIELD <'3 ') atau " + "(KEY_FIELD <='get3' and B_FIELD ='8')").foreach(r => println(" - " + r))Ada JIRA lain yang dirancang untuk membuat kode lebih mudah digunakan dan membuat pengujian unit lebih komprehensif. Tujuan pribadi saya adalah untuk dapat melaporkan kembali dalam posting blog tindak lanjut dengan semua kemajuan besar yang kami buat. Tujuannya adalah untuk mengubah Spark menjadi warga negara kelas satu yang layak untuk dihormati sehubungan dengan HBase, semakin memperkuatnya sebagai pengganti MapReduce di industri. Mengganti MapReduce dengan Spark akan memungkinkan kita untuk melakukan lebih banyak pemrosesan pada klaster HBase, tanpa menambahkan kekhawatiran bahwa akan ada lebih banyak pertentangan IO disk.
Ini akan memakan waktu sebelum modul HBase-Spark membuatnya menjadi rilis HBase. Sementara itu, ada rencana untuk mem-back-port beberapa kode dari modul HBase-Spark ke SparkOnHBase di Cloudera Labs. Saat ini, SparkOnHBase bekerja pada CDH 5.3 dan 5.4, dan tujuannya adalah untuk memperbarui SparkOnHBase dengan kemajuan modul HBase-Spark untuk rilis minor CDH mendatang nanti pada tahun 2015.
Ted Malaska adalah Solutions Architect di Cloudera, kontributor untuk Spark, Apache Flume, dan Apache HBase, dan salah satu penulis buku O'Reilly, Arsitektur Aplikasi Hadoop.