我正在尝试让spark集群使用带有微软JDBC驱动程序(v7.0.0)的JavaKerberos (即,我在连接字符串中指定integratedSecurity=true;authenticationScheme=JavaKerberos
)和在keyTab文件中指定的凭据来写入SQL server,但我没有太多成功(如果我在连接字符串中指定凭据,问题也是一样的)。
我使用以下命令将作业提交到集群(4节点YARN模式v2.3.0):
spark-submit --driver-class-path mssql-jdbc-7.0.0.jre8.jar \
--jars /path/to/mssql-jdbc-7.0.0.jre8.jar \
--conf spark.executor.extraClassPath=/path/to/mssql-jdbc-7.0.0.jre8.jar \
--conf "spark.driver.extraJavaOptions=-Djava.security.auth.login.config=/path/to/SQLJDBCDriver.conf" \
--conf "spark.executor.extraJavaOptions=-Djava.security.auth.login.config=/path/to/SQLJDBCDriver.conf" \
application.jar
部分工作: spark驱动程序正确地进行了身份验证并创建了表,但是,当任何一个执行器来写入表时,它们都会失败,并返回一个异常:
java.security.PrivilegedActionException: GSSException: No valid credentials provided (Mechanism level: Failed to find any Kerberos tgt)
观察结果:
如果我指定SQL
-Djava.security.auth.login.config=/path/to/SQLJDBCDriver.conf
在大量记录/调试spark驱动程序和executor行为的差异之后,似乎归结到executor试图使用错误的凭据,即使指定的选项应该使它使用keytab文件中指定的那些,就像它成功地为spark驱动程序所做的那样。(这就是为什么它会生成那个特定的异常,如果我故意尝试不正确的凭据,它就会这样做。)
奇怪的是,我可以在调试输出中看到JDBC驱动程序找到并读取SQLJDBCDriver.conf文件,并且keytab必须显示(否则我得到文件未找到失败),然后它立即忽略它们,并尝试使用默认行为/本地用户凭据。
谁能帮助我理解如何强制执行程序使用密钥表中提供的凭据,或者以其他方式让JavaKerberos/SQL Server身份验证与Spark一起工作?
发布于 2021-02-10 15:41:21
更新一下,我刚刚关闭了https://issues.apache.org/jira/browse/SPARK-12312,现在可以使用内置的JDBC连接提供程序进行Kerberos身份验证。添加了许多提供程序,其中之一是MS SQL。请阅读文档如何使用它:https://spark.apache.org/docs/latest/sql-data-sources-jdbc.html
请注意,Spark 3.1尚未发布,因此当页面上出现新添加的2个配置参数(keytab
和principal
)时,将需要一段时间。我认为文档更新将在1-2周内完成。
发布于 2018-10-19 07:58:37
因此,根据一个旧的JIRA here https://issues.apache.org/jira/browse/SPARK-12312,显然JDBC Kerberos身份验证目前在执行器上是不可能的。根据spark用户列表和我的测试,其行为与2.3.2版相同。
解决方法
发布于 2021-06-04 08:06:32
在具有AD集成的安全群集中,集成身份验证不适用于MS Kerberos JDBC驱动程序,因为容器将不具有上下文,因为当映射器生成时,SQLServer令牌会丢失(因为纱线将作业转移到其内部安全子系统)。
这是我的存储库,作为获得Kerberos/AD身份验证的变通方法,https://github.com/chandanbalu/mssql-jdbc-krb5解决方案实现了一个驱动程序,该驱动程序覆盖了最新的MS SQL JDBC驱动程序(mssql-jdbc-9.2.1.jre8.jar)的connect方法,并将获得密钥表文件/主体的票据,并返回此连接。
您可以从发布文件夹here中获取此自定义驱动程序的最新版本
使用JARS启动spark-shell
spark-shell --jars /efs/home/c795701/.ivy2/jars/mssql-jdbc-9.2.1.jre8.jar,/efs/home/c795701/mssql-jdbc-krb5/target/scala-2.10/mssql-jdbc-krb5_2.10-1.0.jar
Scala
scala>val jdbcDF = spark.read.format("jdbc").option("url", "jdbc:krb5ss://<SERVER_NAME>:1433;databasename=<DATABASE_NAME>;integratedSecurity=true;authenticationScheme=JavaKerberos;krb5Principal=c795701@NA.DOMAIN.COM;krb5Keytab=/efs/home/c795701/c795701.keytab").option("driver","hadoop.sqlserver.jdbc.krb5.SQLServ, "dbo.table_name").load()
scala>jdbcDF.count()
scala>jdbcDF.show(10)
spark-submit命令
com.spark.SparkJDBCIngestion - Spark JDBC数据帧操作
ingestionframework-1.0-SNAPSHOT.jar -您的项目构建JAR
spark-submit \
--master yarn \
--deploy-mode cluster \
--jars "/efs/home/c795701/mssql-jdbc-krb5/target/scala-2.10/mssql-jdbc-krb5_2.10-1.0.jar,/efs/home/c795701/.ivy2/jars/scala-library-2.11.1.jar"
--files /efs/home/c795701/c795701.keytab
--class com.spark.SparkJDBCIngestion \
/efs/home/c795701/ingestionframework/target/ingestionframework-1.0-SNAPSHOT.jar
https://stackoverflow.com/questions/52662249
复制相似问题