作者:简锋

引言

在谈生态之前,我们来聊聊什么是生态。生态是指在某个特定领域,以某个组件为核心衍生出来其他多个组件,这些组件可以间接或者直接用到这个核心组件,然后辅助这个核心组件共同完成一个更大或者更特殊的任务。Flink生态圈就是指以Flink为核心的生态圈,Flink属于大数据生态里的计算环节,只做计算,不做存储。但是在实际工作当中,你会发现往往单独用Flink是不够的。比如你的数据是从哪里读出来,Flink计算完之后数据又将存到哪里,又怎么消费这些数据。如何利用Flink来完成某个垂直领域的特殊任务等等。这些涉及到上下游,或者更高抽象的任务都需要一个强大的生态圈来完成。

Flink生态的现状

在讲清楚了什么是生态之后,我们来聊聊目前Flink生态的现状。整体而言Flink生态还处于相对初级的阶段。Flink生态目前主要侧重于各种上下游的connector和对各种集群的支持。

截至目前Flink支持的connector有:Kafka,Cassandra,Elasticsearch,Kinesis,RabbitMQ,JDBC,HDFS等等,基本支持所有主流数据源。在集群支持方面,目前Flink支持Standalone和YARN。基于目前生态的状况,Flink仍然主要应用于流数据的计算。如果要用Flink要做其他一些场景(机器学习,交互式分析)就会比较复杂,用户体验上还有很大的提升空间。这也正是Flink生态所面临的挑战和机遇。

Flink生态的挑战和机遇

Flink致力于作为一个批流统一的大数据计算平台,还有很多潜力没有发挥出来,要完全发挥出它的潜力,就需要一个强大的生态系统。总的来说我们可以从2个维度来看这个生态系统:

  1. 横向维度。 横向维度的生态主要是为构建一个端到端的解决方案。比如连接上下游数据源的各种connector,与下游机器学习框架的整合,与下游BI工具的整合,方便提交和运维Flink Job的工具,提供更好交互式分析体验的Notebook。

  2. 纵向维度。纵向维度是指更加抽象化Flink的计算引擎以适应各种计算场景。比如批流计算的统一,更高计算抽象层Table API,复杂事件处理引擎(CEP),更高机器学习计算框架(Flink ML),对各种集群框架的适配等等。

下图是对整个Flink生态在横向和纵向2个维度的描述。

接下来我会对几个主要的生态点进行逐个阐述

Flink对Hive的集成和支持

Apache Hive是一个有将近10年历史的Apache顶级项目。项目最初在MapReduce引擎的基础上封装了SQL,用户不再需要写复杂的MapReduce Job,而只需写简单熟悉的SQL语句,用户的SQL会被翻译成一个或多个MapReduce Job。随着项目的不断演进,Hive的计算引擎发展成可以插拔式,比如,现在Hive就支持MR, Tez, Spark 3种计算引擎。Apache Hive现在已经成为Hadoop生态圈中事实上数据仓库的标准,很多公司的数据仓库系统已经在Hive上运转了很多年。

Flink作为一个批流统一的计算框架,与Hive的集成就变得很自然了。比如通过Flink来做实时ETL,构建实时数据仓库,然后用Hive SQL做实时数据的查询。

Flink社区已经创建了 FLINK-10556 来对Hive更好的集成和支持。主要实现的功能有以下几点:

  • 允许Flink访问Hive的元数据

  • 允许Flink访问Hive的表数据

  • Flink兼容Hive的数据类型

  • Flink可以使用Hive UDF

  • 可以在Flink里使用Hive SQL(包括DML和DDL)

Flink社区正在逐渐实现以上功能。如果你想提前体验以上功能,可以试用阿里巴巴开源的Blink。开源的Blink已经在元数据(meta data)和数据层将Flink和Hive对接和打通, 用户可以直接用Flink SQL去查询Hive的数据,真正能够做到在Hive引擎和Flink引擎之间的自由切换。为了打通元数据,Blink重构了Flink catalog的实现,并且增加了两种catalog,一个是基于内存存储的FlinkInMemoryCatalog,另外一个是能够桥接Hive MetaStore的HiveCatalog。有了这个HiveCatalog,Flink作业就能读取Hive的MetaData。为了打通数据,Blink实现了HiveTableSource,使得Flink job可以直接读取Hive中普通表和分区表的数据。因此,通过这个版本,用户可以使用Flink SQL读取已有的Hive meta和data,做数据处理。未来阿里巴巴将在Flink上继续加大对Hive兼容性的支持,包括支持Hive特有的query,data type,和Hive UDF等等,这些改进都会陆续回馈到Flink社区。

Flink对交互式分析的支持

批处理是流处理之外另一个更大的应用场景。而交互式分析又是批处理的一个大类,特别对于数据分析师和数据科学家,交互式分析尤为重要。

对于交互式分析,Flink本身需要做进一步的改进,以提高Flink在交互式分析方面的性能要求。比如 FLINK-11199,现在在同一个Flink App中的多个Job之间是没法共享数据的,每个Job的DAG是独立的,FLINK-11199 就是要解决这个问题,从而对交互式分析提供更友好的支持。

