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

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

目的

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

问题

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

以前的尝试

  1. 包括连接字符串中的目录(前缀和非前缀)jdbc:oracle:thin:@luigi_low?TNS_ADMIN=/user/spark/wallet_LUIGI
  2. 包括与spark.driver.extraJavaOptions-Doracle.net.tns_admin-Doracle.net.wallet_location目录

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

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

帮帮我StackOverflow。你是我唯一的希望

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

update (SparkFiles attempt)

代码位于同一存储库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库,因为这个错误可能与我的JDBC库的旧版本相关

oracle apache-spark hdfs yarn ojdbc
2个回答
3
投票

这里有一些代码可以帮助诊断问题所在。它检查并配置连接所需的一切。

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


  }

}

0
投票

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

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