scala应用程序中的异常“com.google.common.util.concurrent.moreexecutors.directexecutor()ljava/util/concurrent/executor”

hzbexzde  于 2021-05-27  发布在  Spark
关注(0)|答案(1)|浏览(695)

我使用shadowjar为从mysql数据库到gcs的数据移动过程制作了一个scala应用程序。
使用的渐变依赖项:

compile group: 'org.apache.spark', name: 'spark-sql_2.11', version: '2.3.0'
 compile group: 'mysql', name: 'mysql-connector-java', version: '8.0.15'
 compile group: 'org.apache.spark', name: 'spark-core_2.11', version: '2.3.0'
 compile group: 'com.google.cloud', name: 'google-cloud-storage', version: '1.110.0'
 compile group: 'com.google.oauth-client', name: 'google-oauth-client', version: '1.30.6'
 compile group: 'com.typesafe', name: 'config', version: '1.0.2'
 compile group: 'com.google.cloud', name: 'google-cloud-bigquery', version: '1.116.3'
 compile group: 'com.google.api', name: 'gax', version: '0.2.0'
compile group: 'com.microsoft.sqlserver', name: 'mssql-jdbc', version: '6.1.0.jre7'

使用的java版本: 1.8 错误1:
无法在gcs中创建blob以将Parquet文件移动到那里,出现以下异常:

Exception in thread "main" java.lang.NoSuchMethodError: com.google.common.util.concurrent.MoreExecutors.directExecutor()Ljava/util/concurrent/Executor;

解决方案1:在研究这个错误时,我得出结论,这是由于在使用shadowjar时缺少依赖项或某些依赖项版本冲突造成的,为了解决这个问题,我添加了

--conf spark.driver.userClassPathFirst=true --conf spark.executor.userClassPathFirst=true

在我的Spark里。
错误2:现在我可以在我的gcs中创建blob,错误1得到解决,但spark会话停止工作,无法从db获取数据,并引发以下异常:

Exception in thread "main" java.util.ServiceConfigurationError: org.apache.spark.sql.sources.DataSourceRegister: Provider org.apache.spark.sql.hive.orc.OrcFileFormat not a subtype

因此,如何才能执行shadowjar而不出错。
gcs错误(error1)的代码段:

val Credentials: GoogleCredentials = ServiceAccountCredentials.fromPkcs8(client_id, client_email, private_key, private_key_id, null)
val Storage= StorageOptions.newBuilder().setCredentials(Credentials).setProjectId(strProjectId).build().getService

val blobId: BlobId = BlobId.of(strGcsBucket, s"$Dir")
val blobInfo: BlobInfo = BlobInfo.newBuilder(blobId).build()
Storage.create(blobInfo, Files.readAllBytes(fPath))

spark会话错误(error2)的代码段:

val Spark: SparkSession = SparkSession.builder()
    .master("local")
    .appName("Migration App")
    .getOrCreate()
iovurdzv

iovurdzv1#

我在build.gradle中使用relocate()解决了这个错误。请参阅以下内容:

shadowJar {
    zip64 true
    mergeServiceFiles()
    relocate ('com.google.common', 'shaded.com.google.common')
}

这向我的fatjar清楚地表明,它为shadowjar中提到的依赖项版本提供了首选项,而不是本地平台依赖项。

相关问题