Spark Streaming Oracle JDBC 带钱包的接收器
Spark Streaming Oracle JDBC sink with wallet
我正在开发一个 Spark Streaming 应用程序,它会监听一个文件夹(分区为 yyyyMMdd)并汇总每分钟写入的记录数,然后将结果保存到 Oracle table。
我开发了一个 JDBCSink (ForeachWriter),在打开方法中,我试图打开一个到 Oracle 的连接,但在创建 Oracle 连接时出现 "oracle.net.ns.NetException: could not resolve the connect identifier"
异常。我正在使用 Oracle 钱包 (SSO),我可以通过设置 TNS_ADMIN 环境变量使用此钱包通过 sqlplus 进行连接。
我正在使用 spark-submit 推送 tnsnames.ora、sqlnet.ora、cwallet.sso 和 ewallet.p12 --files 选项,并且我已验证文件已使用接收器 class 中的 SparkFiles.get
方法推送到执行程序。我还使用 spark-submit --jars 选项(即 ojdbc7.jar、oraclepki.jar、osdt_cert.jar、osdt_core.jar)
打开连接的代码片段如下:
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")
我已尝试找出问题所在
Oracle版本是12.1.0.2(我用的是Docker镜像)
spark-submit2 ^
--master local ^
--files "%CWD%\wlt\tnsnames.ora,%CWD%\wlt\sqlnet.ora,%CWD%\wlt\cwallet.sso,%CWD%\wlt\ewallet.p12" ^
--jars "%CWD%\lib\ojdbc7.jar,%CWD%\lib\oraclepki.jar,%CWD%\lib\osdt_cert.jar,%CWD%\lib\osdt_core.jar" ^
--class OJDBCSinkMain ^
.\target\spark-streaming-ojdbc-sink-1.0-SNAPSHOT-jar-with-dependencies.jar
我的sqlnet.ora
文件如下:
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 服务 xe 的凭据存在于我的钱包中:
comment mkstore -wrl . -listCredential
List credential (index: connect_string username)
1: xe system
你有什么意见吗?提前致谢。
我的错误,我需要一个橡胶底座来发现!!! SparkFiles.get("tnsnames.ora")).getParent.getName
returns 相对路径,不是绝对路径。我的问题现在解决了。
我正在开发一个 Spark Streaming 应用程序,它会监听一个文件夹(分区为 yyyyMMdd)并汇总每分钟写入的记录数,然后将结果保存到 Oracle table。
我开发了一个 JDBCSink (ForeachWriter),在打开方法中,我试图打开一个到 Oracle 的连接,但在创建 Oracle 连接时出现 "oracle.net.ns.NetException: could not resolve the connect identifier"
异常。我正在使用 Oracle 钱包 (SSO),我可以通过设置 TNS_ADMIN 环境变量使用此钱包通过 sqlplus 进行连接。
我正在使用 spark-submit 推送 tnsnames.ora、sqlnet.ora、cwallet.sso 和 ewallet.p12 --files 选项,并且我已验证文件已使用接收器 class 中的 SparkFiles.get
方法推送到执行程序。我还使用 spark-submit --jars 选项(即 ojdbc7.jar、oraclepki.jar、osdt_cert.jar、osdt_core.jar)
打开连接的代码片段如下:
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")
我已尝试找出问题所在 Oracle版本是12.1.0.2(我用的是Docker镜像)
spark-submit2 ^
--master local ^
--files "%CWD%\wlt\tnsnames.ora,%CWD%\wlt\sqlnet.ora,%CWD%\wlt\cwallet.sso,%CWD%\wlt\ewallet.p12" ^
--jars "%CWD%\lib\ojdbc7.jar,%CWD%\lib\oraclepki.jar,%CWD%\lib\osdt_cert.jar,%CWD%\lib\osdt_core.jar" ^
--class OJDBCSinkMain ^
.\target\spark-streaming-ojdbc-sink-1.0-SNAPSHOT-jar-with-dependencies.jar
我的sqlnet.ora
文件如下:
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 服务 xe 的凭据存在于我的钱包中:
comment mkstore -wrl . -listCredential
List credential (index: connect_string username)
1: xe system
你有什么意见吗?提前致谢。
我的错误,我需要一个橡胶底座来发现!!! SparkFiles.get("tnsnames.ora")).getParent.getName
returns 相对路径,不是绝对路径。我的问题现在解决了。