hadoop启动hdfs异常

33次阅读

共计 2003 个字符,预计需要花费 6 分钟才能阅读完成。

记录一下安装 hadoop 遇到的问题,以便后面再次遇到有个解决方式的记录,也方便其他人解决相同的问题。在安装好 hadoop 后,start-dfs.sh 的时候报了 util.NativeCodeLoader: Unable to load native-hadoop library for your platform… using builtin-java classes where applicable。
从字面上来看就是本地的 hadoop 的库并不适用于本机的平台。网上搜索后发现可能是以下三种问题导致的:

问题一:native-hadoop 的库是 32 位的,而系统是 64 位的导致不可用。

进入到 hadoop 目录下的 lib/native 目录下,linux 系统使用

file libhadoop.so.1.0.0
得到的结果是
libhadoop.so.1.0.0: ELF 64-bit LSB shared object, x86-64, version 1 (SYSV), dynamically linked, BuildID[sha1]=2c6a0dae993e827ec637437f921b30279487049c, not stripped

可以看到本地 hadoop 的库是 64 位的,我的电脑也是 64 位的。所以应该不是这个版本的问题

问题二:/etc/profile 中没有添加依赖库的地址。

这个确实我没有添加过
(1). 需要在 /etc/profile 中添加

export HADOOP_HOME=/Users/scott/hadoop-3.2.0
export HADOOP_COMMON_LIB_NATIVE_DIR=$HADOOP_HOME/lib/native
export HADOOP_OPTS="-Djava.library.path=$HADOOP_HOME/lib:$HADOOP_COMMON_LIB_NATIVE_DIR"

然后在使用 source /etc/profile 重新执行该文件使配置生效。
(2). 需要在 hadoop-env.sh 添加同样的配置

注:我这一步弄完其实 hdfs 就可以启动起来了,但是依然会报标题那个 warn。但是不影响使用了。

问题三:libhadoop.so.1.0.0 缺少了依赖库或者 glibc

linux:

使用 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 =>  (0x00007fff369ff000)
        libdl.so.2 => /lib64/libdl.so.2 (0x00007f3caa7ea000)
        libc.so.6 => /lib64/libc.so.6 (0x00007f3caa455000)
        /lib64/ld-linux-x86-64.so.2 (0x00007f3caac1b000)

这种类似的就是 glibc 版本问题,使用 ldd –version 可以查看版本。

# ldd --version
ldd (GNU libc) 2.13
Copyright (C) 2012 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
Written by Roland McGrath and Ulrich Drepper.

如果发现版本是低于刚才上面出现的 GLIBC_2.14, 就需要升级 glibc 版本。这个比较麻烦,而且有一定风险,我遇到的不是这个问题,所以没有实践这个操作。可以参考升级 glibc 版本。

mac:

还有一种情况呢,就是有的朋友可能是在 mac 上安装的 hadoop,我也这样尝试了。首先排除了问题一后,问题二基本上就解决了问题。如果尝试问题三会发现,mac 上没有 ldd 这个命令,网上说使用 otool -L 文件,这样是行不通的。
libhadoop.so 是 C 写的。需要安装 binutils,然后使用 binutils 中的 readelf 命令。
readelf -d 文件 |grep NEED

这里 - d 就是查看动态依赖库,grep NEED 就是需要的库。
不过这里其实只是列举一下 readelf 的用法

如果要去除这个 warn 可以在 hadoop 的文件夹下的 /etc/hadoop/log4j.properties 中添加
log4j.logger.org.apache.hadoop.util.NativeCodeLoader=ERROR
把错误级别调成 ERROR 就不会报这个 warn 了。

正文完
 0