如何处理异常:运行spark-submit时出现“没有合适的驱动程序”

元数据

我正在尝试运行一个火花代码,该代码将读取postgres数据库上的表并将其插入HDFS上的Hive表中。为此,我在属性文件中设置了连接属性,如下所示:

devUserName=usrname
devPassword=pwd
gpDriverClass=org.postgresql.Driver
gpDevUrl=jdbc:postgresql://ip:port/dbname?ssl=true&sslfactory=org.postgresql.ssl.NonValidatingFactory

并将属性文件读取为:

  val conFile       = "testconnection.properties"
  val properties    = new Properties()
  properties.load(new FileInputStream(conFile))

  // GP Properties
  val connectionUrl = properties.getProperty("gpDevUrl")
  val devUserName   = properties.getProperty("devUserName")
  val devPassword   = properties.getProperty("devPassword")
  val driverClass   = properties.getProperty("gpDriverClass")

我通过以下方式提交jar文件:

SPARK_MAJOR_VERSION=2 spark-submit --conf spark.ui.port=4090 --driver-class-path /home/usrname/jars/postgresql-42.1.4.jar --master=yarn --deploy-mode=cluster --driver-memory 40g --driver-cores 3 --executor-memory 40g --executor-cores 20 --num-executors 5  --files /usr/hdp/current/spark2-client/conf/hive-site.xml,testconnection.properties --jars /home/usrname/jars/postgresql-42.1.4.jar --class com.partition.source.YearPartition splinter_2.11-0.1.jar  --keytab /home/usrname/usrname.keytab --principal [email protected] --name Splinter --conf spark.executor.extraClassPath=/home/usrname/jars/postgresql-42.1.4.jar

作业失败,并显示以下错误消息:

client token: Token { kind: YARN_CLIENT_TOKEN, service:  }
     diagnostics: User class threw exception: java.sql.SQLException: No suitable driver
     ApplicationMaster host: 10.230.137.190
     ApplicationMaster RPC port: 0
     queue: default
     start time: 1537545547309
     final status: FAILED
     tracking URL: http://ip:port/proxy/application_123456789_76/
     user: fdlhdpetl
18/09/21 15:59:38 INFO Client: Deleted staging directory hdfs://dev/user/usrname/.sparkStaging/application_123456789_76
Exception in thread "main" org.apache.spark.SparkException: Application application_123456789_76 finished with failed status
    at org.apache.spark.deploy.yarn.Client.run(Client.scala:1187)
    at org.apache.spark.deploy.yarn.Client$.main(Client.scala:1233)
    at org.apache.spark.deploy.yarn.Client.main(Client.scala)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)
    at org.apache.spark.deploy.SparkSubmit$.org$apache$spark$deploy$SparkSubmit$$runMain(SparkSubmit.scala:782)
    at org.apache.spark.deploy.SparkSubmit$.doRunMain$1(SparkSubmit.scala:180)
    at org.apache.spark.deploy.SparkSubmit$.submit(SparkSubmit.scala:205)
    at org.apache.spark.deploy.SparkSubmit$.main(SparkSubmit.scala:119)
    at org.apache.spark.deploy.SparkSubmit.main(SparkSubmit.scala)
18/09/21 15:59:38 INFO ShutdownHookManager: Shutdown hook called
18/09/21 15:59:38 INFO ShutdownHookManager: Deleting directory /tmp/spark-59934097-dfe9-4ad2-a66a-ff93d42cf838

我在build.sbt文件中的依赖项:

name := "Splinter"
version := "0.1"
scalaVersion := "2.11.8"

libraryDependencies ++= Seq(
  "org.apache.spark" %% "spark-core" % "2.0.0" % "provided",
  "org.apache.spark" %% "spark-sql" % "2.0.0" % "provided",
  "org.json4s" %% "json4s-jackson" % "3.2.11" % "provided",
  "org.apache.httpcomponents" % "httpclient" % "4.5.3"
)

// https://mvnrepository.com/artifact/org.postgresql/postgresql
libraryDependencies += "org.postgresql" % "postgresql" % "42.1.4"

用于读取postgres表的代码:

