gpt4 book ai didi

Oracle 数据库 JDBC 驱动程序无法从 Spark 读取钱包文件

转载 作者:行者123 更新时间:2023-12-02 03:30:50 26 4
gpt4 key购买 nike

目标

我正在尝试从 Yarn 上运行的 Spark 应用程序写入 Oracle 的 ADWC(基本上是 oracle 数据库)。连接到该数据库的唯一方法是使用 Oracle Wallet 文件,它基本上是一个 Java keystore 。

问题

当 JDBC 驱动程序试图从 HDFS 读取钱包时,就会出现问题。如果我包含 hdfs:// 前缀,JDBC 驱动程序中的解析器会抛出错误,如果不包含,则它无法找到该文件。

以前的尝试

  1. 在连接字符串中包含目录(有前缀和无前缀)jdbc:oracle:thin:@luigi_low?TNS_ADMIN=/user/spark/wallet_LUIGI

所有代码都在GitHub上,具体错误信息在这里https://github.com/sblack4/kafka-scala-jdbc/blob/master/ERROR.md

我在这里有一个相同连接的工作示例 https://github.com/sblack4/scala-jdbc-adwc

帮助我使用 StackOverflow。你是我唯一的希望

如果您需要更多说明,请不要犹豫:)

更新(SparkFiles 尝试)

代码位于同一存储库的单独分支上,https://github.com/sblack4/kafka-scala-jdbc/tree/sparkfiles

此错误消息让我感到困惑,因为我的 JDBC 库似乎已停止尝试读取钱包文件。可能和之前的问题无关

Exception in thread "main" java.sql.SQLRecoverableException: IO Error: Invalid connection string format, a valid format is: "host:port:sid" 

我已经通过 Ambari 从我的类路径中删除了其他 JDBC 库,因为这个错误可能与 spark 获取我的 JDBC 库的旧版本有关

最佳答案

下面是一些有助于诊断问题的代码。它检查并配置连接所需的一切。

  • JDBC 驱动程序版本
  • 已安装 JCE
  • 类路径依赖

配置

  • tns_admin
  • SSL 设置
  • 信任/ key 存储

这是 sqldev/sqlcl 中内容的精简版

import java.security.NoSuchAlgorithmException;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.util.Collections;
import java.util.Properties;

import javax.crypto.Cipher;

import oracle.jdbc.OracleConnection;

public class JDBCTest {

public static void fail(String msg){
System.err.println(String.join("", Collections.nCopies(20, "*")));
System.err.println(msg);
System.err.println(String.join("", Collections.nCopies(20, "*")));
System.exit(1);
}
public static void main(String[] args) throws SQLException {
System.out.println("JDBC Driver Version:" + oracle.jdbc.OracleDriver.getDriverVersion());

// Check JDBC Driver Version
if (!oracle.jdbc.OracleDriver.getDriverVersion().startsWith("18.")) {
fail(" DRIVER TOOO OLD!!!");
}

// Check JCE Installed
int maxKeySize = 0;
try {
maxKeySize = Cipher.getMaxAllowedKeyLength("AES");
} catch (NoSuchAlgorithmException e) {
}
if (maxKeySize < 129 ) {
fail(" JCE Policy not unlimited!!!");
}

// Check Classpath

String cp = System.getProperty("java.class.path");

String[] cpFiles = {"ojdbc8.jar","oraclepki.jar","osdt_cert.jar","osdt_core.jar"};

for (String file:cpFiles){
if ( cp.indexOf(file) == -1 ){
fail("CLASSPATH Missing:" + file);

}
}
// Wallet unziped location
String unzippedWalletLocation = "/Users/klrice/workspace/12.2JDBC/wallet";



String conString = "jdbc:oracle:thin:@sqldev_medium";


Properties props = new Properties();
props.setProperty("oracle.net.wallet_location",unzippedWalletLocation);

props.setProperty(OracleConnection.CONNECTION_PROPERTY_THIN_NET_CONNECT_TIMEOUT, "2000");

// unzipped includes a tnsnames.ora
props.setProperty("oracle.net.tns_admin",unzippedWalletLocation);
props.setProperty("javax.net.ssl.trustStore","truststore.jks");
props.setProperty("javax.net.ssl.trustStorePassword","<password>");
props.setProperty("javax.net.ssl.keyStore","keystore.jks");
props.setProperty("javax.net.ssl.keyStorePassword","<password>");
props.setProperty("oracle.net.ssl_server_dn_match","true");
props.setProperty("oracle.net.ssl_version","1.2");


props.setProperty("user", "ADMIN");
props.setProperty("password", "<password>");

try {
// now Connect
Connection conn = DriverManager.getConnection(conString,props);
} catch (Exception e){
e.printStackTrace();
fail(e.getLocalizedMessage());
}

System.out.println("SUCCESS!!");


}

}

关于Oracle 数据库 JDBC 驱动程序无法从 Spark 读取钱包文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51901455/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com