簡體   English   中英

如何修復此Scala jar錯誤“線程“ main”中的異常java.lang.NoClassDefFoundError:org / apache / spark / sql / types / DataType”

[英]How to fix this scala jar error “Exception in thread ”main“ java.lang.NoClassDefFoundError: org/apache/spark/sql/types/DataType”

當在智能中運行時,scala spark對象運行良好。 但是在構建工件並以jar執行后,我在下面收到此錯誤。

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

如何解決這個問題? 感謝您對此的投入。

IntelliJ IDEA

“文件”>“項目結構”>“項目設置”>“工件”> +>“ 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()

  }


}

Spark應用程序通常通過spark-submit腳本提交 可以使用java -jar ...提交作業,但是處理類路徑問題的時間要困難得多,因為您現在正在體驗。

相關地,您將需要將Spark / Hadoop依賴項標記為“已提供”,例如"org.apache.spark" % "spark-core_2.11" % "2.4.3" % "provided" ,因為spark-submit將找到並從本地安裝將必要的.jar文件添加到類路徑。

通過使用sbt程序集構建胖子罐來解決此問題。

這篇文章對我有幫助

如何在IntelliJ IDEA中使用SBT構建Uber JAR(Fat JAR)?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM