Hadoop学习(源码编译篇)

Hadoop学习(源码编译篇)

1.为什么要进行源码编译

网上说Hadoop官网没有提供32位的编译好的Hadoop,这其实是假的,自从2.5版本以后,官方已经提供了64位的编译好的Hadoop,你可以到lib/native目录下通过命令:

$file libhadoop.so.1.0.0

#如果查看到有如下信息代表已经是64-bit
libhadoop.so.1.0.0: ELF 64-bit LSB shared object, x86-64, version 1 (SYSV),

那为什么我们还要编译源码呢,官方是这么解释的:

Note: Depending on your environment, the term “native libraries” could refer to all *.so’s you need to compile; and, the term “native compression” could refer to all *.so’s you need to compile that are specifically related to compression. Currently, however, this document only addresses the native hadoop library (libhadoop.so). The document for libhdfs library (libhdfs.so) is here.

Hadoop has native implementations of certain components for performance reasons and for non-availability of Java implementations. These components are available in a single, dynamically-linked native library called the native hadoop library. On the *nix platforms the library is named libhadoop.so.

我们需要linux系统要运行Native 代码,首先要将Native 编译成目标CPU 架构的[.so]文件。源码编译就是为了连接本地库生成对应的[.so]文件。

2.为什么不用官方的编译好的Hadoop

官方编译好的Hadoop不一定是完全切和我们的虚拟机的,其实你可以下载一个已经编译好的64位的Hadoop会来,然后通过官方的检测命令可以是否能正确加载本地库组件。通过以下命令检测:

$ hadoop checknative -a

官方给出的正确加载的应该会显示这样的信息(不过这里的bzip2好像没有加载啊,搞得会使用纯Java版本):

14/12/06 01:30:45 WARN bzip2.Bzip2Factory: Failed to load/initialize native-bzip2 library system-native, will use pure-Java version
   14/12/06 01:30:45 INFO zlib.ZlibFactory: Successfully loaded & initialized native-zlib library
   Native library checking:
   hadoop: true /home/ozawa/hadoop/lib/native/libhadoop.so.1.0.0
   zlib:   true /lib/x86_64-linux-gnu/libz.so.1
   snappy: true /usr/lib/libsnappy.so.1
   lz4:    true revision:99
   bzip2:  false

主要还是查看Native library checking下面的这个部分

2.1如果使用编译好的Hadoop

如果直接使用官方编译好的Hadoop版本,就可能会出现以下情况(这个是我直接从官网下载的Hadoop2.7.1版本):

java.lang.UnsatisfiedLinkError: Cannot load libsnappy.so.1 (libsnappy.so.1: cannot open shared object file: No such file or directory)!
......
......
Native library checking:
hadoop:  true /home/liangwenyao/hadoop/hadoop-2.7.1/lib/native/libhadoop.so.1.0.0
zlib:    true /lib/x86_64-linux-gnu/libz.so.1
snappy:  false 
lz4:     true revision:99
bzip2:   false 
openssl: false Cannot load libcrypto.so (libcrypto.so: cannot open shared object file: No such file or directory)!

我们可以看到抛出错误:

ERROR snappy.SnappyCompressor: failed to load SnappyCompressor
java.lang.UnsatisfiedLinkError: Cannot load libsnappy.so.1 (libsnappy.so.1: cannot open shared object file: No such file or directory)!

openssl: false Cannot load libcrypto.so (libcrypto.so: cannot open shared object file: No such file or directory)!

这是因为没有加载到snappy,openssl,bzip2

解决办法:

1.安装snappy

sudo apt-get install snappy libsnappy*

之后把/usr/lib/libsnappy1.0 复制到$HADOOP_HOME/lib/native下。(这步看情况,有时不复制也能直接加载到。)

2.安装ssl lib包

apt-get install libssl-dev

执行过后应该能看到跟官网一样的提示信息。

3.解决bzip2包 (如果你直接使用官方编译好的Hadoop,这步还是算了,又要编译源码)

步骤一:安装bzip2包

yum -y install bzip2-devel

步骤二:重新编译源码(到Hadoop源码目录下),这个是需要源码版本的Hadoop

mvn package -Pdist,native -DskipTests -Dtar -Djavax.net.debug=all

步骤三:将编译好的文件放到官方已经编译好的版本

cp ~/hadoop-2.6.0-cdh5.7.0/hadoop-dist/target/hadoop-2.6.0-cdh5.7.0/lib/native/*  /opt/software/hadoop-2.6.0-cdh5.7.0/lib/native/

步骤四:检测

$Hadoop checknative -a

这样搞还不如下载个Hadoop源码,进行源码编译。

3.编译Hadoop源码

说了那么多,最好还是使用Hadoop官方提供的源码,自己编译安装一下。

3.1软件准备
  1. JDK1.7(这个直接不说)

  2. Maven3.3(下载Maven,配环境变量跟JDK一样,如果有镜像源,可以通过settings.xml文件配置)

  3. ant(更JDK一样,解压然后配置环境变量)

  4. glibc-headers和g++

    $yum install glibc-headers
    $yum install gcc-c++
    
  5. 安装make和cmake命令

    $yum install make
    $yum install cmake
    
  6. protocolBuffer 2.5.0(按照这个步骤就可以了)

    $tar -zxvf protobuf-2.5.0.tar.gz -C /opt/module/
    $cd /opt/module/protobuf-2.5.0/
    $./configure
    $make
    $make check
    $make install
    $ldconfig
    $vi /etc/profile
    export LD_LIBRARY_PATH=/opt/module/protobuf-2.5.0
    export PATH=$PATH:$LD_LIBRARY_PATH
    $source /etc/profile
    $protoc --version
    
  7. 安装openssl和 ncurses-devel库

    $yum install openssl-devel
    $yum install ncurses-devel
    
  8. 安装bzip2包(防止出现上面的情况,还是安装一下其他依赖包)

    yum -y install bzip2-devel lzo-devel zlib-devel libtool
    
3.2编译源码

一定要进入到Hadoop源码目录下。

$tar -zxvf hadoop-2.7.2-src.tar.gz -C /opt/
$cd hadoop-2.7.2-src
$mvn package -Pdist,native -DskipTests -Dtar 

然后就是漫长的等待。。。。。。。。。

编译成功后Hadoop编译后的包在hadoop-2.7.2-src/hadoop-dist/target下面,这里编译就完成了。

其余发生的错误请自行查找,因为不同环境会有不同的错误出现,请根据实践进行解决。源码编译篇,我就分享到这里了。

猜你喜欢

转载自blog.csdn.net/qq_43203949/article/details/106749707
今日推荐