Flink学习4-流式SQL

Flink学习4-流式SQL

摘要

最近需要做流式数仓,所以调研就要Flink流式SQL。初期选定袋鼠云做的flinkStreamSQL。本文会记录一下重要的文章。

1 flinkStreamSQL

1.1 flinkStreamSQL解决的问题

原生FlinkSQL没有实现对数据来源、数据目的地的SQL化,必须要写代码。

这个就很坑了,一般来说,SQL面向数据分析人员,如果要写代码无疑提高了门槛。flinkStreamSQL里面将这一切都用SQL解决。袋鼠云声称的数据计算采用SQL的优势:

  • 声明式
    用户只需要表达我想要什么,至于怎么计算那是系统的事情,用户不用关心。
  • 自动调优
    查询优化器可以为用户的 SQL 生成最有的执行计划。用户不需要了解它,就能自动享受优化器带来的性能提升。
  • 易于理解和使用
    很多不同行业不同领域的人都懂 SQL,SQL 的学习门槛很低,用 SQL 作为跨团队的开发语言可以很大地提高效率。
  • 稳定
    SQL 是一个拥有几十年历史的语言,是一个非常稳定的语言,很少有变动。所以当我们升级引擎的版本时,甚至替换成另一个引擎,都可以做到兼容地、平滑地升级。

此外,FlinkSQl还支持了流与流、流与维表Join:
Flink学习4-流式SQL_第1张图片

1.2 flinkStreamSQL基本原理

这里摘自Flink-SQL的扩展实现

  • 将创建源表的sql语句转换为flink的operator
    目前flinkStreamSQL只支持Kafka数据源,已经满足我们要求。其实我们在flinkStreamSQL中写的建表语句就是映射到Flink Table类,各个属性就是Kafka数据源的属性,注册表时调用以下Flink代码:

    StreamTableEnvironment.registerTable(tableName, table);
    
  • 将创建的输出表sql语句转换为flink的operator

    • 解析出create table语句中的连接信息和表信息,放入自定义类
    • 继承RichOutputFormat类,根据数据源来分别实现writeRecord方法将数据写入外部数据源
  • 将UDF语句转换为flink的operator
    Flink原生对UDF提供两种类型的实现方式:

    • 继承ScalarFunction
    • 继承TableFunction

    flinkStreamSQL将用户提供的实现了上述接口class所在的jar添加到URLClassLoader,并加载指定的class ,然后调用TableEnvironment.registerFunction(funcName, udfFunc)即完成了UDF注册。

  • 维表功能的实现
    Flink原生SQL不支持注册表和外部数据源Join,但我们常常需要用Flink做数据预处理时就join维表补足表的维度信息字段。

    flinkStreamSQL使用定时更新缓存外部被Join数据源、阿里贡献的异步获取外部数据源数据的RichAsyncFunction、解决了维表不断变化、IO吞吐问题。

    另一方面,使用Flink项目依赖的calcite做SQL解析出的AST,迭代搜索出维度表,区分出维表和非维表即可(如果有维表就把这个join的维表的语句单独拆来,用Flink的TableAPI和StreamAPi 生成新DataStream,在把这个DataStream与其他的表再做join即可)。
    Flink学习4-流式SQL_第2张图片
    Flink学习4-流式SQL_第3张图片
    Flink学习4-流式SQL_第4张图片

参考文档

  • Github-flinkStreamSQL
  • 袋鼠云研发手记 | 开源·数栈-扩展FlinkSQL实现流与维表的join
  • Flink-SQL的扩展实现
    本文介绍了flinkStreamSQL的基本概念和实现基本原理。
  • 阿里-实时计算 Flink SQL 核心功能解密

你可能感兴趣的:(flink)