Spark SQL性能调优:内存泄露与解决方案

需积分: 5 19 下载量 176 浏览量 更新于2024-07-17 收藏 5.61MB DOCX 举报
Spark SQL性能调优是一项关键任务,特别是在处理高并发请求时。Spark并非专为高并发场景设计,它在面临网络条件不佳的集群和大量小SQL并发压测时,可能会遇到内存泄露问题。以下是一些关键的性能调优和内存泄露问题分析: 1. 高并发内存泄露现象: - 当并发查询达到100个以上时,Spark UI上会出现大量处于pending状态的activejob,这些任务似乎永远不会结束,导致driver内存占用过高。 - 使用内存分析工具发现内存泄漏的源头,这可能是由于SQL中的大量union和join操作导致Event数量激增,超过了系统设定的上限,进而引发资源回收机制的失效。 2. AsynchronousListenerBus内存泄露: - 在高并发下,AsynchronousListenerBus负责处理Spark事件,但若事件数量过多,单线程的postToAll操作速度不足以跟上事件产生的速度,造成队列积压,最终导致内存泄露。 - 通过深入分析,发现在记录日志的部分,特别是`log4j.logger.org.apache.spark.scheduler=ERROR`,可能会成为性能瓶颈,禁用这部分日志可以提升事件处理速度。 3. Cleaner模块内存泄露: - Spark的ContextCleaner负责清理已完成任务的广播和shuffle数据,但在高并发下,这个功能可能导致内存积累,driver进程因内存溢出而崩溃。 - 内存回收依赖于System.gc,禁用这个功能会削弱垃圾回收效果,因此优化ContextCleaner的工作策略或配置参数至关重要。 为了优化Spark SQL的性能并解决内存泄露问题,建议采取以下措施: - 优化SQL查询,减少不必要的union和join操作,降低event的数量。 - 调整AsynchronousListenerBus的队列大小或处理逻辑,确保事件能及时处理,避免内存积压。 - 评估和调整日志记录级别,如禁用非必要的日志输出,提高系统响应速度。 - 定期检查和清理ContextCleaner的清理策略,确保其在高并发场景下的内存管理效率。 通过这些细致的分析和调整,可以在Spark SQL应用中有效提升性能,避免内存泄露问题,确保系统的稳定运行。
2018-08-16 上传
目录 一:为什么sparkSQL? 3 1.1:sparkSQL的发展历程 3 1.1.1:hive and shark 3 1.1.2:Shark和sparkSQL 4 1.2:sparkSQL的性能 5 1.2.1:内存列存储(In-Memory Columnar Storage) 6 1.2.2:字节码生成技术(bytecode generation,即CG) 6 1.2.3:scala代码优化 7 二:sparkSQL运行架构 8 2.1:Tree和Rule 9 2.1.1:Tree 10 2.1.2:Rule 10 2.2:sqlContext的运行过程 12 2.3:hiveContext的运行过程 14 2.4:catalyst优化器 16 三:sparkSQL组件之解析 17 3.1:LogicalPlan 18 3.2:SqlParser 20 3.1.1:解析过程 20 3.1.2:SqlParser 22 3.1.3:SqlLexical 25 3.1.4:query 26 3.3:Analyzer 26 3.4:Optimizer 28 3.5:SpankPlan 30 四:深入了解sparkSQL运行计划 30 4.1:hive/console安装 30 4.1.1:安装hive/cosole 30 4.1.2:hive/console原理 31 4.2:常用操作 32 4.2.1 查看查询的schema 32 4.2.2 查看查询的整个运行计划 33 4.2.3 查看查询的Unresolved LogicalPlan 33 4.2.4 查看查询的analyzed LogicalPlan 33 4.2.5 查看优化后的LogicalPlan 33 4.2.6 查看物理计划 33 4.2.7 查看RDD的转换过程 33 4.2.8 更多的操作 34 4.3:不同数据源的运行计划 34 4.3.1 json文件 34 4.3.2 parquet文件 35 4.3.3 hive数据 36 4.4:不同查询的运行计划 36 4.4.1 聚合查询 36 4.4.2 join操作 37 4.4.3 Distinct操作 37 4.5:查询的优化 38 4.5.1 CombineFilters 38 4.5.2 PushPredicateThroughProject 39 4.5.3 ConstantFolding 39 4.5.4 自定义优化 39 五:测试环境之搭建 40 5.1:虚拟集群的搭建(hadoop1、hadoop2、hadoop3) 41 5.1.1:hadoop2.2.0集群搭建 41 5.1.2:MySQL的安装 41 5.1.3:hive的安装 41 5.1.4:Spark1.1.0 Standalone集群搭建 42 5.2:客户端的搭建 42 5.3:文件数据准备工作 42 5.4:hive数据准备工作 43 六:sparkSQL之基础应用 43 6.1:sqlContext基础应用 44 6.1.1:RDD 44 6.1.2:parquet文件 46 6.1.3:json文件 46 6.2:hiveContext基础应用 47 6.3:混合使用 49 6.4:缓存之使用 50 6.5:DSL之使用 51 6.6:Tips 51 七:ThriftServer和CLI 51 7.1:令人惊讶的CLI 51 7.1.1 CLI配置 52 7.1.2 CLI命令参数 52 7.1.3 CLI使用 53 7.2:ThriftServer 53 7.2.1 ThriftServer配置 53 7.2.2 ThriftServer命令参数 54 7.2.3 ThriftServer使用 54 7.3:小结 56 八:sparkSQL之综合应用 57 8.1:店铺分类 57 8.2:PageRank 59 8.3:小结 61 九:sparkSQL之调优 61 9.1:并行性 62 9.2: 高效的数据格式 62 9.3:内存的使用 63 9.4:合适的Task 64 9.5:其他的一些建议 64 十:总结 64