scala - 使用 spark 和 scala 将文件写入 S3 非常慢。有什么更好的方法来优化它?

标签 scala amazon-web-services apache-spark amazon-s3

df.write.option("header", "false").
          option("quote", null).
          option("delimiter", Delimiter).
          csv(tempPath)

当我保存 2 KB 文件时,保存到 S3 需要不到 5 秒的时间,但是当我尝试保存大约 20GB 的大文件时,需要 1 个多小时。

有什么建议可以加快写作过程吗?

我正在使用“s3a//”进行保存。

更新:当我操作大小为 5 KB 的数据并生成 20 KB 文件以存储到 S3 时,需要 8 秒。
当我尝试操作大小为 250MB 的数据并生成 20KB 文件以存储到 S3 时,需要 45 分钟。
我在保存之前进行计数,因此在保存之前通过 spark 对其进行评估。

当我使用“aws S3 cp”命令将相同的 20KBB 文件复制到 S3 时,只需不到一秒钟的时间。

那么,Spark 正在做什么以减慢保存过程?

最佳答案

这不是写,而是输出是通过重命名提交的,这在 s3a 中通过列表、副本和删除进行模拟。您拥有的文件越多,您拥有的数据就越多,所需的时间也就越长。 “使用算法 2”技术使事情稍微快一些,但使用起来并不安全,因为:

这里真正的问题是不可见的,但提交算法假定 rename() 是原子的和可靠的,而事实并非如此。数据可能会悄悄丢失

除非为您提供 s3 客户端的人另有说明,否则针对 HDFS 工作,然后复制到 S3。 (EMR S3的连接器直接使用是安全的)

  • Spark Cloud Integration
  • 星火峰会talk on spark and object stores
  • 关于scala - 使用 spark 和 scala 将文件写入 S3 非常慢。有什么更好的方法来优化它?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47803007/

    相关文章:

    apache-spark - 在 join 和 reduceByKey 中触发执行程序内存不足

    scala - 在集群 (YARN) 模式下,Spark 上的 Kerberos 问题

    mysql - SQL 查询不适用于 RDS

    php - 使用 Amazon RDS 查询大型 MySQL 表

    amazon-web-services - 路由表 (AWS VPC) 中的目的地和目标是什么?

    JavaSparkStreaming | JavaSparkStreaming在awaitResult中抛出异常

    scala - 在scala中,是否可以有一个只有两个元素的Set?

    scala - 通用流/阅读器复制

    scala - scala 中的闭包是如何实现的?

    apache-spark - 使用嵌套用户数据类型保存 Spark DataFrame