Spark Dataframe 未分发

Posted

技术标签:

【中文标题】Spark Dataframe 未分发【英文标题】:Spark Dataframe not distributed 【发布时间】:2018-01-31 23:15:53 【问题描述】:

我不明白为什么我的数据框只在一个节点上。 我在 spark 独立集群上有一个 14 台机器和 4 个物理 CPU 的集群。

我通过笔记本连接并创建我的火花上下文:

我期望 8 个分区的并行性,但是当我创建一个数据框时,我只得到一个分区:

我错过了什么?

感谢来自 user8371915 的分析器,我重新分区了我的数据框(我正在读取一个压缩文件 (.csv.gz),所以我理解拆分表。

但是当我对其进行“计数”时,我认为它仅在一个执行者上执行: 这里即在 executor n°1 上,即使文件大小为 700 Mb,并且位于 HDFS 上的 6 个块上。 据我了解,微积分应该超过 10 个核心,超过 5 个节点......但一切都只在一个节点上计算:-(

【问题讨论】:

【参考方案1】:

有两种可能:

文件大小低于spark.sql.files.maxPartitionBytes。 使用 gzip 等不可分割的格式压缩文件。

第一种情况你可能会考虑调整参数,但如果你用默认值,它已经很小了。

在第二种情况下,最好在加载到 Spark 之前解压缩文件。如果你不能这样做,加载后repartition,但它会很慢。

【讨论】:

我想我是第二种情况,我相应地更新了我的问题 “gz”文件上的“重新分区”似乎不起作用。我直接在 hdfs 中解压了“gz”,并在上面重建了一个数据框 => 现在我可以更改分区的数量,并看到更快的结果。 它会工作,很好,但它发生在加载之后。第一阶段不受影响。 我无法真正重新分区 gz 文件。我必须在 csv 上对其进行转换才能使分区正常工作。

以上是关于Spark Dataframe 未分发的主要内容,如果未能解决你的问题,请参考以下文章

Spark DataFrame RangePartitioner

如何在 Spark Structured Streaming 中向 DataFrame 添加几列(仍未填充)

云计算复习索引

云计算复习索引

Spark Dataframe 中的过滤操作

Microsoft.Spark 中 Take 方法的方法未实现异常