[英]Adding JDBC driver to Spark on EMR
我正在嘗試將 JDBC 驅動程序添加到在 Amazon EMR 上執行的 Spark 集群,但我不斷收到:
java.sql.SQLException:沒有找到合適的異常驅動程序。
我嘗試了以下事情:
你能幫我解決這個問題嗎,我怎樣才能輕松地將驅動程序引入 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
這是我的步驟:
我的驅動程序類路徑最終看起來像這樣:
--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 驅動程序的方式。 (完全自動化對於每個作業啟動和終止的臨時集群很有用。)
aws s3 cp s3://.../your-jdbc-driver.jar /home/hadoop
/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.