通过Spark和Glue将部分关系S3数据移植到Redshift中

时间:2018-05-15 01:46:57

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

我应该在此前提到我正在为我的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管道,其中包括:

  1. Spark使用Athena将S3数据查询到DataFrames;我也想知道AWS Glue是否可以在这里做一些繁重的工作
  2. Spark将这些DataFrames的内容写入Redshift
  3. 所以我的问题:这是将大量部分结构化/关系型S3数据(再次存储在各种文件格式中)移植到Redshift中的最有效方法,还是有更好/更简单的方式?

1 个答案:

答案 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加载数据,因为所有流量都通过主节点,并且它无法正确利用并行性。

有一种更简单的方法,即使是两种方式:

  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

  3. 请注意:Redshift仅支持 flat 模式,因此如果您有structarraymap架构,在以某种方式展平之前,您将无法将其加载到Redshift中(AWS Glue提供relationalize函数来自动执行此操作)。由于Presto支持嵌套模式,因此您可以使用Athena来查询conplex nexted模式。