HBase
 sql >> Teknologi Basis Data >  >> NoSQL >> HBase

Bagaimana-untuk:Menggunakan Pemuatan Massal HBase, dan Mengapa

Apache HBase adalah tentang memberi Anda akses acak, real-time, baca/tulis ke Big Data Anda, tetapi bagaimana cara Anda memasukkan data tersebut ke HBase secara efisien? Secara intuitif, pengguna baru akan mencoba melakukannya melalui API klien atau dengan menggunakan pekerjaan MapReduce dengan TableOutputFormat, tetapi pendekatan tersebut bermasalah, seperti yang akan Anda pelajari di bawah. Sebaliknya, fitur pemuatan massal HBase jauh lebih mudah digunakan dan dapat memasukkan jumlah data yang sama lebih cepat.

Entri blog ini akan memperkenalkan konsep dasar fitur pemuatan massal, menyajikan dua kasus penggunaan, dan mengusulkan dua contoh.

Ringkasan Pemuatan Massal

Jika Anda memiliki salah satu gejala ini, pemuatan massal mungkin merupakan pilihan yang tepat untuk Anda:

  • Anda perlu mengubah MemStore Anda untuk menggunakan sebagian besar memori.
  • Anda harus menggunakan WAL yang lebih besar atau mengabaikannya sepenuhnya.
  • Antrian pemadatan dan flush Anda mencapai ratusan.
  • GC Anda di luar kendali karena sisipan Anda berkisar dalam MB.
  • Latensi Anda keluar dari SLA saat Anda mengimpor data.

Sebagian besar gejala tersebut biasanya disebut sebagai "nyeri tumbuh." Menggunakan pemuatan massal dapat membantu Anda menghindarinya.

Dalam bahasa HBase, pemuatan massal adalah proses mempersiapkan dan memuat HFiles (format file HBase sendiri) langsung ke RegionServers, sehingga melewati jalur tulis dan meniadakan masalah tersebut sepenuhnya. Proses ini mirip dengan ETL dan terlihat seperti ini:

1. Ekstrak data dari sumber, biasanya file teks atau database lain. HBase tidak mengelola bagian proses ini. Dengan kata lain, Anda tidak dapat memberi tahu HBase untuk menyiapkan HFiles dengan membacanya langsung dari MySQL — melainkan, Anda harus melakukannya dengan cara Anda sendiri. Misalnya, Anda dapat menjalankan mysqldump di atas meja dan mengunggah file yang dihasilkan ke HDFS atau mengambil file log HTTP Apache Anda. Bagaimanapun, data Anda harus dalam HDFS sebelum langkah berikutnya.

2. Ubah data menjadi HFiles. Langkah ini memerlukan pekerjaan MapReduce dan untuk sebagian besar jenis input Anda harus menulis sendiri Mapper. Pekerjaan harus memancarkan kunci baris sebagai Kunci, dan Nilai Kunci, Put, atau Hapus sebagai Nilai. Peredam ditangani oleh HBase; Anda mengonfigurasinya menggunakan HFileOutputFormat.configureIncrementalLoad() dan melakukan hal berikut:

  • Memeriksa tabel untuk mengonfigurasi partisi pesanan total
  • Mengupload file partisi ke cluster dan menambahkannya ke DistributedCache
  • Menyetel jumlah tugas pengurangan agar sesuai dengan jumlah wilayah saat ini
  • Menyetel kelas kunci/nilai keluaran agar sesuai dengan persyaratan HFileOutputFormat
  • Menyetel peredam untuk melakukan penyortiran yang sesuai (KeyValueSortReducer atau PutSortReducer)

Pada tahap ini, satu HFile akan dibuat per wilayah di folder output. Ingatlah bahwa data masukan hampir seluruhnya ditulis ulang, jadi Anda akan membutuhkan setidaknya dua kali jumlah ruang disk yang tersedia daripada ukuran kumpulan data asli. Misalnya, untuk mysqldump 100GB Anda harus memiliki setidaknya 200GB ruang disk yang tersedia di HDFS. Anda dapat menghapus file dump di akhir proses.

