课程名称:Spark+ClickHouse实战企业级数据仓库
课程章节: 初识Grok通用数据解析器
主讲老师:xiaochen
课程内容:
今天学习的内容包括:
Grok数据解析器的使用——在生产环境中,日志的格式五花八门,大部分时候不会有结构化的日志数据,如果自定义数据解析器,灵活性不高,而Grok提供了灵活的数据解析格式,可以灵活的将日志数据进行解析,并最终得到结构化的日志数据,提供给数据端使用。
Grok工具类的封装——Grok解析器在使用过程中,有许多步骤是可以复用的,将其封装为工具类可以方便后续使用。
在Spark代码中使用Grok——Grok多用在数据解析,而在spark中对数据进行解析,可以提高性能。
课程收获:
在Spark中使用Grok数据解析器,可以先封装一个UDF工具类,因为注册UDF函数的动作重复性很高,提前封装可以方便使用。在封装好Grok的UDF工具类后,在需要使用的地方进行调用。
需要注意的是,利用Grok解析的日志,在DataFrame中是一个字段存储整个结构化日志信息,可读性差,需要我们手动将这个字段拆开,把一个日志字段拆为多个字段后,要调用dataframe的drop方法,把日志字段删除。
在使用Grok的UDF时,有两个地方存在性能优化的可能,分别是读取Grok的patterns和调用compile生成Grok这两个地方。优化时可以将他们从UDF方法中提出来,在driver端执行,但这样做又会遇到两个问题
一是cluster模式下,spark读取不到本地文件,这个问题,我们可以将文件存放在hdfs进行解决。
二是Grok本提出UDF函数后,在driver端生成,但Grok对象无法序列化,这就导致UDF中无法在多节点使用Grok,解决方法是修改Grok源码,实现Serializable接口,实现序列化。
以上是今天学习所得。