WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform...

1、在启动HDFS过程中,总是会提示warning信息:
WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable

搜索的结果大部分说是操作系统与hadoop的位数不一致造成的,然而事实并非如此。

本文的操作系统为centos 64位,而libhadoop.so也是64位的

$ file ../lib/native/libhadoop.so.1.0.0

../lib/native/libhadoop.so.1.0.0: ELF 64-bit LSB shared object, x86-64, version 1 (SYSV), dynamically linked, not stripped

后来甚至在机器上耗费数天从编译hadoop到编译spark,最后依然会提示上述warning,那么显然问题并不是位数冲突造成的了。

由于上述warning并不能提供更多有效的信息,需要增加debug信息:

export HADOOP_ROOT_LOGGER=DEBUG,console

再次执行./stop-dfs.sh,这次debug到一些有用的信息:

16/07/05 15:33:54 DEBUG util.Shell: setsid exited with exit code 0
16/07/05 15:33:54 DEBUG lib.MutableMetricsFactory: field org.apache.hadoop.metrics2.lib.MutableRate org.apache.hadoop.security.UserGroupInformation$UgiMetrics.loginSuccess with annotation @org.apache.hadoop.metrics2.annotation.Metric(value=[Rate of successful kerberos logins and latency (milliseconds)], about=, valueName=Time, type=DEFAULT, always=false, sampleName=Ops)
16/07/05 15:33:54 DEBUG lib.MutableMetricsFactory: field org.apache.hadoop.metrics2.lib.MutableRate org.apache.hadoop.security.UserGroupInformation$UgiMetrics.loginFailure with annotation @org.apache.hadoop.metrics2.annotation.Metric(value=[Rate of failed kerberos logins and latency (milliseconds)], about=, valueName=Time, type=DEFAULT, always=false, sampleName=Ops)
16/07/05 15:33:54 DEBUG lib.MutableMetricsFactory: field org.apache.hadoop.metrics2.lib.MutableRate org.apache.hadoop.security.UserGroupInformation$UgiMetrics.getGroups with annotation @org.apache.hadoop.metrics2.annotation.Metric(value=[GetGroups], about=, valueName=Time, type=DEFAULT, always=false, sampleName=Ops)
16/07/05 15:33:54 DEBUG impl.MetricsSystemImpl: UgiMetrics, User and group related metrics
16/07/05 15:33:55 DEBUG security.Groups:  Creating new Groups object
16/07/05 15:33:55 DEBUG util.NativeCodeLoader: Trying to load the custom-built native-hadoop library...
<span style="color:#FF0000;">16/07/05 15:33:55 DEBUG util.NativeCodeLoader: Failed to load native-hadoop with error: java.lang.UnsatisfiedLinkError: no hadoop in java.library.path
16/07/05 15:33:55 DEBUG util.NativeCodeLoader: java.library.path=/usr/local/sinasrv2/hadoop/hadoop-2.6.4/lib
16/07/05 15:33:55 WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable</span>
16/07/05 15:33:55 DEBUG util.PerformanceAdvisory: Falling back to shell based
16/07/05 15:33:55 DEBUG security.JniBasedUnixGroupsMappingWithFallback: Group mapping impl=org.apache.hadoop.security.ShellBasedUnixGroupsMapping
16/07/05 15:33:55 DEBUG security.Groups: Group mapping impl=org.apache.hadoop.security.JniBasedUnixGroupsMappingWithFallback; cacheTimeout=300000; warningDeltaMs=5000
16/07/05 15:33:55 DEBUG security.UserGroupInformation: hadoop login
16/07/05 15:33:55 DEBUG security.UserGroupInformation: hadoop login commit
16/07/05 15:33:55 DEBUG security.UserGroupInformation: using local user:UnixPrincipal: hadoop
16/07/05 15:33:55 DEBUG security.UserGroupInformation: Using user: "UnixPrincipal: hadoop" with name hadoop
16/07/05 15:33:55 DEBUG security.UserGroupInformation: User entry: "hadoop"
16/07/05 15:33:55 DEBUG security.UserGroupInformation: UGI loginUser:hadoop (auth:SIMPLE)
16/07/05 15:33:55 DEBUG security.UserGroupInformation: PrivilegedAction as:hadoop (auth:SIMPLE) from:org.apache.hadoop.hdfs.tools.GetConf.run(GetConf.java:314)

可以看到是上述标红位置出现了问题。也就是从java.library.path处没有找到libhadoop.so,我们发现,libhadoop.so是存放在/usr/local/sinasrv2/hadoop/hadoop-2.6.4/lib/native下的

在hadoop包中搜索发现,java.library.path被定义为$JAVA_LIBRARY_PATH

