Peringatan Hadoop "Tidak dapat memuat pustaka hadoop asli untuk platform Anda"


269

Saat ini saya mengonfigurasi hadoop pada server yang menjalankan CentOs . Ketika saya menjalankan start-dfs.shatau stop-dfs.sh, saya mendapatkan kesalahan berikut:

PERINGATAN util.NativeCodeLoader: Tidak dapat memuat pustaka-hadoop asli untuk platform Anda ... menggunakan kelas builtin-java di mana berlaku

Saya menjalankan Hadoop 2.2.0.

Melakukan pencarian online memunculkan tautan ini: http://balanceandbreath.blogspot.ca/2013/01/utilnativecodeloader-unable-to-load.html

Namun, isi /native/direktori pada hadoop 2.x tampaknya berbeda jadi saya tidak yakin apa yang harus dilakukan.

Saya juga menambahkan dua variabel lingkungan ini di hadoop-env.sh:

export HADOOP_OPTS = "$ HADOOP_OPTS -Djava.library.path = / usr / local / hadoop / lib /"

export HADOOP_COMMON_LIB_NATIVE_DIR = "/ usr / local / hadoop / lib / native /"

Ada ide?


3
Untuk pencarian: masalah ini juga berlaku setidaknya untuk Hadoop 2.4.0, Hadoop 2.4.1 dan mungkin versi lainnya.
Greg Dubicki

Dokumentasi untuk cara menggunakan perpustakaan asli ada di hadoop.apache.org/docs/current/hadoop-project-dist/…
James Moore

Jawaban:


227

Saya berasumsi Anda menjalankan Hadoop pada 64bit CentOS. Alasan Anda melihat bahwa peringatan adalah pustaka Hadoop asli $HADOOP_HOME/lib/native/libhadoop.so.1.0.0sebenarnya dikompilasi pada 32 bit.

Bagaimanapun, itu hanya peringatan, dan tidak akan memengaruhi fungsionalitas Hadoop.

Inilah caranya jika Anda ingin menghilangkan peringatan ini, unduh kode sumber Hadoop dan kompilasi ulang libhadoop.so.1.0.0pada sistem 64bit, lalu ganti 32bit.

Langkah-langkah tentang cara mengkompilasi ulang kode sumber disertakan di sini untuk Ubuntu:

Semoga berhasil.


7
Tidak Bekerja untukku. Memberi saya hal yang sama Tidak dapat memuat pustaka asli-hadoop untuk kesalahan platform Anda.
Akshay Hazari

7
Bahkan jika ini tidak berhasil, itu masih membantu. Jadi, apakah ini berdampak kinerja, sama sekali?
WattsInABox

1
Saya menggunakan tar hadoop 2.5.0 yang sama pada Centos 7 dan Centos 6.5. Keduanya adalah OS 64 bit. Tidak ada peringatan seperti itu pada Centos7 tetapi Centos 6.5 memberi saya peringatan ini, mengapa?
sandip divekar

Terima kasih. Saya tidak menyadari bahwa itu adalah peringatan. Sebenarnya mengatakan "memulai namenode" dan kalimat terakhir adalah "Tidak dapat memuat asli-hadoop .." yang menyebabkan ketakutan.
Kaushik Lele

Perhatikan bahwa Anda sebenarnya tidak perlu mengkompilasi seluruh Hadoop, seperti yang disarankan oleh instruksi - hadoop-common-project/hadoop-commondan itu hadoop-hdfs-project/hadoop-hdfssudah cukup.
Greg Dubicki

152

Cukup tambahkan kata asli ke Anda HADOOP_OPTSseperti ini:

export HADOOP_OPTS="$HADOOP_OPTS -Djava.library.path=$HADOOP_HOME/lib/native"

PS: Terima kasih Searene


Ini juga melakukannya untuk saya. Di Ubuntu dengan Hadoop 2.6,
pathnya

25
export HADOOP_OPTS = "- Djava.library.path = $ HADOOP_HOME / lib / native"
Searene

1
Saya pikir, dua solusi adalah sama. Menurut doc , java.library.path adalah daftar jalur yang harus dicari saat memuat pustaka. Sehingga, Anda dapat mengekspor LD_LIBRARY_PATH atau menggunakan opsi -D di baris perintah java. Dalam baris perintah java, dan -D <property> = nilai memungkinkan kita untuk menetapkan nilai properti sistem.
Hoai-Thu Vuong

