Spark Parquet信封解密报错:Executor退出(代码50)求助
OCI KMS RSA密钥结合Spark Parquet信封解密失败排查思路
问题场景
在OCI KMS创建RSA密钥后,基于Spark Parquet实现信封加密解密流程,解密阶段触发异常:
- Spark任务因Stage失败终止,Executor 4以退出码50(未捕获异常)退出
- 日志仅输出
Before read parquet后无后续执行记录,推测自定义KMS客户端实现类ParquetEnvelopeDecryption存在调用失败或逻辑Bug
1. 类加载与依赖有效性排查
- 确认
ParquetEnvelopeDecryption类已正确打包到Spark作业依赖JAR,通过spark-submit的--jars/--packages参数确保依赖能分发到所有Executor节点 - 检查类及方法的访问权限:确保类为
public修饰,解密核心方法(如decryptDataKey)为public可访问,避免Executor因权限限制无法调用 - 对齐OCI SDK版本:验证Spark环境与开发环境使用的OCI SDK版本一致,版本不匹配可能引发类加载冲突或方法签名不兼容问题
2. 日志增强与异常精准定位
- 在
ParquetEnvelopeDecryption的初始化、解密入口等关键节点添加细粒度日志(如类实例化日志、KMS请求参数日志),确认类是否被正常加载、方法是否被触发 - 在解密逻辑外层包裹
try-catch(Throwable t)块,捕获并打印完整异常栈信息,避免异常被Spark任务调度机制吞掉 - 提取Executor 4的完整stderr/stdout日志:通过集群日志系统(YARN/Spark History Server)获取该Executor的完整日志,退出码50通常对应未处理的RuntimeException,完整栈可定位具体报错行
3. OCI KMS访问权限与配置验证
- 检查Executor节点网络连通性:确认节点能访问OCI KMS的endpoint,安全组、防火墙规则是否允许出站到KMS服务端口(默认443)
- 验证KMS客户端配置:检查
ParquetEnvelopeDecryption中的region、密钥OCID、认证方式(Instance Principal/API Key)是否与加密阶段一致,是否存在配置遗漏 - 独立测试KMS解密逻辑:将
ParquetEnvelopeDecryption的解密代码抽离为独立Java测试用例,传入加密阶段生成的加密数据密钥,验证是否能正常调用KMS解密并返回明文数据密钥,排除服务端或权限问题
4. Spark Parquet解密流程适配检查
- 确认Parquet加密配置:验证Spark配置
spark.sql.parquet.kms.client.class是否正确指向ParquetEnvelopeDecryption的全限定类名 - 检查加密数据密钥存储:确认加密阶段已将加密后的Data Key正确写入Parquet元数据,解密时能正常读取该字段
- 对齐Spark版本兼容性:确认使用的Parquet加密API与当前Spark版本匹配,不同版本的Parquet加密扩展接口可能存在差异
5. 代码逻辑针对性检查
针对提供的代码片段:
- Python解密代码:检查是否正确传递KMS配置参数,是否将加密Data Key完整传递给Java实现类
- Java实现类
ParquetEnvelopeDecryption:- 检查
getKmsClient方法是否正确初始化KMS客户端,是否处理了认证异常(如密钥文件读取失败、Instance Principal权限不足) - 验证解密方法是否正确解析KMS响应,是否将解密后的明文Data Key转换为Parquet解密所需的字节格式
- 排查空指针风险:读取Parquet元数据中的加密Data Key时是否做了非空判断,避免因字段缺失引发异常
- 检查
内容的提问来源于stack exchange,提问作者masterfly
相关产品推荐
相关产品推荐

