microsoft / sql-spark-connector

Apache Spark Connector for SQL Server and Azure SQL
Apache License 2.0
273 stars 116 forks source link

Intermittent Authentication Failure using ActiveDirectoryPassword #254

Open melshami opened 7 months ago

melshami commented 7 months ago

I have a situation in which I receive intermittent authentication failure when using ActiveDirectoryPassword, To troubleshoot I setup a loop to connect to our Synapse Sql Database using python. The random error we receive is:

This is the spark read configuration: df = spark.read \ .format("com.microsoft.sqlserver.jdbc.spark") \ .option("url", connDict['url']) \ .option(typeString, typeArg) \ .option("authentication", connDict['authentication']) \ .option("user", connDict['username']) \ .option("password", connDict['password']) \ .load()

JARs being used content-type-2.2.jar |   oauth2-oidc-sdk-11.9.1.jar |   adal4j-1.6.7.jar |   spark-mssql-connector_2.12-1.3.0-BETA.jar

Then I loop through 20 times.

from datetime import datetime makeAttemptsJDBC = 20 delayBetweenJDBCAttempts = 2

errors = {} successes = 0 for i in range(0, makeAttemptsJDBC): if i > 0: time.sleep(delayBetweenJDBCAttempts) try: df = readJDBCFromDb(config, 'query', 'SELECT TOP 1 * FROM sys.tables') successes += 1 now = datetime.now() print('Read ' + str(i) + ' was successful' + ' Time - ' + str(now)) except Exception as e: now = datetime.now() print('Read ' + str(i) + ' failed' + ' Time - ' + str(now)) strE = str(e)[:300] if strE not in errors: errors[strE] = 1 else: errors[strE] += 1

print('Out of ' + str(makeAttemptsJDBC) + ', ' + str(successes) + ' were successful.') if len(errors) == 0: print('No failures') else: for key,val in errors.items(): print(val, 'failed with error:', key)

RESULTS: Read 0 was successful Time - 2024-01-23 01:54:12.250192 Read 1 was successful Time - 2024-01-23 01:54:18.196843 Read 2 was successful Time - 2024-01-23 01:54:24.128849 Read 3 was successful Time - 2024-01-23 01:54:30.311090 Read 4 was successful Time - 2024-01-23 01:54:36.197872 Read 5 was successful Time - 2024-01-23 01:54:42.051919 Read 6 failed Time - 2024-01-23 01:54:51.428730 Read 7 was successful Time - 2024-01-23 01:54:57.679738 Read 8 was successful Time - 2024-01-23 01:55:03.704308 Read 9 was successful Time - 2024-01-23 01:55:09.719151 Read 10 was successful Time - 2024-01-23 01:55:15.801442 Read 11 was successful Time - 2024-01-23 01:55:22.040815 Read 12 was successful Time - 2024-01-23 01:55:27.857129 Read 13 was successful Time - 2024-01-23 01:55:33.743849 Read 14 was successful Time - 2024-01-23 01:55:39.879636 Read 15 was successful Time - 2024-01-23 01:55:46.353185 Read 16 failed Time - 2024-01-23 01:55:55.789135 Read 17 was successful Time - 2024-01-23 01:56:02.831716 Read 18 was successful Time - 2024-01-23 01:56:09.351897 Read 19 was successful Time - 2024-01-23 01:56:15.728788

