【问题标题】:Porting partially-relational S3 data into Redshift via Spark and Glue通过 Spark 和 Glue 将部分关系 S3 数据移植到 Redshift
【发布时间】:2018-10-24 18:08:07
【问题描述】:

我应该先说明我正在为我的 AWS 账户使用增强型 VPC 路由,precludes me 从使用传统 S3 到 Redshift 查询:

您的集群无法启用增强型 VPC 路由。(使用 Spectrum)


我的理解是 AWS Redshift 是一种高辛烷值的 Postgres 即服务,它针对大数据量的极快读取进行了优化。因此,如果您很多有想要查询/分析的关系数据,那么 Redshift 对您来说是一个不错的选择。

我对 AWS Athena 的理解是它只是使用类似 Apache Drill(或类似的)的东西来为存储在 S3 存储桶中的任何数据提供类似 SQL 的接口(关系和其他,以及任何格式:非结构化纯文本、JSON、XML 等)。因此,如果您只想通过类似 SQL 的语法查询 S3 中的数据,那么 Athena 是您的不错选择。

首先,任何人都可以先确认/澄清我的上述理解吗?假设我或多或少是正确的......

我在 S3 上有结构化/关系(存储在 JSON 和 CSV 文件中)。我想创建一个 ETL 进程,从 S3 中读取这些数据并将其转储到 Redshift 中,以便下游进程可以对其进行分析。

所以我正在考虑创建一个基于 Spark 的 ETL 管道:

  1. Spark 使用 Athena 将 S3 数据查询到DataFrames;我还想知道 AWS Glue 是否可以在这里做一些繁重的工作
  2. Spark 将 DataFrames 的内容写入 Redshift

所以我的问题是:这是将大量部分结构化/关系 S3 数据(再次以各种文件格式存储)移植到 Redshift 的最有效方法,还是有更好/更简单的方法?

【问题讨论】:

标签: apache-spark amazon-s3 amazon-redshift amazon-athena aws-glue


【解决方案1】:

编辑 由于您的 Redshift 集群对 S3 没有任何访问权限(由于增强型 VPC 路由),我在这里看到的选项是使用 JDBC 写入 Redshift。

关于 Athena:由于您使用的是 Spark,因此此处不需要 Athena - spark 可以从 S3 读取数据并从中创建数据帧。

关于 Glue:Glue 是一种 无服务器 Spark 产品,它带有 Glue 目录(Metastore)、用于发现表的爬虫和用于简单转换的 Spark 代码生成器。最好的一点是它还运行普通的 spark 代码。我不知道您如何运行 Spark 工作负载,但这可能是一种选择。

DataFrame 写入 Spark 中的 JDBC 端点可能如下所示:

val spark = SparkSession.getOrCreate(...)
val dataframe = spark
   .read
   .format("csv") //or json
   .load("s3://your-s3-path") 

val connectionProps = new Properties()
redshiftConnProps.setProperty(...)

dataframe
    .write
    .jdbc("redshift-url", "tablename", connectionProperties)

有关 jdbc 连接属性的详细信息,请查看Spark DataFrameWriter documentation

请注意:正如我在评论中提到的 - 不鼓励通过 JDBC 接口将数据加载到 Redshift,因为所有流量都通过主节点,它无法正确利用并行性。


有一种更简单的方法,甚至有两种:

  1. 要将数据从 s3 加载到 Redshift,您不需要任何外部 ETL 流程(前提是您不必转换数据)。 Redshift 支持loading data from S3 directly

    copy venue from 's3://mybucket/venue'
    iam_role 'arn:aws:iam::0123456789012:role/MyRedshiftRole'
    delimiter '|';
    
  2. 其他选项是使用 Redshift 频谱(这与 AWS Athena 非常相似,但使用 redshift sql 引擎而不是 presto),它允许您将 S3 存储桶公开为表,而无需将数据移动到任何地方。您只需创建一个EXTERNAL SCHEMA 和一个EXTERNAL TABLE,您的表就可以从 Redshift(以及 Athena)中看到和查询。更多内容official AWS documentation

请注意:Redshift 仅支持 flat 架构,因此如果您的架构中有任何 structarraymap,您将不会能够在以某种方式将其展平之前将其加载到 Redshift 中(AWS Glue 提供了一个 relationalize 函数来自动执行此操作)。由于 Presto 支持嵌套模式,因此您可以使用 Athena 查询复杂的下一个模式。

【讨论】:

  • 感谢@botchniaque (+1) 但是如果您有增强型 VPC 路由 (see article) 就我的情况,这些选项将不起作用!
  • 这是否意味着您的存储桶对 Redshift 不可见?在这种情况下,Glue 也无济于事,因为它在内部使用 Redshift COPY 命令:/ 这会通过 JDBC 接口为您留下INSERTs,这对于大型数据集是不鼓励的。
  • 感谢@botchniaque (+1) -- 是的,这意味着当配置了增强型 VPC 路由时,Redshift 看不到存储桶。你能确认我的基于 Spark 的 ETL(从 Athena/S3 到 Redshift)毕竟不是那么疯狂吗?或者你能想出一个更好的方法来解决这个 VPC 限制吗?
  • @hotmeatballsoup 请看看我的更新答案
猜你喜欢
  • 2023-03-13
  • 1970-01-01
  • 2021-03-25
  • 2015-11-27
  • 1970-01-01
  • 2021-11-20
  • 2019-02-23
  • 1970-01-01
  • 2010-11-22
相关资源
最近更新 更多