【问题标题】:spark importing data from oracle - java.lang.ClassNotFoundException: oracle.jdbc.driver.OracleDriver火花从 oracle 导入数据 - java.lang.ClassNotFoundException: oracle.jdbc.driver.OracleDriver
【发布时间】:2017-09-28 13:31:16
【问题描述】:

在尝试使用 AWS EMR 上的 spark 从 oracle 数据库中读取数据时, 我收到此错误消息:

java.lang.ClassNotFoundException: oracle.jdbc.driver.OracleDriver.

谁能告诉我是否有人遇到过这个问题以及他们是如何解决的?

pyspark --driver-class-path /home/hadoop/ojdbc7.jar --jars   /home/hadoop/ojdbc7.jar

from pyspark import SparkContext, HiveContext, SparkConf

from pyspark.sql import SQLContext

sqlContext = SQLContext(sc)

df = sqlContext.read.format("jdbc").options(url="jdbc:oracle:thin:user/pass@//10.200.100.142:1521/BMD", driver = "oracle.jdbc.driver.OracleDriver", 
dbtable="S_0COORDER_TEXT_D").load()

【问题讨论】:

    标签: python oracle hadoop apache-spark pyspark


    【解决方案1】:

    我在 AWS EMR 集群 (emr-5.31.0) 上遇到了完全相同的问题。

    SparkSession.builder.config() 中设置spark.driver.extraClassPathspark.executor.extraClassPath spark-defaults.confspark-submit --jars 命令到jodbc6.jar 的位置不起作用。

    我终于通过将 Maven 坐标传递给 spark.jars.packages 来让它工作,然后我不得不将 spark.driver.extraClassPathspark.executor.extraClassPath 设置为 $HOME/.ivy2/jars/* .

    import os
    from pyspark.sql import SparkSession
    
    spark_packages_list = [
        'io.delta:delta-core_2.11:0.6.1',
        'com.oracle.database.jdbc:ojdbc6:11.2.0.4',
    ]
    spark_packages = ",".join(spark_packages_list)
    
    home = os.getenv("HOME")
    
    spark = (
        SparkSession
        .builder
        .config("spark.jars.packages", spark_packages)
        .config('spark.driver.extraClassPath', f"{home}/.ivy2/jars/*")
        .config('spark.executor.extraClassPath', f"{home}/.ivy2/jars/*")
    )
    

    然后以下工作(相应地更改参数):

    host = "111.111.111.111"
    port = "1234"
    schema = "YourSchema"
    URL = f"jdbc:oracle:thin:@{host}:{port}/{schema}"
    
    with open(f"{home}/username.file", "r") as f:
        username = f.read()
    
    with open(f"{home}/password.file", "r") as f:
        password = f.read()
    
    query  = "SELECT * FROM YourTable"
    
    df = (spark.read.format("jdbc")
        .option("url", URL)
        .option("query", query)
        .option("user", username)
        .option("password", password)
        .load()
    )
    
    df.printSchema()
    df.show()
    

    properties = {
        "user": username,
        "password": password,
    }
    
    df = spark.read.jdbc(
        url=URL, 
        table="YourTable",
        properties=properties,
        )
    
    df.printSchema()
    df.show()
    

    【讨论】:

      【解决方案2】:

      将以下代码添加到 your_spark_home_path/conf/spark-defaults.conf,'/opt/modules/extraClass/' 是我放置额外 jar 的目录:

      spark.driver.extraClassPath = /opt/modules/extraClass/jodbc7.jar
      spark.executor.extraClassPath = /opt/modules/extraClass/jodbc7.jar
      

      或者您可以简单地将 jodbc7.jar 添加到 your_spark_home_path/jars。

      【讨论】:

      • @BdEngineer 那是因为您的执行程序可能没有 jdbc jar。使用 --jars /path/to/jdbc.jar 参数运行您的 spark-submit 命令。此参数将 jar 分发给所有执行者。
      【解决方案3】:

      虽然你没有提到你使用的是哪个版本的spark……你可以在下面试试……

      将 jars 导入驱动程序和执行程序。因此,您需要编辑conf/spark-defaults.conf 在下面添加两行。

      spark.driver.extraClassPath /home/hadoop/ojdbc7.jar
      spark.executor.extraClassPath /home/hadoop/ojdbc7.jar
      


      您可以在提交作业时尝试通过,如下例所示:

      --conf spark.driver.extraClassPath /home/hadoop/ojdbc7.jar
      --conf spark.executor.extraClassPath /home/hadoop/ojdbc7.jar
      

      【讨论】:

      • 我们使用的是 spark 2.0.0 版本。我已经在 conf/spark-defaults.conf 中为驱动程序和执行程序添加了 jar,但我仍然面临同样的问题。 py4j.protocol.Py4JJavaError: 调用 o54.load 时出错。 : java.lang.ClassNotFoundException: oracle.jdbc.driver.OracleDriver
      • 我试过 pyspark --jars /home/hadoop/ojdbc7.jar --conf spark.driver.extraClassPath=/home/hadoop/ojdbc7.jar --conf spark.executor.extraClassPath= /home/hadoop/ojdbc7.jar,还是一样的问题。
      • 您建议的相同设置适用于不同的团队,但不适用于我,这很奇怪。
      • 你的东西可能有特定的问题。它应该工作。由于您提到的其他团队正在工作,请以所有者身份接受该解决方案!
      猜你喜欢
      • 2015-11-06
      • 2020-11-05
      • 2020-05-07
      • 1970-01-01
      • 2015-12-29
      • 2015-11-14
      • 2021-09-22
      • 1970-01-01
      相关资源
      最近更新 更多