【问题标题】:Spark Poor Query performance: How to improve query performance on Spark?Spark 查询性能不佳:如何提高 Spark 上的查询性能?
【发布时间】: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 对每个查询的性能都很差

  • 问题

    1. 您能提出一些可以提高查询性能的建议吗?可能是我缺少一些优化技术。任何建议都将受到高度赞赏。

    2. 如何强制 Spark 将所有数据加载到内存中?目前它在内存中存储了一些数据,在磁盘中存储了一些数据。

    3. 使用 Dataframe 和 SQL 表有性能差异吗?我觉得不行。因为在后台他们使用的是相同的优化器。

【问题讨论】:

  • 你有没有得到任何积分来提高查询性能。我也面临同样的问题
  • 我们已经应用了 Spark 文档中建议的所有优化,例如,内存缓存、分区、用于连接的集群等。性能有所提高,但无法击败 MPP 数据库(如 vertica 或 redshift)的性能。
  • 您能否进一步阐明您的数据结构?是全部在一个“文件”(又名表)中,还是在 12 个表中?您是在不同文件之间加入,还是在查询中尝试自我加入?您能否详细说明您已序列化的数据结构以及您正在运行的查询?

标签: apache-spark apache-spark-sql query-performance spark-dataframe


【解决方案1】:
  1. 我建议您使用 Parquet 作为文件格式,而不是 gzip 文件。

  2. 您可以尝试增加 --num-executors、--executor-memory 和 --executor-cores

  3. 如果您使用 YARN 并且您的实例类型为 r3.2xlarge,请确保您的容器大小 yarn.nodemanager.resource.memory-mb 大于您的 --executor-memory(可能大约 55G)还需要将 yarn.nodemanager.resource.cpu-vcores 设置为 15。

【讨论】:

    猜你喜欢
    • 2017-07-26
    • 1970-01-01
    • 2013-08-03
    • 1970-01-01
    • 2020-09-09
    • 2016-01-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多