首页 文章

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

提问于
浏览
2

关于处理大量数据的优质和快速火花有很多大肆宣传 .

所以,我们想研究一下spark的查询性能 .

  • 机器配置:

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

  • 数据

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

  • 我们做了什么

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

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

  • 查询性能

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

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

  • 问题

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

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

  • 使用Dataframe和SQL表有什么性能差异吗?我想不是 . 因为在引擎盖下他们使用相同的优化器 .

1 回答

  • 1
    • 我建议您使用Parquet作为文件格式而不是gzip压缩文件 .

    • 你可以尝试增加你的--num-executors, - executor-memory和--executor-cores

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

相关问题