FAQ:StarRocks 中 Hadoop 3.4.3 Wildfly Native SSL 库问题
背景
StarRocks 已将内置的 Hadoop 依赖从 3.4.2 升级到 3.4.3(PR #69503)。Hadoop 3.4.3 引入了 HADOOP-19719,将 Wildfly OpenSSL 绑定从 2.1.4.Final 升级到 2.2.5.Final,以支持 OpenSSL 3.0。然而,新版本的本地库(libwfssl.so)是基于 GLIBC 2.34+ 构建的,这会在较旧的 Linux 发行版上引发兼容性问题。
受影响的 StarRocks 版本: 4.1.0+、4.0.7+、3.5.14+
典型现象
问题发生时,CN/BE 节点在初始化 SSL 上下文时可能因 SIGSEGV(段错误) 崩溃。FE 通常会报如下错误:
SQL Error [1064] [42000]: Access storage error. Error message: failed to get file schema:
A error occurred: errorCode=2001 errorMessage:Channel inactive error!
在 GitHub Issue #70478 中,当通过 FILES() 函数查询 Azure Data Lake 上的 Parquet 文件时也会触发该问题。
*** SIGSEGV (@0x0) received by PID (TID 0x...) ***
@ 0x7b9b67093453 SSL_CTX_new_ex
@ 0x7b9b6a09d95a Java_org_wildfly_openssl_SSLImpl_makeSSLContext0
@ 0x7b9a68544be1 (unknown)
根因是 Wildfly JNI 调用 Java_org_wildfly_openssl_SSLImpl_makeSSLContext0 时加载了按 OpenSSL 3.x ABI 编译的 libwfssl.so。但在 starrocks_be 进程内,libwfssl.so 对 OpenSSL 符号的查找会先命中 starrocks_be 二进制中静态链接进来的 OpenSSL 1.x 符号(来自 StarRocks thirdparty),根本不会走到系统磁盘上的 OpenSSL 3.x 共享库。3.x 的调用点(例如 SSL_CTX_new_ex)被派发到 1.x 的实现,就会在 SSL 上下文初始化时使 JVM 崩溃。因此,仅在宿主机上安装 OpenSSL 3.x 或其开发头文件无法修复该崩溃——BE 进程内置的 OpenSSL 1.x 永远会先命中符号解析。
Q1:什么是 Wildfly OpenSSL 本地库?
Hadoop 使用 Wildfly OpenSSL 将本地 OpenSSL 绑定到 Java 的 JSSE(Java Secure Socket Extension)API。
这使得 Hadoop 的 S3A、Azure Blob(ABFS)和 Azure Data Lake(ADL)连接器可以使用原生 OpenSSL 来处理 TLS/SSL 连接,而不是依赖 JVM 内置的 SSL 实现。在正常情况下,这可以提升高吞吐加密 I/O 场景的性能。
Q2:Hadoop 3.4.3 出了什么问题?
Hadoop 3.4.3 为支持 OpenSSL 3.0,将 Wildfly OpenSSL 升级到 2.2.5.Final