提升内功方法——写RCA报告

RCA(Root Cause Analysis,根本原因分析)是一种用于分析失败的程序、技术问题、意外事件等所导致任务未完成根本原因的方法。目前一些工业型企业在使用该方法(如果你去网上找资料,大多都是工业型企业的培训PPT)。RCA其实很简单,它存在的目的就是为了找出问题发生的根本原因,然后找出解决问题的方法和指定预防措施。

这种严谨的方法同样也适用到我们的技术领域,在实践过程中对遇到的问题或者bug刨根问底,然后总结下来,如此长期积累,不仅可以锻炼处理问题的能力,也可以提高自己的技术内功。很多技术员在遇到问题仅仅是停留在按网上说的“删除某个文件”、“改下这个配置”就完事的表面形式,缺乏去思考why。

对于解决的问题,我们连续问自己5个why(有时可能会问到更多或更少),直到回答出根本原因,然后把它表达出来。我看了一些传统企业讲RCA的PPT,讲了很多RCA表示方法,比如鱼骨图、关联图等,但对我们技术员来说最简单的方法就是记录成文字即可,只需包含关键要素:

1、定义问题,表面原因是xxxx;

2、分析问题,根本原因是xxxx;

3、总结解决方案,形成预防措施。

下面是我常用的模板:

1、问题现象
所产生问题有着什么表现,比如内存不足、CPU占用率过高等。

2、分析原因
用前面提到的5个why,不断问前一个问题为什么发生,直到分析到根本原因。所谓根本原因,就是精准分析出问题所在点,找不到更多的理由含糊过去。

3、解决方案
出现这种现象,应该如何去解决。

4、经验总结
将来可以采取什么措施来避免这类问题的发生。

我举个例子,某次解决Spark小文件问题记录的RCA:

问题现象:
导出了12个月的日志,每个月日志大概100M,导出的是Parquet格式。但是用spark.read.parquet载入新导出的日志时,SparkShell会长时间阻塞,如果中断进程时会发现GC异常,有时运行时间长了也会报GC问题。

问题原因分析:
统计导出来的日志(Parquet格式,后缀名.parquet),共有165,532,9个,用Spark一次性读这么多文件时,由于Spark会把文件等信息都载入内存,竟而增加了GC的工作压力,所以JVM崩溃。

产生那么多小文件的原因是每个task都会生成一个.parquet文件。

解决方法:
只用对小文件做合并操作即可:

spark.sql("select * from logs").coalesce(1024).write.parquet(path)

coalesce参数表示生成的文件最多1024个。

经验教训:
如果是导长时间的数据,write操作前就应该加上coalesce。