Out of 20, 18 were successful. : com.microsoft.sqlserver.jdbc.SQLServerException: Failed to authenticate the user user@domain.com in Active Directory (Authentication=ActiveDirectoryPassword). at com.microsoft.sqlserver.jdbc.SQLServerADAL4JUtils.getSqlFedAuthToken(SQLServerADAL4JUtils.java:62) at com.microsoft.sqlserver.jdbc.SQLServerConnection.getFedAuthToken(SQLServerConnection.java:4442) at com.microsoft.sqlserver.jdbc.SQLServerConnection.onFedAuthInfo(SQLServerConnection.java:4415) at com.microsoft.sqlserver.jdbc.SQLServerConnection.processFedAuthInfo(SQLServerConnection.java:4380) at com.microsoft.sqlserver.jdbc.TDSTokenHandler.onFedAuthInfo(tdsparser.java:289) at com.microsoft.sqlserver.jdbc.TDSParser.parse(tdsparser.java:125) at com.microsoft.sqlserver.jdbc.TDSParser.parse(tdsparser.java:37) at com.microsoft.sqlserver.jdbc.SQLServerConnection.sendLogon(SQLServerConnection.java:5233) at com.microsoft.sqlserver.jdbc.SQLServerConnection.logon(SQLServerConnection.java:3988) at com.microsoft.sqlserver.jdbc.SQLServerConnection.access$000(SQLServerConnection.java:85) at com.microsoft.sqlserver.jdbc.SQLServerConnection$LogonCommand.doExecute(SQLServerConnection.java:3932) at com.microsoft.sqlserver.jdbc.TDSCommand.execute(IOBuffer.java:7375) at com.microsoft.sqlserver.jdbc.SQLServerConnection.executeCommand(SQLServerConnection.java:3206) at com.microsoft.sqlserver.jdbc.SQLServerConnection.connectHelper(SQLServerConnection.java:2713) at com.microsoft.sqlserver.jdbc.SQLServerConnection.login(SQLServerConnection.java:2362) at com.microsoft.sqlserver.jdbc.SQLServerConnection.connectInternal(SQLServerConnection.java:2213) at com.microsoft.sqlserver.jdbc.SQLServerConnection.connect(SQLServerConnection.java:1276) at com.microsoft.sqlserver.jdbc.SQLServerDriver.connect(SQLServerDriver.java:861) at org.apache.spark.sql.execution.datasources.jdbc.connection.BasicConnectionProvider.getConnection(BasicConnectionProvider.scala:49) at org.apache.spark.sql.execution.datasources.jdbc.connection.ConnectionProvider$.create(ConnectionProvider.scala:77) at org.apache.spark.sql.execution.datasources.jdbc.JdbcUtils$.$anonfun$createConnectionFactory$1(JdbcUtils.scala:64) at org.apache.spark.sql.execution.datasources.jdbc.JDBCRDD$.getQueryOutputSchema(JDBCRDD.scala:62) at org.apache.spark.sql.execution.datasources.jdbc.JDBCRDD$.resolveTable(JDBCRDD.scala:57) at org.apache.spark.sql.execution.datasources.jdbc.JDBCRelation$.getSchema(JDBCRelation.scala:239) at org.apache.spark.sql.execution.datasources.jdbc.JdbcRelationProvider.createRelation(JdbcRelationProvider.scala:36) at org.apache.spark.sql.execution.datasources.DataSource.resolveRelation(DataSource.scala:350) at org.apache.spark.sql.DataFrameReader.loadV1Source(DataFrameReader.scala:281) at org.apache.spark.sql.DataFrameReader.$anonfun$load$3(DataFrameReader.scala:253) at scala.Option.getOrElse(Option.scala:189) at org.apache.spark.sql.DataFrameReader.load(DataFrameReader.scala:253) at org.apache.spark.sql.DataFrameReader.load(DataFrameReader.scala:176) at sun.reflect.GeneratedMethodAccessor37.invoke(Unknown Source) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:498) at py4j.reflection.MethodInvoker.invoke(MethodInvoker.java:244) at py4j.reflection.ReflectionEngine.invoke(ReflectionEngine.java:357) at py4j.Gateway.invoke(Gateway.java:282) at py4j.commands.AbstractCommand.invokeMethod(AbstractCommand.java:132) at py4j.commands.CallCommand.execute(CallCommand.java:79) at py4j.GatewayConnection.run(GatewayConnection.java:238) at java.lang.Thread.run(Thread.java:750) Caused by: java.util.concurrent.ExecutionException: com.microsoft.aad.adal4j.AuthenticationException: Connection reset at com.microsoft.sqlserver.jdbc.SQLServerADAL4JUtils.getSqlFedAuthToken(SQLServerADAL4JUtils.java:60) ... 40 more Caused by: com.microsoft.aad.adal4j.AuthenticationException: Connection reset at com.microsoft.sqlserver.jdbc.SQLServerADAL4JUtils.getSqlFedAuthToken(SQLServerADAL4JUtils.java:53) ... 40 more