此外,我们需要提供一个交互式分析的平台让数据分析师/数据科学家更高效得使用Flink。在这方面Apache Zeppelin已经做了很多工作。 Apache Zeppelin也是Apache的顶级项目,Zeppelin提供一个交互式开发环境,支持Scala,Python,SQL等多种语言,此外Zeppelin天然具有极强的可扩展性,支持多种大数据引擎,比如Spark,Hive,Pig等等。阿里巴巴做了大量的工作让Zeppelin能够更好的支持Flink。用户可以直接在Zeppelin里面写Flink代码(Scala或者SQL),而不用在本地打包,然后用bin/flink脚本来手动提交Job,在Zeppelin里你可以直接提交Job,然后看到Job的结果,Job结果既可以是文本形式,也可以是可视化出来,特别对于SQL的结果,可视化尤为显得重要。下面这些是Zeppelin对Flink支持的一些要点:

  • 支持3种运行模式:Local, Remote和Yarn

  • 支持运行Scala,Batch Sql和Stream Sql

  • 支持可视化静态table和动态table

  • 自动关联Job URL

  • 支持Cancel Job

  • 支持Flink job的savepoint

  • 支持ZeppelinContext的高级功能,比如创建控件

  • 提供3个tutorial notes: Streaming ETL, Flink Batch Tutorial, Flink Stream Tutorial

这些改动有些是在Flink上的,有些是在Zeppelin上的。在这些改动全部推回Flink和Zeppelin社区之前,大家可以使用这个Zeppelin Docker Image (Blink开源文档里的examples中有具体如何下载安装的细节)来测试和使用这些功能。为了方便用户试用,我们在这一版zeppelin中提供3个built-in的Flink tutorial的例子: 一个是做Streaming ETL的例子, 另外两个分别是做Flink Batch, Flink Stream的基础样例。具体如何使用,可以参考以下2个链接

  • https://flink-china.org/doc/blink/ops/zeppelin.html

  • https://flink-china.org/doc/blink/quickstart/zeppelin_quickstart.html

Flink对机器学习的支持

Flink作为一个大数据架构中最重要的计算引擎组件,目前主要的应用场景还是在做传统的数据计算和处理,也就是传统的BI(比如实时数据仓库,实时统计报表等等)。而21世纪将是一个AI爆发的世纪,越来越多的企业和行业开始启用AI技术来重新革命自己的行业。Flink作为一个大数据计算引擎在这一革命中不可或缺。虽然Flink并不是为机器学习而生的,但是在机器学习中也将扮演不可或缺的角色。未来Flink在机器学习领域主要有3件大事可以做

  • 机器学习Pipeline的构建

  • 传统机器学习算法的支持

  • 与其他深度学习框架的整合

机器学习主要分2个阶段:Training和Predication。但Training和Predication只是做机器学习的一小部分,在Training之前要做数据的清洗,转换以及Normalization等等,Training之后要做Model的Evaluation。Predication阶段也是如此。对于一个复杂的机器学习系统,如何将每个步骤很好的整合起来对于一个系统的健壮性和可扩展性显得尤为重要。FLINK-11095 就是社区为此正在做的努力。

目前Flink有个flink-ml的模块实现了一些传统的机器学习方法,但是仍然需要进一步的改进。

对于深度学习的支持,Flink社区也在这个领域也在积极努力。阿里巴巴内部有TensorFlow on Flink的项目,用户可以在Flink Job中运行Tensorflow,Flink做数据处理,然后将处理完之后的数据发送给Tensorflow的Python进程做深度学习训练。在语言层面,Flink正在做对Python的支持。目前Flink只支持Java和Scala的API。这2种语言都是基于JVM的语言,比较适合做系统的大数据工程师,而不适合做数据分析的Data Analyst和做机器学习的Data Scientist。做数据分析和机器学习的人一般会比较喜欢用Python和R等这类更高级的语言。目前Flink社区也在这方面努力,首先Flink会支持Python, 社区已经在这块开始讨论,因为Python在近几年发展的特别快,这主要得益于AI和Deep Learning的发展。目前流行的Deep Learning的library都提供Python的API,比如TensorFlow,Pytorch,Keras等等。通过对Python语言的支持,用户可以用一种语言将整个机器学习的Pipeline串接起来,从而提高开发的效率。

Flink Job的提交和运维

在开发环境里,一般是通过执行shell 命令 bin/flink run 来提交Flink Job。但在真正生产环境里面,这种方式就会有很多问题。比如如何跟踪管理Job的状态,在Job失败的情况下如何重试,如何并发启动多个Flink Job,如何方便修改提交Job的参数等等。这些问题虽然可以通过人工干预来解决,但在生产环境里人工干预是最危险的,能自动化的操作我们都要将其自动化。在Flink生态圈里目前的确缺少这样一个工具。阿里巴巴内部已经有了这样一个工具,而且在生产环境里稳定运行了很长时间,已经被实践证明是一个可靠稳定的提交和运维Flink Job的工具。目前阿里巴巴正在准备开源这个项目,剥离一些阿里巴巴内部依赖的组件,预计2019年上半年会开源。

总的来说,Flink生态目前问题很多,机会也很多。Apache Flink社区在不断努力去构建一个更加强大的Flink生态来发挥其强大的计算引擎能力,希望有志参与其中的人可以积极参与,让我们一起努力来构建一个健康强大的Flink生态圈。

更多资讯请访问 Apache Flink 中文社区网站