Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/apache-spark/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Amazon web services Spark:如何高效地将数据帧写入S3_Amazon Web Services_Apache Spark_Amazon S3_Pyspark - Fatal编程技术网

Amazon web services Spark:如何高效地将数据帧写入S3

Amazon web services Spark:如何高效地将数据帧写入S3,amazon-web-services,apache-spark,amazon-s3,pyspark,Amazon Web Services,Apache Spark,Amazon S3,Pyspark,我正试图找出哪种方法是将数据写入计算机的最佳方法 似乎我在从S3存储桶读取数据方面没有问题,但当我需要编写时,速度非常慢 我像这样启动了spark shell(包括hadoop aws包): AWS\u ACCESS\u KEY\u ID=AWS\u SECRET\u ACCESS\u KEY=pyspark--packagesorg.apache.hadoop:hadoop-AWS:3.2.0 这是示例应用程序 #将多个csv文件从S3加载到一个数据帧(这里没有问题) df=spark.re

我正试图找出哪种方法是将数据写入计算机的最佳方法

似乎我在从S3存储桶读取数据方面没有问题,但当我需要编写时,速度非常慢

我像这样启动了spark shell(包括
hadoop aws
包):

AWS\u ACCESS\u KEY\u ID=AWS\u SECRET\u ACCESS\u KEY=pyspark--packagesorg.apache.hadoop:hadoop-AWS:3.2.0
这是示例应用程序

#将多个csv文件从S3加载到一个数据帧(这里没有问题)
df=spark.read.csv(path='s3a://mybucket/data/*.csv',sep=','
df.show()
#一些加工
结果_df=进行一些处理(df)
结果_df.cache()
结果_df.show()
#写入S3
result_df.write.partitionBy('my_column').csv(path='s3a://mybucket/output',sep='',')这太慢了
当我尝试写入S3时,我得到以下警告:

20/10/28 15:34:02 WARN AbstractS3ACommitterFactory: Using standard FileOutputCommitter to commit work. This is slow and potentially unsafe.

是否有任何设置需要更改才能高效写入S3?由于现在的速度非常慢,将100个小文件写入S3大约需要10分钟。

结果是您必须手动指定提交者(否则将使用默认提交者,它没有针对S3进行优化):

result\u df\
.写\
.partitionBy('my_column')\
.option('fs.s3a.committer.name','partitioned')\
.option('fs.s3a.committer.staging.conflict mode','replace')\
.option(“fs.s3a.fast.upload.buffer”、“bytebuffer”)\\将缓冲区放在内存中而不是磁盘中,速度可能更快,但内存更密集
.mode('覆盖')\
.csv(路径='s3a://mybucket/output',sep=',')
相关文件可在此处找到:


关于
s3://
?@Lamanus,它似乎只在EMRFS(AWS修改的Hadoop文件系统)附带的EMR集群上受支持。是否可以在本地使用EMRFS进行测试?FWIW,s3a.fast.upload.buffer选项与s3a提交者无关。任务写入文件://,当文件通过多部分PUT上传到s3时,文件在PUT/POST中直接流式传输到s3,而无需通过s3a代码(即AWS SDK传输管理器完成此工作)。此外,对于临时提交者,您必须有一个群集FS,“spark.hadoop.FS.defaultFs”。这是将任务输出给作业提交者所需要的。如果您使用file://并且没有共享NFS装载,那么最终可能会得到空输出