默认情况下,hadoop官方发布的二进制包是不包含native库的,native库是用C++实现的,用于进行一些CPU密集型计算,如压缩。比如apache kylin在进行预计算时为了减少预计算的数据占用的磁盘空间,可以配置使用压缩格式。

默认情况下,启动spark-shell,会有无法加载native库的警告:

19/02/14 09:55:41 WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable

spark使用hadoop native库_java

 

1. 编译hadoop源码

具体请参见本人的博文

或者在hadoop源码根目录下,执行ant compile-native 编译本地库(未亲测)

编译好中之后在{hadoop_source_root}/hadoop-dist/target/hadoop-{hadoop_version}/lib/native会存在编译好的native库文件,具体路径,请自己替换为匹配的版本。在本人的机器上显示如下,本人机器上用的是hadoop-2.7.3,所以路径为

{hadoop_source_root}/hadoop-dist/target/hadoop-2.7.3/lib/native

[druid@palo101 native]$ ls -lh
total 4.6M
-rw-rw-r-- 1 druid druid 1.2M Feb  6 21:53 libhadoop.a
-rw-rw-r-- 1 druid druid 1.6M Feb  6 21:53 libhadooppipes.a
lrwxrwxrwx 1 druid druid   18 Feb  6 21:53 libhadoop.so -> libhadoop.so.1.0.0
-rwxrwxr-x 1 druid druid 710K Feb  6 21:53 libhadoop.so.1.0.0
-rw-rw-r-- 1 druid druid 465K Feb  6 21:53 libhadooputils.a
-rw-rw-r-- 1 druid druid 425K Feb  6 21:53 libhdfs.a
lrwxrwxrwx 1 druid druid   16 Feb  6 21:53 libhdfs.so -> libhdfs.so.0.0.0
-rwxrwxr-x 1 druid druid 267K Feb  6 21:53 libhdfs.so.0.0.0

2. 部署编译好的hadoop native库

.删除hadoop部署环境下的native库(如果存在的话)

rm -rf  $HADOOP_HOME/lib/native

复制编译好的native库到hadoop部署目录

scp  -r {hadoop_source_root}/hadoop-dist/target/hadoop-2.7.3/lib/native  {hadoop集群节点IP}:$HADOOP_HOME/lib

注意:复制到集群节点上.

 

3. 复制libjvm.so文件到$HADOOP_HOME/lib/native目录下

用ldd查看一下生成的native二进制文件的信息,发现libjvm.so找不到

[druid@palo101 native]$ sudo ldd $HADOOP_HOME/lib/native/libhadoop.so
        linux-vdso.so.1 =>  (0x00007ffe12bad000)
        libdl.so.2 => /lib64/libdl.so.2 (0x00007fee0127c000)
        libjvm.so => not found
        libc.so.6 => /lib64/libc.so.6 (0x00007fee00eba000)
        /lib64/ld-linux-x86-64.so.2 (0x00007fee016ba000)

spark使用hadoop native库_java_02

所以我们在每台机器上执行下面脚本,把libjvm.so文件复制到hadoop native lib目录下

cp  $JAVA_HOME/jre/lib/amd64/server/libjvm.so   $HADOOP_HOME/lib/native

 复制过去后,再执行一下下面的命令检查一下二进制native库

sudo ldd $HADOOP_HOME/lib/native/libhadoop.so

spark使用hadoop native库_hadoop_03

一切正常,说明部署已经没有问题了。下面就来做一下配置

 

4. 配置使用native库

4.1 hadoop启用native库

vim $HADOOP_HOME/etc/hadoop/core-site.xml

 添加配置项

<property>
  <name>hadoop.native.lib</name>
  <value>true</value>
  <description>Should native hadoop libraries, if present, be used.</description>
</property>

4.2 添加环境变量

vim /etc/profile

在末尾添加

export LD_LIBRARY_PATH=$HADOOP_HOME/lib/native

也可以在shell窗口中执行这个命令,但是是临时生效,shell窗口关闭就失效了。

 

5. 在shell中验证是否成功

spark使用hadoop native库_linux_04

发现警告已经消失,成功使用了hadoop本地库.