YARN加载本地库抛出Unable to load native-hadoop library解决办法

本文解决了一个在64位操作系统上使用Hadoop 2.1.0预编译版本时遇到的问题,即运行hadoop命令时出现的Warning提示。问题源于预编译版本提供的nativelibrary为32位而非64位。通过重新编译源代码以生成正确的64位nativelibrary解决了该问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

用官方的Hadoop 2.1.0-beta安装后,每次hadoop命令进去都会抛出这样一个Warning

WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable

设置logger级别,看下具体原因

export HADOOP_ROOT_LOGGER=DEBUG,console​
13/08/29 13:59:38 DEBUG util.NativeCodeLoader: Trying to load the custom-built native-hadoop library...
13/08/29 13:59:38 DEBUG util.NativeCodeLoader: Failed to load native-hadoop with error: java.lang.UnsatisfiedLinkError: /usr/local/hadoop/hadoop-2.1.0-beta/lib/native/libhadoop.so.1.0.0: /usr/local/hadoop/hadoop-2.1.0-beta/lib/native/libhadoop.so.1.0.0: wrong ELF class: ELFCLASS32 (Possible cause: architecture word width mismatch)
13/08/29 13:59:38 DEBUG util.NativeCodeLoader: java.library.path=/usr/local/hadoop/hadoop-2.1.0-beta/lib/native/Linux-amd64-64:/usr/local/hadoop/hadoop-2.1.0-beta/lib/native
13/08/29 13:59:38 WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable
wrong   ELFCLASS32,难道是 加载的so文件系统版本不对
执行命令file libhadoop.so.1.0.0
libhadoop.so.1.0.0: ELF 32-bit LSB shared object, Intel 80386, version 1 (SYSV), dynamically linked, not stripped
果然是80386,是32位的系统版本,而我的hadoop环境是64位OS
原来直接从apache镜像中下载的编译好的Hadoop版本native library都是32版本的,如果要支持64位版本,必须自己重新编译,这就有点坑爹了,要知道几乎所有的生产环境都是64位的OS
YARN官方对于native library的一段话验证了这一点
The pre-built 32-bit i386-Linux native hadoop library is available as part of the hadoop distribution and is located in the lib/native directory

重新checkout source code
svn checkout http://svn.apache.org/repos/asf/hadoop/common/tags/release-2.1.0-beta/
加上编译native的选项,编译时会根据当前的操作系统架构来生产相应的native库
mvn package -Pdist,native -DskipTests -Dtar
再去native文件下查看所有的file type,已经都是64位版的了,替换线上文件,WARNING消除
file *
libhadoop.a:        current ar archive
libhadooppipes.a:   current ar archive
libhadoop.so:       symbolic link to `libhadoop.so.1.0.0'
libhadoop.so.1.0.0: ELF 64-bit LSB shared object, x86-64, version 1 (GNU/Linux), dynamically linked, not stripped
libhadooputils.a:   current ar archive
libhdfs.a:          current ar archive
libhdfs.so:         symbolic link to `libhdfs.so.0.0.0'
libhdfs.so.0.0.0:   ELF 64-bit LSB shared object, x86-64, version 1 (GNU/Linux), dynamically linked, not stripped

本文链接http://blog.youkuaiyun.com/lalaguozhe/article/details/10361367 ,转载请注明

