首页 文章 精选 留言 我的

精选列表

搜索[sui],共24篇文章
优秀的个人博客,低调大师

spark-submit报错:Exception in thread "main" java.sql.SQLException:No sui...

版权声明:本文由董可伦首发于https://dongkelun.com,非商业转载请注明作者及原创出处。商业转载请联系作者本人。 https://blog.csdn.net/dkl12/article/details/80256619 我的原创地址:https://dongkelun.com/2018/05/06/sparkSubmitException/ 前言 最近写了一个用spark连接oracle,然后将mysql所有的表保存到hive中的程序,在本地eclipse里运行没有问题,想在集群上跑一下,看看在集群上性能如何,但是用spark-submit 提交程序时抛出一个异常Exception in thread “main” java.sql.SQLException: No suitable driver,一开始以为spark-submit提交时找不到oracle 驱动jar,折腾了半天才发现是代码问题。 1、猜测是否是缺失oracle驱动 由于在本地没有问题,所以不会想到是代码问题,根据提示想到的是spark-submit找不到oracle驱动,因为maven或sbt仓库里没有oracle驱动,在本地跑的时候,是将oracle驱动下载到本地,然后在eclipse设置build path就可以了。 但是我在spark-submit 里已经通过–jars 加载oracle驱动了: spark-submit --class com.dkl.leanring.spark.sql.Oracle2HiveDemo --jars ojdbc5-11.2.0.3.jar spark-scala_2.11-1.0.jar 开始以为自己用法不对,但是上网搜了一下,发现就是这么用的~ 然后尝试用–driver-class-path、–driver-library-path等都没成功。 2、sbt-assembly打包 网上查的sbt-assembly打包可以将所有依赖的jar包包括你写的代码全部打包在一起,于是尝试了一下 首先在项目目录中project/plugins.sbt添加 addSbtPlugin("com.eed3si9n" % "sbt-assembly" % "0.14.5") resolvers += Resolver.url("bintray-sbt-plugins", url("http://dl.bintray.com/sbt/sbt-plugin-releases"))(Resolver.ivyStylePatterns) 其中0.14.5为版本号,需要与自己sbt对应上,否则报错,可在http://dl.bintray.com/sbt/sbt-plugin-releases/com.eed3si9n/sbt-assembly/查看版本 然后在项目对应目录下执行sbt,然后输入plugins,即可看到sbtassembly插件了,如下: $ sbt [info] Loading settings from plugins.sbt ... [info] Loading global plugins from C:\Users\14123\.sbt\1.0\plugins [info] Loading settings from assembly.sbt,plugins.sbt ... [info] Loading project definition from D:\workspace\spark-scala\project [info] Loading settings from spark-scala.sbt ... [info] Set current project to spark-scala (in build file:/D:/workspace/spark-scala/) [info] sbt server started at local:sbt-server-8b6c904d40b181717b3f sbt:spark-scala> plugins In file:/D:/workspace/spark-scala/ sbt.plugins.IvyPlugin: enabled in spark-scala sbt.plugins.JvmPlugin: enabled in spark-scala sbt.plugins.CorePlugin: enabled in spark-scala sbt.plugins.JUnitXmlReportPlugin: enabled in spark-scala sbt.plugins.Giter8TemplatePlugin: enabled in spark-scala com.typesafe.sbteclipse.plugin.EclipsePlugin: enabled in spark-scala sbtassembly.AssemblyPlugin: enabled in spark-scala sbt:spark-scala> 但是这样执行sbt-assembly打包会报错,需要解决jar包冲突(deduplicate)问题 在项目的bulid.sbt里添加如下即可(只是其中一种解决策略,可根据自己项目实际情况自己设定) assemblyMergeStrategy in assembly := { case m if m.toLowerCase.endsWith("manifest.mf") => MergeStrategy.discard case m if m.startsWith("META-INF") => MergeStrategy.discard case PathList("javax", "servlet", xs @ _*) => MergeStrategy.first case PathList("org", "apache", xs @ _*) => MergeStrategy.first case PathList("org", "jboss", xs @ _*) => MergeStrategy.first case "about.html" => MergeStrategy.rename case "reference.conf" => MergeStrategy.concat case _ => MergeStrategy.first } 其中不同旧版本和新版本sbt写法不一样,具体可上网看一下别人的博客或者在官网查看。 这样就可以sbt-assembly进行打包了,发现这样打的jar包确实很大,用sbt package打的jar包大小1.48MB,sbt-assembly打的jar包大小194MB,将spark-scala-assembly-1.0.jar上传到服务器,然后执行submit,发现还是报同样的错,查看一下sbt-assembly日志,发现确实将oracle驱动加载上了~ 3、真正原因 这样就猜想不是缺少oracle驱动,于是上网查了好多,偶然发现可能是代码问题,下面是我写的从oracle取数的部分代码 val allTablesDF = spark.read .format("jdbc") .option("url", "jdbc:oracle:thin:@192.168.44.128:1521:orcl") .option("dbtable", "(select table_name,owner from all_tables where owner in('BIGDATA'))a") .option("user", "bigdata") .option("password", "bigdata") .load() 写法和我之前写的spark连接mysql的博客里的写法是一样的:Spark Sql 连接mysql 这样写在eclipse运行是没问题的,但是在spark-submit提交时是不行的,需要加上驱动信息 .option("driver", "oracle.jdbc.driver.OracleDriver") 重新打包,再运行,发现果然没问题 4、总结 4.1 其实在用spark提交之前写的spark连接mysql的程序也会报统一的错(如果$SPARK_HOME/jars没有mysql驱动),和oracle驱动不在sbt仓库里没关系。 但是之前在spark-shell里测试spark连接hive时已经将mysql驱动拷贝过去了,所以mysql没有报错 4.2 在代码里加上driver之后再提交如果没有oracle驱动会报不同的错 Exception in thread "main" java.lang.ClassNotFoundException: oracle.jdbc.driver.OracleDriver 4.3 通过–jars指定jar和sbt assembly打包都可以,看自己习惯,但通过–jars需要注意先后顺序 正确: spark-submit --class com.dkl.leanring.spark.sql.Oracle2HiveDemo --jars ojdbc5-11.2.0.3.jar spark-scala_2.11-1.0.jar spark-submit --jars ojdbc5-11.2.0.3.jar --class com.dkl.leanring.spark.sql.Oracle2HiveDemo spark-scala_2.11-1.0.jar 错误: spark-submit --class com.dkl.leanring.spark.sql.Oracle2HiveDemo spark-scala_2.11-1.0.jar --jars ojdbc5-11.2.0.3.jar spark-submit --jars ojdbc5-11.2.0.3.jar spark-scala_2.11-1.0.jar --class com.dkl.leanring.spark.sql.Oracle2HiveDemo ... 也就是通过sbt package和sbt assembly生成的项目jar包一定要放在最后面 4.4 通过–driver-class-path也可以实现加载额外的jar spark-submit --class com.dkl.leanring.spark.sql.Oracle2HiveDemo --driver-class-path lib/* spark-scala_2.11-1.0.jar 4.5 将oracle驱动拷贝到$SPARK_HOME/jars,就可以不在代码里指定driver选项了,而且也不用通过–jars添加oracle驱动,一劳永逸. cp ojdbc5-11.2.0.3.jar $SPARK_HOME/jars spark-submit --class com.dkl.leanring.spark.sql.Oracle2HiveDemo spark-scala_2.11-1.0.jar 具体这样设置可根据实际情况和偏好习惯使用。 附完整代码(测试用) 比较简单就不加注释~ package com.dkl.leanring.spark.sql import org.apache.spark.sql.SparkSession object Oracle2HiveDemo { def main(args: Array[String]): Unit = { val spark = SparkSession .builder() .appName("Oracle2HiveDemo") .master("local") .enableHiveSupport() .getOrCreate() val allTablesDF = spark.read .format("jdbc") .option("url", "jdbc:oracle:thin:@192.168.44.128:1521:orcl") .option("dbtable", "(select table_name,owner from all_tables where owner in('BIGDATA'))a") .option("user", "bigdata") .option("password", "bigdata") .option("driver", "oracle.jdbc.driver.OracleDriver") .load() import spark.implicits._ import spark.sql sql("use oracle_test") allTablesDF.rdd.collect().foreach(row => { val tableName: String = row(0).toString() val dataBase: String = row(1).toString() println(dataBase + "." + tableName) val df = spark.read .format("jdbc") .option("url", "jdbc:oracle:thin:@192.168.44.128:1521:orcl") .option("dbtable", dataBase + "." + tableName) .option("user", "bigdata") .option("password", "bigdata") .option("driver", "oracle.jdbc.driver.OracleDriver") .load() df.write.mode("overwrite").saveAsTable(tableName) }) spark.stop } }

