蜂巢分区表上的火花行为
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多个。任务分配给执行者有什么关系吗?以上是关于蜂巢分区表上的火花行为的主要内容,如果未能解决你的问题,请参考以下文章