$ grep -R 'java.library.path' *
bin/yarn:  YARN_OPTS="$YARN_OPTS -Djava.library.path=$JAVA_LIBRARY_PATH"
bin/yarn.cmd:    set YARN_OPTS=%YARN_OPTS% -Djava.library.path=%JAVA_LIBRARY_PATH%
etc/hadoop/yarn-env.sh:  YARN_OPTS="$YARN_OPTS -Djava.library.path=$JAVA_LIBRARY_PATH"
etc/hadoop/yarn-env.cmd:  set YARN_OPTS=%YARN_OPTS% -Djava.library.path=%JAVA_LIBRARY_PATH%
libexec/hadoop-config.sh:# setup 'java.library.path' for native-hadoop code if necessary
libexec/hadoop-config.sh:  HADOOP_OPTS="$HADOOP_OPTS -Djava.library.path=$JAVA_LIBRARY_PATH"
libexec/hadoop-config.cmd:@rem setup 'java.library.path' for native hadoop code if necessary
libexec/hadoop-config.cmd:  set HADOOP_OPTS=%HADOOP_OPTS% -Djava.library.path=%JAVA_LIBRARY_PATH%
share/doc/hadoop/common/CHANGES.txt:    HADOOP-8756. Fix SEGV when libsnappy is in java.library.path but
share/doc/hadoop/common/CHANGES.txt:    HADOOP-1660. Add the cwd of the map/reduce task to the java.library.path
share/doc/hadoop/common/CHANGES.txt: 50. HADOOP-1493.  Permit specification of "java.library.path" system
share/doc/hadoop/common/CHANGES.txt:10. HADOOP-873.      Pass java.library.path correctly to child processes.
share/doc/hadoop/common/CHANGES.txt:42. HADOOP-838.  Fix tasktracker to pass java.library.path to
share/doc/hadoop/mapreduce/CHANGES.txt:    MAPREDUCE-4458. Warn if java.library.path is used for AM or Task
share/doc/hadoop/mapreduce/CHANGES.txt:    MAPREDUCE-4072. User set java.library.path seems to overwrite default
share/doc/hadoop/mapreduce/CHANGES.txt:    MAPREDUCE-3259. Added java.library.path of NodeManager to

但是此时发现环境变量$JAVA_LIBRARY_PATH并未定义,那么问题到这里终于算是找到了,解决方法也很简单了,vim /etc/profile,添加$JAVA_LIBRARY_PATH环境变量

export JAVA_LIBRARY_PATH='/usr/local/sinasrv2/hadoop/hadoop-2.6.4/lib/native'

source /etc/profile 使之生效

再执行,则不会出现上述warning信息


2、在执行spark-shell的时候出现上述warning信息

同样的思路,修改spark的日志级别为warning,vim $SPARK_HOME/conf/log4j.properties

log4j.rootCategory=WARNING, console

得到如下错误信息:
16/07/06 12:15:41 DEBUG Groups:  Creating new Groups object
16/07/06 12:15:41 DEBUG NativeCodeLoader: Trying to load the custom-built native-hadoop library...
16/07/06 12:15:41 DEBUG NativeCodeLoader: Failed to load native-hadoop with error: java.lang.UnsatisfiedLinkError: no hadoop in java.library.path
16/07/06 12:15:41 DEBUG NativeCodeLoader: java.library.path=/usr/java/packages/lib/amd64:/usr/lib64:/lib64:/lib:/usr/lib
16/07/06 12:15:41 WARN NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable
16/07/06 12:15:41 DEBUG PerformanceAdvisory: Falling back to shell based

又是java.library.path的问题,Orz…

但是在grep的时候,没有发现java.library.path的出处,也不知道其值是如何设定的。问题虽然找到了,但是解决方法一筹莫展。只要求助万能的度娘了…

这篇帖子也是同样的问题,http://bbs.youkuaiyun.com/topics/390978577,采用7楼的解决方法:

在spark的conf目录下,修改spark-env.sh文件加入LD_LIBRARY_PATH环境变量,值为hadoop的native库的路径

果然凑效!

vim $SPARK_HOME/conf/spark-env.sh


  export SPARK_MASTER_IP=hadoop1
  export SPARK_MASTER_PORT=7077
  export SPARK_WORKER_CORES=1
  export SPARK_WORKER_INSTANCES=1
  export SPARK_WORKER_MEMORY=512M
  export LD_LIBRARY_PATH=$JAVA_LIBRARY_PATH