3. Muat file ke HBase dengan memberi tahu RegionServers di mana menemukannya. Ini adalah langkah termudah. Ini membutuhkan penggunaan LoadIncrementalHFiles (lebih dikenal sebagai alat completebulkload), dan dengan meneruskan URL yang menempatkan file dalam HDFS, itu akan memuat setiap file ke wilayah yang relevan melalui RegionServer yang melayaninya. Jika suatu wilayah dipecah setelah file dibuat, alat akan secara otomatis membagi HFile sesuai dengan batas baru. Proses ini tidak terlalu efisien, jadi jika tabel Anda saat ini sedang ditulis oleh proses lain, sebaiknya file dimuat segera setelah langkah transformasi selesai.

Berikut adalah ilustrasi dari proses ini. Aliran data beralih dari sumber asli ke HDFS, di mana RegionServers hanya akan memindahkan file ke direktori wilayahnya.

Kasus Penggunaan

Pemuatan set data asli: Semua pengguna yang bermigrasi dari penyimpanan data lain harus mempertimbangkan kasus penggunaan ini. Pertama, Anda harus melalui latihan mendesain skema tabel, lalu membuat tabel itu sendiri, pra-pemisahan. Titik split harus mempertimbangkan distribusi kunci baris dan jumlah Server Wilayah. Saya merekomendasikan untuk membaca presentasi rekan saya Lars George tentang desain skema tingkat lanjut untuk kasus penggunaan yang serius.

Keuntungannya di sini adalah jauh lebih cepat untuk menulis file secara langsung daripada melalui jalur tulis RegionServer (menulis ke MemStore dan WAL) dan akhirnya membilas, memadatkan, dan seterusnya. Ini juga berarti Anda tidak perlu menyesuaikan kluster untuk beban kerja tulis yang berat, lalu menyetelnya lagi untuk beban kerja normal Anda.

Beban tambahan: Katakanlah Anda memiliki beberapa kumpulan data yang saat ini dilayani oleh HBase, tetapi sekarang Anda perlu mengimpor lebih banyak data dalam batch dari pihak ketiga atau Anda memiliki pekerjaan malam yang menghasilkan beberapa gigabyte yang perlu Anda masukkan. Ini mungkin tidak sebesar set data yang sudah disajikan oleh HBase, tetapi mungkin memengaruhi persentil ke-95 latensi Anda. Melalui jalur tulis normal akan memiliki efek merugikan yang memicu lebih banyak flush dan pemadatan selama impor daripada biasanya. Tekanan IO tambahan ini akan bersaing dengan kueri sensitif latensi Anda.

Contoh

Anda dapat menggunakan contoh berikut di kluster Hadoop Anda sendiri, tetapi instruksi diberikan untuk Cloudera QuickStart VM, yang merupakan kluster node tunggal, OS tamu, dan contoh data serta contoh yang dimasukkan ke dalam alat mesin virtual untuk desktop Anda.

Setelah Anda memulai VM, beri tahu, melalui antarmuka web yang akan terbuka secara otomatis, untuk menerapkan CDH dan kemudian pastikan bahwa layanan HBase juga dimulai.

Pemuat Massal TSV Bawaan

HBase dikirimkan dengan pekerjaan MR yang dapat membaca file nilai yang dipisahkan pembatas dan output langsung ke tabel HBase atau membuat HFiles untuk pemuatan massal. Di sini kita akan:

  1. Dapatkan sampel data dan unggah ke HDFS.
  2. Jalankan tugas ImportTsv untuk mengubah file menjadi beberapa HFiles sesuai dengan tabel yang telah dikonfigurasi sebelumnya.
  3. Siapkan dan muat file di HBase.

Langkah pertama adalah membuka konsol dan menggunakan perintah berikut untuk mendapatkan sampel data:

curl -O
https://people.apache.org/~jdcryans/word_count.csv

Saya membuat file ini dengan menjalankan hitungan kata pada manuskrip asli dari posting blog ini dan kemudian mengeluarkan hasilnya dalam format csv, tanpa judul kolom apa pun. Sekarang, unggah file ke HDFS:

hdfs dfs -put word_count.csv

