蜂巢分区表上的火花行为

Posted

技术标签:

【中文标题】蜂巢分区表上的火花行为【英文标题】:spark behavior on hive partitioned table 【发布时间】:2018-04-04 16:22:24 【问题描述】:

我使用 Spark 2。

实际上我不是执行查询的人,所以我不能包含查询计划。数据科学团队向我提出了这个问题。

我们将 hive 表分区为 2000 个分区并以 parquet 格式存储。当在 spark 中使用这个各自的表时,执行者之间正好有 2000 个任务在执行。但是我们有一个 256 MB 的块大小,我们预计(总大小/256)分区数肯定会远小于 2000。是否有任何内部逻辑火花使用数据的物理结构来创建分区。任何参考/帮助将不胜感激。

更新:情况正好相反。实际上我们的表非常大,比如 3 TB 有 2000 个分区。 3TB/256MB 实际上会达到 11720,但我们的分区数与表的物理分区数完全相同。我只是想了解数据量上的任务是如何生成的。

【问题讨论】:

查询内容是什么?您如何阅读蜂巢表? 我们正在读取数据,例如 data = spark.sql("select col1,clo2,clo3 from table where conditions") 并使用广播变量对结果集执行连接 【参考方案1】:

通常 Hive 分区不会 1:1 映射到 Spark 分区。 1个Hive partition可以拆分成多个Spark partition,一个Spark partition可以容纳多个hive-partition。

加载 hive-table 时 Spark 分区的数量取决于参数:

spark.files.maxPartitionBytes (default 128MB)
spark.files.openCostInBytes (default 4MB)

您可以检查分区,例如使用

spark.table(yourtable).rdd.partitions

这将为您提供一个 FilePartitions 数组,其中包含文件的物理路径。

为什么你从你的 2000 个 hive 分区中恰好得到了 2000 个 Spark 分区,这对我来说似乎是巧合,根据我的经验,这不太可能发生。请注意,spark 1.6 中的情况不同,spark 分区的数量类似于文件系统上的文件数量(1 个文件对应 1 个 spark 分区,除非文件非常大)

【讨论】:

感谢您的回复拉斐尔。我也想知道。实际上分区数是2149,等于hive表的分区数。【参考方案2】:

我只是想了解数据量上的任务是如何生成的。

任务是一个运行时工件,它们的数量正是分区的数量。

任务数量与数据量没有任何关系。拥有足够的分区来保存数据是 Spark 开发人员的责任。

【讨论】:

感谢您的意见 Jacek。我知道 spark 为每个分区只创建了一项任务,而执行查询的人没有具体提及任何分区。那么在那种情况下,为什么 spark 会有这样的行为呢?而且,每个执行者的任务分配很不均匀,一个执行者只有20个任务,另一个有400多个。任务分配给执行者有什么关系吗?

以上是关于蜂巢分区表上的火花行为的主要内容,如果未能解决你的问题,请参考以下文章

分区上的火花scala数据框功能

蜂巢上的火花 - 为啥不“选择*”产生火花应用程序/执行程序?

如何使用替换 Where 子句实现以下火花行为

亚马逊EMR火花上的蜂巢

蜂巢。动态分区并插入特定列

火花重新分区和合并