如何为 Oracle Solaris 11 构建本地 Hadoop 库

作者:Stefan Schneider

如何在 Oracle Solaris 11 上构建和部署本地库以提高 Hadoop 的性能。


2013 年 5 月发布


Hadoop 1.0.4. 下载是 Oracle Solaris 11 附带的现成功能产品。Hadoop 能够使用本地平台库,以提高 Hadoop 套件运行速度。这些本地库需要下载或构建。

想对本文发表评论吗?请将链接发布在 Facebook 的 OTN Garage 页面上。有类似文章要分享?请将其发布在 Facebook 或 Twitter 上,我们来进行讨论。

构建和部署本地库包括以下步骤:

前提条件

本文假设满足以下条件:

  • Hadoop 安装在 /usr/local/hadoop 目录中,该目录由 Hadoop 管理用户 hadoop 拥有,并对该用户可写。
  • Snappy 压缩库在 /usr/local/lib 目录中。
  • 带 Hadoop 的 Oracle Solaris 11 系统可以使用信息库安装其他软件包。

配置 Oracle Solaris 11 系统

Oracle Solaris 11 系统需要安装以下软件包才能构建本地 Hadoop 库:

  • solarisstudio-123 (Oracle Solaris Studio)
  • automake
  • autoconf
  • ant
  • libtool
  • gcc
  • JDK 6

JDK 6 软件包是 Hadoop 在运行时唯一需要的软件包。其他软件包只在构建库时才需要。

Oracle Solaris 11 构建系统需要能够与其 solaris 信息库交互,并需要能够访问托管 Oracle Solaris Studio 12.3 的信息库。

Oracle Solaris Studio 是一个免费的开发人员套件,Oracle Solaris Studio 页面上进行了介绍并提供了下载。

您可以使用 root 权限通过以下命令从 Oracle Solaris 11 IPS 服务器安装其他软件包:

$ pkg install automake autoconf ant libtool gcc-45 jdk-6

该安装命令是幂等的,这意味着可以多次调用而无任何负面影响。这些程序包将根据需要安装。如果所有软件包均已安装,该命令将不起作用。

配置 Hadoop 管理帐户

假设您将使用 Hadoop 管理帐户构建本地 Hadoop 库。本地库的来源是 Hadoop 的安装 tarball 的一部分。使用 Hadoop 管理帐户可确保这些库有恰当的所有权和正确的访问权限。需要在 Hadoop 运行时使用的 Hadoop 帐户的访问权限。

您应设置几个 shell 变量,让构建过程与 JDK 6 协同工作。此外,构建过程还需要能够找到 Hadoop 配置目录。

假设 Hadoop 管理帐户使用 bash shell。可以通过在 Hadoop 管理帐户主目录的 .profile.bashrc 文件中添加以下行来设置变量:

export PATH=/usr/jdk/instances/jdk1.6.0/bin:$PATH:/usr/local/hadoop/bin
export JAVA_HOME=/usr/jdk/instances/jdk1.6.0
export HADOOP_CONF_DIR=/usr/local/hadoop/conf 

下载并安装 Google Snappy

Google Snappy 压缩库提高了 Hadoop 压缩任务的速度。您可以在 Scalingbits.com 上找到有关这些库的 Oracle Solaris 11 构建过程说明。

构建本地 Hadoop 库

在本文档的其余部分,假设 HADOOP_DIR 变量设置为相应的值:

HADOOP_DIR=/usr/local/hadoop

修补 NativeIO.java 文件

Oracle Solaris 有特定的文件 I/O 标志。您需要在 $HADOOP_DIR/src/core/org/apache/hadoop/io/nativeio/NativeIO.java 文件中更新这些标志的值。

以下是您需要更改的 Java 常量:

   public static final int O_CREAT    = 0x100;
   public static final int O_EXCL     = 0x400;
   public static final int O_NOCTTY   = 0x800;
   public static final int O_TRUNC    = 0x200;
   public static final int O_APPEND   = 0x08;
   public static final int O_NONBLOCK = 0x80;
   public static final int O_SYNC     = 0x10;

修补 Makefile.am 文件

