我应该在此前提到我正在为我的AWS账户使用增强型VPC路由,这是使用传统的S3到Redshift查询的precludes me:
“您的群集无法启用增强型VPC路由 . (使用Spectrum)”
我的理解是,AWS Redshift是一种高辛烷值的Postgres-as-a-service,针对大数据量的极快读取进行了优化 . 因此,如果您有很多想要查询/分析的关系数据,那么Redshift对您来说是个不错的选择 .
我对AWS Athena的理解是它只是使用类似Apache Drill(或类似的)来为存储在S3存储桶中的任何数据提供类似SQL的接口(关系和其他方式,以及任何格式:非结构化明文,JSON,XML,等等 . ) . 因此,如果您只想在S3中使用类似SQL的语法查询数据,那么Athena就是您的不错选择 .
To begin with, can anyone begin by confirming/clarifying my understanding above? 假设我或多或少正确......
我有生活在S3上的结构化/关系(存储在JSON和CSV文件中) . 我想创建一个ETL进程,从S3中读取这些数据并将其转储到Redshift中,以便下游进程可以对其进行分析 .
所以我正在考虑创建一个基于Spark的ETL管道,其中:
-
Spark使用Athena将S3数据查询到
DataFrames
;我也想知道AWS Glue是否可能在这里做一些繁重的工作 -
Spark将那些
DataFrames
的内容写入Redshift
所以我的问题是:这是将大量部分结构化/关系型S3数据(再次存储在各种文件格式中)移植到Redshift中的最有效方法,还是有更好/更简单的方法?
1 回答
EDIT 由于您的Redshift群集无法访问任何S3(由于增强型VPC路由),因此我在此处看到的选项是使用JDBC写入Redshift .
Regarding Athena :由于您在这里需要Athena - spark可以从S3读取数据并从中创建数据帧 .
Regarding Glue :Glue是一个无服务器的Spark产品,它带有Glue Catalog(Metastore),Crawlers用于发现表格和Spark代码生成器,用于简单的转换 . 最好的是它还运行普通的火花代码 . 我不知道你如何运行你的火花工作负载,但这可能是一个选择 .
将
DataFrame
写入Spark中的JDBC endpoints 可能如下所示:有关jdbc连接属性的详细信息,请查看Spark DataFrameWriter documentation .
Please note :正如我在评论中提到的那样 - 不鼓励通过JDBC接口向Redshift加载数据,因为所有流量都通过主节点,并且它无法正确利用并行性 .
有一种更简单的方法,甚至两种方式:
EXTERNAL SCHEMA
和一个EXTERNAL TABLE
,你的表就可以从Redshift(以及Athena)中看到和排队 . 更多official AWS documentationPlease Note :Redshift仅支持平面模式,因此如果您的模式中有任何
struct
,array
或map
,则在以某种方式展平之前,您将无法将其加载到Redshift中(AWS Glue提供了relationalize
函数来自动执行此操作) . 由于Presto支持嵌套模式,因此您可以使用Athena来查询conplex nexted模式 .