You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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后出现编译错误,核心问题:

  1. exception.c中sys_nerr和sys_errlist未定义:
    error: ‘sys_nerr’ undeclared (first use in this function)
    error: ‘sys_errlist’ undeclared (first use in this function)
    
  2. 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.10 14:20:55