一、可行性分析
Flink是一款分布式的计算引擎,它可以用来做批处理,即处理静态的数据集、历史的数据集;也可以用来做流处理,即实时地处理一些实时数据流,实时地产生数据的结果。既然是一个实时计算平台,这里主要用到他的流处理能力。他被称之为继storm、sparkStreaming 之后的第三代流处理引擎。
对于应用Flink的开发者来说关系的是数据源是什么,做什么处理,数据落到哪里去。这是一个通用的数据处理逻辑,在flink中抽象成 source、operator、sink三部分。flinkSQL 中会把source定义成一张table,也就是tableSource。operator就是常写的sql逻辑,比如count、group by 之类的。sink 在flinkSQl中称为tableSink。在flinkSQL 编程过程中需要事先注册TableSource 和 TableSink,也就是源表是什么,结果表是什么,中间的sql就是从源表select 进行sql聚合计算之类的,insert into 到结果表。
对于tableSource来说最终对接的数据源可以是关系型数据库oracle、mysql..;可以是消息队列kafka,可以是NOSQL Hbase、redis 之类的、等等。需要思考的无非就是在获取这些数据源的时候怎么转换成flink内部的tabe。
对于operator来说可以直接写sql语句 + UDF函数就可以,当然在流处理中还有一些特殊的计算比如window.。如果需要的话,那可能还需要创造sql之外的语法结构。最好的是将这些非sql原生的在平台内部消化掉,尽量让用户觉得易用。
对于TableSink 来说同tableSource.因为我们可能会把数据写入各种组件。一个sql语句的在Flink里面是Row格式。我们需要做的就是解析SQL产生的Row结果写入不同的组件。
二、平台构思
上面所述基本只是说明了这个平台的可行性。该怎么实现呢?先对平台进行一下构思。
一、平台的通用性
既然是一个基于flinkSql实时计算平台。希望用户更多的是写sql来解决用户的需求。用户可以选择自己的数据源,然后编写sql,然后选择sql结果的落地方,便可以形成job进行运行。这部分需要有一个前台系统去支持。这里不是重点。但是最终前台sql的编排会形成一个job的描述这个描述可以是一个josn串。大概分为4部分。
1、source schema描述
主要是描述source是什么数据源,他有哪些字段,字段的类型是什么
2、业务逻辑sql
这个就是简单了就是一个sql语言。和临时表之类的
3、sink schema描述
主要是描述sink是什么数据源,他有哪些字段,字段的类型是什么
4、任务描述
主要描述这个任务在flink上运行需要多少资源,等等一些flink内部的参数
二、平台怎么使用
上面所说的其实我们实现的只是一个在flink中适配各种数据存储组件的程序包。他只是一个模板。他本身是不知道使用人员是要干啥。他必须拿到job的描述之后才能替开发sql的人员干活。job的描述相当于是平台的配置信息。下面是我的一个使用构想图。有更好方案的可以留言联系我
三、后续进展透露
三、剖析fink中kafkaTbaleSink的实现
四、改造kafkaTbaleSource
五、改造kafkaTbaleSink
六、实现HbaseTableSource
七、实现HbaseTbaleSink