从 S3 读取超过 500GB 的数据并将 400GB 输出保存到 S3 是个好主意吗?

Is it a good idea to read over 500GB data from S3 and save the 400GB outputs to S3?

我的MR 作业从AWS S3 读取500GB 数据,同时将中间数据保存在S3 中,并将reducer 的输出(大约400GB)写入S3,这是一个好的设计吗?

有没有其他更便宜稳定的解决方案?谢谢!

HDFS 上的 map reduce 旨在获取输入并执行少量操作,然后写入。由于它是并行完成的,所以设计并没有你想象的那么糟糕。你能不能更详细点,关于便宜和稳定。 HDFS绝对稳定。

我们在 AWS 中完成了 ETL 作业 运行。我们使用 Oozie 进行工作流管理。

当您在 EMR (Elastic MapReduce) 中 运行 时,您可以选择写入 s3 或本地 HDFS.

将数据存储在 s3HDFS 中的决定取决于多种因素,例如:

  • 数据的性质:临时(使用HDFS)或永久(使用s3
  • 成本:存储在 s3 中会花费一些 cents/dollars
  • 带宽:当您将数据上传到 s3 时,您会消耗一些带宽,AWS 会为此向您收费。
  • 节流:Uploads/Downloads to/from s3 已节流。如果您在短时间内 uploading/downloading 的数据过多,那么您的某些请求可能会失败。我记得在我们的一个工作流程中遇到过这个问题。
  • 作业效率:将数据存储在本地 HDFS 比存储在 s3 更快。因此,如果您希望作业 运行 更快,将结果存储在 HDFS
  • 中可能是个好主意

总的来说,我们遵循以下准则:

  1. 工作流中的一个作业完成后,如果数据要被工作流中的另一个作业消费,则存储在本地HDFS,消费后删除数据(这样就不用HDFS 中 space 中的 运行。
  2. 如果特定作业的数据不打算用于最终消费(临时数据),则将其存储在 HDFS 中。否则直接将输出写入s3.
  3. 如果最终消费需要一个中间输出,那么直接将结果存入s3,集群宕机时不丢失数据

因为在本地 HDFS 中您可以很容易地 运行 出 space,您需要规划 HDFS 集群的容量。 AWS link 此处 [Calculate the HDFS Capacity of a Cluster] 提供了计算 HDFS 容量并相应地确定 EMR 集群大小的指南。