【问题标题】:Write to Google Cloud Storage via Spark submit job (scala)通过 Spark 提交作业(scala)写入 Google Cloud Storage
【发布时间】:2021-09-18 11:29:53
【问题描述】:

还有其他帖子描述了如何为 spark 类设置配置(spark 和 hadoop)以便能够写入 GCS 存储桶。

如果我从 IntelliJ 运行以下代码

package com.test.migration;

import java.io.File
import java.util

import org.apache.spark.SparkContext
import org.apache.spark.sql.SparkSession
import org.apache.spark.sql.{DataFrame, SaveMode, SparkSession}
object DFToGCSLite {

  def main(args: Array[String]): Unit = {

    val spark = SparkSession
      .builder
      .master("local[*]")
      .appName("DFToGCSLite")
      .config("spark.hadoop.google.cloud.auth.service.account.enable", true)
      .config("spark.hadoop.google.cloud.auth.service.account.json.keyfile", "src/main/resources/test-storage-318320-d3aa6f895415.json")
      .getOrCreate()

    import spark.implicits._


    val sc = spark.sparkContext
    sc.hadoopConfiguration.set("fs.defaultFS", "gs://test-csv-write/")
    
      (0 to 100)
      .toDF
      .write
      .mode(SaveMode.Append)
      .parquet("outputs01")
  }
}

它完美地写入我的 GCS 存储桶。

但是当我编译 jar 并在集群上运行它时:

/usr/local/bin/spark-submit --class com.test.migration.CSVToGCS --master local /Users/adam.mac/Desktop/csv_to_gcs/target/scala-2.11/CSVToGCS-assembly-0.0.1.jar

master.("local[*]") 更改为master.("yarn")

密钥文件位置也在共享挂载上

失败了

Exception in thread "main" org.apache.hadoop.fs.UnsupportedFileSystemException: No FileSystem for scheme "gs"

内置.sbt:

name := "CSVToGCS"

version := "0.0.1"

scalaVersion := "2.11.8"

val sparkVersion = "2.4.0"

libraryDependencies ++= Seq(
  "com.typesafe" % "config" % "1.3.1",
  "org.apache.spark" %% "spark-core" % sparkVersion,
  "org.apache.spark" %% "spark-sql" % sparkVersion,
  "org.apache.spark" %% "spark-yarn" % "2.4.0" % "provided",
  "org.apache.hadoop" % "hadoop-common" % "2.7.3",
  "com.google.cloud.bigdataoss" % "gcs-connector" % "hadoop3-2.0.0"
)

我也尝试过设置这些配置:

sc.hadoopConfiguration.set("fs.gs.impl", "com.google.cloud.hadoop.fs.gcs.GoogleHadoopFileSystem")
sc.hadoopConfiguration.set("fs.AbstractFileSystem.gs.impl", "com.google.cloud.hadoop.fs.gcs.GoogleHadoopFS")

但我得到了相同的结果。我觉得我的配置在某处不正确,但是当我只从 IntelliJ 运行类文件时,代码是如何工作的?

【问题讨论】:

  • 您能检查一下您的罐子是否组装正确吗? jar tvf CSVToGCS-assembly-0.0.1.jar | grep gcs ?

标签: apache-spark hadoop google-cloud-storage hadoop-yarn


【解决方案1】:

这是我在此 github 问题https://github.com/GoogleCloudDataproc/hadoop-connectors/issues/323#issuecomment-597353458 的讨论帮助下解决错误的方法。由于我们使用的是hadoop 2.6版,我们需要使用这个gcs-connector-hadoop2-2.0.1.jar available here

一旦我把 jar 放在 $SPARK_HOME/jars/ 中,代码就可以正常工作了!

【讨论】:

    猜你喜欢
    • 2015-02-21
    • 1970-01-01
    • 2016-04-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-14
    • 1970-01-01
    相关资源
    最近更新 更多