54

Jawabannya tergantung ... Saya baru saja menginstal Hadoop 2.6 dari tarball pada 64-bit CentOS 6.6. Instalasi Hadoop memang datang dengan pustaka asli 64-bit prebuilt. Untuk instal saya, ada di sini:

/opt/hadoop/lib/native/libhadoop.so.1.0.0

Dan saya tahu itu 64-bit:

[hadoop@VMWHADTEST01 native]$ ldd libhadoop.so.1.0.0
./libhadoop.so.1.0.0: /lib64/libc.so.6: version `GLIBC_2.14' not found (required by ./libhadoop.so.1.0.0)
linux-vdso.so.1 =>  (0x00007fff43510000)
libdl.so.2 => /lib64/libdl.so.2 (0x00007f9be553a000)
libc.so.6 => /lib64/libc.so.6 (0x00007f9be51a5000)
/lib64/ld-linux-x86-64.so.2 (0x00007f9be5966000)

Sayangnya, saya dengan bodohnya mengabaikan jawaban di sana menatap wajah saya ketika saya fokus pada, "Apakah perpustakaan ini 32 pr 64 bit?":

`GLIBC_2.14' not found (required by ./libhadoop.so.1.0.0)

Jadi, pelajaran bisa dipetik. Ngomong-ngomong, sisanya setidaknya membuatku mampu menekan peringatan itu. Jadi saya melanjutkan dan melakukan semua yang direkomendasikan dalam jawaban lain untuk menyediakan jalur pustaka menggunakan variabel lingkungan HADOOP_OPTS tanpa hasil. Jadi saya melihat kode sumbernya. Modul yang menghasilkan kesalahan memberi tahu Anda petunjuk ( util.NativeCodeLoader ):

15/06/18 18:59:23 WARN util.NativeCodeLoader: Unable to load native-hadoop    library for your platform... using builtin-java classes where applicable

Jadi, pergilah ke sini untuk melihat apa fungsinya:

http://grepcode.com/file/repo1.maven.org/maven2/com.ning/metrics.action/0.2.6/org/apache/hadoop/util/NativeCodeLoader.java/

Ah, ada beberapa level debug debug - mari kita aktifkan itu di lihat apakah kita mendapatkan bantuan tambahan. Ini dilakukan dengan menambahkan baris berikut ke $ HADOOP_CONF_DIR / file log4j.properties:

log4j.logger.org.apache.hadoop.util.NativeCodeLoader=DEBUG

Lalu saya menjalankan perintah yang menghasilkan peringatan asli, seperti stop-dfs.sh, dan mendapatkan barang ini:

15/06/18 19:05:19 DEBUG util.NativeCodeLoader: Failed to load native-hadoop with error: java.lang.UnsatisfiedLinkError: /opt/hadoop/lib/native/libhadoop.so.1.0.0: /lib64/libc.so.6: version `GLIBC_2.14' not found (required by /opt/hadoop/lib/native/libhadoop.so.1.0.0)

Dan jawabannya terungkap dalam cuplikan pesan debug ini (hal yang sama dengan perintah ldd sebelumnya 'coba' untuk memberi tahu saya:

`GLIBC_2.14' not found (required by opt/hadoop/lib/native/libhadoop.so.1.0.0)

GLIBC versi apa yang saya miliki? Inilah trik sederhana untuk mengetahuinya:

[hadoop@VMWHADTEST01 hadoop]$ ldd --version
ldd (GNU libc) 2.12

Jadi, tidak dapat memperbarui OS saya ke 2.14. Satu-satunya solusi adalah membangun pustaka asli dari sumber di OS saya atau menekan peringatan dan abaikan saja untuk saat ini. Saya memilih untuk hanya menekan peringatan yang mengganggu untuk saat ini (tetapi berencana untuk membangun dari sumber di masa depan) membeli dengan menggunakan opsi logging yang sama yang kami gunakan untuk mendapatkan pesan debug, kecuali sekarang, hanya membuatnya tingkat KESALAHAN.