优秀的个人博客,低调大师

【URLOS应用开发基础】10分钟制作一个nginx静态网站环境应用

KylsNJNFyGujg9hi8QR2q8qcs6xZlXCBZzITo4zS9MRRMNHty3oDApV6GGZA-FRgrXSY7xCUfgAZ2kwBe-XHsRiI68GtpkukysEVOwQRHmJkul36DIFwi39FZjOYVIrzMZ0RcZWTQZZ9EPXQOVSAkPbzT1W70IqQW3LYXaleYCzlI3y9WMeF6d1CnHtqKt3FE7Oo2ZVSmztM8rUw4b5MLGvf_eRt7RC5Oq-ID9e-an_gEGfEO8EqphKlxYlPViYb3rBuNxQkBKDy4Z4mRu59Q21NFTxDLPH_Ela7zwymbrvquDx52pSKMPUVuRqPdR5-kmIrlOiAdw9hvPpzXHRH6PpALZCpNWPX3qGPPWzJsJ88iEmrAwcMgokIwhr7mgCXo6SUI0z_E8OUNerpR3tpslp

资源下载

更多资源
腾讯云软件源

腾讯云软件源

为解决软件依赖安装时官方源访问速度慢的问题,腾讯云为一些软件搭建了缓存服务。您可以通过使用腾讯云软件源站来提升依赖包的安装速度。为了方便用户自由搭建服务架构,目前腾讯云软件源站支持公网访问和内网访问。

