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

Bagaimana-untuk:Sertakan Perpustakaan Pihak Ketiga di Pekerjaan MapReduce Anda

“Perpustakaan saya ada di jalur kelas tetapi saya masih mendapatkan pengecualian Kelas Tidak Ditemukan dalam pekerjaan MapReduce” – Jika Anda memiliki masalah ini, blog ini cocok untuk Anda.

Java membutuhkan kelas pihak ketiga dan kelas yang ditentukan pengguna untuk berada di “–classpath baris perintah ” ketika JVM diluncurkan. Skrip shell pembungkus `hadoop` melakukan hal ini untuk Anda dengan membangun classpath dari pustaka inti yang terletak di /usr/lib/hadoop-0.20/ dan /usr/lib/hadoop-0.20/lib/ direktori. Namun, dengan MapReduce, upaya tugas pekerjaan Anda dijalankan pada node jarak jauh. Bagaimana Anda memberi tahu mesin jarak jauh untuk menyertakan kelas pihak ketiga dan kelas yang ditentukan pengguna?

Pekerjaan MapReduce dijalankan dalam JVM terpisah di TaskTrackers dan terkadang Anda perlu menggunakan perpustakaan pihak ketiga dalam upaya memetakan/mengurangi tugas. Misalnya, Anda mungkin ingin mengakses HBase dari dalam tugas peta Anda. Salah satu cara untuk melakukannya adalah dengan mengemas setiap kelas yang digunakan dalam JAR yang dapat dikirimkan. Anda harus membongkar hbase-.jar yang asli dan kemas ulang semua kelas di toples Hadoop yang dapat Anda kirimkan. Tidak baik. Jangan lakukan ini:Masalah kompatibilitas versi akan mengganggu Anda cepat atau lambat.

Ada cara yang lebih baik untuk melakukan hal yang sama dengan meletakkan toples Anda di cache terdistribusi atau menginstal seluruh JAR pada node Hadoop dan memberi tahu TaskTrackers tentang lokasinya.

1. Sertakan JAR di “-libjars ” opsi baris perintah dari perintah `hadoop jar …`. Guci akan ditempatkan di cache terdistribusi dan akan tersedia untuk semua upaya tugas pekerjaan. Lebih khusus lagi, Anda akan menemukan JAR di salah satu ${mapred.local.dir}/taskTracker/archive/${user.name}/distcache/… subdirektori pada node lokal. Keuntungan dari cache terdistribusi adalah toples Anda mungkin masih ada di program berikutnya (setidaknya secara teori:File harus dikeluarkan dari cache terdistribusi hanya jika melebihi batas lunak yang ditentukan oleh local.cache .ukuran variabel konfigurasi, default ke 10GB, tetapi jarak tempuh Anda yang sebenarnya dapat bervariasi terutama dengan peningkatan keamanan terbaru). Hadoop melacak perubahan pada file cache yang didistribusikan dengan memeriksa stempel waktu modifikasinya.

*Pembaruan untuk mengeposkan:Harap perhatikan bahwa item 2 dan 3 di bawah tidak digunakan lagi mulai CDH4 dan tidak akan didukung lagi mulai CDH5.

2. Sertakan JAR yang direferensikan dalam subdirektori lib dari JAR yang dapat dikirim:Pekerjaan MapReduce akan membongkar JAR dari subdirektori ini ke ${mapred.local.dir}/taskTracker/${user.name}/jobcache/$ jobid/toples pada node TaskTracker dan arahkan tugas Anda ke direktori ini untuk membuat JAR tersedia untuk kode Anda. Jika JAR kecil, sering berubah, dan spesifik untuk pekerjaan, ini adalah metode yang disukai.

3. Terakhir, Anda dapat menginstal JAR pada node cluster. Cara termudah adalah dengan menempatkan JAR ke $HADOOP_HOME/lib direktori karena segala sesuatu dari direktori ini disertakan ketika daemon Hadoop dimulai. Namun, karena Anda tahu bahwa hanya TaskTrackers yang memerlukan JAR baru ini, cara yang lebih baik adalah dengan memodifikasi opsi HADOOP_TASKTRACKER_OPTS di file konfigurasi hadoop-env.sh. Metode ini lebih disukai jika JAR diikat ke kode yang berjalan pada node, seperti HBase.

HADOOP_TASKTRACKER_OPTS="-classpath<colon-separated-paths-to-your-jars>"

Mulai ulang TastTrackers setelah Anda selesai. Jangan lupa untuk memperbarui toples ketika perangkat lunak yang mendasarinya berubah.

Semua opsi di atas hanya memengaruhi kode yang berjalan pada node terdistribusi. Jika kode Anda yang meluncurkan tugas Hadoop menggunakan pustaka yang sama, Anda juga perlu menyertakan JAR dalam variabel lingkungan HADOOP_CLASSPATH:

HADOOP_CLASSPATH="<colon-separated-paths-to-your-jars>"

Perhatikan bahwa memulai dengan Java 1.6 classpath dapat menunjuk ke direktori seperti “/path/to/your/jars/* ” yang akan mengambil semua JAR dari direktori yang diberikan.

Prinsip panduan yang sama berlaku untuk pustaka kode asli yang perlu dijalankan pada node (pipa JNI atau C++). Anda dapat memasukkannya ke dalam cache terdistribusi dengan “-file ”, sertakan ke dalam file arsip yang ditentukan dengan opsi “-arsip ”, atau instal di node cluster. Jika penaut pustaka dinamis dikonfigurasi dengan benar, kode asli harus tersedia untuk upaya tugas Anda. Anda juga dapat mengubah lingkungan tugas menjalankan tugas secara eksplisit dengan menentukan variabel JAVA_LIBRARY_PATH atau LD_LIBRARY_PATH:

hadoop jar <your jar> [main class]
      -D mapred.child.env="LD_LIBRARY_PATH=/path/to/your/libs" ...

  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Arsitektur Apache Hadoop – HDFS, BENANG &Pengurangan Peta

  2. How-to:Gunakan Antarmuka Hemat HBase, Bagian 1

  3. HBase dan Hive – Lebih Baik Bersama

  4. Pengujian kinerja HBase menggunakan YCSB

  5. Bagaimana-untuk:Sertakan Perpustakaan Pihak Ketiga di Pekerjaan MapReduce Anda