log4j.logger.org.apache.hadoop.util.NativeCodeLoader=ERROR

Saya harap ini membantu orang lain melihat bahwa manfaat besar dari perangkat lunak open source adalah Anda dapat mengetahui hal ini jika Anda mengambil beberapa langkah logis sederhana.


4
Terima kasih, Pak, untuk jawaban terperinci yang indah ini. Saya mendapat jawaban dan belajar sesuatu yang berharga (beberapa hal) dalam proses itu.
dogwynn

26

Saya memiliki masalah yang sama. Itu dipecahkan dengan menambahkan baris berikut di .bashrc:

export HADOOP_COMMON_LIB_NATIVE_DIR=$HADOOP_HOME/lib/native
export HADOOP_OPTS="-Djava.library.path=$HADOOP_HOME/lib"

5
Saya harus menambahkan "/ asli" ke nilai HADOOP_OPTS
Ala 'Alnajjar

21

Dalam kasus saya, setelah saya membangun hadoop di Linux mint OS 64 bit saya, saya mengganti perpustakaan asli di hadoop/lib. Masih ada masalah. Lalu aku menemukan hadoop yang menunjuk ke hadoop/libtidak ke hadoop/lib/native. Jadi saya baru saja memindahkan semua konten dari perpustakaan asli ke induknya. Dan peringatan itu hilang begitu saja.


Saya kebetulan telah mencoba semuanya di internet. Saya lelah dan hanya mengosongkan semua file di folder lib itu sendiri yaitu yang dikompilasi menggunakan tautan yang disediakan dalam jawaban di atas. Akhirnya saya tidak tahu mengapa walaupun ada downvotes yang saya miliki, saya mencoba saran Anda dan itu berhasil setelah perjuangan yang luar biasa saya lakukan selama satu hari di belakang semua ini. Tidak masalah apakah saya mengubah lokasi perpustakaan asli di .bashrc atau hadoop-env.sh. Terima kasih banyak.
Akshay Hazari

Saya bosan dan hanya mengosongkan semua file folder asli di folder lib itu sendiri yaitu yang dikompilasi menggunakan tautan yang disediakan dalam jawaban di atas (folder asli di hadoop-2.4.0-src.tar.gz baru.)
Akshay Hazari

15

Ini juga akan berfungsi:

export LD_LIBRARY_PATH=/usr/lib/hadoop/lib/native

