无法在 spark 应用程序中设置系统属性 [在客户端和集群模式下]
Posted
技术标签:
【中文标题】无法在 spark 应用程序中设置系统属性 [在客户端和集群模式下]【英文标题】:Not able to set System property in spark application [In client and cluster mode] 【发布时间】:2019-08-21 09:35:43 【问题描述】:设置System.setProperty("oracle.net.tns_admin",path_of_ora)
我尝试了以下方法。
方法一:使用广播变量将 tns.ora 文件复制到所有执行器 sparkSession.sparkContext().broadcast("/tmp/conf/",classTagTest)
这种方法的问题是"/tmp/conf/”
被认为是字符串变量而不是路径
方法二:在spark submit命令中使用--files参数传递tns.ora文件并设置--conf spark.executor.extraJavaOptions=-Doracle.net.tns_admin=tnsnames.ora
方法3:使用sparkSession.addFile(“tnsnames.ora”) set --conf spark.executor.extraJavaOptions=-Doracle.net.tns_admin=tnsnames.ora
根据我们的分析,我们发现系统属性是在spark应用程序以master作为本地[*]和模式客户端运行时设置的。
即使在客户端模式下,也只能识别本地路径,当我们尝试使用 hdfs 路径设置 systemProperty 时,它无法识别。
但要求是设置系统属性并在集群模式下运行。
spark-submit --class Demo1 --master local[*] --deploy-mode client --driver-memory 5g --executor-memory 10g --executor-cores 5 --num-executors 36 --jars ojdbc15-11.1.0.6.jar --files /tmp/tnsnames.ora --conf spark.executor.extraJavaOptions=-Doracle.net.tns_admin=tnsnames.ora --driver-java-options -Doracle.net.tns_admin=tnsnames .ora test.jar tnsnames.ora
SparkConf sparkConf = new SparkConf()
// .setMaster("local[*]")
.setAppName("Iden");
SparkSession sparkSession = SparkSession.builder()
.config(sparkConf).getOrCreate();
String username = "etldevapp";
String password = "etldevappstg";
String thinConn = "jdbc:oracle:thin:" + username + "/" + password + "@xxxxxxx";
System.setProperty("oracle.net.tns_admin","/tmp/");
try
DriverManager.registerDriver(new OracleDriver());
Connection conn = DriverManager.getConnection(thinConn, username, password);
PreparedStatement st = conn.prepareStatement("select * from xxxx where rownum < 10");
final ResultSet rs = st.executeQuery();
System.out.println(rs.getFetchSize());
catch (Exception e)
System.out.println("Exception from try1 ");
用户类抛出异常:java.sql.SQLException:Io异常:无法解析连接标识符“xxxxx”
【问题讨论】:
【参考方案1】:这就是我所做的。我在 Spark 配置文件中将其设置为属性,然后在代码中将其设置为系统属性。重要的是属性名称以“spark.”开头,所以是这样的:
System.setProperty("oracle.net.tns_admin",conf.get("spark.your.property.name"));
【讨论】:
SparkConf sparkConf = new SparkConf().set("spark.oracle.tns_admin","/tmp").setAppName("Iden"); System.setProperty("oracle.net.tns_admin",sparkConf.get("spark.oracle.tns_admin"));问题是路径“/tmp”不被其他执行程序识别,因为它是驱动程序本地的。如果给出 hdfs 路径,System.setProperty 无法识别它。 每个执行器的属性值是否需要不同?? 最好的办法是确保 tnsnames.ora 文件在每个执行程序和驱动程序上的位置相同。也就是说,tnsnames.ora 文件的路径在每个执行器和驱动程序上都是相同的。 所有执行者的属性值都相同 tnsnames.ora 的路径在驱动程序和执行程序中都相同(“/tmp/tnsnames.ora”)。我能够读取文件的内容并打印属性集(“oracle .net.tns_admin”)。所有这些都工作正常,但仍然出现异常“原因:java.sql.SQLException:Io 异常:指定的未知主机”。有什么遗漏吗?以上是关于无法在 spark 应用程序中设置系统属性 [在客户端和集群模式下]的主要内容,如果未能解决你的问题,请参考以下文章
无法在 Jupyter notebook-anaconda 中设置 spark home