簡體   English   中英

在 EMR 上將 JDBC 驅動程序添加到 Spark

[英]Adding JDBC driver to Spark on EMR

我正在嘗試將 JDBC 驅動程序添加到在 Amazon EMR 上執行的 Spark 集群,但我不斷收到:

java.sql.SQLException:沒有找到合適的異常驅動程序。

我嘗試了以下事情:

  1. 使用 addJar 從代碼中顯式添加驅動程序 Jar。
  2. 使用 spark.executor.extraClassPath spark.driver.extraClassPath 參數。
  3. 使用 spark.driver.userClassPathFirst=true,當我使用這個選項時,我得到了一個不同的錯誤,因為與 Spark 的依賴關系混合在一起,無論如何,如果我只想添加一個 JAR,這個選項似乎過於激進。

你能幫我解決這個問題嗎,我怎樣才能輕松地將驅動程序引入 Spark 集群?

謝謝,

大衛

應用程序源代碼

val properties = new Properties()
properties.put("ssl", "***")
properties.put("user", "***")
properties.put("password", "***")
properties.put("account", "***")
properties.put("db", "***")
properties.put("schema", "***")
properties.put("driver", "***")

val conf = new SparkConf().setAppName("***")
      .setMaster("yarn-cluster")
      .setJars(JavaSparkContext.jarOfClass(this.getClass()))

val sc = new SparkContext(conf)
sc.addJar(args(0))
val sqlContext = new SQLContext(sc)

var df = sqlContext.read.jdbc(connectStr, "***", properties = properties)
df = df.select( Constants.***,
                Constants.***,
                Constants.***,
                Constants.***,
                Constants.***,
                Constants.***,
                Constants.***,
                Constants.***,
                Constants.***)
// Additional actions on df

我有同樣的問題。 對我有用的是使用與 spark-submit 一起使用的 --driver-class-path 參數。

主要是將整個spark類路徑添加到--driver-class-path

這是我的步驟:

  1. 我通過從 Spark History Server 的“Environment”下獲取“spark.driver.extraClassPath”屬性的值來獲得默認的驅動程序類路徑。
  2. 將 MySQL JAR 文件復制到 EMR 集群中的每個節點。
  3. 將 MySQL jar 路徑放在 spark-submit 命令的 --driver-class-path 參數的前面,並將“spark.driver.extraClassPath”的值附加到它

我的驅動程序類路徑最終看起來像這樣:

--driver-class-path /home/hadoop/jars/mysql-connector-java-5.1.35.jar:/etc/hadoop/conf:/usr/lib/hadoop/ :/usr/lib/hadoop-hdfs/ :/usr/lib/hadoop-mapreduce/ :/usr/lib/hadoop-yarn/ :/usr/lib/hadoop-lzo/lib/ :/usr/share/aws/emr/emrfs/conf:/usr/share /aws/emr/emrfs/lib/ :/usr/share/aws/emr/emrfs/auxlib/*

這適用於 EMR 4.1,使用 Java 和 Spark 1.5.0。 我已經在 Maven pom.xml 中添加了 MySQL JAR 作為依賴項

您可能還想看看這個答案,因為它似乎是一個更清潔的解決方案。 我自己沒試過。

使用 EMR 5.2,我將任何新 jar 添加到原始驅動程序classpath中:

export MY_DRIVER_CLASS_PATH=my_jdbc_jar.jar:some_other_jar.jar$(grep spark.driver.extraClassPath /etc/spark/conf/spark-defaults.conf | awk '{print $2}')

在那之后

spark-submit --driver-class-path $MY_DRIVER_CLASS_PATH

按照與上面引用的這個答案類似的模式,這就是我在 EMR 集群上自動安裝 JDBC 驅動程序的方式。 (完全自動化對於每個作業啟動和終止的臨時集群很有用。)

  • 使用引導操作在所有 EMR 集群節點上安裝 JDBC 驅動程序。 您的引導操作將是一個存儲在 S3 中的單行 shell 腳本,看起來像
aws s3 cp s3://.../your-jdbc-driver.jar /home/hadoop
  • 在運行實際的 Spark 作業之前向 EMR 集群添加一個步驟,以修改/etc/spark/conf/spark-defaults.conf

這將是另一個單行 shell 腳本,存儲在 S3 中:

sudo sed -e 's,\(^spark.driver.extraClassPath.*$\),\1:/home/hadoop/your-jdbc-driver.jar,' -i /etc/spark/conf/spark-defaults.conf

步驟本身看起來像

{
    "name": "add JDBC driver to classpath",
    "jar": "s3://us-east-1.elasticmapreduce/libs/script-runner/script-runner.jar",
    "args": ["s3://...bucket.../set-spark-driver-classpath.sh"]
}

這會將您的 JDBC 驅動程序添加到spark.driver.extraClassPath

解釋

  • 您不能同時執行這兩種引導操作,因為 Spark 尚未安裝,因此無需更新配置文件

  • 您不能將 JDBC 驅動程序作為一個步驟安裝,因為您需要將 JDBC 驅動程序安裝在所有集群節點上的同一路徑上。 在 YARN 集群模式下,驅動進程不一定運行在主節點上。

  • 不過,配置只需要在主節點上更新,因為配置已打包並運送到最終運行驅動程序的任何節點。

如果您在 EMR 集群中使用 python,則無需在創建集群時指定 jar。 您可以在創建 SparkSession 時添加 jar 包。

    spark = SparkSession \
    .builder \
    .config("spark.jars.packages", "org.apache.hadoop:hadoop-aws:2.7.0") \
    .config("spark.jars.packages", "mysql:mysql-connector-java:8.0.17") \
    .getOrCreate()

然后,當您進行查詢時,請像這樣提及驅動程序:

 form_df = spark.read.format("jdbc"). \
 option("url", "jdbc:mysql://yourdatabase"). \
 option("driver", "com.mysql.jdbc.Driver"). \

這樣,在從 Maven 存儲庫中提取包時,該包就包含在 SparkSession 中。 我希望它可以幫助與我曾經處於相同情況的人。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM