报错信息如下

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++

Hadoop hdfs未启动_Hadoop

Hadoop hdfs未启动_java_02

②上传apache-maven-3.3.3-bin.tar.gz,解压,配置环境变量,查看是否配置成功。

Hadoop hdfs未启动_Hadoop hdfs未启动_03

Hadoop hdfs未启动_Hadoop hdfs未启动_04

Hadoop hdfs未启动_Hadoop hdfs未启动_05

③安装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

Hadoop hdfs未启动_hadoop_06

④安装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源码编译成功,出现下图表示成功。

Hadoop hdfs未启动_Hadoop hdfs未启动_07

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有关的文件。

Hadoop hdfs未启动_hadoop_08

4、输入命令cp ./* /usr/java/hadoop/lib/native(注意:这里的路径要和自己本地的路径对应)把该native目录下的文件copy到原hadoop安装目录下的native目录里,简单的说就是替换原来的native。然后切换到原hadoop安装目录下的native目录下,查看是否替换成功(这里可以提前看一下原native和现native里边文件的区别,做个对照)

5、最后输入命令hadoop checknative -a检查本地库是否安装成功。出现如下结果表示安装成功。

Hadoop hdfs未启动_java_09

注意:如果用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>