【问题标题】:How to fix this scala jar error "Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/spark/sql/types/DataType"如何修复此 scala jar 错误“线程“主”java.lang.NoClassDefFoundError:org/apache/spark/sql/types/DataType 中的异常”
【发布时间】:2019-07-20 21:00:35
【问题描述】:

scala spark 对象在 intelliJ 中运行时运行良好。但是在构建工件并作为 jar 执行之后,我在下面收到此错误。

线程“主”java.lang.NoClassDefFoundError:org/apache/spark/sql/types/DataType 中的异常

如何解决这个问题?感谢您对此的投入。

IntelliJ IDEA

由 File>Project Structure>Project Setting>Artifacts> + > Jar > 来自具有依赖关系的模块生成的 jar 文件 选中复选框“包含在项目构建中” 应用 > 确定 Tab:Build>Build Artifacts>poc:jar>Build

Jar 错误

build.sbt

name := "poc"
version := "0.1"
scalaVersion := "2.11.12"
libraryDependencies ++= Seq(
  "org.apache.spark" % "spark-core_2.11" % "2.4.3",
  "org.apache.spark" % "spark-sql_2.11" % "2.4.3",
  "com.datastax.spark" % "spark-cassandra-connector_2.11" % "2.4.1",
  "org.apache.hadoop" % "hadoop-aws" % "2.7.1"
) 

poc.scala

import org.apache.spark.sql.types.{ IntegerType, StringType, StructField, StructType}
import org.apache.spark.{SparkConf, SparkContext}
import org.apache.spark.sql.SparkSession

object dataload {
  def main(args: Array[String]): Unit =
  {
    val awsAccessKeyId: String     = args(0)
    val awsSecretAccessKey: String = args(1)
    val csvFilePath: String        = args(2)
    val host: String               = args(3)
    val username: String           = args(4)
    val password: String           = args(5)
    val keyspace: String           = args(6)

    println("length args: " + args.length)

    val Conf = new SparkConf().setAppName("Imp_DataMigration").setMaster("local[2]")
      .set("fs.s3n.awsAccessKeyId", awsAccessKeyId)
      .set("fs.s3n.awsSecretAccessKey", awsSecretAccessKey)
      .set("fs.s3n.impl", "org.apache.hadoop.fs.s3native.NativeS3FileSystem")
      .set("spark.cassandra.connection.host", host)
      .set("spark.cassandra.connection.port","9042")
      .set("spark.cassandra.auth.username", username)
      .set("spark.cassandra.auth.password", password)

    val sc = new SparkContext(Conf)
    val spark = SparkSession.builder.config(sc.getConf).getOrCreate()

    val schemaHdr = StructType(
      StructField("a2z_name", StringType) ::
        StructField("a2z_key", StringType) ::
        StructField("a2z_id", IntegerType) :: Nil
    )

    val df = spark.read.format( source = "csv")
      .option("header", "true")
      .option("delimiter", "\t")
      .option("quote", "\"")
      .schema(schemaHdr)
      .load( path = "s3n://at-spring/a2z.csv")

    println(df.count())

    df.write
      .format( source = "org.apache.spark.sql.cassandra")
      .option("keyspace","poc_sparkjob")
      .option("table","a2z")
      .mode(org.apache.spark.sql.SaveMode.Append)
      .save

    sc.stop()

  }


}

【问题讨论】:

    标签: scala apache-spark intellij-idea


    【解决方案1】:

    Spark 应用程序通常通过spark-submit 脚本提交。可以使用java -jar ... 提交作业,但是您将很难处理类路径问题,正如您现在所看到的那样。

    相关地,您需要将 Spark/Hadoop 依赖项标记为“已提供”,例如"org.apache.spark" % "spark-core_2.11" % "2.4.3" % "provided",因为spark-submit 将从本地安装中找到必要的 .jar 文件并将其添加到类路径中。

    【讨论】:

    • 确实依赖于“提供并且没有”火花提交,但仍然是同样的错误:(
    • spark-submit 给出此错误 线程“main”中的异常 java.lang.RuntimeException: java.lang.ClassNotFoundException: Class org.apache.hadoop.fs.s3a.S3AFileSystem not found
    【解决方案2】:

    通过使用 sbt assembly 构建一个 fat jar 解决了这个问题。

    这篇文章帮助了我

    How to build an Uber JAR (Fat JAR) using SBT within IntelliJ IDEA?

    【讨论】:

      猜你喜欢
      • 2019-09-09
      • 2021-06-24
      • 1970-01-01
      • 2017-01-30
      • 2016-07-03
      • 1970-01-01
      • 2020-08-01
      • 2018-08-09
      • 2017-11-22
      相关资源
      最近更新 更多