Spark Scala脚本CLI执行报加密密钥缺失错误,Spark-shell运行正常
解决Scala脚本运行时"encryption key missing"但spark-shell正常的问题
这种情况在Hive加密集群里挺常见的,核心原因是spark-shell启动时会自动加载Hive相关的配置和身份认证信息,而通过命令行提交脚本时这些信息没有被正确传递。下面是几个针对性的解决方案:
1. 提交脚本时显式传递加密/认证配置
spark-shell会自动读取hive-site.xml里的加密、Kerberos认证等配置,但spark-submit默认可能不会完全继承这些参数,你需要在提交命令里手动指定:
如果是Kerberos认证的集群,加上这些参数:
spark-submit \ --conf "hive.metastore.kerberos.keytab=/path/to/your.keytab" \ --conf "hive.metastore.kerberos.principal=your_principal@YOUR_REALM" \ --conf "hive.metastore.execute.setugi=true" \ scala_script.scala
如果你的Hive用了透明数据加密(TDE),还要补充密钥存储相关的JVM参数:
spark-submit \ --driver-java-options "-Djavax.net.ssl.trustStore=/path/to/truststore.jks -Djavax.net.ssl.trustStorePassword=your_truststore_pwd" \ --conf "hive.security.metastore.authorization.enabled=true" \ scala_script.scala
2. 提前完成Kerberos身份认证
spark-shell启动时会自动复用当前用户的Kerberos票据,但脚本提交前如果没有有效票据,就会触发密钥缺失错误。运行脚本前先执行:
kinit -kt /path/to/your.keytab your_principal@YOUR_REALM
确保身份认证信息生效后再提交脚本。
3. 在脚本里显式初始化带配置的SparkContext
spark-shell里的sc是自动创建并配置好的,但脚本里你需要自己初始化SparkContext,并把加密相关配置嵌入进去:
import org.apache.spark.SparkConf import org.apache.spark.SparkContext import org.apache.spark.sql.hive.HiveContext val conf = new SparkConf() .setAppName("HiveTableProcessor") .setMaster("yarn") // 根据你的集群配置修改,比如local[*] // 添加加密/认证配置 .set("hive.metastore.kerberos.keytab", "/path/to/your.keytab") .set("hive.metastore.kerberos.principal", "your_principal@YOUR_REALM") val sc = new SparkContext(conf) val hc = new HiveContext(sc) // 后续的表读取和写入逻辑 val tb_applicant_details = hc.sql("SELECT * FROM staging_mps_25.applicant_details") tb_applicant_details.write.mode("append").saveAsTable("my_db.my_table")
4. 确保配置文件能被Spark加载
如果脚本运行的节点上,hive-site.xml或core-site.xml不在Spark的默认配置路径里,可以通过--files参数主动传递:
spark-submit --files /path/to/hive-site.xml,/path/to/core-site.xml scala_script.scala
内容的提问来源于stack exchange,提问作者Osama Fareed
相关产品推荐
相关产品推荐

