【发布时间】:2016-02-20 10:15:06
【问题描述】:
我正在尝试对 3 个 DataFrame 进行一系列转换。每次转换后,我都想保留 DF 并将其保存到文本文件中。我正在做的步骤如下。
第 0 步:
创建 DF1
创建 DF2
创建 DF3
创建 DF4
(还没有持久化没有保存)
第 1 步:
通过连接 DF1 和 DF2 创建 RESULT-DF1
将其持久化到磁盘和内存
保存到文本文件
第 2 步:
通过连接 RESULT-DF1 和 DF3 创建 RESULT-DF2
将其持久化到磁盘和内存
保存到文本文件
第 3 步:
通过连接 RESULT-DF2 和 DF4 创建 RESULT-DF3
将其持久化到磁盘和内存
保存到文本文件
观察:
Step1 创建的任务数为 601
Step2 创建的任务数为 1004(没有跳过任何内容)
Step3创建的任务数为1400(跳过400个任务)
作为不同的方法,我将上述步骤分为三个不同的运行。 IE;
- 开始,加载 DF1 和 DF2,执行 Step1,保存 RESULT-DF1 并退出
- 开始,加载 DF3,从文件加载 RESULT-DF1,执行步骤 2,保存 RESULT-DF2 并退出
- 开始,加载 DF4,从文件加载 RESULT-DF2,执行 Step3,保存 RESULT-DF3 并退出
后面的方法跑得更快。
我的问题是:
在第一种方法中是否遗漏了一些持久性方面的东西?
为什么 Step2 运行不只是使用 Step1 的结果,即使在持久化之后也不重做所有任务(只有 601 个任务而不是 1004 个)?
在实施此类转换工作流程时,有哪些关于最佳实践的好读物?
【问题讨论】:
-
您如何持久化 DataFrame 以及如何加入它们。请分享代码。
-
我已经尝试过这种情况并得到了这种行为的原因。您能否提供以下详细信息:1)集群内存和 2)用于创建 DF1、DF2、DF3 的文件大小
-
它是一个 4 + 1 集群。所有五个节点都有 32 GB。跑了四个执行者。提供 20 GB 作为执行程序内存和 20 GB 作为驱动程序内存。每个源的数据大小约为 50 到 75 GB。
-
@pankajarora 使用数据框 sql 连接(内部连接)。对于坚持,尝试: resDf1.persist(StorageLevel.DISK_ONLY()) 和 resDf1.persist(StorageLevel.MEMORY_AND_DISK())
标签: apache-spark