亚马逊 EMR 与亚马逊 Redshift

Amazon EMR vs Amazon Redshift

对于大多数用例,可以使用 Amazon EMR 对流数据或有界数据(比如来自 Amazon S3)进行 Spark 转换,然后可以使用转换后的数据将数据再次写入 S3。

转换也可以在 Amazon Redshift 中实现,使用来自 S3 的不同数据加载到不同的 Redshift tables,然后来自不同 Redshift tables 的数据加载到最终 table。 (现在有了 Redshift spectrum,我们还可以 select 并直接从 S3 转换数据。)

话虽如此,我发现转换可以在 EMR 和 Redshift 中完成,Redshift 加载和转换的开发时间更短。

那么,EMR 是否应该用于主要涉及 streaming/unbounded 数据的用例?还有哪些其他用例是 EMR 更可取(我知道 Spark 也提供其他核心,sql,ml 库),但只是为了实现转换(涉及 joins/reducers),我看不到除了在 EMR 中流式传输之外的用例,也可以在 Redshift 中实现转换。

请提供何时使用 EMR 转换与 Redshift 转换的用例。

首先,我更喜欢使用 Redshift 进行转换,因为:

  • 开发更容易,SQL而不是 Spark
  • 维护/监控更容易
  • 假设您可以 运行 在 "off-peak" 期间,基础设施成本会更低 次。

有时 EMR 是更好的选择,我会在这些情况下考虑它:

  • 当您想在 S3 上同时拥有原始数据和转换后的数据时,例如一种 "data lake" 策略
  • 需要进行复杂的转换。有些转变只是 不可能使用 Redshift,比如什么时候
    • 管理复杂的大型 json 列
    • 动态数据透视(可变数量的属性)
    • 需要第三方库
  • 数据量太大,需要更大的红移集群来处理转换。

除了 Redshift 和 EMR 之外,还有其他附加选项,这些也应该考虑。 例如

  • 标准 python 或其他脚本语言:
    • 创建动态变换sql,在redshift
    • 中可以运行
    • 从 csv 处理到 parquet 或类似格式
    • 调度(例如气流)
  • AWS 雅典娜
    • 可以与 s3(例如 parquet)输入和输出一起使用
    • 使用 SQL(因此在开发时间上有一些优势)使用 Presto 语法,在某些情况下比 Redshift SQL
    • 更强大
    • 可以带来显着的成本效益,因为不需要永久性基础设施成本,按使用付费。

还应考虑 AWS Batch 和 AWS lambda。