【问题标题】:Average time to load 1.5 GB Dataframe from pyspark on EMR to S3 or Redshift从 EMR 上的 pyspark 加载 1.5 GB 数据帧到 S3 或 Redshift 的平均时间
【发布时间】:2020-09-02 17:52:45
【问题描述】:

我正在使用具有 1 个主节点(m5.2x 大)和 4 个核心节点(c5.2xlarge)的 EMR 集群,并在其上运行 PySpark 作业,该作业将连接 5 个事实表,每个 150 列和 100k 行和 5 个小型维度表 10 列,每列少于 100 条记录。当我加入所有这些时,生成的数据框将有 650 列和 420k 记录(大约 1.5 GB 的数据)。我需要将此数据框加载到 redshift 上的一个大事实表中。

加入数据帧只需不到一分钟,但将此数据帧加载到 S3 或 Redshift 大约需要 6 分钟,我认为这相当长。如果此时间正常或仍可调整,需要专家的建议或指导吗?

我尝试加载分区、parquet 文件、加载到 HDFS,然后使用 S3discp 到 s3,然后再到 redshift。所有实施都需要相同的 6 分钟 时间范围。

【问题讨论】:

  • 我不是专家,但也许您应该在最后的步骤中调查日志。也许它正在执行一些 map-reduce 操作,或者在写入文件时正在执行 spark 操作。
  • 谢谢@Guilherme Ferreira。我深入研究了日志,发现实际加载之前的查询与时俱进。

标签: amazon-web-services amazon-s3 pyspark amazon-redshift amazon-emr


【解决方案1】:

在 redshift 中加载数据的最佳方式是使用 redshift jdbc 连接器。

当您使用 jdbc 连接器在 redshift 上写入数据时,它会在 s3 中创建一个临时目录。并在内部运行复制命令以将数据加载到您的表中。

现在如何优化?

因此,它在内部将文件划分为 redshift 集群中可用的切片数量,每个切片选择文件的一部分,使其加载更快且并行。

或者,您可以通过重新分区来划分文件并将其保存在 emrfs 上,然后手动运行复制命令。

有关所有使用信息,请访问here

【讨论】:

  • 嘿,你对这一切有多大把握? JDBC 不使用 s3 和复制?但是,您的链接是指向 databricks redshift 连接器的-这是正确的答案。请问您可以编辑您的答案以清除它并使其更正确吗?
  • 如果您查看二进制文件,您会发现 redshift 写入的工作原理,并且在使用此连接器写入时,它会询问用于卸载数据的 s3 的 iam 角色和临时目录,然后您还可以指定复制参数...我希望您已正确阅读文档
  • 我可以解决这个问题。 spark的懒评价让我觉得有点懒。实际花费的时间是运行一个连接上述 5 个事实表和 5 个维度表的巨大 sql 查询(这需要将近 5 分钟的运行时间)。加载到 Redshift 或 S3 不会花费太多时间(对于 650 列和 420k 记录,几乎不需要 20 秒)。
  • 请在这里给我一些建议,我来自 SQL 和 DWH 背景。因此,我使用单个 SQL 查询来连接所有 5 个事实和 5 个维度,因为我必须从中派生 650 列,并且我觉得单个格式正确的查询将来会很容易维护。我的另一个想法是建议使用核心火花连接(例如:df=a.join(b, a['id']=b['id'], how='inner'))。哪个会是加入这些表格的最佳/建议方式吗?目前在我庞大的 SQL 查询中,我正在广播小维度,这在一定程度上有所帮助。
  • 好吧,将其作为问题发布,我很乐意提供帮助...无法在 cmets 中解释...谢谢
猜你喜欢
  • 1970-01-01
  • 2017-08-13
  • 2021-12-11
  • 2021-11-20
  • 1970-01-01
  • 1970-01-01
  • 2019-01-07
  • 1970-01-01
  • 2020-12-28
相关资源
最近更新 更多