<think>好的,我现在遇到了一个Hadoop的问题,控制台提示“WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform...”,需要解决这个问题。首先,我要理解这个警告的含义。 这个警告是说Hadoop无法加载本地库,可能是因为平台不支持或者库文件不存在。Hadoop的某些组件,比如压缩和解压,使用本地库可以提高性能,如果无法加载,可能会回退到Java实现,性能可能受影响,但功能还是可用的。 接下来,我需要确定问题具体原因。可能的因素包括:本地库文件是否缺失、Hadoop的二进制包是否与当前平台兼容(例如,32位和64位不匹配)、环境变量配置是否正确等。 首先,检查Hadoop安装目录下的lib/native目录,看看是否存在对应的.so文件。如果不存在,可能需要重新编译Hadoop或者下载包含本地库的二进制包。另外,确认系统是否是64位的,Hadoop预编译的本地库通常是64位的,如果系统是32位,可能需要自己编译。 然后,检查环境变量HADOOP_HOME和HADOOP_COMMON_LD_LIBRARY_PATH是否正确设置,确保指向了包含本地库的目录。有时候需要将这些路径添加到LD_LIBRARY_PATH中。 如果确认库文件存在且平台兼容,但仍有警告,可能需要忽略该警告,或者升级Hadoop版本。某些旧版本的Hadoop可能在某些平台上存在兼容性问题,更新到新版本可能解决。 最后,测试解决方案是否有效,例如运行Hadoop命令,查看警告是否消失,或者性能是否有改善。</think>出现 `WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform...` 警告时,表明 Hadoop 无法加载与当前操作系统平台兼容的本地库(Native Library)。以下是分步解决方案: --- ### **1. 确认警告的影响** - **功能性影响**:Hadoop 的核心功能仍可正常运行,但依赖本地库的组件(如压缩算法 `zlib`、`snappy`)会回退到纯 Java 实现,性能可能下降。 - **无需修复的场景**:如果集群对性能不敏感,可忽略此警告。 --- ### **2. 检查本地库是否存在** 进入 Hadoop 安装目录的 `lib/native` 路径,检查是否存在 `.so`(Linux)或 `.dll`(Windows)文件: ```bash cd $HADOOP_HOME/lib/native ls -l ``` - **若目录为空**:说明未正确安装本地库。 - **若文件存在**:检查平台兼容性(如 64 位系统需对应 64 位库)。 --- ### **3. 解决方案** #### **情况 1:本地库缺失** **原因**:Hadoop 官方预编译的二进制包可能未包含某些平台的本地库。 **解决步骤**: 1. **下载含本地库的 Hadoop 包** 从 Hadoop 官网或镜像站下载带有 `-native` 标识的二进制包,例如 `hadoop-x.x.x.tar.gz`(包含预编译的本地库)。 2. **替换或补充本地库** 解压下载的包,将其 `lib/native` 目录下的文件复制到当前 Hadoop 的 `lib/native` 中。 --- #### **情况 2:平台不兼容** **原因**:系统架构(如 32 位)与本地库架构(通常为 64 位)不匹配。 **解决步骤**: 1. **确认系统架构** 执行以下命令检查系统位数: ```bash uname -m ``` - 输出应为 `x86_64`(64 位系统)。若为 `i386` 或 `i686`,则为 32 位系统。 2. **重新编译 Hadoop 本地库**(适用于 32 位系统或自定义平台) 需安装编译工具链(如 GCC、CMake)后,执行: ```bash cd $HADOOP_SOURCE_DIR mvn package -Pdist,native -DskipTests -Dtar ``` 编译完成后,从生成的 `hadoop-dist/target` 目录中获取新的 `lib/native` 文件。 --- #### **情况 3:环境变量未配置** **原因**:Hadoop 未正确识别本地库路径。 **解决步骤**: 1. **设置 `LD_LIBRARY_PATH`** 在 `hadoop-env.sh` 中添加以下行: ```bash export HADOOP_COMMON_LD_LIBRARY_PATH=$HADOOP_HOME/lib/native export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$HADOOP_COMMON_LD_LIBRARY_PATH ``` 2. **应用配置并重启 Hadoop** 执行 `source hadoop-env.sh` 后重启 Hadoop 服务。 --- ### **4. 验证修复结果** 运行以下命令检查本地库是否加载成功: ```bash hadoop checknative ``` - **期望输出**: ``` zlib: true snappy: true zstd : true ... ``` --- ### **5. 其他建议** - **升级 Hadoop 版本**:旧版本可能缺少对新系统的支持。 - **忽略警告**:在 `log4j.properties` 中关闭 NativeCodeLoader 的警告: ```properties log4j.logger.org.apache.hadoop.util.NativeCodeLoader=ERROR ``` --- **总结**:此警告通常由本地库缺失或平台不兼容引起。优先通过补充本地库或配置环境变量解决,若对性能无要求,也可选择忽略。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值