20190107 Spark 任务优化方案

对于一系列 Spark 任务的优化, 需要有目的的优化, 将精力花费在瓶颈处, 避免过早优化和盲目优化.

所以需要收集足够的运行信息, 比如设计一个 Dashboard, 对整个任务流程的信息进行收集, 包括输入信息/运行时间等. 另外假如这些任务是多人维护的, 有一个详细的文档说明也很重要. 从这些信息中提取公用资源/常用资源进行缓存和提前计算, 以减少实际运算时的重复计算.

任务执行前

任务输入聚合分析

目的: 分析目前各项任务中哪些条件常用, 给数据缓存提供思路

需求: 这些任务描述可能已经保存在数据库中, 最好有一个直观的可视化界面, 或者能有定期脚本分析结果, 分任务对条件进行归类聚合,
比如本周 A任务输入条件中: 条件1 a次, 条件2 b次, 条件3 c次

根据常用输入, 可以分析出各种常见模式, 提前计算结果, 或显示在界面上, 用于引导或推荐

任务执行中

多个任务共用数据

目的: 可缓存不同任务共用的中间数据, 防止重复计算

难点: 各任务逻辑不同, 需熟悉所有执行流程

解决方案:

  1. 一个人读所有计算逻辑代码
  2. 每个人维护各自计算逻辑文档(初始读取的数据, 中间生成了什么数据, 假如有什么数据会简化计算), 然后根据文档分析

单个任务常用数据

从任务输入聚合分析的结果中找到常用数据
这些数据可以采用 Parquet 保存, 所以可以使用明文, 不需要转成 id

影响: 任务的数据加载部分需要修改
问题: 如何验证数据加载/提取/过滤这一块是瓶颈? (根据 Spark 运行记录)

优化计算资源占用(内存/CPU)

目的: 增大并行任务数

解决方案: 分析各任务 Spark 流程图, 看是否占用较多资源

任务执行后

任务时间统计

目的: 寻找整个系统瓶颈

需求: 输出各任务执行时间, 最好有甘特图等