首页 文章

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

提问于
浏览
0

我应该在此前提到我正在为我的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 回答

  • 3

    EDIT 由于您的Redshift群集无法访问任何S3(由于增强型VPC路由),因此我在此处看到的选项是使用JDBC写入Redshift .

    Regarding Athena :由于您在这里需要Athena - spark可以从S3读取数据并从中创建数据帧 .

    Regarding Glue :Glue是一个无服务器的Spark产品,它带有Glue Catalog(Metastore),Crawlers用于发现表格和Spark代码生成器,用于简单的转换 . 最好的是它还运行普通的火花代码 . 我不知道你如何运行你的火花工作负载,但这可能是一个选择 .

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

    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 .

    Please note :正如我在评论中提到的那样 - 不鼓励通过JDBC接口向Redshift加载数据,因为所有流量都通过主节点,并且它无法正确利用并行性 .


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

    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

    Please Note :Redshift仅支持平面模式,因此如果您的模式中有任何 structarraymap ,则在以某种方式展平之前,您将无法将其加载到Redshift中(AWS Glue提供了 relationalize 函数来自动执行此操作) . 由于Presto支持嵌套模式,因此您可以使用Athena来查询conplex nexted模式 .

相关问题