Kylin Ambassador 访谈 | 源码达人?吸猫才是本体?

朱卫斌
蚂蚁金服工程师
2020年 3月 13日

Apache Kylin 所依赖的复杂的环境配置经常让初入门的小伙伴们晕头转向,社区开发者验证 patch 的时候也多有不便。轻量级的部署方式「Kylin Docker Image」的出现完美地解决了这个老大难问题,上线后的短短 6 个月时间里被 pull 了 2.9 k+ 次,来自蚂蚁金服的朱卫斌同学正是这个便捷工具的作者。

Kylin Docker Image

除了 Docker Image,卫斌的源码阅读文章《可能是全网最深度的 Apache Kylin 查询剖析》一经推出也收获了公众号、CSDN 等平台上的满满阅读量,社区邮件组也经常有卫斌同学的身影。凭借在社区中独特的影响力,卫斌同学被评选为「Kylin Ambassador」。让我们来看看卫斌「混迹」社区的经验分享,非常适合初入门 Kylin 的同学学习~

 

注:文末有大大大大彩蛋

 

Q:可以简单介绍下自己吗?

A:目前就职于蚂蚁金服,曾就职于金山软件,主要工作是大数据平台建设、大数据计算引擎优化。熟悉 Kylin、Spark、Calcite 等计算引擎。个人爱好是羽毛球和动漫。

Q:你和 Kylin 是怎么结缘的呢?

A:公司内部一个项目刚好也需要使用到预计算技术,所以就想在开源社区调研看看做类似事情的方案,Apache Kylin 在 OLAP、预计算方向上大名鼎鼎,很自然就想要了解 Kylin 是怎么做的来达成超大数据集上的亚秒级查询这样一个目的。然后就开始阅读 Kylin 的源码,在阅读源码的过程中,发现有一些可以改进的地方或者发现一些 bug,就向社区提交了 jira/pr。从基础的环境部署、使用上的一些问题到比较深入的框架、源码优化的讨论都在社区得到了很好的反馈。

Q:读懂源码可以让大家理解底层实现,有助于更好地使用 Kylin 和快速定位、解决问题;同时也是提升自身技术能力的很好途径。作为《可能是全网最深度的 Apache Kylin 查询剖析》的作者,可以和大家分享下你的源码阅读经验吗?

A:阅读源码前需要做一些准备。

1)心理准备

首先,需要做好一定的心理准备,阅读开源项目源码:

· 是一件需要持续投入的事情:如果你只是心血来潮想随便花点时间看看,以期望收获对某个开源项目的深度理解,那是不可能的。

· 短期并不会有明显的收益:也许你花了不少时间搞明白了某个功能是怎么实现的,可能一下子也没有可以施展的地方。

2)阅读官方文档

首先,对于一个你并不熟悉的项目,我并不建议一上来就读源码。我们需要一个从宏观到微观的过程,对于一个不熟悉的项目,首先要做的是阅读该项目的官方文档,通过官方文档我们可以了解到:

· 这个项目的背景

· 是用来解决什么样的问题的

· 包含哪几个部分、每个部分的作用是什么

· 都有哪些配置,这些配置是用来控制什么的

· 可以用来体验的 examples

· …

在阅读官方文档后,在心里对这个项目其实就有了一个大概的轮廓,虽然细节还是不清楚,但是知道了个大概,也了解到了这个项目相关的很多名词。阅读官方文档的另一个好处是,它是最权威的,你可以完全信任它,但阅读其他人的翻译或者分析文章,由于作者英语、技术水平的参差不齐,文章质量相差也很大,甚至可能是错误的。

3)初步体验项目

接下来,建议动手去用一用这个项目,至少要跑一跑项目自带的 examples,对项目有一个体感。比如Kylin项目,你可以下载Docker Image快速体验下Kylin的亚秒级查询:https://kylin.apache.org/docs/install/kylin_docker.html。

如果你已经阅读了官方文档并有一定的实际使用经验,就可以开始阅读源码了。

1)带着问题找答案

比如我开始看 Kylin 的源码时,是带着 “Kylin 是怎么做到查询时输入的SQL是事实表、维表相关的,但最终查的是 Cube 的数据”这个问题去看的。看源码时,特别是一开始,如果不带着问题,容易迷失在海量的代码中,不知道从何看起,看着看着就不知道在看啥了。对于这个“问题”,可以是一个大的话题,如果是大的话题,你需要把大的话题随着看代码的过程,拆分为多个子问题去各个击破,子问题可以继续拆分为子问题,这样能让目标变得容易实现,当你解决一个子问题时,容易建立信心来解决接下来的问题。

2)Debug 式阅读

用 debug 的方式去跟读源码,相比于直接看源码是更加高效的方式。debug 能让你很清楚的看到执行某一个逻辑时:

