首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在EMR上向Spark添加JDBC驱动程序

问在EMR上向Spark添加JDBC驱动程序
EN

Stack Overflow用户
提问于 2015-09-24 08:05:04
回答 4查看 8.7K关注 0票数 3

我正在尝试将JDBC驱动程序添加到在Amazon之上执行的Spark集群中,但我一直得到以下内容:

java.sql.SQLException:没有为异常找到合适的驱动程序。

我尝试了以下几点:

  1. 使用addJar显式地从代码中添加驱动程序Jar。
  2. 使用spark.executor.extraClassPath spark.driver.extraClassPath参数。
  3. 使用spark.driver.userClassPathFirst=true时,当我使用这个选项时,我得到了一个不同的错误,因为将依赖项与Spark混合在一起,如果我只想添加一个JAR,那么这个选项看起来就太激进了。

你能帮我做一下吗?我怎样才能轻易地把驱动程序介绍给星火星团?

谢谢,

大卫

应用程序的源代码

代码语言:javascript
复制
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
EN

回答 4

Stack Overflow用户

发布于 2016-02-06 05:28:23

我也有同样的问题。为我工作的结束是使用-驱动类路径参数与火花提交。

主要是将整个星火类路径添加到--驱动程序类路径中。

以下是我的步骤:

  1. 通过从Spark获取"spark.driver.extraClassPath“属性的值,我获得了默认的驱动程序类路径。
  2. 将MySQL JAR文件复制到EMR集群中的每个节点。
  3. 将MySQL jar路径放置在--驱动程序类- path参数的前面,并将"spark.driver.extraClassPath“的值附加到它。

我的驾驶员类路径最后看起来如下:

-驱动程序-类路径/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/*

这适用于EMR4.1,使用Java和Spark1.5.0。我已经将MySQL JAR添加为Maven pom.xml中的依赖项

您可能还想看看this answer,因为它似乎是一个更干净的解决方案。我自己也没试过。

票数 1
EN

Stack Overflow用户

发布于 2017-01-21 01:06:14

使用EMR5.2,我将任何新的jars添加到原始驱动程序classpath中:

代码语言:javascript
复制
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}')

在那之后

代码语言:javascript
复制
spark-submit --driver-class-path $MY_DRIVER_CLASS_PATH
票数 1
EN

Stack Overflow用户

发布于 2020-07-09 23:55:53

遵循与this answer quoted above类似的模式,这就是我在EMR集群上自动安装JDBC驱动程序的方式。(对于每个作业启动和终止的瞬态集群来说,完全自动化非常有用。)

  • 使用引导操作在所有EMR集群节点上安装JDBC驱动程序。您的引导操作将是一个一行shell脚本,存储在S3中,如下所示
代码语言:javascript
复制
aws s3 cp s3://.../your-jdbc-driver.jar /home/hadoop
  • 在运行实际的星火作业之前,在EMR集群中添加一个步骤,以修改/etc/spark/conf/spark-defaults.conf

这将是另一个一行shell脚本,存储在S3中:

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

步骤本身看起来就像

代码语言:javascript
复制
{
    "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驱动程序。在纱线集群模式中,驱动进程不一定在主节点上运行。
  • 不过,配置只需要在主节点上更新,因为配置被打包并发送到运行驱动程序的任何节点。
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32756335

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档