报错信息如下:
WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable
本地库找不到, 但是这个错误不影响集群的运行。
什么原因呢?网上的争议是hadoop支持的位数与linux的centos64bit版本冲突。
可以参考这篇博客:
检验一下hadoop的版本:打开/hadoop/lib/native目录,用ldd命令查看libhadoop.so.1.0.0依赖库。
#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 => (0x00007ffff7283000)
libdl.so.2 => /lib64/libdl.so.2 (0x00007f68ecf45000)
libc.so.6 => /lib64/libc.so.6 (0x00007f68ecbb0000)
/lib64/ld-linux-x86-64.so.2 (0x00007f68ed36f000)
而系统的glibc库版本如下:
#ldd --version
ldd (GNU libc) 2.12
2.12版本不满足需求2.14
这位博主采取最简洁的办法
在hadoop/etc/hadoop/log4j.properties文件中添加
log4j.logger.org.apache.hadoop.util.NativeCodeLoader=ERROR
保存之后,重新启动hadoop伪分布集群,不再报错。
Hadoop 源码编译并安装Snappy压缩
补充:经过一段时间的深入学习,找到了根本原因,报错是因为直接在官方网站下载的Hadoop 安装包,然后安装启动的Hadoop集群,所以缺少Hadoop本地库,可以下载Hadoop对应版本的源码进行编译,生成需要的本地库,然后替换集群上的本地库就可以了。
特别提醒:
1、参考哪里来进行源码编译:Hadoop源码文件夹下的BUILDING.txt文件
2、要注意的问题
(1)网络要保持畅通
(2)几个依赖软件要提前安装
(3)要注意版本:jdk1.7(因为1.8和hadoop2.2和2.6版本不匹配)
(4)Setting 文件的替换(用阿里的镜像站,开源中国的好像现在还是不能用)
(5)Snappy安装使用默认的安装路径
步骤:
①在root用户下检查并安装gcc-c++
[root@pc1 ~]# yum install -y gcc-c++
②上传apache-maven-3.3.3-bin.tar.gz,解压,配置环境变量,查看是否配置成功。
③安装ProtocolBuffer
[root@pc1 java]# tar -zxvf protobuf-2.5.0.tar.gz
[root@pc1 java]# mv protobuf-2.5.0 protobuf
[root@pc1 java]# cd protobuf
[root@pc1 protobuf]# ./configure --prefix=/usr/local/protobuf
[root@pc1 protobuf]# make
[root@pc1 protobuf]# make check
[root@pc1 protobuf]# make install
配置环境变量,并查看是否安装成功
[root@pc1 protobuf]# cd /usr/local/protobuf
[root@pc1 protobuf]# protoc --version
④安装cmake
[root@pc1 protobuf]# yum -y install cmake
⑤安装zlib
[root@pc1 protobuf]# yum -y install zlib
⑥ openssl devel
[root@pc1 protobuf]# yum -y install openssl-devel
⑦安装snappy
[root@pc1 java]# tar -zxvf snappy-1.1.3.tar.gz
[root@pc1 java]# mv snappy-1.1.3 snappy
[root@pc1 java]# cd snappy
[root@pc1 snappy]# ./configure;make;make install
⑧Hadoop源码编译
下载并解压hadoop-2.6.0-src.tar.gz,然后进入hadoop-2.6.0-src目录编码Hadoop源码和Snappy压缩。 选择其它版本的Hadoop也可以。
1、执行mvn package -Pdist,native -DskipTests -Dtar -Dbundle.snappy -Dsnappy.lib=/usr/share
然后一直等待,直到hadoop源码编译成功,出现下图表示成功。
2、Hadoop源码编译成功之后,在hadoop-2.2.0-src/hadoop-dist/target目录找到编译后的hadoop 安装包,即hadoop-2.2.0.tar.gz,然后输入命令tar -zxvf hadoop-2.2.0.tar.gz解压安装包得到hadoop-2.2.0.
3、输入命令cd ./hadoop-2.2.0/lib/native,切换到native目录下,会发现多了一些和snappy有关的文件。
4、输入命令cp ./* /usr/java/hadoop/lib/native(注意:这里的路径要和自己本地的路径对应)把该native目录下的文件copy到原hadoop安装目录下的native目录里,简单的说就是替换原来的native。然后切换到原hadoop安装目录下的native目录下,查看是否替换成功(这里可以提前看一下原native和现native里边文件的区别,做个对照)
5、最后输入命令hadoop checknative -a检查本地库是否安装成功。出现如下结果表示安装成功。
注意:如果用mvn命令编译源码时出现-bash: mvn: command not found这种错误,可以重新打开/etc/profile ,然后重新使配置文件生效source /etc/profile,然后再执行mvn命令
到这里,Hadoop 源码编译完毕.
Hadoop 配置Snappy压缩
①配置hadoop-env.sh
修改hadoop-env.sh配置文件,增加以下配置
export HADOOP_HOME=/usr/java/hadoop 安装目录
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$HADOOP_HOME/lib/native
②配置core-site.xml
修改core-site.xml配置文件,增加以下配置
<property>
<name>io.compression.codecs</name>
<value>org.apache.hadoop.io.compress.SnappyCodec</value>
</property>
③配置mapred-site.xml
如果MR中间结果需要使用snappy压缩,修改mapred-site.xml
<property>
<name>mapreduce.map.output.compress</name>
<value>true</value>
</property>
<property>
<name>mapreduce.map.output.compress.codec</name>
<value>org.apache.hadoop.io.compress.SnappyCodec</value>
</property>