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



>Objective

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

问题

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

以前的尝试

  1. 在连接字符串(前缀和非前缀(中包含目录jdbc:oracle:thin:@luigi_low?TNS_ADMIN=/user/spark/wallet_LUIGI
  2. 将目录作为具有-Doracle.net.tns_admin-Doracle.net.wallet_locationspark.driver.extraJavaOptions

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

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

帮我堆栈溢出。 你是我唯一的希望

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

更新(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 设置
  • 信任/密钥存储

这是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!!");

}
}

您是否使用的是 18.3 JDBC 驱动程序?将TNS_ADMIN作为连接 URL 的一部分传递需要 18.3 JDBC 驱动程序。此外,您是否尝试在公司网络中进行连接。在这种情况下,您需要在连接 URL 中传递HTTPS_PROXY和HTTPS_PROXY_PORT。让我们知道。很乐意帮助解决问题。

最新更新