Bagian ekstraksi dari beban massal sekarang sedang selesai, Anda perlu mengubah file. Pertama, Anda perlu mendesain meja. Untuk mempermudah, sebut saja "jumlah kata" — tombol baris akan menjadi kata-kata itu sendiri dan satu-satunya kolom akan berisi hitungan, dalam keluarga yang kita sebut "f". Praktik terbaik saat membuat tabel adalah membaginya sesuai dengan distribusi kunci baris, tetapi untuk contoh ini kita hanya akan membuat lima wilayah dengan titik pemisah yang tersebar merata di seluruh ruang kunci. Buka shell hbase:

hbase shell

Dan jalankan perintah berikut untuk membuat tabel:

create 'wordcount', {NAME => 'f'},   {SPLITS => ['g', 'm', 'r', 'w']}

Empat titik pemisahan akan menghasilkan lima wilayah, di mana wilayah pertama dimulai dengan kunci baris kosong. Untuk mendapatkan poin split yang lebih baik, Anda juga dapat melakukan analisis cepat untuk melihat bagaimana kata-kata tersebut benar-benar didistribusikan, tetapi saya akan menyerahkannya kepada Anda.

Jika Anda mengarahkan browser VM Anda ke http://localhost:60010/ Anda akan melihat tabel kami yang baru dibuat dan lima wilayahnya semuanya ditetapkan ke RegionServer.

Sekarang saatnya untuk melakukan angkat berat. Menerapkan toples HBase pada baris perintah dengan skrip "hadoop" akan menampilkan daftar alat yang tersedia. Yang kita inginkan disebut importtsv dan memiliki penggunaan berikut:

hadoop jar /usr/lib/hbase/hbase-0.94.6-cdh4.3.0-security.jar importtsv
 ERROR: Wrong number of arguments: 0
 Usage: importtsv -Dimporttsv.columns=a,b,c  

Baris perintah yang akan kita gunakan adalah sebagai berikut:

hadoop jar   /usr/lib/hbase/hbase-0.94.6-cdh4.3.0-
security.jar importtsv
-Dimporttsv.separator=,
-Dimporttsv.bulk.output=output
-Dimporttsv.columns=HBASE_ROW_KEY,f:count wordcount word_count.csv

Berikut adalah ikhtisar dari elemen konfigurasi yang berbeda:

  • -Dimporttsv.separator=, menentukan bahwa pemisahnya adalah koma.
  • -Dimporttsv.bulk.output=output adalah jalur relatif ke tempat HFiles akan ditulis. Karena pengguna Anda di VM adalah "cloudera" secara default, itu berarti file akan berada di /user/cloudera/output. Melewati opsi ini akan membuat pekerjaan menulis langsung ke HBase.
  • -Dimporttsv.columns=HBASE_ROW_KEY,f:hitung adalah daftar semua kolom yang terdapat dalam file ini. Kunci baris perlu diidentifikasi menggunakan string HBASE_ROW_KEY all-caps; jika tidak, itu tidak akan memulai pekerjaan. (Saya memutuskan untuk menggunakan "hitungan" kualifikasi tetapi bisa juga yang lain.)

Pekerjaan harus selesai dalam satu menit, mengingat ukuran input yang kecil. Perhatikan bahwa lima Peredam sedang berjalan, satu per wilayah. Ini hasilnya di HDFS:

-rw-r--r--   3 cloudera cloudera         4265   2013-09-12 13:13 output/f/2c0724e0c8054b70bce11342dc91897b
-rw-r--r--   3 cloudera cloudera         3163   2013-09-12 13:14 output/f/786198ca47ae406f9be05c9eb09beb36
-rw-r--r--   3 cloudera cloudera         2487   2013-09-12 13:14 output/f/9b0e5b2a137e479cbc978132e3fc84d2
-rw-r--r--   3 cloudera cloudera         2961   2013-09-12 13:13 output/f/bb341f04c6d845e8bb95830e9946a914
-rw-r--r--   3 cloudera cloudera         1336   2013-09-12 13:14 output/f/c656d893bd704260a613be62bddb4d5f

