vlambda博客
学习文章列表

优化一下 Spark 读 Kafka 的UI

我们学习一个项目的时候,一开始只能有一个了解整体架构和使用方法,很难熟悉到具体细节,我们学习的过程也是一个从一个点开始,以点带面的逐渐深入。接下来我们通过优化 spark 的一个 ui,熟悉 spark streaming 操作 kafka 的流程和原理。



引出问题


使用 spark streaming 读 Kafka 数据的时候,web 界面会展示分配到每个 Executor 的 partitions,以及每个 partition 的 offset,方便开发人员观察负载,如下图:


通过 Metadata 可以看出某个 batch 处理的所有的 partition 的 offset 详情,也就知道了每个 Executor 大概的整个负载,但是这个看起来挺乱的,我希望能够按照记录数排个序,看起来就比较分析意义。


分析代码


在动手之前要熟悉一下这部分对应的代码,可以全局搜索这些字符串找到对应代码的位置,搜索 “Details of batch” 可以找到一个 BatchPage 的类,然后在类里面搜索 “Input Metadata” 可以找到这里展示的信息对应的类是 BatchUIData 的 streamIdToInputInfo 字段,也就是一个 StreamInputInfo 类:


优化一下 Spark 读 Kafka 的UI



通过代码分析工具找到相关的代码,也就是  DirectKafkaInputDStream 的 compute 方法:

优化一下 Spark 读 Kafka 的UI


看到这里很多人就比较熟悉了,Spark streaming 消费 Kafka 数据是通过 KafkaUtils.createDirectStream 方法实现,进一步查看可以发现 是通过 DirectKafkaInputDStream 类实现的:


优化一下 Spark 读 Kafka 的UI


DirectKafkaInputDStream 继承自 InputDStream,读取 Kafka 的核心方法是 compute,compute 方法会发送到 Executor 执行,每次执行都会将对应的 partition 的元数据发送到 web ui。



修改代码


知道了代码的结构就可以修改代码了,我们要做的就是在 metadata 里面算下每个 partition 的 count,然后按照 count 排序展示,代码如下:


优化一下 Spark 读 Kafka 的UI


首先 offsetRanges 数组按照 count 排序,最后展示的时候加一个 count 字段。


然后可以在本地启动验证一下,本地启动的时候由于 spark 自带的依赖都是 provided 的可能失败,需要勾选一下启动配置:



本地运行 spark 程序,当然要启动一下 kafka 插入测试数据,访问 Web 界面:



说明已经成功了,然后就可以把代码提交到 spark 官方库,由于第一次给 spark 贡献代码很多注意事项不清楚,过了很久才满足了需求,详情可以查看:https://github.com/apache/spark/pull/26266


总结


一开始接触一个项目很难有大的架构方面的贡献,只能在一些细节上优化,通过这个小的细节优化,我们也熟悉了 Spark 消费 Kafka 的方法和原理。如果希望给一些开源项目贡献代码,也可以从优化 Web UI 开始。