将Spark数据框保存为Google云端存储中的镶木地板文件

时间:2015-09-15 17:04:08

标签: scala apache-spark google-cloud-storage apache-spark-sql parquet

我正在尝试将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

我试图在互联网上寻找类似的指南,但似乎没有?任何人都可以建议我如何完成它?

感谢。

1 个答案:

答案 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+。