我试图将Spark数据框保存到谷歌云存储。我们可以将数据帧以拼花格式保存到S3,但由于我们的服务器是Google Compute Engine,因此将有巨大的数据传输到S3的成本。我想如果有可能有类似的功能为谷歌云存储?下面是我在S3的情况下所做的:
Add dependencies to 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
我试着在网上找一个类似的指南,但似乎没有一个?谁能告诉我怎么做呢?
谢谢。
如果有人想做同样的事情,我得到这个工作如下:
添加库依赖到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+。