Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/apache-spark/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Spark流媒体Oracle JDBC接收器和钱包_Oracle_Apache Spark_Jdbc_Streaming_Wallet - Fatal编程技术网

Spark流媒体Oracle JDBC接收器和钱包

Spark流媒体Oracle JDBC接收器和钱包,oracle,apache-spark,jdbc,streaming,wallet,Oracle,Apache Spark,Jdbc,Streaming,Wallet,我正在开发一个Spark流应用程序,它将侦听一个文件夹(分区为yyyyMMdd),并聚合每分钟写入的记录数,然后将结果持久化到Oracle表中 我已经开发了一个JDBCSink(ForeachWriter),在open方法中,我试图打开到Oracle的连接,但是我在创建Oracle连接时遇到了“Oracle.net.ns.NetException:无法解析连接标识符”异常。我使用的是Oracle wallet(SSO),通过设置TNS_ADMIN环境变量,我可以使用此wallet通过sqlplu

我正在开发一个Spark流应用程序,它将侦听一个文件夹(分区为yyyyMMdd),并聚合每分钟写入的记录数,然后将结果持久化到Oracle表中

我已经开发了一个JDBCSink(ForeachWriter),在open方法中,我试图打开到Oracle的连接,但是我在创建Oracle连接时遇到了
“Oracle.net.ns.NetException:无法解析连接标识符”
异常。我使用的是Oracle wallet(SSO),通过设置TNS_ADMIN环境变量,我可以使用此wallet通过sqlplus进行连接

我正在使用spark submit--files选项推送tnsnames.ora、sqlnet.ora、cwallet.sso和ewallet.p12,并且我已经使用sink类中的
SparkFiles.get
方法验证了文件被推送到执行者。我还使用spark submit--jars选项(即ojdbc7.jar、oraclepki.jar、osdt_cert.jar、osdt_core.jar)为Oracle钱包添加了第三方Oracle依赖项

打开连接的代码如下所示:

Class.forName("oracle.jdbc.driver.OracleDriver")
  
System.setProperty("oracle.net.tns_admin", new Path(SparkFiles.get("tnsnames.ora")).getParent.getName)
val ds = new OracleDataSource()
val props = new Properties()
props.setProperty(OracleConnection.CONNECTION_PROPERTY_WALLET_LOCATION, 
      new Path(SparkFiles.get("cwallet.sso")).getParent.getName)
ds.setConnectionProperties(props)
ds.setURL("jdbc:oracle:thin:@xe")
NAMES.DIRECTORY_PATH=(TNSNAMES, EZCONNECT)
SQLNET.WALLET_OVERRIDE=TRUE
SSL_CLIENT_AUTHENTICATION=FALSE
SSL_VERSION=0
我试着把问题孤立起来 Oracle版本是12.1.0.2(我使用的是Docker映像)

我的
sqlnet.ora
文件如下:

Class.forName("oracle.jdbc.driver.OracleDriver")
  
System.setProperty("oracle.net.tns_admin", new Path(SparkFiles.get("tnsnames.ora")).getParent.getName)
val ds = new OracleDataSource()
val props = new Properties()
props.setProperty(OracleConnection.CONNECTION_PROPERTY_WALLET_LOCATION, 
      new Path(SparkFiles.get("cwallet.sso")).getParent.getName)
ds.setConnectionProperties(props)
ds.setURL("jdbc:oracle:thin:@xe")
NAMES.DIRECTORY_PATH=(TNSNAMES, EZCONNECT)
SQLNET.WALLET_OVERRIDE=TRUE
SSL_CLIENT_AUTHENTICATION=FALSE
SSL_VERSION=0
我的
tnsnames.ora
文件是:

xe =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = localhost)(PORT = 1521))
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SERVICE_NAME = xe)
    )
  )
我还验证了我钱包中是否存在Oracle service xe的凭据:

comment mkstore -wrl . -listCredential

List credential (index: connect_string username)
1: xe system

你有什么意见吗?提前谢谢。

我的错误,我需要一个橡胶船坞来定位
SparkFiles.get(“tnsnames.ora”).getParent.getName
返回相对路径,而不是绝对路径。我的问题现在解决了