为什么一个分区的钻孔速度最快?



我的集群有 6 个节点,每个节点有 2 个核心。我有一个 Spark 作业,将大小为 ~150MB 的 Parquet 文件保存到 HDFS。如果我在保存之前将数据帧重新分区为 6 个分区,则钻取查询实际上比将其重新分区为 1 个分区时慢 30-40%。为什么?这是意料之中的吗?它是否表明我的设置有问题?

更新

以秒为单位的相同 SQL 查询的结果(每个分区数运行 3 次)

1 partition: 1.238, 1.29, 1.404
2 partitions: 1.286 1.175 1.259
3 partitions: 1.699 1.8 1.7
6 partitions: 2.223, 1.96, 1.772
12 partitions: 1.311, 1.335, 1.339
24 partitions: 1.261 1.302 1.235
48 partitions: 1.664 1.757 2.133

如您所见,1、2、12 和 24 分区很快。 3、6 和 48 分区显然速度较慢。可能是什么原因造成的?

使用单个分区将 Spark 中的镶木地板文件保存在 Spark 中时,应将文件本地保存到单个节点上的分区。一旦发生这种情况,复制需要启动并将文件分发到不同的节点上。

当使用多个分区将partquet文件保存在Spark中时,spark将保存已经分发的文件,但是,可能不完全是HDFS需要它的方式。复制和重新分发仍然需要启动,但现在的情况要复杂得多。

然后,根据您的 Spark 进程,您可能已经以不同的方式对数据进行了排序(1 与多个分区),这可能会使其更适合下一个进程(钻取)。

我真的无法找出原因,但是由于时间差异如此之小(您说的是秒),我不确定这种差异是否足够明显。

然后,我们可能需要对测试方法提出质疑。Java垃圾回收,正在运行的后台进程(包括复制进程)等。

我的一个建议是,在开始钻取过程之前,让 HDFS 集群静止一段时间,以确保复制和其他进程安静下来。

最新更新