Seperti yang Anda lihat, file saat ini milik pengguna "cloudera". Untuk memuatnya, kita perlu mengubah pemiliknya menjadi "hbase" atau HBase tidak akan memiliki izin untuk memindahkan file. Jalankan perintah berikut:

sudo -u hdfs hdfs dfs -chown -R   hbase:hbase/user/cloudera/output

Untuk langkah terakhir, kita perlu menggunakan alat completebulkload untuk menunjukkan di mana file berada dan ke tabel mana kita memuat:

hbase org.apache.hadoop.hbase.mapreduce.LoadIncrementalHFiles output wordcount

Kembali ke shell HBase, Anda dapat menjalankan perintah count yang akan menunjukkan kepada Anda berapa banyak baris yang dimuat. Jika Anda lupa chown, perintah akan hang.

Pekerjaan MR Khusus

Pemuat massal TSV bagus untuk pembuatan prototipe, tetapi karena itu menafsirkan semuanya sebagai string dan tidak mendukung manipulasi bidang pada waktu transformasi, Anda akhirnya harus menulis pekerjaan MR Anda sendiri. Rekan saya James Kinley, yang bekerja sebagai arsitek solusi di Eropa, menulis pekerjaan yang akan kami gunakan untuk contoh berikutnya. Data untuk pekerjaan tersebut berisi pesan Facebook dan Twitter publik terkait dengan Final NBA 2010 (pertandingan 1) antara Lakers dan Celtics. Anda dapat menemukan kodenya di sini. (VM Mulai Cepat dilengkapi dengan git dan maven yang diinstal sehingga Anda dapat mengkloning repositori di dalamnya.)

Melihat kelas Driver, bit yang paling penting adalah sebagai berikut:

job.setMapOutputKeyClass(ImmutableBytesWritable.class);
    job.setMapOutputValueClass(KeyValue.class);
…
	// Auto configure partitioner and reducer
    HFileOutputFormat.configureIncrementalLoad(job, hTable);

Pertama, Mapper Anda perlu mengeluarkan ImmutableBytesWritable yang berisi kunci baris, dan nilai keluaran dapat berupa KeyValue, Put, atau Delete. Cuplikan kedua menunjukkan cara mengonfigurasi Reducer; itu sebenarnya sepenuhnya ditangani oleh HFileOutputFormat. configureIncrementalLoad() seperti yang dijelaskan di bagian “Transform” sebelumnya.

Kelas HBaseKVMapper hanya berisi Mapper yang menghormati kunci dan nilai output yang dikonfigurasi:

public class HBaseKVMapper extends
   Mapper<LongWritable,   Text, ImmutableBytesWritable,