<think>我们正在解决Hadoop启动或运行时出现的警告:Unabletoloadnative-hadooplibraryforyourplatform...usingbuiltin-javaclasseswhereapplicable。这个警告表明Hadoop无法加载本地库nativelibrary),因此将使用内置的Java类,这可能会影响性能(尤其是在IO操作方面)。根据引用资料,问题可能由多种原因引起,包括:1.环境变量配置不正确(如JAVA_HOME路径含有空格,或未正确设置本地库路径)2.本地库与当前平台不兼容(例如,在32位系统上使用64位编译的库,或相反)3.依赖的库(如glibc)版本不匹配4.缺少必要的本地库文件(如winutils.exe和hadoop.dll在Windows环境下)下面将逐步分析并提供解决方案:###步骤1:确认问题首先,使用以下命令检查本地库加载情况:```bashhadoopchecknative-a```该命令会检查各个组件(如zlib,snappy,openssl等)的本地库加载情况。如果输出中显示`notavailable`或类似的错误信息,则说明本地库加载有问题。###步骤2:检查JAVA_HOME确保`JAVA_HOME`环境变量指向的路径不包含空格(特别是在Windows系统中)。例如,默认的安装路径`C:\ProgramFiles\Java\jdk1.8.0_xxx`包含空格,这可能导致问题。建议将JDK安装到无空格的路径(如`C:\Java\jdk1.8.0_xxx`),并更新`JAVA_HOME`。###步骤3:设置本地库路径在Hadoop的配置中,需要指定本地库的位置。通常,本地库位于`$HADOOP_HOME/lib/native`(Linux)或`%HADOOP_HOME%\bin`(Windows)。确保该路径下存在与平台匹配的本地库文件。对于Linux系统,可以通过设置环境变量`LD_LIBRARY_PATH`来包含本地库路径:```bashexportLD_LIBRARY_PATH=$HADOOP_HOME/lib/native:$LD_LIBRARY_PATH```或者,在`hadoop-env.sh`中设置:```bashexportHADOOP_OPTS="$HADOOP_OPTS-Djava.library.path=$HADOOP_HOME/lib/native"```对于Windows系统,需要将`hadoop.dll`和`winutils.exe`等文件放在正确的位置(通常放在`%HADOOP_HOME%\bin`目录下),并确保系统PATH环境变量包含该目录。###步骤4:检查依赖库(Linux)在Linux系统中,使用`ldd`命令检查本地库的依赖关系:```bashldd$HADOOP_HOME/lib/native/libhadoop.so.1.0.0```如果出现类似`libc.so.6:version'GLIBC_2.14'notfound`的错误,说明当前系统的glibc版本过低(如CentOS6默认是2.12),而Hadoop本地库需要更高版本(如2.14)。解决方案:-升级系统(例如升级到CentOS7或更高版本,其glibc版本为2.17以上)。-或者,重新编译Hadoop源代码以适配当前系统的glibc版本(需要安装开发工具和依赖)。###步骤5:忽略警告(仅测试环境)如果是在本地测试环境,且对性能要求不高,可以选择忽略此警告。在`core-site.xml`中添加以下配置:```xml<property><name>hadoop.native.lib</name><value>false</value><description>Disablenativehadooplibraries,usebuilt-in-javaclassesinstead.</description></property>```###步骤6:确保使用正确的Hadoop版本下载Hadoop时,应选择与操作系统平台匹配的版本(32位或64位)。如果使用预编译的二进制包,确保其编译环境与运行环境一致。对于Windows用户,需要额外下载Windows版本的本地库(winutils和hadoop.dll),并覆盖到Hadoop的bin目录。可以从可靠的源获取(如:https://gitee.com/nkuhyx/winutils)。总结:1.检查并修正JAVA_HOME(无空格)。2.设置本地库路径(通过环境变量)。3.检查依赖库版本(Linux下使用ldd),必要时升级系统或重新编译Hadoop。4.对于Windows,确保bin目录下有正确的winutils.exe和hadoop.dll。5.测试环境可配置忽略。按照以上步骤操作后,通常可以解决本地库加载问题。§§相关问题§§1.如何重新编译Hadoop以适配当前系统的glibc版本?2.在Windows上配置Hadoop本地库的详细步骤是什么?3.除了本地库问题,还有哪些常见的Hadoop启动警告及解决方法?</think>### Hadoop "Unable to load native-hadoop library" 解决方案 该警告表明 Hadoop 无法加载本地优化库(native library),将使用 Java 内置实现代替,可能导致性能下降。以下是系统级解决方案: #### 1. **检查本地库兼容性(关键步骤)** ```bash hadoop checknative -a ``` - 若输出显示 `***/libhadoop.so.1.0.0: FAILED`,说明本地库不兼容 - **Linux 系统诊断**: ```bash ldd $HADOOP_HOME/lib/native/libhadoop.so.1.0.0 ``` 若出现 `GLIBC_2.14 not found`(如 CentOS 6.x),需升级系统或重编译 Hadoop[^3][^5] #### 2. **环境变量配置** - **添加本地库路径**(在 `hadoop-env.sh` 中): ```bash export HADOOP_OPTS="$HADOOP_OPTS -Djava.library.path=$HADOOP_HOME/lib/native" ``` - **Windows 特殊处理**: - 确保 `JAVA_HOME` 路径**无空格**(避免 `Program Files`,建议 `C:\Java\jdk1.8.0`)[^2] - 将 `winutils.exe` 和 `hadoop.dll` 放入 `%HADOOP_HOME%\bin`(从可靠源获取)[^2] #### 3. **系统库版本修复** - **CentOS/RHEL 6.x 方案**: ```bash # 升级 glibc(风险高,需谨慎) sudo yum install -y glibc-static # 或重编译 Hadoop(推荐): mvn package -Pdist,native -DskipTests -Dtar ``` - **兼容性覆盖方案**(测试环境用): 在 `core-site.xml` 中添加: ```xml <property> <name>io.native.lib.available</name> <value>false</value> </property> ``` #### 4. **文件权限修复(Linux)** ```bash chmod -R 755 $HADOOP_HOME/lib/native chmod 755 $HADOOP_HOME/bin/container-executor # YARN 相关 ``` #### 验证流程: ```bash # 检查加载状态 hadoop checknative -a # 期望输出示例: # zlib: true # snappy: true # openssl: true ``` > **关键点**:本地库问题通常由三方面导致:①环境变量配置错误 ②glibc 版本不匹配 ③文件缺失/权限问题。生产环境建议使用官方预编译版本或匹配操作系统的 Hadoop 发行版[^4][^5]。
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值