前言
从开始工作,我一直会问自己这么两个问题:
我有足够多的工具提升自己效率么?
我有足够好的平台去提升团队效率么?
效率在我看来是至关重要的。关于我对效率的理解,还可以看看我这篇文章 【抖音短文】痛点不能驱动一切,效率驱动才是
如果要让自己有效率,取决于两点:
要有足够多的工具覆盖自己工作的方方面面
自己用的笔记本要有足够多的脚本实现自动化
先简单说说第二点,举个例子,因为我用的是MacBook,所以我会把我常见的工作都转化为脚本或者命令,而且这些脚本和命令只能在我的Mac笔记本上工作。他们存在的意义就是为了让我高效的使用我当前这台笔记本。
关于第一点,其实就是我们今天即将登场的主角们了。我会按我职业生涯来依次给他们一个出场顺序。大体上,我08-11年做Web, 11-13年做搜索,13年以后做进入大数据这个行当。大概是这么个时间点,不一定准确。
ServiceFramework
我职业生涯第一阶段是做Web开发,并且主力语言是Java,所以我希望写Web能更高效些,于是就有了ServiceFramework。这个项目首页的第一句话就是:
ServcieFramework 定位在 移动互联网后端 领域,强调开发的高效性,其开发效率可以比肩Rails.
可以看到,SF是受到Rails的影响。但是受限于Java这个语言自身动态性的不足,所以虽然模仿Rails的Java框架很多,但终究似乎都难以火起来。现在,Web上,Java还是Spring(Boot)的天下。
ServcieFramework其实有非常多的创新,在ORM上,通过字节码修改技术,它成功的Java上实现了富血模型,并且摒弃了比如Hibernate的XML以及复杂的Annotation配置,极致简化后的结果就是你可以定义一个空的模型类:
public class Tag extends Model {
然后直接做各种各种查询(以及保存)了,比如:
模型字段校验也创新的采用了代码描述:
或者静态块描述:
Controller也有自己独特的设计:
ServiceFramework我其实不鼓励其他人使用,但我自己却一直在用,主要原因是我个人使用它效率非常高,而且可以随时修改发版。
web-platform
当然,SF的设计离现在已经快小十年了。今年(2020)因为疫情在家里多呆了写时间,基于ServiceFramework,我开发了一套纯插件的Web体系,并且配套了相应的命令行工具。如果感兴趣,大家可以看看这篇文章开发你的第一个web-platform应用。 目前我已经基于web-platform开发了非常多的有意思的项目,比如MLSQL的插件仓库,Python代码执行器等等,大家可以在我的github主页看到ar_开头的项目名都是和他相关的。这个项目的特点是,插件可以独立运行,也可以基于一个runtime运行,相比JVM会更高一层。插件之间可以通过lib依赖,也可以通过接口依赖,并且我们提供了sf-cli命令,帮助大家去构建项目,非常方便和高效。我新的web项目基本都基于web-platform去完成的。web-platform进一步简化了基于http协议的web开发,相比SF,你基本上你已经touch不到http概念了。我想等他成熟点,可以试试推广看下。
MLSQL
因为我做大数据的时间比较久,所以相应的项目也就多一些。第一个当然是MLSQL,我给他的定义是The Programming Language Designed For Big Data and AI。设计他的原因是我比较厌烦了来一个业务,就要开发一个Spark程序,然后还要找台跳板机部署,运行,明明五分钟就可以搞定的事情,来来回回要一个程序员一天。我希望团队通过简单的MLSQL脚本就能完成批,流,adhoc查询以及机器学习相关的任务,而且所见即所得,写完点击运行直接看结果,速度要快。关于这个项目,我写的文章以及视频等等已经非常多了。感兴趣的可以进一步深入看看。
下面是一段MLSQL代码的例子:
PyJava
PyJava是我为了融合大数据和AI做的一个项目,主要是基于Arrow实现Java 和Python 数据互通。该项目可以应用于普通的Java程序也可以应用于Spark程序上,目前他已经被应用于我前面的MLSQL项目中。多语言融合的核心其实是数据交互,如何高效的将数据从一个语言生态传输到另外一个语言生态,这包括进程内,进程间两种情况。关于多生态融合方面的内容,不妨参看我这篇文章 [让我们再探讨是可以【移动数据】而不是【移动计算】了。未来多生态融合会成为主流。所以我也很看好我这个PyJava项目。
下面是一段示例代码:
delta-plus
delta-plus 是我基于Delta数据湖项目做的一个增强版。他可以在Scala或者MLSQL语言中使用。
目前原生delta 我个人认为还没达到开箱即用,不做任何调优或修改 就能很好满足很多业务场景,或多或少还是需要你了解下里面的原理的,这也是delta-plus存在的理由。
delta-plus解决了如下几个痛点:
无论流批upsert,都可以保持文件数稳定。原生delta upsert会导致大量小文件问题。
单独支持Partial Merge
支持append only表的compaction操作
支持和spark-binlog 配合 ,做MySQL/HBase实时同步数据到Delta中
我也写了一个系列文章数据湖delta,里面涉及到了我对delta-plus的一些设计缘由,当然也可以很好的帮你去了解Delta.
spark-binlog
spark-binlog 我google了下,应该是唯一实现了对接mysql/hbase增量数据的spark数据源。spark-binlog支持读取MySQL binlog日志,HBase WAL日志来获取数据的变更。配合delta-plus,可以很容易实现数据实时同步到数据湖。
下面是一段spark的示例使用代码:
spark-adhoc-kafka
spark-adhoc-kafka 允许你直接基于Kafka作为数据源做数据分析。支持时间范围下推,offset区间下推,以及并行度控制,从而让分析速度更快。有的时候你想看看Kafka数据到底啥情况,这个就是不错的分析工具。
下面是Spark示例代码:
这个是MLSQL的示例使用代码:
sql-booster
sql-booster 目标是实现物化视图功能,顺带做了一波SQL血缘关系的相关的功能。
物化视图是啥意思呢?假设你有基础表A,B,C,然后你还有一种基于A,B,C聚合得到的新表D. 当你写一条只包含A,B,C三张表的SQL语句时,系统会自动尝试能够将改写成包含D的SQL语句。这样就可以避免大量的计算。
比如你基于emps,depts表创建了一个新表:
之后你使用sql-booster 对某条SQL进行改写:
改写后的结果为
SELECT a.`empid`
我们看到,改写后的语句里只有emps_mv了,消除掉了join计算。
另外sql-booster 还支持将logicalplan转化为SQL。这个在特定场景也很有用。
还有其他一些有用的库
比如common-utils是我写的一套工具库,有点类似guava,顺带我把大部分guava代码都修改了一份放到了common-utils里,避免我的项目和依赖的项目的guava包发生冲突。ServiceframeworkDispatcher 就是一个只有不到300行代码的一个策略开发框架。大家可以到我的allwefantasy主页多看看。
=========
欢迎大家关注我公众号 【祝威廉】