【发布时间】:2016-06-21 18:24:05
【问题描述】:
对于处理大量数据的 Spark 有多好和多快,有很多炒作。
所以,我们想研究一下 spark 的查询性能。
- 机器配置:
4 个工作节点,r3.2xlarge 实例
- 数据
我们的输入数据存储在 S3 中的 12 个拆分的 gzip 文件中。
- 我们做了什么
我们使用 Spark SQL 为上述输入数据集创建了一个表。
然后我们缓存了表。我们从 Spark UI 中发现,Spark 并没有将所有数据加载到内存中,而是将一些数据加载到内存中,而将一些数据加载到磁盘中。 更新:我们还测试了镶木地板文件。在这种情况下,所有数据都加载到内存中。然后我们执行与下面相同的查询。性能还不够好。
- 查询性能
假设表名是 Fact_data。我们对该缓存表执行了以下查询:
select date_key,sum(value) from Fact_data where date_key 201401 and 201412 group by date_key order by 1 查询需要 1268.93 秒才能完成。与仅需要 9.23 秒的 Redshift(dc1.large 集群)中的执行时间相比,这是巨大的。 我还测试了其他一些查询,例如 count、join 等。Spark 对每个查询的性能都很差
-
问题
您能提出一些可以提高查询性能的建议吗?可能是我缺少一些优化技术。任何建议都将受到高度赞赏。
如何强制 Spark 将所有数据加载到内存中?目前它在内存中存储了一些数据,在磁盘中存储了一些数据。
使用 Dataframe 和 SQL 表有性能差异吗?我觉得不行。因为在后台他们使用的是相同的优化器。
【问题讨论】:
-
你有没有得到任何积分来提高查询性能。我也面临同样的问题
-
我们已经应用了 Spark 文档中建议的所有优化,例如,内存缓存、分区、用于连接的集群等。性能有所提高,但无法击败 MPP 数据库(如 vertica 或 redshift)的性能。
-
您能否进一步阐明您的数据结构?是全部在一个“文件”(又名表)中,还是在 12 个表中?您是在不同文件之间加入,还是在查询中尝试自我加入?您能否详细说明您已序列化的数据结构以及您正在运行的查询?
标签: apache-spark apache-spark-sql query-performance spark-dataframe