Oracle Solaris 需要一些特定标志用于 gcc 编译器。在 $HADOOP_DIR/src/native/Makefile.am 文件中,将 AM_CLFAGS 变量更新为以下值:

AM_CFLAGS = -D_POSIX_C_SOURCE=199506L -D__EXTENSIONS__ -g -Wall -fPIC -O2 -m$(JVM_DATA_MODEL)

更新 Hadoop 配置

Hadoop 配置文件 ${HADOOP_DIR}/conf/hadoop-env.sh 必须指向 JDK 6。情况可能已经如此。如果并非如此,请使用以下命令:

echo "JAVA_HOME=/usr/jdk/instances/jdk1.6.0" >>
${HADOOP_DIR}/conf/hadoop-env.sh

启动构建过程

构建过程需要通过互联网访问 Maven 和 Ivy 信息库。构建系统必须能够访问互联网。可以通过在 shell 变量中设置选项指示 Ant 使用 HTTP 代理,如下所示:

$ export ANT_OPTS="-Dhttp.proxyHost=myhttpprox.mydomain.com"

您可以使用 ant 工具从 Hadoop 主目录 HADOOP_DIR 启动构建。因此,首先切换到该目录:

$ cd  ${HADOOP_DIR}

运行以下命令设置所有必需的 shell 变量,启动构建过程:

export PATH=/usr/jdk/instances/jdk1.6.0/bin:$PATH
echo PATH $PATH
export JAVA_HOME=/usr/jdk/instances/jdk1.6.0
echo JAVA_HOME $JAVA_HOME
export LD_RUN_PATH=/usr/local/lib
export LD_LIBRARY_PATH=/usr/local/lib
ant -verbose -logfile ant.log -Dcompile.native=true -Dmake.cmd=gmake -Dos.name=SunOS -Dnonspace.os=SunOS

文件 ant.log 保存了构建库时生成的全部信息。该文件对于分析和修复构建过程中的问题很重要。

构建过程在 ${HADOOP_DIR}/build 下创建一个目录结构。本地库存储在 ${HADOOP_DIR}/build/native 中。该目录包含一个名称以 SunOS 开头并以架构名结尾的子目录。因此,对于基于 Intel 的 Oracle Solaris 系统,名称将是 SunOS-x86-32,而对于基于 SPARC 的系统,将是 SunOS-SPARC-32

部署本地 Hadoop 库

使用如下命令将 ${HADOOP_DIR}/build/native/SunOS* 下的子目录结构复制到 ${HADOOP_DIR}/lib/native/SunOS*

$ cp -R ${HADOOP_DIR}/build/native/SunOS-x86-32 ${HADOOP_DIR}/lib/native/SunOS-x86-32

Snappy 库需要在 ${HADOOP_DIR}/lib/native/SunOS* 目录中可用,因此使用如下所示的命令:

$ cp /usr/local/lib/libsnappy.so ${HADOOP_DIR}/lib/native/SunOS-x86-32

验证本地 Hadoop 库的部署

Hadoop 将在启动时报告是否能够加载本地库。因此,您可以通过检查日志文件验证部署是否成功。

日志文件名将有各自的时间戳,格式为 YYYY-MM-DD。示例日志文件名为 hadoop-hadoop-jobtracker-solaris.log.YYYY-MM-DD。日志文件应包含类似下面的一行内容:

2013-03-31 10:42:10,487 INFO org.apache.hadoop.util.NativeCodeLoader: Loaded the native-hadoop library

另请参见

有关 Oracle Solaris 的其他链接:

关于作者

Stefan Schneider 使用 SunOS 进行 3D 机器人模拟研究,并获得针对制造业的面向对象的数据库博士学位。然后他在 20 世纪 90 年代初开发出了一个针对创业公司的面向对象的数据库产品。他于 1994 年加入 Sun,负责将 SAP 应用移植到 Solaris 2 并进行优化,并与 Sun 的主要合作伙伴协作,支持采用 Sun 技术(如 Oracle Solaris、多线程、Java SE 和 Swing)。作为 Oracle ISV 工程团队的 CTO,他目前管理所有 Oracle 合作伙伴对 Oracle Solaris 11 的采用。

修订版 1.1,2013 年 5 月 31 日

关注我们:
博客 | Facebook | Twitter | YouTube