本机库指南

概述

本指南介绍本机 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. 安装压缩编解码器开发包(>zlib-1.2、>gzip-1.2)
    • 如果您下载该库,请安装一个或多个开发包 - 任何您希望与部署一起使用的压缩编解码器。
    • 如果您构建该库,则必须安装这两个开发包。
  5. 检查运行时日志文件。

组件

本机 Hadoop 库包括各种组件

支持的平台

仅在 *nix 平台上支持原生 Hadoop 库。该库不适用于 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 autotools 链(autoconf、autoheader、automake、autoscan、libtool)构建。这意味着在任何具有符合标准的 C 编译器和 GNU autotools 链(请参阅支持的平台)的平台上构建库都应该很简单。

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

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

安装完必备软件包后,使用标准的 Hadoop pom.xml 文件并传递原生标志来构建原生 Hadoop 库

   $ mvn package -Pdist,native -DskipTests -Dtar

您应该在

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

请注意以下事项

  • 必须在目标平台上同时安装 zlib 和 gzip 开发包才能构建原生 Hadoop 库;但是,对于部署,如果您只想使用一种编解码器,则只需安装一个软件包就足够了。
  • 为了构建和部署原生 Hadoop 库,必须为 zlib 拥有正确的 32/64 位库,具体取决于目标平台的 32/64 位 jvm。

运行时

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

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

  • 如果一切正常,则:DEBUG util.NativeCodeLoader - 尝试加载自定义构建的原生 Hadoop 库... INFO util.NativeCodeLoader - 已加载原生 Hadoop 库
  • 如果出现问题,则:INFO util.NativeCodeLoader - 无法为您的平台加载 native-hadoop 库... 在适用的情况下使用内置 Java 类

检查

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 加载任何本机共享库,以分发和符号链接库文件。

此示例向您展示如何分发共享库 mylib.so,并从 MapReduce 任务中加载它。

  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. MapReduce 任务可以包含:System.loadLibrary("mylib.so");

注意:如果您下载或构建了本机 hadoop 库,则无需使用 DistibutedCache 向您的 MapReduce 任务提供该库。