apache-spark - Spark 性能问题与 Hive
问题描述
我正在开发一条每天都会运行的管道。它包括连接 2 个表,例如 x 和 y(分别约为 18 MB 和 1.5 GB 大小)并将连接的输出加载到最终表。
以下是有关环境的事实,
对于表 x:
- 数据大小:18 MB
- 分区中的文件数:~191
- 文件类型:镶木地板
对于表 y:
- 数据大小:1.5 GB
- 分区中的文件数:~3200
- 文件类型:镶木地板
现在的问题是:
Hive 和 Spark 的性能相同(所用时间相同)
我为火花工作尝试了不同的资源组合。
例如:
- 执行器:50 内存:20GB 内核:5
- 执行器:70 内存:20GB 内核:5
- 执行器:1 内存:20GB 内核:5
所有三种组合都提供相同的性能。我不确定我在这里缺少什么。
我还尝试广播小表'x'以避免加入时随机播放,但性能没有太大改善。
一个关键的观察结果是:
读取大表 'y' 消耗了 70% 的执行时间,我猜这是因为每个分区的文件数量更多。
我不确定 hive 如何提供相同的性能。
请建议。
解决方案
我假设您正在比较 MR 和 Spark 上的 Hive。如果不是这样,请告诉我。因为 Hive(在 tez 或 spark)与 Spark Sql 在性能方面不会有太大差异。
我认为主要问题是小文件太多。I/O 本身消耗了大量的 CPU 和时间,因此您无法体验 Spark 的处理能力。
我的建议是在阅读 parquet 文件后立即合并 spark 数据帧。请将“x”数据帧合并为单个分区,将“y”数据帧合并为 6-7 个分区。
完成上述操作后,请执行join(broadcastHashJoin)。
推荐阅读
- python - 如何在 lambda Python 中重写此代码并将其分配给 IpPermissions 中的 CidrIP 参数
- python-3.x - 使用 np.isin 和 np.where 进行快速像素处理 [issue]
- python - 没有名为“scipy.io.matlab”的模块
- javascript - 将javascript中的十进制数字表示为C中的“%g”格式
- r - 如何在 tidyverse 框架中最有效地过滤另一个数据框的值?
- sql-server - SQL:使用 EXIST 重用查询
- reactjs - 从 getInitialProps 返回内容时,是否有方法检查是否为空?
- javascript - 如何在 QML + JS 中为水平和垂直方向设置不同的锚点
- excel - VBA 宏正在复制和粘贴不正确的行
- django - Django poll 应用程序教程在我的服务器中没有按预期工作