zoukankan      html  css  js  c++  java
  • HADOOP docker(八):hadoop本地库

    小伙伴还记得每次启动hdfs就会报can't find native libriaries吗?今天我们就来聊聊这个~
    文档:http://hadoop.apache.org/docs/r2.7.3/hadoop-project-dist/hadoop-hdfs/CentralizedCacheManagement.html

    前言

    理论上讲,本地类指你的机器上所有"*.so"文件,这些文件在编译的时候会用到。这里只讲hadoop相关的libhadoop.so。

    2. Native Hadoop Library

    hadoop使用本地库解决某些组件的性能问题,这些库不在JVM中。在*NIX机器上称作libhadoop.so

    3. 使用本地库

    两种方式:

    1. 下载当前系统对应的hadoop版本
    2. 下载源码,在当前机上编译hadoop。

    如果当前机器上没有这些库,先装上。在下载库时,同时下载多个版本的压缩包(zlib,gzip类型)
    原文(我是没看明白):

    Install the compression codec development packages (>zlib-1.2, >gzip-1.2):
    If you download the library, install one or more development packages - whichever compression codecs you want to use with your deployment.
    If you build the library, it is mandatory to install both development packages.

    4. 本地库组件

    • Compression Codecs (bzip2, lz4, snappy, zlib)
      压缩类的 bzip2 lz4 snappy zlib
    • Native IO utilities for HDFS Short-Circuit Local Reads and Centralized Cache Management in HDFS
      本地IO单元,hdfs本地读及缓存集中管理会用到
    • CRC32 checksum implementation
      CRC32检校

    5. 支持的平台

    本地库仅支持*NIX平台,不支持cygwi和mac平台
    hadooop本地库主要支持GNU/Linux平台,在该平台上大量测试:

    • RHEL4/Fedora
    • Ubuntu
    • Gentoo

    6. 下载

    预编译的32-bit i386-Linux本地库已经被压缩到hadoop压缩包下的lib/native下,但需要下载相应的弄开发包(以上几个本地库的开发包)。

    7. 编译

    hadoop本地库是用ANSI C写的,并且GNU autotools-chain (autoconf, autoheader, automake, autoscan, libtool)来编译的,因引强烈建议在自己的平台上编译hadoop.

    编译hadoop,要安装以下几个组件:

    • C compiler (e.g. GNU C Compiler)
    • GNU Autools Chain: autoconf, automake, libtool
    • zlib-development package (stable version >= 1.2.0)
    • openssl-development package(e.g. libssl-dev)
      可以在hadoop的pom.xml中加入这个包。然后执行编译:
      $ mvn package -Pdist,native -DskipTests -Dtar

    $ hadoop-dist/target/hadoop-2.7.3/lib/native下能看到本地库

    注意:
    1.最好下载同时下载zip gzip两种本地库安装包
    2.对应32/64位JVM,下载好对应的32/64的zlib包。

    8. 运行时观察

    执行bin/hadoop时:

    1. If everything is all right, then: DEBUG util.NativeCodeLoader - Trying to load the custom-built native-hadoop library… INFO util.NativeCodeLoader - Loaded the native-hadoop library
      如果本地库安装正常,则。。。
      2 .If something goes wrong, then: INFO util.NativeCodeLoader - Unable to load native-hadoop library for your platform… using builtin-java classes where applicable
      如果不正常,则。。。

    9. 检查本地库

    NativeLibraryChecker能检查hadoop 本地库是否被加载:

       $ hadoop checknative -a
       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

    10. 如果共享本地库

    可以使用DistributedCache来共享本地库,以mr任务为例:

    1. 先将本地库复制到hdfs上:
      bin/hadoop fs -copyFromLocal mylib.so.1 /libraries/mylib.so.1
    2. 在启动任务时加上:
      DistributedCache.createSymlink(conf); DistributedCache.addCacheFile("hdfs://host:port/libraries/mylib.so. 1#mylib.so", conf)
    3. 在mr任务中使用:
      System.loadLibrary("mylib.so");

    提示:当安装了本地库或者编译了hadoop时不需要能过DistributedCache来共享本地库

    有很多地方不是很清楚~

    [========]

    2017/07/03修改:
    最近在家新装的一个虚拟机环境,centos6.8 hadoop-2.8.0,报本地库错误:

    决定解决一下,在网上找了一些办法:
    http://www.superwu.cn/2016/06/20/3053/

    首先修改hadoop日志级别,打印出debug日志:

    [root@hadoop4 ~]# export HADOOP_ROOT_LOGGER=DEBUG,console
    [root@hadoop4 ~]# hadoop checknative -a
    17/06/27 17:14:53 DEBUG util.NativeCodeLoader: Trying to load the custom-built native-hadoop library…
    17/06/27 17:14:53 DEBUG util.NativeCodeLoader: Failed to load native-hadoop with error: java.lang.UnsatisfiedLinkError: /opt/hadoop-2.8.0/lib/native/libhadoop.so.1.0.0: /lib64/libc.so.6: version `GLIBC_2.14' not found (required by /opt/hadoop-2.8.0/lib/native/libhadoop.so.1.0.0)17/06/27 17:14:53 DEBUG util.NativeCodeLoader: java.library.path=/opt/hadoop-2.8.0/lib/native
    17/06/27 17:14:53 WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform… using builtin-java classes where applicable
    17/06/27 17:14:53 DEBUG util.Shell: setsid exited with exit code 0
    Native library checking:
    hadoop:  false 
    zlib:    false 
    snappy:  false 
    lz4:     false 
    bzip2:   false 
    openssl: false 
    17/06/27 17:14:53 INFO util.ExitUtil: Exiting with status 1

    看到/opt/hadoop-2.8.0/lib/native/libhadoop.so.1.0.0这个本地库要用到GLIBC_2.14,本机上的gblic是2.11.

    [root@hadoop4 ~]# 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

    然后按照上面网址中的方法,下载glibc2.14并编译,然后修改系统默认的glibc:

    下载
    wget http://mirror.bjtu.edu.cn/gnu/libc/glibc-2.14.tar.xz
    解压
    tar xvf glibc-2.14.tar.gz
    编译
    cd glibc-2.14
    mkdir build
    cd build
    ../configure --prefix=/usr/local/glibc-2.14   // 配置glibc并设置当前glibc-2.14安装目录
    make -j4
    make install
    安装完了,我们接下来要去更新系统的lib库,先复制libc-2.14.so到/lib64目录下
    cp /usr/local/glibc-2.14/lib/libc-2.14.so /lib64/libc-2.14.so
    备份原来的/lib64/libc.so.6
    mv /lib64/libc.so.6 /lib64/libc.so.6.bak
    备份好了,ls看一下
    [root@hadoop001 ~]# ls
    ls: error while loading shared libraries: libc.so.6: cannot open shared object file: No such file or directory
    如下图所示:
    oh,No,ls命令不能用啦,咋回事,这还能不能愉快的玩耍啦,不要着急,我们continue吧
    export LD_PRELOAD=/lib64/libc-2.14.so
    ln -s /lib64/libc-2.14.so  /lib64/libc.so.6

    这时再执行hadoop checknative -a就不会报gblic-2.14的错,但是其它的本地库依然找不到.根据hadoop文档,安装这些包的开发包:

    yum install -y zlib-devel
    yum install -y snappy-devel
    yum install -y bzip2-devel
    yum install -y openssl-devel

    就不会报本地库的错误了.
    首先说一下,hadoop2的版本中应该都包含了libhadoop.so.1.0.0这个东西,目测这个库就是引用本地库的东西.但是不同版本的hadoop编译时使用的gblic版本也不同,因此需要对应的gblic版本才能运行libhadoop.so.1.0.0这个库,当安装了对应的gblic版本后,该库就可以发挥使用引用本地的其它库.

    感谢万能的网友!





  • 相关阅读:
    SQL Select Case
    Fxcop:Globlization warning/全球化警告
    How to get free(available) physical memory/获取可用的内存
    CA2000: Dispose objects before losing scope/在退出作用域前Dispose object
    并行编译Parallel Building
    VS2010 WebInstall/web安装
    欧洲天空访问
    .NET Framework Client Profile/.net framework 客户端配置
    新书推荐:Practical Code Generation in .NET: Covering Visual Studio 2005, 2008, and 2010
    Disable floppy driver(禁用软盘)
  • 原文地址:https://www.cnblogs.com/skyrim/p/7455280.html
Copyright © 2011-2022 走看看