【问题标题】:How to use JDBC to read datasets from Oracle?如何使用 JDBC 从 Oracle 读取数据集?
【发布时间】:2017-12-19 09:07:03
【问题描述】:

在使用 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()    
    

如果我没有在 scala 代码中明确添加 jdbc jar,它将失败。 执行方式有何不同?为什么我需要在代码中指定jdbc jar?如果不依赖master和worker启动,连接master的目的是什么? 如果我将多个工作人员与 jdbc 一起使用,他们会只使用一个连接还是会同时通过多个连接并行读取?

【问题讨论】:

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


    【解决方案1】:

    您肯定在样本中使用了太多,而您感到困惑。

    spark-class.cmd org.apache.spark.deploy.master.Masterspark-class.cmd org.apache.spark.deploy.worker.Worker spark://myip:7077 这两行代码启动了一个包含一个 master 和一个 worker 的 Spark Standalone 集群。见Spark Standalone Mode

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

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

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

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

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

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

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

    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)。

    【讨论】:

    • 阅读这些后,我理解为在 eclipse 中我可以在本地模式模式下运行代码,也可以使用独立集群远程运行代码。我尝试的是在独立集群上远程运行它,通过这样的连接:setMaster("spark://myip:7077")。在这种情况下,我需要在代码中添加罐子。据我了解,它将作为一个胖罐子推出。在本地模式下,代码将在同一个 jvm 中运行。本地模式用作:.setMaster("local[1]")。应用程序也可以通过 spark-submit 提交到独立集群。
    • 如果使用 spark-shell,它似乎使用了 confs,因为它找到了 jdbc 而没有在 scala 中指定它。不过,在将它们放入 confs 之前,我必须使用 addJar 在 spark-shell 中添加 jdbc jar。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-12
    • 1970-01-01
    • 1970-01-01
    • 2010-11-30
    • 2017-06-17
    • 1970-01-01
    相关资源
    最近更新 更多