Nacos

Nacos

Nacos /nɑ:kəʊs/ 是 Dynamic Naming and Configuration Service 的首字母简称,一个易于构建 AI Agent 应用的动态服务发现、配置管理和AI智能体管理平台。Nacos 致力于帮助您发现、配置和管理微服务及AI智能体应用。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据、流量管理。Nacos 帮助您更敏捷和容易地构建、交付和管理微服务平台。

Spring

Spring

Spring框架(Spring Framework)是由Rod Johnson于2002年提出的开源Java企业级应用框架,旨在通过使用JavaBean替代传统EJB实现方式降低企业级编程开发的复杂性。该框架基于简单性、可测试性和松耦合性设计理念,提供核心容器、应用上下文、数据访问集成等模块,支持整合Hibernate、Struts等第三方框架,其适用范围不仅限于服务器端开发,绝大多数Java应用均可从中受益。

Sublime Text

Sublime Text

Sublime Text具有漂亮的用户界面和强大的功能,例如代码缩略图,Python的插件,代码段等。还可自定义键绑定,菜单和工具栏。Sublime Text 的主要功能包括:拼写检查,书签,完整的 Python API , Goto 功能,即时项目切换,多选择,多窗口等等。Sublime Text 是一个跨平台的编辑器,同时支持Windows、Linux、Mac OS X等操作系统。

用户登录
用户注册