我正在尝试从在Yarn上运行的Spark应用程序写入Oracle的ADWC(基本上是oracle数据库)。连接到该数据库的唯一方法是使用 Oracle Wallet 文件,该文件基本上是Java密钥库。
当JDBC驱动程序尝试从HDFS读取钱包时,就会出现问题。如果我在JDBC驱动程序中加入hdfs://
前缀,则解析器将引发错误,如果没有,则找不到文件。
jdbc:oracle:thin:@luigi_low?TNS_ADMIN=/user/spark/wallet_LUIGI
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库的旧版本有关
答案 0 :(得分:3)
有些代码可以帮助诊断问题所在。 它检查并配置连接所需的一切。
配置
这是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。让我们知道很高兴为您提供帮助。