[hdfs@tsczbddbprd3 ~]$ /data/hadoop/bin/hadoop checknative -a
19/04/28 01:28:56 WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable
Native library checking:
hadoop: false
zlib: false
snappy: false
lz4: false
bzip2: false
openssl: false
从上面可以看到native lib加载失败,我们使用debug日志来看看到底为什么?
[hdfs@tsczbddbprd3 ~]$ export HADOOP_ROOT_LOGGER=DEBUG,console
[hdfs@tsczbddbprd3 ~]$ /data/hadoop/bin/hadoop checknative -a
19/04/28 01:40:22 DEBUG util.NativeCodeLoader: Trying to load the custom-built native-hadoop library...
19/04/28 01:40:22 DEBUG util.NativeCodeLoader: Failed to load native-hadoop with error: java.lang.UnsatisfiedLinkError: /data/hadoop/lib/native/libhadoop.so: /lib64/libc.so.6: version `GLIBC_2.14' not found (required by /data/hadoop/lib/native/libhadoop.so)
19/04/28 01:40:22 DEBUG util.NativeCodeLoader: java.library.path=/data/hadoop/lib/native
19/04/28 01:40:22 WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable
19/04/28 01:40:22 DEBUG util.Shell: setsid exited with exit code 0
Native library checking:
hadoop: false
zlib: false
snappy: false
lz4: false
bzip2: false
openssl: false
19/04/28 01:40:22 INFO util.ExitUtil: Exiting with status 1
原因是缺少GLIBC_2.14,查看当前的版本:
[root@tsczbddbprd3 ~]# rpm -qa | grep glibc
glibc-common-2.12-1.212.0.3.el6_10.3.x86_64
glibc-utils-2.12-1.212.0.3.el6_10.3.x86_64
glibc-headers-2.12-1.212.0.3.el6_10.3.x86_64
glibc-static-2.12-1.212.0.3.el6_10.3.x86_64
glibc-devel-2.12-1.212.0.3.el6_10.3.x86_64
glibc-2.12-1.212.0.3.el6_10.3.x86_64
[root@tsczbddbprd3 ~]# strings /lib64/libc.so.6 |grep GLIBC_
GLIBC_2.2.5
GLIBC_2.2.6
GLIBC_2.3
GLIBC_2.3.2
GLIBC_2.3.3
GLIBC_2.3.4
GLIBC_2.4
GLIBC_2.5
GLIBC_2.6
GLIBC_2.7
GLIBC_2.8
GLIBC_2.9
GLIBC_2.10
GLIBC_2.11
GLIBC_2.12
GLIBC_PRIVATE
目前不支持2.14版本, 需要升级glibc。glibc网站地址:http://ftp.gnu.org/gnu/glibc/,下载2.14的包即可。
编译命令如下(为什么需要建立build目录,这是软件编译要求):
mkdir build && cd build
../configure --prefix=/usr/local/glibc
make && make install
然后拷贝so文件到/lib64,并执行ldconfig:
cp /usr/local/glibc/lib/libc-2.14.so /lib64/
ldconfig
[root@tsczbddbprd3 lib64]# strings /lib64/libc.so.6 |grep GLIBC_
GLIBC_2.2.5
GLIBC_2.2.6
GLIBC_2.3
GLIBC_2.3.2
GLIBC_2.3.3
GLIBC_2.3.4
GLIBC_2.4
GLIBC_2.5
GLIBC_2.6
GLIBC_2.7
GLIBC_2.8
GLIBC_2.9
GLIBC_2.10
GLIBC_2.11
GLIBC_2.12
GLIBC_2.13
GLIBC_2.14
GLIBC_PRIVATE
这一步很多人会执行什么软连接,千万不要这么干 ,因为libc.so.6是很多程序必不可少的文件,如果你先删除软连接再生成新的软连接,很多命令都无法执行,甚至可能出现不能登入。 其实LINUX提供了ldconfig命令,然后自动重新生成。
测试hadoop native library:
[hdfs@tsczbddbprd3 ~]$ /data/hadoop/bin/hadoop checknative -a
19/04/28 02:03:36 DEBUG util.NativeCodeLoader: Trying to load the custom-built native-hadoop library...
19/04/28 02:03:36 DEBUG util.NativeCodeLoader: Loaded the native-hadoop library
19/04/28 02:03:36 DEBUG util.Shell: setsid exited with exit code 0
19/04/28 02:03:36 INFO bzip2.Bzip2Factory: Successfully loaded & initialized native-bzip2 library system-native
19/04/28 02:03:36 INFO zlib.ZlibFactory: Successfully loaded & initialized native-zlib library
Native library checking:
hadoop: true /data/hadoop/lib/native/libhadoop.so
zlib: true /lib64/libz.so.1
snappy: true /usr/lib64/libsnappy.so.1
lz4: true revision:99
bzip2: true /lib64/libbz2.so.1
openssl: true /usr/lib64/libcrypto.so
遗留问题,升级完之后,登入的时候会出现错误:
-bash: warning: setlocale: LC_CTYPE: cannot change locale (en_US.UTF-8): No such file or directory
-bash: warning: setlocale: LC_COLLATE: cannot change locale (en_US.UTF-8): No such file or directory
-bash: warning: setlocale: LC_MESSAGES: cannot change locale (en_US.UTF-8): No such file or directory
-bash: warning: setlocale: LC_NUMERIC: cannot change locale (en_US.UTF-8): No such file or directory
-bash: warning: setlocale: LC_TIME: cannot change locale (en_US.UTF-8): No such file or directory
大家可以参考这篇文章:https://blog.youkuaiyun.com/guitar___/article/details/77651983
解决思路是:有2个locale,实际上通过which locale只能看到一个,我们编译的glibc, /usr/local/glibc/bin/locale会去寻找一个目录,但是这个目录不存在,因此报错。
/usr/local/glibc/lib/locale/locale-archive
那么从系统默认的locale目录拷贝一个过来即可。
[root@tsczbddbprd3 build]# rm -rf /usr/local/glibc/lib/locale
[root@tsczbddbprd3 build]# mkdir -p /usr/local/glibc/lib/locale
[root@tsczbddbprd3 build]# cp /usr/lib/locale/locale-archive /usr/local/glibc/lib/locale
[root@tsczbddbprd3 build]# su - hdfs
[hdfs@tsczbddbprd3 ~]$ exit
logout
[root@tsczbddbprd3 build]#
一切正常了。