如何使用JDBC从Oracle读取数据集?

时间:2017-07-14 09:55:35

标签: windows scala apache-spark jdbc apache-spark-sql

当使用jdbc驱动程序连接到例如甲骨文? 1:我已经开始了火花大师

spark-class.cmd org.apache.spark.deploy.master.Master 

和一个像这样的工人

spark-class.cmd org.apache.spark.deploy.worker.Worker spark://myip:7077  

和火花壳

spark-shell --master spark://myip:7077  

spark-defaults.conf我有

spark.driver.extraClassPath = C:/jdbcDrivers/ojdbc8.jar
spark.executor.extraClassPath = C:/jdbcDrivers/ojdbc8.jar

并且在spark-env.sh中我有

SPARK_CLASSPATH=C:/jdbcDrivers/ojdbc8.jar

我现在可以在spark-shell中对Oracle运行查询:

val jdbcDF = spark.read.format("jdbc").option("url","jdbc:oracle:thin:@...

这样可以正常工作,而无需在scala shell中单独添加jdbc驱动程序jar。

  1. 当我以相同的方式启动master和worker时,但是在eclipse中创建一个scala项目并连接到master,如下所示:

    val sparkSession = SparkSession.builder.
    master("spark://myip:7077")
    .appName("SparkTestApp")
    .config("spark.jars", "C:\\pathToJdbc\\ojdbc8.jar")
    .getOrCreate()    
    
  2. 然后如果我没有在scala代码中显式添加jdbc jar,它就会失败。 执行情况有何不同?为什么我需要在代码中指定jdbc jar?如果不依赖主人和工人开始,连接到主人的目的是什么? 如果我使用jdbc的多个worker,他们只使用一个连接,还是会同时在多个连接上并行读取?

1 个答案:

答案 0 :(得分:0)

你肯定对样本使用太多而且你感到困惑。

这两行spark-class.cmd org.apache.spark.deploy.master.Masterspark-class.cmd org.apache.spark.deploy.worker.Worker spark://myip:7077启动了一个Spark Standalone集群,其中包含一个主服务器和一个工作服务器。请参阅Spark Standalone Mode

  

除了在Mesos或YARN集群管理器上运行外,Spark还提供了一种简单的独立部署模式。您可以手动启动独立群集,方法是手动启动主服务器,也可以使用我们提供的启动脚本。也可以在一台机器上运行这些守护进程进行测试。

您选择手动启动Spark Standalone群集(如Starting a Cluster Manually中所述)。

怀疑集群根本使用spark-defaults.conf。该文件用于将spark-submit的Spark应用程序配置到群集(如Dynamically Loading Spark Properties中所述):

  

bin / spark-submit还将读取conf/spark-defaults.conf中的配置选项,其中每一行由一个键和一个由空格分隔的值组成。

话虽如此,我认为我们可以放心地将Spark Standalone放在一边。它没有给讨论增加太多(并且有点混淆)。

为Spark应用程序“安装”JDBC驱动程序

为了在Spark应用程序中使用JDBC驱动程序,您应spark-submit使用--driver-class-path命令行选项(或Runtime Environment中所述的spark.driver.extraClassPath属性):

  

spark.driver.extraClassPath 要添加到驱动程序类路径的额外类路径条目。

     

注意:在客户端模式下,不能直接在应用程序中通过SparkConf设置此配置,因为驱动程序JVM已在此时启动。相反,请通过--driver-class-path命令行选项或默认属性文件中设置它。

我强烈建议您使用spark-submit --driver-class-path

$ ./bin/spark-submit --help
...
  --driver-class-path         Extra class path entries to pass to the driver. Note that
                              jars added with --jars are automatically included in the
                              classpath.

您可以在Working with Datasets from JDBC Data Sources (and PostgreSQL)中阅读有关如何在PostgreSQL中使用JDBC驱动程序的说明。

PROTIP 使用SPARK_PRINT_LAUNCH_COMMAND=1查看spark-submit的命令行。

以上所有内容也适用于spark-shell(因为它使用了spark-submit)。