Spark Poor Query性能:如何提高Spark的查询性能?

时间:2016-03-08 00:15:42

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

对于处理大量数据的好处和快速火花有很多大肆宣传。

因此,我们想调查spark的查询性能。

  • 机器配置:

4个工作节点,r3.2xlarge实例

  • 数据

我们的输入数据存储在S3中的12个分割gzip文件中。

  • 我们做了什么

我们使用Spark SQL为上述输入数据集创建了一个表。

然后我们缓存了表格。我们从Spark UI中发现Spark没有将所有数据加载到内存中,而是将一些数据加载到内存中,一些数据加载到磁盘中。 更新:我们还测试了镶木地板文件。在这种情况下,所有数据都加载到内存中。然后我们执行如下相同的查询。表现仍然不够好。

  • 查询效果

假设表名是Fact_data。我们在该缓存表上执行了以下查询:

从Fact_data中选择date_key,sum(value),其中201401和201412之间的date_key按date_key顺序排列1 查询需要1268.93秒才能完成。与Redshift(dc1.large集群)中的执行时间相比,这只需要9.23秒。 我还测试了一些其他的查询,例如,计数,加入等.Spark给我的每个查询的性能都很差

  • 问题

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

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

    3. 使用Dataframe和SQL表有什么性能差异吗?我想不是。因为他们使用相同的优化器。

1 个答案:

答案 0 :(得分: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。