原生库指南

概述

本指南介绍hadoop原生库,并简要讨论原生共享库。

注意:根据您的环境,"原生库"可能指需要编译的所有*.so文件;而"原生压缩"可能特指与压缩相关的需要编译的所有*.so文件。不过目前本文档仅涉及原生hadoop库(libhadoop.so)。关于libhdfs库(libhdfs.so)的文档请见此处

原生Hadoop库

出于性能考虑以及Java实现不可用的情况,Hadoop针对某些组件提供了原生实现。这些组件被整合在一个名为原生Hadoop库的动态链接库中。在*nix平台上,该库被命名为libhadoop.so

使用说明

使用原生hadoop库相当简单:

  1. 检查组件。
  2. 查看支持的平台。
  3. 可以下载一个hadoop发行版,其中会包含预构建的本地hadoop库版本,或者自行构建本地hadoop库。无论下载还是构建,该库的名称都相同:libhadoop.so
  4. Install the compression codec development packages (>zlib-1.2, >gzip-1.2):
    • 如果下载该库,请安装一个或多个开发包——根据您希望在部署中使用的压缩编解码器选择相应的包。
    • 如果构建该库,必须同时安装开发包。
  5. 检查运行时日志文件。

组件

原生hadoop库包含以下组件:

支持的平台

原生hadoop库仅支持在*nix平台上运行。该库无法与Cygwin或Mac OS X平台兼容。

原生hadoop库主要用于GNU/Linus平台,并已在以下发行版上经过测试:

  • RHEL4/Fedora
  • Ubuntu
  • Gentoo

在上述所有发行版上,32/64位的原生hadoop库将与相应32/64位的JVM兼容。

下载

预构建的32位i386-Linux原生hadoop库作为hadoop发行版的一部分提供,位于lib/native目录中。您可以从Hadoop Common Releases下载hadoop发行版。

请确保安装zlib和/或gzip开发包 - 这些是您希望在部署中使用的压缩编解码器。

构建

原生hadoop库是用ANSI C编写的,并使用GNU自动工具链(autoconf、autoheader、automake、autoscan、libtool)构建。这意味着在任何具有符合标准的C编译器和GNU自动工具链的平台上构建该库应该都很直接(参见支持的平台)。

您需要在目标平台上安装的软件包有:

  • C 编译器(例如 GNU C 编译器)
  • GNU 自动工具链: autoconf, automake, libtool
  • zlib开发包(稳定版本 >= 1.2.0)
  • openssl开发包(例如libssl-dev)

安装完必备软件包后,使用标准的hadoop pom.xml文件并通过native标志来构建原生hadoop库:

   $ mvn package -Pdist,native -DskipTests -Dtar

您应该能在以下位置看到新构建的库:

   $ hadoop-dist/target/hadoop-3.4.1/lib/native

请注意以下事项:

  • 为了构建原生hadoop库,必须在目标平台上同时安装zlib和gzip开发包;但是,如果只想使用其中一个编解码器,部署时只需安装一个包即可。
  • 为了构建和部署原生hadoop库,需要根据目标平台的32/64位JVM准备相应的32/64位zlib库。

运行时

bin/hadoop脚本通过系统属性确保原生hadoop库位于库路径上:-Djava.library.path=

在运行时,检查您的MapReduce任务的hadoop日志文件。

  • 如果一切正常,则显示:DEBUG util.NativeCodeLoader - Trying to load the custom-built native-hadoop library... INFO util.NativeCodeLoader - Loaded the native-hadoop library
  • 如果出现问题,则:WARN util.NativeCodeLoader - Unable to load native-hadoop library for your platform... using builtin-java classes where applicable

检查

NativeLibraryChecker是一个用于检查本地库是否正确加载的工具。您可以按以下方式启动NativeLibraryChecker:

   $ 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
   zstd: true /usr/lib/libzstd.so.1
   lz4:    true revision:99
   bzip2:  false

原生共享库

您可以使用DistributedCache加载任何原生共享库,用于分发和符号链接库文件。

本示例向您展示如何在类Unix系统中分发共享库mylib.so,并从MapReduce任务中加载它。

  1. 首先将库文件复制到HDFS:bin/hadoop fs -copyFromLocal libmyexample.so.1 /libraries/libmyexample.so.1
  2. 作业启动程序应包含以下内容:DistributedCache.createSymlink(conf); DistributedCache.addCacheFile("hdfs://host:port/libraries/libmyexample.so.1#libmyexample.so", conf);
  3. MapReduce任务可以包含:System.loadLibrary("myexample");

注意:如果您下载或构建了原生hadoop库,则无需使用DistibutedCache即可让该库对您的MapReduce任务可用。