胶水作业从 Redshift 读取大量数据时出现性能问题

问题描述 投票:0回答:1

我正在尝试运行查询以通过 AWS Glue 作业从 redshift 表中读取数据。当它从表中读取数据时,它创建的数据框只有 1 个分区,并且从 Redshift 表中读取数据需要花费大量时间(从 Redshift 表中读取数据是一个复杂的查询,有多个连接)

        df = spark.read \
            .format("jdbc") \
            .option("url", url) \
            .option("query", query) \
            .option("numPartitions", 10) \
            .option("fetchsize", "10000") \
            .option("batchsize", "10000") 
            .load()

我使用 numPartitions 为 10,但它仍在读取一个分区中的全部数据。不知道为什么在读取时创建 10 个分区不受影响。

任何人都可以帮助我理解为什么 option("numPartitions",10) 无效以及我们如何在从 redshift 读取数据时实现并行性以提高 jdbc 读取的性能。

这也是通过将复杂查询传递给spark.read.jdbc来从redshift读取数据的最佳方法。

非常感谢对此的任何帮助。

================================================== 我厌倦了博格丹给出的建议,但它仍然没有带来任何改进。

它总是与 2 个执行器一起运行(1 个用于驱动程序,1 个用于工作节点)。确实,我们如何提高读取并行性。我尝试了以下不同的选项,但没有看到任何改进。我正在寻找与 10 到 20 名执行者一起阅读的内容,非常感谢任何建议。

DF_options  = {
                "connectionName": connection,
                "url": url,
                "sampleQuery": query,
                "user": user,
                "password": pwd,
                "redshiftTmpDir": "s3://bucket/temp/",
                "hashfield": "location",
                "hashexpression": "id",
                "hashpartitions": "5"

        }

        DF = glueContext.create_dynamic_frame_from_options(connection_type="redshift",
                                                                      connection_options=DF_options ,
                                                                      transformation_ctx="DF")
                                                              

谢谢, 巴布

amazon-web-services apache-spark pyspark apache-spark-sql aws-glue
1个回答
0
投票

这对我在红移查询上非常有效:

print(f"Executing SQL query = {sql_query}")

# Script generated for node Amazon Redshift
AmazonRedshift_node1 = glueContext.create_dynamic_frame.from_options(
    connection_type="redshift",
    connection_options={
        "sampleQuery": sql_query ,
        "redshiftTmpDir": "s3://aws-glue-assets-***/temporary/",
        "useConnectionProperties": "true",
        "connectionName": "your-connection-name",
        "aws_iam_user": "arn:aws:iam::123456789:role/yourGlueRole"
    },
    transformation_ctx="AmazonRedshift_node1",)

print("Size of DynamicFrame: {}".format(AmazonRedshift_node1.toDF().count()))
© www.soinside.com 2019 - 2024. All rights reserved.