将 Hadoop 2.5.1 本机库重新编译为 32 位
Recompile Hadoop 2.5.1 native libraries to 32 bit
第 1 阶段:我已经在 Ubuntu 14.04 64 位上安装了 Hadoop 2.6.0,我已经在伪分布式模式下启动它并且我 运行 他们 provide 的示例程序。这里一切正常。
第 2 阶段:我已经在 运行 Ubuntu 10.04 32 位的 3 台计算机上安装了 Hadoop 2.5.1。我已经启动了 HDFS 和 YARN,我可以在 Web GUI 中看到它们。但是当尝试编译相同的测试程序时,我得到了这个:
gcc test.c -I$HADOOP_HDFS_HOME/include -L/usr/lib/java/jdk1.7.0_71/jre/lib/amd64/server/ -L$HADOOP_HDFS_HOME/lib/native -lhdfs -ljvm -o test
/usr/bin/ld: skipping incompatible /usr/local/hadoop/lib/native/libhdfs.so when searching for -lhdfs
/usr/bin/ld: skipping incompatible /usr/local/hadoop/lib/native/libhdfs.a when searching for -lhdfs
/usr/bin/ld: cannot find -lhdfs
collect2: ld returned 1 exit status
现在,当我执行 file libhdfs.so.0.0.0
时,我得到:
libhdfs.so.0.0.0: ELF 64-bit LSB shared object, x86-64, version 1 (SYSV), dynamically linked, not stripped
因此,本机库是 64 位的,而我的 OS 是 32 位的。
问题:
是否有必要从源代码重新编译整个 Hadoop,或者我是否可以只重新编译本机库并在现有安装中替换它们?
什么是最短路径?
请提供有关重新编译的信息。
编辑:
我在我的 64 位机器上编译了 32 位,我导出了 CLFAGS=-m32 ,但是我有这个错误:
[exec] /usr/lib/jvm/java-8-oracle/jre/lib/amd64/server/libjvm.so: error adding symbols: File in wrong format
[exec] collect2: error: ld returned 1 exit status
[exec] make[2]: *** [target/usr/local/lib/libhdfs.so.0.0.0] Error 1
[exec] make[1]: *** [CMakeFiles/hdfs.dir/all] Error 2
我接下来做的是手动安装和配置 update-alternatives 以指向 java8 JDK 32 位。
我只有 libfuse-dev 有问题,我已经卸载了。
因为它不是强制性的。
之后我 运行 : mvn package -Pnative -DskipTests -Dtar
并在此处找到库:hadoop-hdfs-project/hadoop-hdfs/target/native/target/usr/local/lib
:
libhdfs.a libhdfs.so libhdfs.so.0.0.0
最近的 hadoop tarball 似乎只附带 64 位库。你可以自己编译它们,虽然我自己没有测试过。
您必须下载 hadoop 的源码压缩包并安装以下软件包:
- GCC(或其他 C 编译器)
- GNU Autotools(autoconf、automake、libtool)
- zlib 开发包
- openssl 开发包
- maven
安装完成后,您可以使用源压缩包中包含的标准 hadoop pom.xml 文件来编译本机库:
$ mvn package -Pdist,native -DskipTests -Dtar
可以在以下位置找到这些库:
$ hadoop-dist/target/hadoop-2.6.0/lib/native
bin/hadoop 脚本通过系统 属性 -Djava.library.path 确保本机 hadoop 库位于类路径中。您可以修改 bin/hadoop 脚本以指向新编译的库。有关详细信息,请务必查看可用的文档 here。
第 1 阶段:我已经在 Ubuntu 14.04 64 位上安装了 Hadoop 2.6.0,我已经在伪分布式模式下启动它并且我 运行 他们 provide 的示例程序。这里一切正常。
第 2 阶段:我已经在 运行 Ubuntu 10.04 32 位的 3 台计算机上安装了 Hadoop 2.5.1。我已经启动了 HDFS 和 YARN,我可以在 Web GUI 中看到它们。但是当尝试编译相同的测试程序时,我得到了这个:
gcc test.c -I$HADOOP_HDFS_HOME/include -L/usr/lib/java/jdk1.7.0_71/jre/lib/amd64/server/ -L$HADOOP_HDFS_HOME/lib/native -lhdfs -ljvm -o test
/usr/bin/ld: skipping incompatible /usr/local/hadoop/lib/native/libhdfs.so when searching for -lhdfs
/usr/bin/ld: skipping incompatible /usr/local/hadoop/lib/native/libhdfs.a when searching for -lhdfs
/usr/bin/ld: cannot find -lhdfs
collect2: ld returned 1 exit status
现在,当我执行 file libhdfs.so.0.0.0
时,我得到:
libhdfs.so.0.0.0: ELF 64-bit LSB shared object, x86-64, version 1 (SYSV), dynamically linked, not stripped
因此,本机库是 64 位的,而我的 OS 是 32 位的。
问题: 是否有必要从源代码重新编译整个 Hadoop,或者我是否可以只重新编译本机库并在现有安装中替换它们? 什么是最短路径?
请提供有关重新编译的信息。
编辑:
我在我的 64 位机器上编译了 32 位,我导出了 CLFAGS=-m32 ,但是我有这个错误:
[exec] /usr/lib/jvm/java-8-oracle/jre/lib/amd64/server/libjvm.so: error adding symbols: File in wrong format
[exec] collect2: error: ld returned 1 exit status
[exec] make[2]: *** [target/usr/local/lib/libhdfs.so.0.0.0] Error 1
[exec] make[1]: *** [CMakeFiles/hdfs.dir/all] Error 2
我接下来做的是手动安装和配置 update-alternatives 以指向 java8 JDK 32 位。
我只有 libfuse-dev 有问题,我已经卸载了。 因为它不是强制性的。
之后我 运行 : mvn package -Pnative -DskipTests -Dtar
并在此处找到库:hadoop-hdfs-project/hadoop-hdfs/target/native/target/usr/local/lib
:
libhdfs.a libhdfs.so libhdfs.so.0.0.0
最近的 hadoop tarball 似乎只附带 64 位库。你可以自己编译它们,虽然我自己没有测试过。 您必须下载 hadoop 的源码压缩包并安装以下软件包:
- GCC(或其他 C 编译器)
- GNU Autotools(autoconf、automake、libtool)
- zlib 开发包
- openssl 开发包
- maven
安装完成后,您可以使用源压缩包中包含的标准 hadoop pom.xml 文件来编译本机库:
$ mvn package -Pdist,native -DskipTests -Dtar
可以在以下位置找到这些库:
$ hadoop-dist/target/hadoop-2.6.0/lib/native
bin/hadoop 脚本通过系统 属性 -Djava.library.path 确保本机 hadoop 库位于类路径中。您可以修改 bin/hadoop 脚本以指向新编译的库。有关详细信息,请务必查看可用的文档 here。