def prepareFinalDF(splitColumns:List[String], textList: ListBuffer[String], allColumns:String, dataMapper:Map[String, String], partition_columns:Array[String], spark:SparkSession): DataFrame = {
  val execQuery = s"select ${allColumns}, 0 as ${flagCol} from schema.tablename where period_year='2017'"
  val yearDF    = spark.read.format("jdbc").option("url", connectionUrl).option("dbtable", s"(${execQuery}) as year2017").option("user", devUserName).option("password", devPassword).option("numPartitions",20).load()
  val totalCols:List[String] = splitColumns ++ textList
  val cdt                    = new ChangeDataTypes(totalCols, dataMapper)
  hiveDataTypes              = cdt.gpDetails()
  prepareHiveTableSchema(hiveDataTypes, partition_columns)
  val allColsOrdered         = yearDF.columns.diff(partition_columns) ++ partition_columns
  val allCols                = allColsOrdered.map(colname => org.apache.spark.sql.functions.col(colname))
  val resultDF               = yearDF.select(allCols:_*)
  val stringColumns          = resultDF.schema.fields.filter(x => x.dataType == StringType).map(s => s.name)
  val finalDF                = stringColumns.foldLeft(resultDF) {
    (tempDF, colName) => tempDF.withColumn(colName, regexp_replace(regexp_replace(col(colName), "[\r\n]+", " "), "[\t]+"," "))
  }
  finalDF
}

execQuery包含: select * from schema.tablename where period_year=2017

val dataDF = prepareFinalDF(splitColumns, textList, allColumns, dataMapper, partition_columns, spark)
dataDF.createOrReplaceTempView("preparedDF")
spark.sql("set hive.exec.dynamic.partition.mode=nonstrict")
spark.sql("set hive.exec.dynamic.partition=true")
spark.sql(s"INSERT OVERWRITE TABLE default.xx_gl_forecast PARTITION(${prtn_String_columns}) select * from preparedDF")

我检查了spark-submit中提到的jar,它存在于给定的目录中,但提交时仍然失败。谁能告诉我我在这里做错了什么?在spark-submit中提供参数时,是否要遵循任何特定的顺序?

罗伯托·孔久(Roberto Congiu)

postgres的JDBC驱动程序不仅必须在spark驱动程序的类路径中,而且还必须在执行程序中。有3种方法可以做到:

  1. 您构建了一个包含驱动程序的胖子罐。这意味着添加"org.postgresql" % "postgresql" % "42.1.4"到您的项目中libraryDependencies
  2. 您告诉Spark从Maven下载依赖项。根据您的情况,将其添加--packages org.postgresql:postgresql:42.1.4到spark-submit(而不是--driver-class-path)中。
  3. 使用,--jars并附带驱动程序jar的路径。这会将驱动程序添加到驱动程序和执行者的类路径中。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

线程“main”中的异常 java.sql.SQLException:运行 spark-submit 时没有合适的驱动程序

如何解决异常java.sql.SQLException:没有找到合适的驱动程序?

如何解决错误:java.sql.SQLException:Spring安全中没有合适的驱动程序?

使用DTO时如何处理异常

如何处理牛仔websocket处理程序中的异常?

我该如何处理无效的异常处理程序例程?

如何处理@ControllerAdvice中所有未处理的异常?

在Docker容器中运行Spark驱动程序-没有从执行程序到驱动程序的连接返回?

sql中没有返回行时如何处理异常

servlet调用中找不到合适的驱动程序异常

从JAR运行时“找不到合适的驱动程序”

如何处理 Azure 逻辑应用程序中的异常

创建名称为“ namedParameterJdbcTemplate”的bean时出错,无法确定合适的驱动程序类,试图运行Web应用程序

不需要操作时如何处理 Python 异常

使用容器管理事务时如何处理异常

如何处理实例化类对象时发生的异常

使用WebClient.DownloadFileAsync时如何处理异常

使用SwingWorker时应如何处理异常?

在RXJava中订阅操作时如何处理异常

与Cassandra的连接失败时如何处理异常?

使用Spring Kafka框架时如何处理错误/异常?

在python中编写库时如何处理异常

用户取消登录流程时如何处理平台异常

使用SpreadsheetApp.openById()时如何处理抛出的异常

java spark cassandra 小程序给出了 datastax 驱动程序异常:SyntaxError:在输入“FROM”时没有可行的替代方案

如何解决“找不到合适的驱动程序”错误

运行Neo4j Python Bolt驱动程序示例时,错误:“ ImportError:没有名为'_backend'的模块”

设备上没有空间时如何处理异常

java.sql.SQLException:将DataFrame加载到Spark SQL中时找不到合适的驱动程序