1
Terima kasih. Jika Anda mengganti LD_LIBRARY_PATH untuk menggunakan tomcat apr, tambahkan saja path asli hadoop sebagai `export LD_LIBRARY_PATH = $ LD_LIBRARY_PATH: / usr / lib / hadoop / lib / native.
Eric

ini hanya solusi bagi saya. (mencoba semua jawaban lain).
sailfish009

13

Setelah penelitian berkelanjutan seperti yang disarankan oleh KotiI, masalah terselesaikan.

hduser@ubuntu:~$ cd /usr/local/hadoop

hduser@ubuntu:/usr/local/hadoop$ ls

bin  include  libexec      logs        README.txt  share
etc  lib      LICENSE.txt  NOTICE.txt  sbin

hduser@ubuntu:/usr/local/hadoop$ cd lib

hduser@ubuntu:/usr/local/hadoop/lib$ ls
native

hduser@ubuntu:/usr/local/hadoop/lib$ cd native/

hduser@ubuntu:/usr/local/hadoop/lib/native$ ls

libhadoop.a       libhadoop.so        libhadooputils.a  libhdfs.so
libhadooppipes.a  libhadoop.so.1.0.0  libhdfs.a         libhdfs.so.0.0.0

hduser@ubuntu:/usr/local/hadoop/lib/native$ sudo mv * ../

Bersulang


11

Bagi mereka yang menggunakan OSX dengan Hadoop diinstal melalui Homebrew, ikuti langkah-langkah ini menggantikan jalur dan versi Hadoop yang sesuai

wget http://www.eu.apache.org/dist/hadoop/common/hadoop-2.7.1/hadoop-2.7.1-src.tar.gz
tar xvf hadoop-2.7.1-src.tar.gz
cd hadoop-2.7.1-src
mvn package -Pdist,native -DskipTests -Dtar
mv lib /usr/local/Cellar/hadoop/2.7.1/

kemudian perbarui hadoop-env.sh dengan

export HADOOP_OPTS="$HADOOP_OPTS -Djava.net.preferIPv4Stack=true -Djava.security.krb5.realm= -Djava.security.krb5.kdc= -Djava.library.path=/usr/local/Cellar/hadoop/2.7.1/lib/native"

Terima kasih Philip. Solusi ini bekerja dengan sempurna. Dalam kasus saya, yang saya butuhkan adalah opsi Djava.library.path. Itulah tepatnya yang saya cari. Terima kasih!!!
arcee123

Terima kasih banyak. Saya punya bzip2: false, openssl: false build tidak mendukung openssl. Yang lain memiliki jalan yang muncul. Ada saran.
ggorantl

11
export JAVA_HOME=/home/hadoop/software/java/jdk1.7.0_80
export HADOOP_HOME=/usr/local/hadoop
export HADOOP_COMMON_LIB_NATIVE_DIR=$HADOOP_HOME/lib/native
export HADOOP_OPTS="-Djava.library.path=$HADOOP_COMMON_LIB_NATIVE_DIR"

8

@zhutoulala - FWIW tautan Anda berfungsi untuk saya dengan Hadoop 2.4.0 dengan satu pengecualian, saya harus memberi tahu maven untuk tidak membangun javadocs. Saya juga menggunakan tambalan di tautan pertama untuk 2.4.0 dan bekerja dengan baik. Inilah perintah pakar yang harus saya keluarkan

mvn package -Dmaven.javadoc.skip=true -Pdist,native -DskipTests -Dtar

Setelah membangun ini dan memindahkan perpustakaan, jangan lupa untuk memperbarui hadoop-env.sh :)

Kupikir ini mungkin membantu seseorang yang mengalami hambatan sama seperti aku


5

Pindahkan file perpustakaan asli yang dikompilasi ke $HADOOP_HOME/lib folder.

Kemudian atur variabel lingkungan Anda dengan mengedit .bashrcfile

export HADOOP_COMMON_LIB_NATIVE_DIR=$HADOOP_HOME/lib  
export HADOOP_OPTS="$HADOOP_OPTS -Djava.library.path=$HADOOP_HOME/lib"

Pastikan file perpustakaan asli Anda yang dikompilasi berada di $HADOOP_HOME/lib folder.

itu harus bekerja.


2
export HADOOP_HOME=/home/hadoop/hadoop-2.4.1  
export PATH=$HADOOP_HOME/bin:$PATH  
export HADOOP_PREFIX=$HADOOP_HOME  
export HADOOP_COMMON_HOME=$HADOOP_PREFIX  
export HADOOP_COMMON_LIB_NATIVE_DIR=$HADOOP_PREFIX/lib/native  
export HADOOP_CONF_DIR=$HADOOP_PREFIX/etc/hadoop  
export HADOOP_HDFS_HOME=$HADOOP_PREFIX  
export HADOOP_MAPRED_HOME=$HADOOP_PREFIX  
export HADOOP_YARN_HOME=$HADOOP_PREFIX  
export JAVA_LIBRARY_PATH=$HADOOP_HOME/lib/native:$JAVA_LIBRARY_PATH

ya, Anda harus mengkompilasi ulang lib / native 64bit melalui sumber hadoop.
KunBetter

2

Baris ini di sini:

export JAVA_LIBRARY_PATH=$HADOOP_HOME/lib/native:$JAVA_LIBRARY_PATH

Dari jawaban KunBetter, bekerja untuk saya. Cukup tambahkan ke file .bashrc dan muat ulang konten .bashrc

$ source ~/.bashrc

Saya menggunakan versi hadoop-2.6.0 di sistem lokal saya. Saya juga menghadapi masalah yang sama. Kemudian saya mengunduh hadoop-2.7.1-src dan membangun perpustakaan biner dan penduduk asli, juga menggantikan perpustakaan asli hadoop-2.6.0 dengan penduduk asli yang baru dibangun. Tapi tetap saja saya mendapatkan kesalahan yang sama. Lalu saya export JAVA_LIBRARY_PATH=$HADOOP_HOME/lib/native:$JAVA_LIBRARY_PATHdan itu berhasil untuk saya.
ParagFlume

1

Baris ini di sini:

export JAVA_LIBRARY_PATH=$HADOOP_HOME/lib/native:$JAVA_LIBRARY_PATH

Dari jawaban KunBetter adalah di mana uang itu berada


Dalam kasus saya, saya membutuhkan keduanya: export JAVA_LIBRARY_PATH=$HADOOP_HOME/lib/native:$JAVA_LIBRARY_PATH dan export LD_LIBRARY_PATH=$HADOOP_HOME/lib/native:$LD_LIBRARY_PATH
bores

1

Saya memiliki masalah yang sama dengan JDK6, saya mengubah JDK menjadi JDK8, masalah terpecahkan. Coba gunakan JDK8 !!!


1

Selain jawaban yang diterima @zhutoulala, berikut adalah pembaruan untuk membuatnya berfungsi dengan versi stabil terbaru hingga saat ini (2,8) pada platform ARMHF (Raspberry Pi 3 model B). Pertama saya dapat mengkonfirmasi bahwa Anda harus mengkompilasi ulang pustaka asli ke ARM 64 bit, jawaban lain di sini berdasarkan pengaturan beberapa variabel lingkungan tidak akan berfungsi. Seperti yang ditunjukkan dalam dokumentasi Hadoop, perpustakaan asli pra-dibangun adalah 32 bit.

Langkah-langkah tingkat tinggi yang diberikan dalam tautan pertama ( http://www.ercoppa.org/posts/how-to-compile-apache-hadoop-on-ubuntu-linux.html ) sudah benar. Pada url ini http://www.instructables.com/id/Native-Hadoop-260-Build-on-Pi/ Anda mendapatkan detail lebih lanjut khusus untuk Raspberry Pi, tetapi tidak untuk Hadoop versi 2.8.

Berikut indikasi saya tentang Hadoop 2.8:

  • masih belum ada paket protobuf pada Raspbian terbaru sehingga Anda harus mengompilasinya sendiri dan versinya harus persis protobuf 2.5 ( https://protobuf.googlecode.com/files/protobuf-2.5.0.tar.gz )
  • Metode penambalan file CMake harus diubah. Apalagi file yang akan ditambal tidak sama. Sayangnya, tidak ada patch yang diterima pada JIRA khusus untuk 2,8. Pada URL ini ( https://issues.apache.org/jira/browse/HADOOP-9320 ) Anda harus menyalin dan menempel tambalan yang diusulkan Andreas Muttscheller pada namenode Anda:

    :hadoop-2.8.0-src/hadoop-common-project/hadoop-common $ touch HADOOP-9320-v2.8.patch
    :hadoop-2.8.0-src/hadoop-common-project/hadoop-common $ vim HADOOP-9320-v2.8.patch
    #copy and paste proposed patch given here : https://issues.apache.org/jira/browse/HADOOP-9320?focusedCommentId=16018862&page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel#comment-16018862
    :hadoop-2.8.0-src/hadoop-common-project/hadoop-common $ patch < HADOOP-9320-v2.8.patch
    patching file HadoopCommon.cmake
    patching file HadoopJNI.cmake
    :hadoop-2.8.0-src/hadoop-common-project/hadoop-common $ cd ../..
    :hadoop-2.8.0-src $ sudo mvn package -Pdist,native -DskipTests -Dtar

Setelah membangun berhasil:

    :hadoop-2.8.0-src/hadoop-dist/target/hadoop-2.8.0/lib/native $ tar -cvf nativelibs.tar *

Dan ganti konten lib / direktori asli Hadoop Anda instal dengan konten arsip ini. Pesan peringatan saat menjalankan Hadoop harus menghilang.


0

Untuk menginstal Hadoop, soooooo jauh lebih mudah menginstal versi gratis dari Cloudera. Itu datang dengan GUI yang bagus yang membuatnya mudah untuk menambahkan node, tidak ada kompilasi atau mengisi dengan dependensi, ia datang dengan hal-hal seperti sarang, babi dll

http://www.cloudera.com/content/support/en/downloads.html

Langkah-langkahnya adalah: 1) Unduh 2) Jalankan 3) Buka web GUI (1.2.3.4:7180) 4) Tambahkan node tambahan di web gui (JANGAN menginstal perangkat lunak cloudera di node lain, itu melakukan semuanya untuk Anda) 5) Di dalam GUI web, buka Beranda, klik Hue dan Hue Web UI. Ini memberi Anda akses ke Sarang, Babi, Sqoop dll.


Distribusi Cloudera banyak waktu di belakang versi saat ini tersedia untuk banyak paket. jika Anda ingin "terbaru dan terhebat", Apache Hadoop adalah jalannya
Nerrve

0

Obat terverifikasi dari posting sebelumnya:

1) Memeriksa bahwa libhadoop.so.1.0.0pengiriman dengan distribusi Hadoop dikompilasi untuk arsitektur mesin saya, yaitu x86_64:

[nova]:file /opt/hadoop-2.6.0/lib/native/libhadoop.so.1.0.0
/opt/hadoop-2.6.0/lib/native/libhadoop.so.1.0.0: ELF 64-bit LSB shared object, x86-64, version 1 (SYSV), dynamically linked, BuildID[sha1]=3a80422c78d708c9a1666c1a8edd23676ed77dbb, not stripped

2) Ditambahkan -Djava.library.path=<path>ke HADOOP_OPTdalam hadoop-env.sh:

export HADOOP_OPTS="$HADOOP_OPTS -Djava.net.preferIPv4Stack=true -Djava.library.path=/opt/hadoop-2.6.0/lib/native"

Ini memang membuat peringatan yang mengganggu itu hilang.


0

Pertama: Anda dapat memodifikasi versi glibc.CentOS menyediakan perangkat lunak yang aman secara tranditional, itu juga berarti versi yang lama seperti glibc, protobuf ...

ldd --version
ldd /opt/hadoop/lib/native/libhadoop.so.1.0.0

Anda dapat membandingkan versi glibc saat ini dengan glibc yang dibutuhkan.

Kedua: Jika versi glibc saat ini sudah tua, Anda dapat memperbarui glibc. DownLoad Glibc

Jika versi glibc id saat ini benar, Anda dapat menambahkan kata asli ke HADOOP_OPTS Anda

export HADOOP_COMMON_LIB_NATIVE_DIR=$HADOOP_HOME/lib/native
export HADOOP_OPTS="-Djava.library.path=$HADOOP_HOME/lib"

0

Saya tidak menggunakan CentOS. Inilah yang saya miliki di Ubuntu 16.04.2, hadoop-2.7.3, jdk1.8.0_121. Jalankan start-dfs.sh atau stop-dfs.sh berhasil tanpa kesalahan:

# JAVA env
#
export JAVA_HOME=/j01/sys/jdk
export JRE_HOME=/j01/sys/jdk/jre

export PATH=${JAVA_HOME}/bin:${JRE_HOME}/bin:${PATH}:.

# HADOOP env
#
export HADOOP_HOME=/j01/srv/hadoop
export HADOOP_MAPRED_HOME=$HADOOP_HOME
export HADOOP_COMMON_HOME=$HADOOP_HOME
export HADOOP_HDFS_HOME=$HADOOP_HOME
export YARN_HOME=$HADOOP_HOME

export HADOOP_CONF_DIR=$HADOOP_HOME/etc/hadoop
export PATH=$PATH:$HADOOP_HOME/sbin:$HADOOP_HOME/bin

Ganti / j01 / sys / jdk, / j01 / srv / hadoop dengan jalur instalasi Anda

Saya juga melakukan hal berikut untuk satu kali pengaturan di Ubuntu, yang menghilangkan kebutuhan untuk memasukkan kata sandi beberapa kali ketika menjalankan start-dfs.sh:

sudo apt install openssh-server openssh-client
ssh-keygen -t rsa
ssh-copy-id user@localhost

Ganti pengguna dengan nama pengguna Anda


0

Pada dasarnya, ini bukan kesalahan, itu peringatan di cluster Hadoop. Di sini kita memperbarui variabel lingkungan.

export HADOOP_OPTS = "$ HADOOP_OPTS" -Djava.library.path = / usr / local / hadoop / lib
 export HADOOP_COMMON_LIB_NATIVE_DIR = "/ usr / local / hadoop / lib / asli"
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.