我正在尝试将Spark数据框保存到Google云端存储中。我们能够将数据帧格式保存到S3,但由于我们的服务器是Google Compute Engine,因此S3会产生巨大的数据传输成本。我想是否可以为Google云端存储提供类似的功能?以下是我在S3中所做的事情:
向build.sbt添加依赖项:
"net.java.dev.jets3t" % "jets3t" % "0.9.4",
"com.amazonaws" % "aws-java-sdk" % "1.10.16"
在主代码中使用:
val sc = new SparkContext(sparkConf)
sc.hadoopConfiguration.set("fs.s3a.awsAccessKeyId", conf.getString("s3.awsAccessKeyId"))
sc.hadoopConfiguration.set("fs.s3a.awsSecretAccessKey", conf.getString("s3.awsSecretAccessKey"))
val df = sqlContext.read.parquet("s3a://.../*") //read file
df.write.mode(SaveMode.Append).parquet(s3FileName) //write file
最后,使用spark-submit
spark-submit --conf spark.hadoop.fs.s3a.impl=org.apache.hadoop.fs.s3native.NativeS3FileSystem
--conf spark.hadoop.fs.s3.impl=org.apache.hadoop.fs.s3.S3FileSystem
我试图在互联网上寻找类似的指南,但似乎没有?任何人都可以建议我如何完成它?
感谢。
答案 0 :(得分:2)
如果有人想要做同样的事情,我的工作如下:
将库依赖项添加到SBT:
"com.google.cloud.bigdataoss" % "gcs-connector" % "1.4.2-hadoop2"
设置Hadoop配置:
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")
sc.hadoopConfiguration.set("fs.gs.project.id", conf.getString("gcs.projectId"))
sc.hadoopConfiguration.set("google.cloud.auth.service.account.enable", "true")
sc.hadoopConfiguration.set("google.cloud.auth.service.account.email", conf.getString("gcs.serviceAccountEmail"))
sc.hadoopConfiguration.set("google.cloud.auth.service.account.keyfile", conf.getString("gcs.serviceAccountKeyFile"))
然后您可以像保存S3一样保存和读取文件。唯一的事情是它在我测试的时候没有使用Spark 1.4,所以你可能想要将它更新为Spark 1.5+。