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

时间:2018-08-17 19:01:32

标签: oracle apache-spark hdfs yarn ojdbc

客观

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

问题

当JDBC驱动程序尝试从HDFS读取钱包时,就会出现问题。如果我在JDBC驱动程序中加入hdfs://前缀,则解析器将引发错误,如果没有,则找不到文件。

以前的尝试

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

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

我在https://github.com/sblack4/scala-jdbc-adwc

处有一个相同连接的有效示例。

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

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

更新(尝试-Doracle.net.wallet_location次)

代码位于同一存储库https://github.com/sblack4/kafka-scala-jdbc/tree/sparkfiles

的单独分支中

此错误消息使我感到迷惑,因为看来我的JDBC库已停止尝试读取电子钱包文件。可能与先前的问题无关

SparkFiles

我已通过Ambari从我的类路径中删除了其他JDBC库,因为此错误可能与启动我的JDBC库的旧版本有关

2 个答案:

答案 0 :(得分: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!!");


  }

}

答案 1 :(得分:0)

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