Jdbc 使用ActiveDirectoryPassword连接到Azure SQL DB时出错
我正在尝试从Databricks连接Azure sql db,并使用AAD密码验证。我导入了azure sql db和adal4j库。但仍然低于误差Jdbc 使用ActiveDirectoryPassword连接到Azure SQL DB时出错,jdbc,databricks,adal4j,Jdbc,Databricks,Adal4j,我正在尝试从Databricks连接Azure sql db,并使用AAD密码验证。我导入了azure sql db和adal4j库。但仍然低于误差 java.lang.NoClassDefFoundError: com/nimbusds/oauth2/sdk/AuthorizationGrant 堆栈跟踪: at com.microsoft.sqlserver.jdbc.SQLServerADAL4JUtils.getSqlFedAuthToken(SQLServerADAL4JUt
java.lang.NoClassDefFoundError: com/nimbusds/oauth2/sdk/AuthorizationGrant
堆栈跟踪:
at com.microsoft.sqlserver.jdbc.SQLServerADAL4JUtils.getSqlFedAuthToken(SQLServerADAL4JUtils.java:24)
at com.microsoft.sqlserver.jdbc.SQLServerConnection.getFedAuthToken(SQLServerConnection.java:3609)
at com.microsoft.sqlserver.jdbc.SQLServerConnection.onFedAuthInfo(SQLServerConnection.java:3580)
at com.microsoft.sqlserver.jdbc.SQLServerConnection.processFedAuthInfo(SQLServerConnection.java:3548)
at com.microsoft.sqlserver.jdbc.TDSTokenHandler.onFedAuthInfo(tdsparser.java:261)
at com.microsoft.sqlserver.jdbc.TDSParser.parse(tdsparser.java:103)
at com.microsoft.sqlserver.jdbc.SQLServerConnection.sendLogon(SQLServerConnection.java:4290)
at com.microsoft.sqlserver.jdbc.SQLServerConnection.logon(SQLServerConnection.java:3157)
at com.microsoft.sqlserver.jdbc.SQLServerConnection.access$100(SQLServerConnection.java:82)
at com.microsoft.sqlserver.jdbc.SQLServerConnection$LogonCommand.doExecute(SQLServerConnection.java:3121)
at com.microsoft.sqlserver.jdbc.TDSCommand.execute(IOBuffer.java:7151)
at com.microsoft.sqlserver.jdbc.SQLServerConnection.executeCommand(SQLServerConnection.java:2478)
at com.microsoft.sqlserver.jdbc.SQLServerConnection.connectHelper(SQLServerConnection.java:2026)
at com.microsoft.sqlserver.jdbc.SQLServerConnection.login(SQLServerConnection.java:1687)
at com.microsoft.sqlserver.jdbc.SQLServerConnection.connectInternal(SQLServerConnection.java:1528)
at com.microsoft.sqlserver.jdbc.SQLServerConnection.connect(SQLServerConnection.java:866)
at com.microsoft.sqlserver.jdbc.SQLServerDriver.connect(SQLServerDriver.java:569)
at org.apache.spark.sql.execution.datasources.jdbc.JdbcUtils$$anonfun$createConnectionFactory$1.apply(JdbcUtils.scala:63)
at org.apache.spark.sql.execution.datasources.jdbc.JdbcUtils$$anonfun$createConnectionFactory$1.apply(JdbcUtils.scala:54)
at org.apache.spark.sql.execution.datasources.jdbc.JDBCRDD$.resolveTable(JDBCRDD.scala:56)
at org.apache.spark.sql.execution.datasources.jdbc.JDBCRelation.<init>(JDBCRelation.scala:115)
at org.apache.spark.sql.execution.datasources.jdbc.JdbcRelationProvider.createRelation(JdbcRelationProvider.scala:5
at com.databricks.backend.daemon.driver.DriverWrapper.tryExecutingCommand(DriverWrapper.scala:590)
at com.databricks.backend.daemon.driver.DriverWrapper.getCommandOutputAndError(DriverWrapper.scala:474)
at com.databricks.backend.daemon.driver.DriverWrapper.executeCommand(DriverWrapper.scala:548)
at com.databricks.backend.daemon.driver.DriverWrapper.runInnerLoop(DriverWrapper.scala:380)
at com.databricks.backend.daemon.driver.DriverWrapper.runInner(DriverWrapper.scala:327)
at com.databricks.backend.daemon.driver.DriverWrapper.run(DriverWrapper.scala:215)
at java.lang.Thread.run(Thread.java:748)
Caused by: java.lang.ClassNotFoundException: com.nimbusds.oauth2.sdk.AuthorizationGrant
at java.net.URLClassLoader.findClass(URLClassLoader.java:381)
at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:338)
at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
如果有人解决了这个问题,请帮助我
下载工作笔记本
创建Databricks集群
已知工作配置-Databricks Runtime 5.2包括ApacheSpark 2.4.0和Scala 2.11
为Microsoft Azure SQL数据库和SQL Server安装Spark连接器
导航到群集>库>安装新的>Maven>搜索软件包
切换到Maven Central
搜索azure sqldb spark com.microsoft.azure:azure sqldb spark
单击选择
单击“安装”
已知工作版本-com.microsoft.azure:azure sqldb spark:1.0.2
更新变量
更新变量值客户名称、服务器、数据库、表、用户名、密码
仅运行一次初始化命令
这将执行以下操作:
在dbfs:/databricks/init下创建一个名为init的文件夹/
Creta一个子文件夹,名称为Databricks集群
为每个依赖项创建bash脚本
Bash脚本命令:
*wget:从web服务器检索内容
*-退出:关闭wget的输出
*-O:输出
依赖项:
重新启动Databricks群集
这是执行init脚本所必需的
运行此笔记本中的最后一个单元格
这将测试通过Active Directory身份验证连接到Azure SQL数据库的能力
初始化命令
//初始化
//此代码块只需运行一次即可为重新启动时保留的集群文件创建初始化脚本
//获取集群名称
var clusterName=dbutils.widgets.getcluster
//创建dbfs:/databricks/init/如果它不存在。
dbutils.fs.mkdirsdbfs:/databricks/init/
//使用Databricks文件系统-DBFS创建一个名为clusterName的目录。
dbutils.fs.mkdirssdbfs:/databricks/init/$clusterName/
//创建adal4j脚本。
dbutils.fs.puts/databricks/init/$clusterName/adal4j-install.sh,
!/bin/bash
wget-quiet-O/mnt/driver-daemon/jars/adal4j-1.6.0.jarhttp://central.maven.org/maven2/com/microsoft/azure/adal4j/1.6.0/adal4j-1.6.0.jar
wget-quiet-O/mnt/jars/driver-daemon/adal4j-1.6.0.jarhttp://central.maven.org/maven2/com/microsoft/azure/adal4j/1.6.0/adal4j-1.6.0.jar符合事实的
//创建oauth2脚本。
dbutils.fs.put/databricks/init/$clusterName/oauth2-install.sh,
!/bin/bash
wget-quiet-O/mnt/driver-daemon/jars/oauth2-oidc-sdk-5.24.1.jarhttp://central.maven.org/maven2/com/nimbusds/oauth2-oidc-sdk/5.24.1/oauth2-oidc-sdk-5.24.1.jar
wget-quiet-O/mnt/jars/driver-daemon/oauth2-oidc-sdk-5.24.1.jarhttp://central.maven.org/maven2/com/nimbusds/oauth2-oidc-sdk/5.24.1/oauth2-oidc-sdk-5.24.1.jar符合事实的
//创建json脚本。
dbutils.fs.puts/databricks/init/$clusterName/json-smart-install.sh,
!/bin/bash
wget-quiet-O/mnt/driver-daemon/jars/json-smart-1.1.jarhttp://central.maven.org/maven2/net/minidev/json-smart/1.1.1/json-smart-1.1.1.jar
wget-quiet-O/mnt/jars/driver-daemon/json-smart-1.1.jarhttp://central.maven.org/maven2/net/minidev/json-smart/1.1.1/json-smart-1.1.1.jar符合事实的
//创建jwt脚本。
dbutils.fs.puts/databricks/init/$clusterName/jwt-install.sh,
!/bin/bash
wget-quiet-O/mnt/driver-daemon/jars/nimbus-jose-jwt-7.0.1.jarhttp://central.maven.org/maven2/com/nimbusds/nimbus-jose-jwt/7.0.1/nimbus-jose-jwt-7.0.1.jar
wget-quiet-O/mnt/jars/driver-daemon/nimbus-jose-jwt-7.0.1.jarhttp://central.maven.org/maven2/com/nimbusds/nimbus-jose-jwt/7.0.1/nimbus-jose-jwt-7.0.1.jar符合事实的
//检查集群特定的初始化脚本是否存在。
displaydbutils.fs.lssdbfs:/databricks/init/$clusterName/
测试命令
//通过Active Directory密码验证连接到Azure SQL数据库
导入com.microsoft.azure.sqldb.spark.config.config
导入com.microsoft.azure.sqldb.spark.connect_
//获取小部件值
var server=dbutils.widgets.getserver
var database=dbutils.widgets.getdatabase
var table=dbutils.widgets.gettable
var username=dbutils.widgets.getuser
var password=dbutils.widgets.getpassword
val config=ConfigMap
url->s$server.database.windows.net,
databaseName->s$数据库,
dbTable->s$table,
用户->s$username,
密码->s$密码,
身份验证->ActiveDirectoryPassword,
加密->真,
ServerCertificate->false,
hostNameInCertificate->*.database.windows.net
val collection=sqlContext.read.sqlDBconfig
收藏展
作为2020年更新:
我做了如上所述的集群初始化脚本,但最终我的工作设置似乎并不需要这样做
我最终使用了scala 2.11 note 2.11,这些库是通过UI:com.microsoft.azure:azure sqldb spark:1.0.2和mssql_jdbc_8_2_2_jre8.jar note jre8安装的。此外,我还必须在配置中明确提到驱动程序类:
import com.microsoft.azure.sqldb.spark.config.Config
import com.microsoft.azure.sqldb.spark.connect._
val config = Config(Map(
"url" -> "....database.windows.net",
"databaseName" -> "...",
"dbTable" -> "...",
"accessToken" -> "...",
"hostNameInCertificate" -> "*.database.windows.net",
"encrypt" -> "true",
"ServerCertificate" -> "false",
"driver" -> "com.microsoft.sqlserver.jdbc.SQLServerDriver"
))
val collection = spark.read.sqlDB(config)
collection.show()
代币采集完成
使用msal python:
进口msal
租户ID=…guid。。。
授权=https://login.microsoftonline.com/ +租户
范围=https://database.windows.net//.default 类路径上缺少一个库,该库包含类com.nimbusds.oauth2.sdk.AuthorizationGrantRelated,可能重复:另请参见感谢标记的回复。我将oauth2-oidc-sdk-3.0.jar导入我的工作区并连接到集群。我需要在什么地方注册吗。还上传了代码片段
import com.microsoft.azure.sqldb.spark.config.Config
import com.microsoft.azure.sqldb.spark.connect._
val config = Config(Map(
"url" -> "....database.windows.net",
"databaseName" -> "...",
"dbTable" -> "...",
"accessToken" -> "...",
"hostNameInCertificate" -> "*.database.windows.net",
"encrypt" -> "true",
"ServerCertificate" -> "false",
"driver" -> "com.microsoft.sqlserver.jdbc.SQLServerDriver"
))
val collection = spark.read.sqlDB(config)
collection.show()