通过 Simba JDBC 的 Databricks Spark 连接问题

Posted

技术标签:

【中文标题】通过 Simba JDBC 的 Databricks Spark 连接问题【英文标题】:Databricks Spark connection issue over Simba JDBC 【发布时间】:2021-07-12 01:32:41 【问题描述】:

我正在尝试通过 Simba JDBC 从 PERL 代码连接 Spark Databricks(Databricks 推荐方式)。参考这是 JDBC 驱动程序:https://databricks-bi-artifacts.s3.us-east-2.amazonaws.com/simbaspark-drivers/jdbc/2.6.17/SimbaSparkJDBC42-2.6.17.1021.zip

到目前为止,我设法设置了 PERL 和所有与 PERL 相关的模块配置,下面的问题与我坚信的 PERL 无关。

我有以下代码尝试连接 Spark Databricks。 注意:密码中的“replaceme”是databricks 个人访问令牌。

#!/usr/bin/perl

use strict;
use DBI;

my $user = "token";
my $pass = "replaceme";
my $host = "DBhost.azuredatabricks.net";
my $port = 9001;
my $url = "jdbc:spark://DBhost.azuredatabricks.net:443/default;transportMode=http;ssl=1;httpPath=sql/protocolv1/o/853imaskedthis14/1005-imaskedthis-okra138;AuthMech=3;UID=token;PWD=replaceme";  # Get this URL from JDBC data src

my %properties = ('user' => $user, 
                  'password' => $pass, 
                  'host.name' => $host, 
                  'host.port' => $port);

my $dsn = "dbi:JDBC:hostname=localhost;port=$port;url=$url";
my $dbh = DBI->connect($dsn, undef, undef, 
           PrintError => 0, RaiseError => 1, jdbc_properties => \%properties )
          or die "Failed to connect: ($DBI::err) $DBI::errstr\n";
my $sql = qq/select * from table/;
my $sth = $dbh->prepare($sql);
$sth->execute();
my @row;
while (@row = $sth->fetchrow_array) 
 print join(", ", @row), "\n";

我在 SIMBA 驱动程序连接到 SPARK THRIFT 服务器作为身份验证问题时遇到了以下问题和错误。

failed: [Simba][SparkJDBCDriver](500164) Error initialized or created transport for authentication: Invalid status 21
Also, could not send response: com.simba.spark.jdbc42.internal.apache.thrift.transport.TTransportException: java.net.SocketException: Broken pipe (Write failed). at ./perldatabricksconntest.pl line 18.

记录在Java堆栈跟踪下面的记录器:

[Thread-1] 05:40:16,718 WARN  - Error
java.sql.SQLException: [Simba][SparkJDBCDriver](500164) Error initialized or created transport for authentication: Invalid status 21
Also, could not send response: com.simba.spark.jdbc42.internal.apache.thrift.transport.TTransportException: java.net.SocketException: Broken pipe (Write failed).
        at com.simba.spark.hivecommon.api.HiveServer2ClientFactory.createTransport(Unknown Source)
        at com.simba.spark.hivecommon.api.ServiceDiscoveryFactory.createClient(Unknown Source)
        at com.simba.spark.hivecommon.core.HiveJDBCCommonConnection.establishConnection(Unknown Source)
        at com.simba.spark.spark.core.SparkJDBCConnection.establishConnection(Unknown Source)
        at com.simba.spark.jdbc.core.LoginTimeoutConnection.connect(Unknown Source)
        at com.simba.spark.jdbc.common.BaseConnectionFactory.doConnect(Unknown Source)
        at com.simba.spark.jdbc.common.AbstractDriver.connect(Unknown Source)
        at java.sql/java.sql.DriverManager.getConnection(DriverManager.java:677)
        at java.sql/java.sql.DriverManager.getConnection(DriverManager.java:189)
        at com.vizdom.dbd.jdbc.Connection.handleRequest(Connection.java:417)
        at com.vizdom.dbd.jdbc.Connection.run(Connection.java:211)
Caused by: com.simba.spark.support.exceptions.GeneralException: [Simba][SparkJDBCDriver](500164) Error initialized or created transport for authentication: Invalid status 21
Also, could not send response: com.simba.spark.jdbc42.internal.apache.thrift.transport.TTransportException: java.net.SocketException: Broken pipe (Write failed).
        ... 11 more

另外,根据 SIMBA JDBC 连接器文档,我尝试过 NO 身份验证模式,用户名、用户名/密码都不起作用。

所以想知道传输层的身份验证问题在哪里。请注意,我已经创建了令牌,并在启动 jdbc:spark 调用时在密码部分提到了这一点。

【问题讨论】:

【参考方案1】:

您需要生成personal access token 并将其而不是JDBC url 中的replaceme 字符串吗?之后,您无需在%properties 中指定userpassword 字段。

【讨论】:

当我的意思是'replaceme'时,我确实生成了数据库个人访问令牌(根据文档)并放置了那个字母数字长字符串,这就是现在的代码。不幸的是没有工作。 hmmm,真的很奇怪——我这周确实使用了 JDBC,但是来自 Java,而且一切正常。 不仅如此,我还使用简单的方法从 SQLWorkbench 连接 Databricks 集群,没有任何帮助和证书报告错误。

以上是关于通过 Simba JDBC 的 Databricks Spark 连接问题的主要内容,如果未能解决你的问题,请参考以下文章

用于 Cloud Spanner 的 Simba JDBC 驱动程序与 Spark JDBC DataFrame 阅读器一起使用

使用 SIMba JDBC 驱动程序访问特定 Google bigquery 数据集的元数据

maven repo中的Athena JDBC Driver 2.0.7?

无法使用 Impala JDBC 驱动程序通过 Java 应用程序连接到 Impala

jdbc连接impala

从 Databrick 文件系统读取文件