首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >对Spark框架上的SQL Server进行JavaKerberos身份验证

对Spark框架上的SQL Server进行JavaKerberos身份验证
EN

Stack Overflow用户
提问于 2018-10-05 17:16:02
回答 3查看 1.9K关注 0票数 1

我正在尝试让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

  • 凭据,我可以让一切正常工作(但是,我需要在我的spark密钥表中使用集成安全性,并且登录模块文件“SQLJDBCDriver.conf”似乎已正确指定,因为它们适用于驱动程序

  • 我可以在spark UI中看到执行器选择正确的命令行选项:-Djava.security.auth.login.config=/path/to/SQLJDBCDriver.conf

在大量记录/调试spark驱动程序和executor行为的差异之后,似乎归结到executor试图使用错误的凭据,即使指定的选项应该使它使用keytab文件中指定的那些,就像它成功地为spark驱动程序所做的那样。(这就是为什么它会生成那个特定的异常,如果我故意尝试不正确的凭据,它就会这样做。)

奇怪的是,我可以在调试输出中看到JDBC驱动程序找到并读取SQLJDBCDriver.conf文件,并且keytab必须显示(否则我得到文件未找到失败),然后它立即忽略它们,并尝试使用默认行为/本地用户凭据。

谁能帮助我理解如何强制执行程序使用密钥表中提供的凭据,或者以其他方式让JavaKerberos/SQL Server身份验证与Spark一起工作?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 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个配置参数(keytabprincipal)时,将需要一段时间。我认为文档更新将在1-2周内完成。

票数 1
EN

Stack Overflow用户

发布于 2018-10-19 07:58:37

因此,根据一个旧的JIRA here https://issues.apache.org/jira/browse/SPARK-12312,显然JDBC Kerberos身份验证目前在执行器上是不可能的。根据spark用户列表和我的测试,其行为与2.3.2版相同。

解决方法

  1. 使用kinit,然后将缓存的TGT分发给执行器,详细信息如下:https://github.com/LucaCanali/Miscellaneous/blob/master/Spark_Notes/Spark_Executors_Kerberos_HowTo.md。我认为这种技术只适用于运行spark executors的用户。至少我不能让它在我的用例中工作。
  2. 用一个处理身份验证的自定义版本包装了jdbc驱动程序,然后从真正的MS驱动程序调用并返回一个连接。详细信息在这里:https://datamountaineer.com/2016/01/15/spark-jdbc-sql-server-kerberos/和相关的存储库在这里:https://github.com/nabacg/krb5sqljdb。虽然我必须为我的案例修改身份验证码,但我还是让这项技术起作用了。
票数 0
EN

Stack Overflow用户

发布于 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
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52662249

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档