我应该在此前提到我正在为我的AWS账户使用增强型VPC路由,precludes me使用传统的S3到Redshift查询:
“您的群集无法启用增强型VPC路由。(使用Spectrum)”
我的理解是AWS Redshift是一种高辛烷值的Postgres-as-a-service,针对大数据量的极快读取进行了优化。因此,如果你很多拥有想要查询/分析的关系数据,那么Redshift对你来说是个不错的选择。
我对AWS Athena的理解就是它只使用像Apache Drill(或类似的)这样的东西来提供类似于SQL的界面,而不是存储在S3存储桶中的任何数据(关系和其他,以及任何格式:非结构化明文,JSON,XML等)。因此,如果您只想在S3中使用类似SQL的语法进行查询,那么Athena就是您的不错选择。
首先,任何人都可以通过确认/澄清我上面的理解来开始吗?假设我或多或少是正确的......
我有生活在S3上的结构化/关系型(存储在JSON和CSV文件中)。我想创建一个ETL进程,从S3读取这些数据并将其转储到Redshift中,以便下游进程可以对其进行分析。
所以我正在考虑创建一个基于Spark的ETL管道,其中包括:
DataFrames
;我也想知道AWS Glue是否可以在这里做一些繁重的工作DataFrames
的内容写入Redshift 所以我的问题:这是将大量部分结构化/关系型S3数据(再次存储在各种文件格式中)移植到Redshift中的最有效方法,还是有更好/更简单的方式?
答案 0 :(得分:3)
修改强> 由于您的Redshift集群无法访问任何S3(由于增强的VPC路由),因此我在此处看到的选项是使用JDBC写入Redshift。
关于Athena :由于您使用的是Spark,因此您不需要Athena - spark可以从S3读取数据并从中创建数据帧。
关于Glue :Glue是一个无服务器 Spark产品,它带有Glue Catalog(Metastore),Crawlers用于发现表格,Spark代码生成器用于简单转换。最好的是它还运行普通的火花代码。我不知道你如何运行你的火花工作负载,但这可能是一个选择。
在Spark中将DataFrame
写入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加载数据,因为所有流量都通过主节点,并且它无法正确利用并行性。
有一种更简单的方法,即使是两种方式:
要将数据从s3加载到Redshift,您不需要任何外部ETL过程(前提是您不必转换数据)。 Redshift支持loading data from S3 directly
copy venue from 's3://mybucket/venue'
iam_role 'arn:aws:iam::0123456789012:role/MyRedshiftRole'
delimiter '|';
其他选项是使用Redshift频谱(这与AWS Athena非常相似,但使用redshift sql引擎而不是presto),它允许您将S3存储桶作为表公开,而无需在任何地方移动数据。您只需创建一个EXTERNAL SCHEMA
和一个EXTERNAL TABLE
,您的表格就可以从Redshift(以及Athena)中查看和排队。更多official AWS documentation
请注意:Redshift仅支持 flat 模式,因此如果您有struct
,array
或map
架构,在以某种方式展平之前,您将无法将其加载到Redshift中(AWS Glue提供relationalize
函数来自动执行此操作)。由于Presto支持嵌套模式,因此您可以使用Athena来查询conplex nexted模式。