[Databricks][DatabricksJDBCDriver](500593) 通信链路故障。无法连接服务器。原因:HTTP 响应代码:403

问题描述 投票:0回答:2

我正在尝试使用 java 代码连接到 databricks。有人能帮助我吗?这是到目前为止我得到的代码::

打包 digital.eComm.ui.tests;

导入java.sql.Connection; 导入 java.sql.DriverManager; 导入java.sql.SQLException; 导入 java.util.Properties;

public class DatabricksSetup {


    public static void main(String[] args) throws SQLException {
        String url = "jdbc:databricks://XXXX.azuredatabricks.net:443/default;transportMode=http;ssl=1;httpPath=sql/protocolv1/o/XXXXX;AuthMech=3;UID=token;PWD=XXXXXX";
        String username = "token";
        String password = "XXXX"; //Token generated from databricks profile page.

        Connection connection = DriverManager.getConnection(url, username, password);


        System.out.println("Database connected!");
        if(connection != null){
            System.out.println("Connection Established");

        }
        else {
            System.out.println("Connection Failed");
        }

    }

}

已添加以下依赖项:

  "com.databricks:databricks-jdbc:2.6.25"

错误:

Exception in thread "main" java.sql.SQLException: [Databricks][DatabricksJDBCDriver](500593) Communication link failure. Failed to connect to server. Reason: HTTP Response code: 403, Error message: Unknown.
    at com.databricks.client.hivecommon.api.HS2Client.handleTTransportException(Unknown Source)
    at com.databricks.client.spark.jdbc.DowloadableFetchClient.handleTTransportException(Unknown Source)
    at com.databricks.client.hivecommon.api.HS2Client.openSession(Unknown Source)
    at com.databricks.client.hivecommon.api.HS2Client.<init>(Unknown Source)
    at com.databricks.client.spark.jdbc.DowloadableFetchClient.<init>(Unknown Source)
    at com.databricks.client.spark.jdbc.DownloadableFetchClientFactory.createClient(Unknown Source)
    at com.databricks.client.hivecommon.core.HiveJDBCCommonConnection.connectToServer(Unknown Source)
    at com.databricks.client.spark.core.SparkJDBCConnection.connectToServer(Unknown Source)
    at com.databricks.client.hivecommon.core.HiveJDBCCommonConnection.establishConnection(Unknown Source)
    at com.databricks.client.spark.core.SparkJDBCConnection.establishConnection(Unknown Source)
    at com.databricks.client.jdbc.core.LoginTimeoutConnection.connect(Unknown Source)
    at com.databricks.client.jdbc.common.BaseConnectionFactory.doConnect(Unknown Source)
    at com.databricks.client.jdbc.common.AbstractDriver.connect(Unknown Source)
    at java.sql.DriverManager.getConnection(DriverManager.java:664)
    at java.sql.DriverManager.getConnection(DriverManager.java:247)
    at digital.eComm.ui.tests.DatabricksSetup.main(DatabricksSetup.java:16)
Caused by: com.databricks.client.support.exceptions.ErrorException: [Databricks][DatabricksJDBCDriver](500593) Communication link failure. Failed to connect to server. Reason: HTTP Response code: 403, Error message: Unknown.
    ... 16 more
java jdbc databricks azure-databricks
2个回答
1
投票

403
是明确的拒绝。服务器告诉您:我知道您是谁,但您无法做您想做的事。

很可能是因为驱动程序尝试使用用户/密码机制来进行身份验证,而不是 URL 中的令牌,因为您显式地将参数传递给

getConnection()

DriverManager.getConnection(url, username, password);
替换为
DriverManager.getConnection(url);
并尝试。

完整 来自 databricks 的示例

Maven 上的 Databricks JDBC 驱动程序

Java 和 JVM 开发人员使用 JDBC 作为访问数据库的标准 API。 Databricks JDBC 驱动程序现已在 Maven 中央存储库上提供,让您可以在构建系统和 CI/CD 运行中使用此驱动程序。要将其包含在您的 Java 项目中,请将以下条目添加到您应用程序的

pom.xml
:

    <dependency>
      <groupid>com.databricks
      <artifactid>databricks-jdbc</artifactid>
      <version>2.6.25-1</version>
    </groupid></dependency>

这里是一些使用 JDBC 驱动程序查询数据的示例代码:

import java.sql.*;

public static void main(String[] args) throws Exception {
    // Open a connection

    // replace the values below
    String token = "dapi*****";
    String url = "jdbc:databricks://********.cloud.databricks.com:443/default;" +      
                 "transportMode=http;ssl=1;AuthMech=3;httpPath=sql/protocolv1/o/*****;" +
                 "UID=token;" +
                 "PWD=" + token;

    try (Connection conn = DriverManager.getConnection(url);
         Statement stmt = conn.createStatement();
         ResultSet rs = stmt.executeQuery("SELECT * FROM samples.nyctaxi.trips");) {
        // Extract data from result set
        while (rs.next()) {
            // Retrieve by column name
            System.out.print("ID: " + rs.getString("col_name"));
        }
    } 
}

0
投票

这里的响应有点晚了,但以防万一其他人在搜索此异常时得到此结果:

我遇到了同样的问题,使用与OP基本相同的代码来创建Connection对象(也在Databricks文档中引用):

Connection connection = DriverManager.getConnection(url, username, password);

更奇怪的是:当应用程序部署到 AKS 时,此代码可以工作,但在我的笔记本电脑本地运行时却不起作用。

我们的数据团队表示不存在会导致此行为的 IP 块,但建议我根据 此 Microsoft 文档重新实现。我重写了代码:

String url = "jdbc:databricks://<host>:443";
Properties p = new java.util.Properties();
p.put("httpPath", "<http-path>");
p.put("transportMode", "http");
p.put("ssl", "1");
p.put("UseNativeQuery", "1");
p.put("AuthMech", "3");
p.put("UID", "token");
p.put("PWD", "<pwd>");
Connection ods = DriverManager.getConnection(url, p);

现在连接已建立。顺便说一句,这是最新版本的 Databricks JDBC 驱动程序 (2.6.36)。

© www.soinside.com 2019 - 2024. All rights reserved.