KeyValue> {

Untuk menjalankannya, Anda harus mengkompilasi proyek menggunakan maven dan mengambil file data mengikuti tautan di README. (Ini juga berisi skrip shell untuk membuat tabel.) Sebelum memulai pekerjaan, jangan lupa untuk mengunggah file ke HDFS dan mengatur classpath Anda untuk mengetahui HBase karena Anda tidak akan menggunakan toplesnya kali ini :

export HADOOP_CLASSPATH=$HADOOP_CLASSPATH:/etc/hbase/conf/:/usr/lib/hbase/*

Anda akan dapat memulai pekerjaan menggunakan baris perintah yang mirip dengan ini:

hadoop jar hbase-examples-0.0.1-SNAPSHOT.jar
com.cloudera.examples.hbase.bulkimport.Driver -libjars
/home/cloudera/.m2/repository/joda-time/joda-time/2.1/joda-time-2.1.jar,
/home/cloudera/.m2/repository/net/sf/opencsv/opencsv/2.3/opencsv-2.3.jar
RowFeeder\ for\ Celtics\ and\ Lakers\ Game\ 1.csv output2 NBAFinal2010

Seperti yang Anda lihat, dependensi pekerjaan harus ditambahkan secara terpisah. Terakhir, Anda dapat memuat file dengan terlebih dahulu mengubah pemiliknya dan kemudian menjalankan alat fullbulkload:

sudo -u hdfs hdfs dfs -chown -R hbase:hbase/user/cloudera/output2
hbase org.apache.hadoop.hbase.mapreduce.LoadIncrementalHFiles output2 NBAFinal2010

Potensi Masalah

Data yang baru dihapus muncul kembali. Masalah ini terjadi ketika Hapus dimasukkan melalui beban massal dan dipadatkan utama saat Put yang sesuai masih di MemStore. Data akan dianggap dihapus saat Hapus ada di HFile tetapi, setelah dihapus selama pemadatan, Put akan terlihat lagi. Jika Anda memiliki kasus penggunaan seperti itu, pertimbangkan untuk mengonfigurasi kelompok kolom Anda untuk menyimpan sel yang dihapus dengan KEEP_DELETED_CELLS di shell atau HColumnDescriptor.setKeepDeletedCells().

Data yang dimuat secara massal tidak dapat ditimpa oleh pemuatan massal lainnya. Masalah ini terjadi ketika dua HFiles yang dimuat secara massal dimuat pada waktu yang berbeda mencoba untuk menulis nilai yang berbeda di sel yang sama, yang berarti bahwa mereka memiliki kunci baris, keluarga, qualifier, dan stempel waktu yang sama. Hasilnya adalah nilai yang dimasukkan pertama akan dikembalikan, bukan yang kedua. Bug ini akan diperbaiki di HBase 0.96.0 dan CDH 5 (versi utama CDH berikutnya) dan pekerjaan sedang dilakukan di HBASE-8521 untuk cabang 0.94 dan CDH 4.

Pemuatan massal memicu pemadatan besar. Masalah ini muncul ketika Anda melakukan pemuatan massal tambahan dan ada cukup banyak file yang dimuat secara massal untuk memicu pemadatan kecil (ambang default adalah 3). HFiles dimuat dengan nomor urut yang disetel ke 0 sehingga mereka diambil terlebih dahulu ketika RegionServer memilih file untuk pemadatan, dan karena bug itu juga akan memilih semua file yang tersisa. Masalah ini akan sangat mempengaruhi mereka yang sudah memiliki wilayah besar (beberapa GB) atau yang sering memuat secara massal (setiap beberapa jam dan kurang) karena banyak data akan dipadatkan. HBase 0.96.0 memiliki perbaikan yang tepat dan begitu juga CDH 5; HBASE-8521 memperbaiki masalah di 0,94 karena HFiles yang dimuat secara massal sekarang diberi nomor urut yang tepat. HBASE-8283 dapat diaktifkan dengan hbase.hstore.useExploringCompation setelah 0.94.9 dan CDH 4.4.0 untuk mengurangi masalah ini hanya dengan menjadi algoritme pemilihan pemadatan yang lebih cerdas.

Data yang dimuat secara massal tidak direplikasi . Saat pemuatan massal melewati jalur tulis, WAL tidak ditulis sebagai bagian dari proses. Replikasi bekerja dengan membaca file WAL sehingga tidak akan melihat data yang dimuat secara massal – dan hal yang sama berlaku untuk pengeditan yang menggunakan Put.setWriteToWAL(true). Salah satu cara untuk mengatasinya adalah dengan mengirimkan file mentah atau HFiles ke cluster lain dan melakukan pemrosesan lainnya di sana.

Kesimpulan

Tujuan dari posting blog ini adalah untuk memperkenalkan Anda pada konsep dasar pemuatan massal Apache HBase. Kami menjelaskan bagaimana prosesnya seperti melakukan ETL, dan itu jauh lebih baik untuk kumpulan data besar daripada menggunakan API normal karena melewati jalur tulis. Kedua contoh disertakan untuk menunjukkan bagaimana file TSV sederhana dapat dimuat secara massal ke HBase dan bagaimana menulis Mapper Anda sendiri untuk format data lain.

Sekarang Anda dapat mencoba melakukan hal yang sama menggunakan antarmuka pengguna grafis melalui Hue.


  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Di dalam Dukungan Baru Apache HBase untuk MOB

  2. Hadoop InputFormat &Jenis InputFormat di MapReduce

  3. Pendekatan untuk Pencadangan dan Pemulihan Bencana di HBase

  4. Pengantar Federasi &Arsitektur HDFS

  5. Blok Data HDFS – Pelajari Internal Hadoop Data Besar