Ubuntu22.04编译Hadoop-common3.3.0报错求助
问题分析与解决
环境信息
遵循BUILDING.txt配置:
- Unix系统:
$ uname Linux - JDK 1.8:
$ echo $JAVA_HOME /usr/lib/jvm/java-8-openjdk-amd64/ - Maven 3.3+:
$ mvn -v Apache Maven 3.6.3 Maven home: /usr/share/maven Java version: 1.8.0_382, vendor: Private Build, runtime: /usr/lib/jvm/java-8-openjdk-amd64/jre Default locale: en_US, platform encoding: UTF-8 OS name: "linux", version: "6.2.0-32-generic", arch: "amd64", family: "unix" - Protocol Buffers 3.7.1(编译原生代码需要):
$ protoc --version libprotoc 3.20.3 - CMake 3.1+(编译原生代码需要):
$ cmake --version cmake version 3.22.1 CMake suite maintained and supported by Kitware (kitware.com/cmake). - Zlib devel(编译原生代码需要):
$ python -c 'import zlib;print(zlib.ZLIB_VERSION)' 1.2.13 - Cyrus SASL devel(编译原生代码需要):
$ saslpasswd2 -v This product includes software developed by Computing Services at Carnegie Mellon University (http://www.cmu.edu/computing/). Built against SASL API version 2.1.27 LibSasl version 2.1.27 by "Cyrus SASL" - 编译器:GCC 11.4.0(曾降级至4.8.5)
- OpenSSL devel:
$ openssl version OpenSSL 1.1.1u 30 May 2023
执行命令与异常信息
执行mvn clean install -DskipTests -Pdist,native后出现编译错误,核心问题:
exception.c中sys_nerr和sys_errlist未定义:error: ‘sys_nerr’ undeclared (first use in this function) error: ‘sys_errlist’ undeclared (first use in this function)OpensslSecureRandom.c中OpenSSL相关函数隐式声明警告:warning: implicit declaration of function ‘dlsym_CRYPTO_num_locks’; did you mean ‘dlsym_CRYPTO_malloc’?
原因与解决方案
1. 关于sys_nerr/sys_errlist未定义问题
这两个全局变量在新版glibc(2.32+)中已被移除,属于非线程安全的旧API,降级GCC无法解决(Ubuntu 22.04的glibc版本为2.35,与GCC版本无关)。解决方法有两种:
方法一:修改exception.c代码(推荐)
将依赖旧API的代码替换为线程安全的标准API:
原代码片段:
if ((errnum < 0) || (errnum >= sys_nerr)) { return "Unknown error"; } return sys_errlist[errnum];
替换为:
// 使用strerror(部分系统实现为线程安全,或用更严谨的strerror_r) const char *err_msg = strerror(errnum); return err_msg ? err_msg : "Unknown error";
或者用完全线程安全的strerror_r:
static char err_buf[256]; if (strerror_r(errnum, err_buf, sizeof(err_buf)) == 0) { return err_buf; } else { return "Unknown error"; }
方法二:强制暴露旧API(临时 workaround)
在编译时添加编译选项,强制glibc暴露这些废弃符号:
mvn clean install -DskipTests -Pdist,native -DCMAKE_C_FLAGS="-D_GNU_SOURCE -D_BSD_SOURCE"
此方法仅作为临时方案,旧API后续可能完全失效,不推荐长期使用。
2. 关于OpenSSL相关警告问题
OpenSSL 1.1.x简化了锁机制API,Hadoop旧版本代码中的dlsym_CRYPTO_num_locks等函数已被弃用或移除。解决方法:
- 若使用的Hadoop版本不支持OpenSSL 1.1.x,降级OpenSSL到1.0.x版本(如安装
libssl1.0-dev); - 升级Hadoop到支持OpenSSL 1.1.x的版本(如Hadoop 3.3+);
- 修改
OpensslSecureRandom.c代码,适配OpenSSL 1.1.x逻辑(1.1.x中无需手动设置锁,OpenSSL会自动处理线程安全)。
3. 根本解决:适配系统版本
Ubuntu 22.04属于较新发行版,旧版Hadoop存在兼容性问题。建议:
- 升级Hadoop到官方支持该系统的版本;
- 若必须使用旧版Hadoop,结合上述代码修改或依赖降级的方式解决。
内容的提问来源于stack exchange,提问作者zyxing
相关产品推荐
相关产品推荐

