gpt4 book ai didi

apache-spark - spark-redshift 需要大量时间写入 redshift

转载 作者:行者123 更新时间:2023-12-04 06:56:54 24 4
gpt4 key购买 nike

我正在使用 kinesis 和 redshift 设置 Spark 流光。我每 10 秒从 kinesis 读取数据,处理它并使用 spark-redshift lib 将其写入 redshift。

问题是只写 300 行需要花费大量时间。

这是它在控制台中向我显示的内容

[Stage 56:====================================================> (193 + 1) / 200]

查看我的日志 df.write.format 正在这样做。

我在具有 4 gb ram 和 2 核 amazon EC2 的机器上进行了 Spark 设置,以 --master local[*] 模式运行。

这是我创建流的方法
kinesisStream = KinesisUtils.createStream(ssc, APPLICATION_NAME, STREAM_NAME, ENDPOINT, REGION_NAME, INITIAL_POS, CHECKPOINT_INTERVAL, awsAccessKeyId =AWSACCESSID, awsSecretKey=AWSSECRETKEY, storageLevel=STORAGE_LEVEL)    
CHECKPOINT_INTERVAL = 60
storageLevel = memory

kinesisStream.foreachRDD(writeTotable)
def WriteToTable(df, type):
if type in REDSHIFT_PAGEVIEW_TBL:
df = df.groupby([COL_STARTTIME, COL_ENDTIME, COL_CUSTOMERID, COL_PROJECTID, COL_FONTTYPE, COL_DOMAINNAME, COL_USERAGENT]).count()
df = df.withColumnRenamed('count', COL_PAGEVIEWCOUNT)

# Write back to a table

url = ("jdbc:redshift://" + REDSHIFT_HOSTNAME + ":" + REDSHIFT_PORT + "/" + REDSHIFT_DATABASE + "?user=" + REDSHIFT_USERNAME + "&password="+ REDSHIFT_PASSWORD)

s3Dir = 's3n://' + AWSACCESSID + ':' + AWSSECRETKEY + '@' + BUCKET + '/' + FOLDER

print 'Start writing to redshift'
df.write.format("com.databricks.spark.redshift").option("url", url).option("dbtable", REDSHIFT_PAGEVIEW_TBL).option('tempdir', s3Dir).mode('Append').save()

print 'Finished writing to redshift'

请让我知道花这么多时间的原因

最佳答案

通过 Spark 和直接写入 Redshift 时,我也有类似的经历。 spark-redshift 将始终将数据写入 S3,然后使用 Redshift 复制功能将数据写入目标表。这种方法是写入大量记录的最佳实践和最有效的方法。这种方法也对写入施加了很大的开销,特别是当每次写入的记录数量相对较少时。

查看上面的输出,您似乎有大量分区(可能有 200 个左右)。这很可能是因为 spark.sql.shuffle.partitions默认设置为 200。您可以找到更多详情 in the Spark documentation .

group 操作可能会生成 200 个分区。这意味着您要对 S3 执行 200 个单独的复制操作,每个操作在获取连接和完成写入方面都有大量相关的延迟。

正如我们在下面的评论和聊天中所讨论的,您可以将组的结果合并为更少的分区,对上面的行进行以下更改:

df = df.coalesce(4).withColumnRenamed('count', COL_PAGEVIEWCOUNT)

这会将分区数量从 200 减少到 4,并将从副本到 S3 的开销减少几个数量级。您可以尝试使用分区数来优化性能。您也可以更改 spark.sql.shuffle.partitions考虑到您正在处理的数据大小和可用内核数,设置以减少分区数。

关于apache-spark - spark-redshift 需要大量时间写入 redshift,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35739755/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com