做者:简锋html
在谈生态以前,咱们来聊聊什么是生态。生态是指在某个特定领域,以某个组件为核心衍生出来其余多个组件,这些组件能够间接或者直接用到这个核心组件,而后辅助这个核心组件共同完成一个更大或者更特殊的任务。Flink生态圈就是指以Flink为核心的生态圈,Flink属于大数据生态里的计算环节,只作计算,不作存储。可是在实际工做当中,你会发现每每单独用Flink是不够的。好比你的数据是从哪里读出来,Flink计算完以后数据又将存到哪里,又怎么消费这些数据。如何利用Flink来完成某个垂直领域的特殊任务等等。这些涉及到上下游,或者更高抽象的任务都须要一个强大的生态圈来完成。算法
在讲清楚了什么是生态以后,咱们来聊聊目前Flink生态的现状。总体而言Flink生态还处于相对初级的阶段。Flink生态目前主要侧重于各类上下游的connector和对各类集群的支持。shell
截至目前Flink支持的connector有:Kafka,Cassandra,Elasticsearch,Kinesis,RabbitMQ,JDBC,HDFS等等,基本支持全部主流数据源。在集群支持方面,目前Flink支持Standalone和YARN。基于目前生态的情况,Flink仍然主要应用于流数据的计算。若是要用Flink要作其余一些场景(机器学习,交互式分析)就会比较复杂,用户体验上还有很大的提高空间。这也正是Flink生态所面临的挑战和机遇。apache
Flink致力于做为一个批流统一的大数据计算平台,还有不少潜力没有发挥出来,要彻底发挥出它的潜力,就须要一个强大的生态系统。总的来讲咱们能够从2个维度来看这个生态系统:架构
横向维度。 横向维度的生态主要是为构建一个端到端的解决方案。好比链接上下游数据源的各类connector,与下游机器学习框架的整合,与下游BI工具的整合,方便提交和运维Flink Job的工具,提供更好交互式分析体验的Notebook。并发
纵向维度。纵向维度是指更加抽象化Flink的计算引擎以适应各类计算场景。好比批流计算的统一,更高计算抽象层Table API,复琐事件处理引擎(CEP),更高机器学习计算框架(Flink ML),对各类集群框架的适配等等。框架
下图是对整个Flink生态在横向和纵向2个维度的描述。运维
接下来我会对几个主要的生态点进行逐个阐述机器学习
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-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个连接
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串接起来,从而提升开发的效率。
在开发环境里,通常是经过执行shell 命令 bin/flink run 来提交Flink Job。但在真正生产环境里面,这种方式就会有不少问题。好比如何跟踪管理Job的状态,在Job失败的状况下如何重试,如何并发启动多个Flink Job,如何方便修改提交Job的参数等等。这些问题虽然能够经过人工干预来解决,但在生产环境里人工干预是最危险的,能自动化的操做咱们都要将其自动化。在Flink生态圈里目前的确缺乏这样一个工具。阿里巴巴内部已经有了这样一个工具,并且在生产环境里稳定运行了很长时间,已经被实践证实是一个可靠稳定的提交和运维Flink Job的工具。目前阿里巴巴正在准备开源这个项目,剥离一些阿里巴巴内部依赖的组件,预计2019年上半年会开源。
总的来讲,Flink生态目前问题不少,机会也不少。Apache Flink社区在不断努力去构建一个更增强大的Flink生态来发挥其强大的计算引擎能力,但愿有志参与其中的人能够积极参与,让咱们一块儿努力来构建一个健康强大的Flink生态圈。
更多资讯请访问 Apache Flink 中文社区网站