我对火花分区的理解是否正确?

时间:2018-01-23 12:39:35

标签: apache-spark bigdata partitioning

我想知道如果我对Spark中的分区的理解是正确的。 我一直在考虑分区数量及其大小,而不是 他们由处理的工作人员。

昨天,由于我正在玩分区,我发现我能够使用WEB UI(存储 - >缓存RDD - >数据分发)跟踪缓存分区的位置,这让我感到惊讶。

我有一个30个核心的集群(3个核心* 10个执行程序),我有一个类似10个分区的RDD。我试图将其扩展到100个分区以增加并行性,只是为了发现几乎90%的分区都在同一个工作节点上,因此我的并行性不受集群中cpu总数的限制,而是受到数量的限制。包含90%分区的节点的cpu。

我试图在stackoverflow上找到答案,我唯一可以得到的答案就是数据局部性。 Spark检测到我的大多数文件都在这个节点上,所以它决定将大部分分区保留在这个节点上。

我的理解是否正确?

如果是的话,有没有办法告诉Spark 真的改组数据? 到目前为止,这个“数据位置”导致我的集群严重未充分利用......

1 个答案:

答案 0 :(得分:-1)

Spark严重依赖于数据位置。它总是尝试将工作室壁橱运行到数据所在的位置。

现在RDD的问题有10个分区,但是spark作业有30 * 3个分区。这基本上意味着最多10个执行器可以并行运行,其余的将处于空闲状态。

所以有两种选择。您可以减少spark作业执行程序,以便从集群中使用更少的资源。或者您可以增加RDD中的分区数。

要做的就是重新分配。

val newDF = df.repartition(100).

这会强制改组原始数据,并会创建更多分区。

然而,拥有许多分区会产生反效果。如果每个分区都很小,那么火花任务将花费越来越少的时间来完成。然后,您将看到每个任务比处理数据花费更多时间来启动/安排。

理想情况下,您希望保持每个RDD分区等于HDFS块大小,以获得(128MB)最佳效益。

由于您只有4个节点,因此底层数据最多可以存在于4个节点中。如果rdd分区10建议的数据很小。数据可能存在于1个框中。这使得Spark在不同的物理盒中产生执行器的空间非常小。由于spark基本上试图将数据局部性作为主要目标,同时产生执行程序,因此它会在最初存在数据的同一个框中产生工作者。

因此,当您进行重新分区时,您最终会在同一个框中显示所有数据。我建议你用更大的数据集和更大数量的节点来测试它,其中spark重新分配将提供所需的好处。