我的群集有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分区非常明显较慢。可能导致什么?
答案 0 :(得分:2)
使用单个分区将镶木地板文件保存在spark中时,可以将文件本地保存到单个节点上的分区中。一旦发生这种情况,复制需要启动并通过不同的节点分发文件。
使用多个分区将partquet文件保存在spark中时,spark会保存已分发的文件,但可能不完全符合HDFS的需要。仍需要复制和重新分配,但现在处于更复杂的情况。
然后,根据您的火花过程,您可能已经以不同的方式对数据进行排序(1对多个分区),可能使其更适合下一个流程(钻孔)。
我真的不能指出一个原因,但是由于时间差异很小(你说的是秒数),我不确定差异是否足够独特。
然后,我们可能需要对测试方法置疑。 Java垃圾收集,后台进程运行(包括复制过程)等。
我的一个建议是让您的HDFS群集静止一段时间,以确保在开始钻取过程之前复制和其他进程安静下来。