小伙伴还记得每次启动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版本后,该库就可以发挥使用引用本地的其它库.

感谢万能的网友!

HADOOP docker(八):hadoop本地库的更多相关文章

  1. HADOOP docker(五):hadoop用户代理 Proxy user

    1.hadoop用户代理简介2.配置3.实验 1.hadoop用户代理简介 hadoop用户代理功能的作用是让超级用户superuser模拟一个普通用户来执行任务.比如用户joe通过oozie提交一个 ...

  2. 使用Docker搭建Hadoop集群(伪分布式与完全分布式)

    之前用虚拟机搭建Hadoop集群(包括伪分布式和完全分布式:Hadoop之伪分布式安装),但是这样太消耗资源了,自学了Docker也来操练一把,用Docker来构建Hadoop集群,这里搭建的Hado ...

  3. docker搭建Hadoop集群

    一个分布式系统基础架构,由Apache基金会所开发. 用户可以在不了解分布式底层细节的情况下,开发分布式程序.充分利用集群的威力高速运算和存储. 首先搭建Docker环境,Docker版本大于1.3. ...

  4. Docker部署Hadoop集群

    Docker部署Hadoop集群 2016-09-27 杜亦舒 前几天写了文章"Hadoop 集群搭建"之后,一个朋友留言说希望介绍下如何使用Docker部署,这个建议很好,Doc ...

  5. docker安装hadoop

    docker为hadoop的云化带来了极大便利,安装和应用也会更快更方便.进入正题: docker search hadoop 将会看到如下结果: INDEX NAME DESCRIPTION STA ...

  6. docker安装hadoop集群

    docker安装hadoop集群?图啥呢?不图啥,就是图好玩.本篇博客主要是来教大家如何搭建一个docker的hadoop集群.不要问 为什么我要做这么无聊的事情,答案你也许知道,因为没有女票.... ...

  7. 暑假第二弹:基于docker的hadoop分布式集群系统的搭建和测试

    早在四月份的时候,就已经开了这篇文章.当时是参加数据挖掘的比赛,在计科院大佬的建议下用TensorFlow搞深度学习,而且要在自己的hadoop分布式集群系统下搞. 当时可把我们牛逼坏了,在没有基础的 ...

  8. docker 安装hadoop

    上一篇文章介绍了一些docker的基本命令,这篇文章来安装一个HADOOP 一.下载hadoop镜像 @~/git/github/docker-ambari (master)$ docker pull ...

  9. Docker 安装Hadoop HDFS命令行操作

    网上拉取Docker模板,使用singlarities/hadoop镜像 [root@localhost /]# docker pull singularities/hadoop 查看: [root@ ...

随机推荐

  1. javascript中的栈堆内存

    <--------栈内存---------> 俗称叫做作用域(全局作用域/私有作用域) >为js代码提供的执行环境(执行js代码的地方) >基本数据内省是直接存放在栈内存中的 ...

  2. #leetcode刷题之路7- 整数反转

    给出一个 32 位的有符号整数,你需要将这个整数中每位上的数字进行反转. 示例 1:输入: 123输出: 321 示例 2:输入: -123输出: -321 示例 3:输入: 120输出: 21 #i ...

  3. nginx知识总结

    nginx知识总结 一.功能 负载均衡 反向代理 静态资源服务器 二.来源 nginx 俄罗斯第二网站开源项目 tengine 淘宝团队基于nginx开发的 区别:nginx安装之后还得装第三方软件包 ...

  4. DOM中的事件傳播機制

    要講到事件傳播機制之前,首先要瞭解的是 什麼是事件? 事件,發生在靜態頁面與動態行為之間的交互行為.是JavaScript 和 HTML的交互是通过事件实现的.比如,按鈕的點擊,鼠標的滑過,鍵盤的輸入 ...

  5. 第3天 Java基础语法

    第3天 Java基础语法 今日内容介绍 引用数据数据类型(Scanner.Random) 流程控制语句(if.for.while.dowhile.break.continue) 引用数据类型 Scan ...

  6. 用kubeadm构建k8s集群部署

    一.环境 三台centos机器 二.软件及容器准备 1.安装docker环境 本例安装 docker-ce版本,repo源为docker-ce.repo文件,拷贝到 /etc/yum.repos.d下 ...

  7. epoll 服务端 ET模式

    windows下IOCP, linux下 epoll. epoll模型其实也是一个同步模型,ET是epoll里面的一种模式,叫 边缘触发. 个人理解,类似于 windows下的事件选择模型.代码如下: ...

  8. 001-快速排序(C++实现)

    快速排序的基本实现 快速排序算法是一种基于交换的高效的排序算法,它采用了分治法的思想: 1.从数列中取出一个数作为基准数(枢轴,pivot). 2.将数组进行划分(partition),将比基准数大的 ...

  9. Scratch入门课程(1)——把工具准备好

    为了让更多的同学了解少儿编程,从今天开始,我将以每周1次的频率发布Scratch的入门课程,大约在30课时左右. 几点情况说明: 1.这批课程主要面向2-4年级的同学,难度都不大,按照教程可以很轻松地 ...

  10. 5 属性 property

    1.属性  property 调用私有属性通过实例方法调用.达到这种效果 #property的作用:相当于把方法进行了封装, 开发者在对属性设置数据的时候更方便 class Dog(object): ...