· 各个类、方法之间的调用顺序是怎么样的

· 每个方法的输入输出是怎么样的

· 每个步骤调用前后状态、数据发生了什么样的变化

3)画流程图

我另一个习惯是画流程图,从《可能是全网最深度的Apache Kylin 查询剖析》可以看出。源码毕竟是比较庞杂、细碎的,但比如达成一个子功能的关键步骤其实并不会特别多,通过流程图可以让我们更好的提炼出有哪几个关键步骤,这几个关键步骤做了什么样的事情,让状态、数据发生了什么样的改变。说白了就是要抓住重点。这里我推荐一个很好用的工具:PlantUml(https://plantuml.com/zh/),它可以通过写简单 “代码”的方式画出各种常用的图,并且在 IDEA 中有插件支持。

PlantUml

4)费曼学习法

最后,我推荐一个四步学习法,即费曼技巧,我觉得非常适用于阅读源码:

· 第一步:选择一个你想要理解的概念,然后拿出一张白纸,把这个概念写在白纸的最上边。

· 第二步:假想你正要向别人传授这个概念,然后在白纸上写下你对这个概念的解释,就像你在教一位新接触这个概念的学生一样。这样做的时候,你会清楚的意识到关于这个概念你理解了多少,是否还存在理解不清的地方。

· 第三步:无论何时你感觉卡壳了,都要回到原始的学习资料,并重新学习让你感到卡壳的那部分,直到你领会得足够顺畅,顺畅到可以在纸上解释这个部分为止

· 第四步:用你自己的语言,而不是学习资料中的语言来解释概念。如果你的解释很冗长或者令人迷惑,那就说明你对概念的理解可能并没有你自己想象得那么顺畅。你要努力简化语言表达,或者与已有的知识建立一种类比关系(比喻),以便更好地理解它。

Q:为什么做 Kylin Docker Image 呢?

A:我第一次想去把 Kylin 跑起来进行试用的时候,发现 Kylin 的依赖非常多,包括:Hadoop, Hive, HBase, Spark, Zookeeper, Kafka, Livy(可选),并且没有一个 local 模式可以启动。对比过往熟悉的引擎,比如 Spark,有自己的 Standalone 模式可以自行运行起来,不用有其他的依赖。对于想试用或者在本地试用 Kylin 的用户来说,要部署这么一套系统成本非常大,所以我希望能够有一个能 “一键”启动 Kylin 的功能,不需要做这么繁重的依赖部署,经过和社区同学的讨论,最终以 Docker 的方式来承载这样一个功能:用户只需要执行。

docker run -d \
-m 8G \
-p 7070:7070 \
-p 8088:8088 \
-p 50070:50070 \
-p 8032:8032 \
-p 8042:8042 \
-p 16010:16010 \
apache-kylin-standalone

一条命令就能把 Kylin 跑起来,并自动 build example Cube 进行试用。

(Kylin Docker Image 见:https://hub.docker.com/r/apachekylin/apache-kylin-standalone)

Q:听说你还做了 Kylin 支持 Spark SQL 作为数据源的功能?

A:对。我之前发现 Kylin 只支持 Hive 和 JDBC 数据源,但还有很多数据源/数据格式也得到了非常广泛的应用,如:Alluxio、Cassandra、Kudu、Orc 等等。如果 Kylin 也能试用这些数据源进行 Cube 构建,那么其应用范围将会更加广泛。Spark SQL DataSource 本身就支持众多的数据源,并且开发了自定义 DataSource 的能力,具有很强的扩展性。恰好能解决 Kylin 数据源很有限的问题,所以就开发了 Kylin 支持 Spark Sql 数据源的能力来借助 Spark Sql 的能力读取更多的数据源(该 PR 还在 Review 中)。

 

彩蛋环节

运营小姐姐:听说你们平时比较忙?

卫斌童鞋:是的。不过头可破,血可流,发型不能乱。

运营小姐姐:每天坚持洗头是作为程序员最后的倔强吗?

卫斌童鞋:可能我比较勤快吧。。。😳

运营小姐姐:又要忙工作又要参与社区,有什么解压小诀窍呢?

卫斌童鞋:忙的时候,撸撸猫就能很放松。大概两年前,我在路边捡到一只刚出生没多久的流浪猫(下图白猫),后来机缘巧合又收养了一只(下图灰猫),平时回家一般会吸吸猫,是很好的解压方式。

朱卫斌

坐拥两只「小可爱」,这就是传说中的「大户人家」吗?有组团偷猫的小伙伴吗🙋?评论区留言走起~

 

PS:

悄悄附上卫斌同学的博客地址:https://www.jianshu.com/u/001d44710e2e

干货满满,不容错过~