【发布时间】:2019-07-05 10:13:56
【问题描述】:
我正在开发一个每天都会运行的管道。它包括连接 2 个表,例如 x 和 y(分别约为 18 MB 和 1.5 GB 大小)并将连接的输出加载到最终表。
以下是关于环境的事实,
对于表 x:
- 数据大小:18 MB
- 一个分区中的文件数:~191
- 文件类型:镶木地板
对于表 y:
- 数据大小:1.5 GB
- 一个分区中的文件数:~3200
- 文件类型:镶木地板
现在的问题是:
Hive 和 Spark 的性能相同(所用时间相同)
我为 spark 作业尝试了不同的资源组合。
例如:
- 执行者:50 内存:20GB 内核:5
- 执行者:70 内存:20GB 内核:5
- 执行器:1 内存:20GB 内核:5
所有三种组合都提供相同的性能。我不确定我在这里缺少什么。
我也尝试广播小表'x'以避免加入时随机播放,但性能没有太大提升。
一个关键的观察是:
70% 的执行时间用于读取大表 'y',我猜这是因为每个分区的文件数量更多。
我不确定 hive 如何提供相同的性能。
请推荐。
【问题讨论】:
-
1.5GB 的 3200 次拆分有点多,我认为。如果您合并拆分或重新分区,可能会有所帮助。
-
真的!我明白这一点,但问题是我们只有一份数据副本,我们怀疑对它做任何事情。另外,重新分区会再次引起洗牌,对吗?我已经试过了。
-
我曾经遇到过同样的问题——主要是因为拆分的数量。一些有用的属性
hive.vectorized.execution.enabled=true、hive.auto.convert.join = true、hive.merge.sparkfiles=true。 -
我也觉得这是由于拆分的数量,我们想使用火花。蜂巢配置在这里有帮助吗?
-
您在 Hive 中使用哪个执行引擎?
标签: apache-spark hadoop hive hdfs