阿里数据处理平台 Blink

Apache
Java
跨平台
2013-04-09
红薯

Blink 最初是阿里巴巴内部的 Apache Flink 版本代号,基于阿里的场景做了大量的优化和稳定性改造工作。在经过一些讨论之后,我们决定将Blink的所有代码捐赠给Flink社区,并将其开源从而成为Flink社区的一部分。我们希望Blink的代码和经验能够帮助更多使用Flink的人,解决一些我们已经碰到过的问题。最终我们也希望和社区一起讨论和努力,将Blink中比较好的一些特性反馈回社区,为繁荣社区也出上我们一份力。

这次开源的Blink版本,主要是基于flink 1.5.1,也从社区的后续版本pick了一些比较有用的新特性和bugfix。除此之外,我们也加入了大量的新功能,在性能和稳定性上也做了很多优化。接下来我们会按模块来简单介绍下一些重要的新特性和改动。

API兼容性

  • DataStream和DataSet API基本和Flink 1.5.1版本兼容,只有OneInputStreamOperator、TwoInputStreamOperator、StreamOperator、RuntimeContext接口有变化,主要原因是为了使stream operator具有运行batch作业的能力

  • TableAPI和SQL有部分不兼容的修改

  • UDF、UDTF、UDAF的接口定义移到api包目录下,同时在涉及到返回类型的API上不兼容

Runtime

为了解决阿里巴巴生产场景中遇到的各种挑战,Blink对Runtime架构、效率、稳定性方面都做了大量改进:

  • 架构

    • Blink设计了新的调度架构,开发者可以根据计算模型自己的特点定制不同调度器;

    • 新的计算模型或者新的硬件都需要不同Shuffle进行适配,Blink引入的Pluggable Shuffle Architecture,方便用户对Flink Shuffle 生态进行扩展;

    • Blink Runtime的全栈上都支持用户对资源的精确控制和匹配。

  • 效率

    • Blink引入了Operator DAG机制,替换了原有的OperatorChain,避免了不必要的数据传输开销;

    • Pipeline Shuffle经过ZeroCopy的改造之后,网络层内存消耗大量减少;

    • 优化BroadCast Shuffle中大量不必要的序列化和反序列化开销;

  • 稳定性

    • 提供了新的JM FailOver机制,大大减少了JMFailOver对JOB的影响——JM发生错误之后,重新接管整个JOB而不是重启JOB

  • 生态和功能

    • 原生支持Kubernetes(实验功能),不同于Standalone模式在K8s上的拉起,新功能在FLIP-6提出的架构上实现原生的融合,根据job的资源需求动态的申请/释放Pod来运行TaskExecutor,实现资源弹性提升资源的利用率

    • 实现了基于Yarn的External Shuffle Service,可以让任务执行完成之后及时归还资源

    • 增加了sorted map state

SQL

我们在SQL层进行了大量的重构和优化,包括类型系统重构,基础数据结构的升级统一。同时我们也做了技术架构上的调整,SQL和TableAPI的程序最终执行的时候将不会翻译到DataStream和DataSet这两个API上,而是直接构建可运行的DAG。因此这个版本的SQL和TableAPI不能和DataSet这个API进行互相转换,但保留了和DataStream API互相转换的能力(将DataStream注册成表,或将Table转成DataStream后继续操作)。一些主要的并且流和批共享的新功能和优化如下:

  • 加入了DDL的支持,主要是CREATE TABLE语法,支持primary key,unique key等constraint,同时还支持计算列和watermark

  • 加入了多Sink的支持,在SQL中如果同时有多个insert into语句,我们会尝试将多个sink编译在一个DAG中,并且将中间部分进行复用(最典型的比如source)减小代价

  • 从社区较新版本pick了SQL CLI的功能,方便用户体验SQL的一些基本功能

  • 基于配置项来设置并发和资源,同时也支持最细粒度到算子级别的资源配置

  • 增加了对Decimal的支持,可自定义precision和scale

  • 增加了隐式转换的支持

  • 增加了数十个优化规则,以及多种统计信息的收集和推导,帮助我们基于代价的优化器选择更优的plan

  • 精确控制所有算子使用的内存,最大限度的避免运行时OOM的产生

  • 内置支持Parquet和Orc两种文件格式

接下来将分为streaming和batch分别介绍各自特有的一些优化和实现:

Streaming SQL

Streaming SQL部分积累了我们内部线上业务过去一两年间所做的大量新特性和优化,主要包括:

  • 维表Join支持,通过继承LookupableTableSource接口的source即可被作为维表使用

  • MiniBatch执行模式,在aggregate、join等需要和state频繁交互的算子中,我们加入了基于小batch来执行的一种模式。用户可以配置一个batch的大小同时控制端到端的延迟,我们会基于这两个因素来动态影响batch的策略

  • InnerJoin的state优化,我们针对常用的双流inner join进行了大量的和state相关的性能优化

  • TopN支持,我们会识别用户基于over window以及rank来实现类似topn需求的执行计划,并将其优化为一种高效的实现

  • Aggregate数据倾斜处理,我们增加了2阶段改写的功能,能够有效避免aggregate尤其是涉及到distinct后聚合时容易造成数据倾斜的问题

Batch SQL

Batch SQL也是我们优化和实现新feature的一个重点,主要包括:

  • 支持所有join的类型,包括inner、left、right、full。同时也包括semi和anti join

  • 支持hash join,sort merge join,nestedloop join等实现策略

  • 支持sort aggregate和hash aggregate

  • 支持多种over window语法

  • 支持多种sub query的写法比如in,exits等,并且会生成比较高效的执行计划

  • 支持tumbling和sliding window

  • 支持多种高级分析语法,如cube、rollup、grouping set等

  • 算子spill数据加入了压缩的支持

  • 支持Runtime Filter,可以在join之前使用bloom filter过滤大量无用的数据

  • 支持基于统计信息的join reorder

  • 支持在优化过程中移除不必要的shuffle和排序

  • 支持所有TPCH和TPCDS的query

TableAPI

TableAPI在功能上是SQL的超集,因此上面提到的新增加的stream/batch SQL的功能,我们在tableAPI也添加了相对应的API。除此之外,我们还在TableAPI上引入了一些新的功能。这里我们列举一个比较重要的功能。

  • 为了增强interactive programming体验,我们添加了cache功能。有了这个功能之后用户可以根据需要来cache计算的中间结果,从而避免不必要的重复计算。这个功能目前只对batch job有效

后续我们会在tableAPI上添加更多有用的功能。很多新功能已经在社区展开讨论。

Catalog

在catalog上做了如下修改和优化:

  • 通过引入全新的 ReadableCatalog and ReadableWritableCatalog 接口统一了 Flink 的内部和外部 catalog。Flink 所有的 catalog 会被 TableEnvironment 中的 CatalogManager管理。

  • 实现了两种新的 catalog - FlinkInMemoryCatalog and HiveCatalog。FlinkInMemoryCatalog 会将所有元数据存在内存中。HiveCatalog 会连接 Hive metastore 并桥接 Flink 和 Hive 之间的元数据。目前,这个HiveCatalog 可以提供读取 Hive 元数据的能力,包括数据库(databases),表(tables),表分区(table partitions), 简单的数据类型(simple data types), 表和列的统计信息(table and column stats)。

  • 重新清晰定义了引用目标的层级,即 'mycatalog.mydatabase.mytable'。通过定义默认 catalog 和默认数据库,用户可以将引用层级简单化为 'mytable’。

未来,我们还将加入对更多类型的元数据以及catalog的支持。

Hive兼容性

我们的目标是在元数据(meta data)和数据层将 Flink 和 Hive 对接和打通。

  • 在这个版本上,Flink可以通过上面提到的HiveCatalog读取Hive的metaData。

  • 这个版本实现了HiveTableSource,使得Flink job可以直接读取Hive中普通表和分区表的数据,以及做分区的裁剪。

通过这个版本,用户可以使用Flink SQL读取已有的Hive meta和data,做数据处理。未来我们将在Flink上继续加大对Hive兼容性的支持,包括支持Hive特有的data type,和Hive UDF等等。

Zeppelin for Flink

为了提供更好的可视化和交互式体验,我们做了大量的工作让Zeppelin能够更好的支持Flink。这些改动有些是在Flink上的,有些是在Zeppelin上的。在全部推回Flink和Zeppelin社区之前,可以使用这个Zeppelin image(具体细节请参考docs/quickstart/zeppelin_quickstart.md)来测试和使用这些功能。新添加的Zeppelin功能包括:

  • 支持3种运行模式提交Flink job:Local, Remote和Yarn

  • 支持运行tableAPI和文本SQL

  • 支持对静态table和动态table的查询

  • 能够自动关联Job URL

  • 支持cancel Job, 支持resume job with savepoint

  • 在Flink Interpreter里可以使用ZeppelinContext的高级功能,比如创建控件

  • 提供3个built-in的Flink tutorial的例子: Streaming ETL, Flink Batch Tutorial, Flink Stream Tutorial

Flink Web

我们在 Flink Runtime Web 的易用性与性能等多个方面进行了改进,从资源使用、作业调优、日志查询等维度新增了大量功能,使得用户可以更方便的对 Flink 作业进行运维。

  • 资源使用:新增 Cluster、TaskManager 与 Job 三个级别的资源信息,资源的申请与使用情况一目了然。

  • 作业调优:作业的拓扑关系及数据流向可以追溯至 Operator 级别,Vertex 增加 InQueue,OutQueue等多项指标,可以方便的追踪数据的反压、过滤及倾斜情况。

  • 日志查询:TaskManager 和 JobManager 的日志功能得到大幅度加强,从Job、Vertex、SubTask 等多个维度都可以关联至对应日志,提供多日志文件访问入口,以及分页展示查询和日志高亮功能。

  • 交互优化:对页面交互逻辑进行了整体优化,绝大部分关联信息在单个页面就可以完成查询和比对工作,减少了大量不必要的跳转。

  • 性能提升:使用 Angular 7.0 进行了整体重构,页面运行性能有了一倍以上的提升。在大数据量情况下也不会发生页面假死或者卡顿情况。

的码云指数为
超过 的项目
加载中

评论(0)

暂无评论

阿里 Blink 正式开源,重要优化点解读

Apache Flink 是德国柏林工业大学的几个博士生和研究生从学校开始做起来的项目,早期叫做 Stratosphere。2014 年,StratoSphere 项目中的核心成员从学校出来开发了 Flink,同时将 Flink 计算...

2019/01/28 08:49

Chrome 渲染引擎 Blink 的 2014 年计划

Google工程师公布了Chrome渲染引擎Blink的2014年工作目标。Google在2013年4月宣布从WebKit切换到Blink。Blink的2014年目标主要是集中在改进移动版性能,包括改进平滑滚动、动画和输 入响应,...

2014/01/15 07:50

谷歌宣布改用Blink引擎不到一周 商标被微软抢注

据国外媒体报道,就在谷歌宣布放弃WebKit转而开发自主浏览器渲染引擎Blink后不到一周,微软就向美国专利商标局提交了Blink商标申请。 谷歌在4月3日宣布,将放弃WebKit转而开发、使用自主渲染...

2013/04/16 07:21

没有更多内容

加载失败,请刷新页面

没有更多内容

1
回答
怎么封装一个Webkit或者Blink内核到安卓?

怎么封装一个Webkit或者Blink内核到安卓??我想要封装一个Webkit或者Blink到安卓,可我对这方面没有经验,请大神帮帮忙。

2017/06/03 13:39
5
回答
webkit还是blink

我想研究一下浏览器内核 我该学webkit还是blink

2014/04/09 18:15

没有更多内容

加载失败,请刷新页面

没有更多内容

谷歌推WebKit新分支——Blink

今天显然是浏览器引擎节。Mozilla和三星才 宣布完Servo ,谷歌就宣布了它 将推出WebKit新分支Blink ( 直译为眨眼,表示速度很快吧 )的消息。和WebKit一样, Blink 将会开源,也还会为其他浏...

2013/04/04 08:00
147
0
这一年多来,阿里Blink测试体系如何从0走向成熟?

摘要: 引言 Apache Flink是面向数据流处理和批处理的分布式开源计算框架,2016年阿里巴巴引入Flink框架,改造为Blink。2017年,阿里整合了所有流计算产品,决定以Blink引擎为基础,打造一款...

2018/11/23 11:39
51
0
Chromium浏览器之渲染引擎Blink

Blink是谷歌公司的浏览器Chromium使用的渲染引擎。 Blink处于一个包容性的开源社区里,它欢迎任何人分享其使命。 Blink是在一种抽象的平台上实现的, 因此本身不能运行。 Chromium Content m...

2015/06/19 22:55
221
0
实时计算实践:基于表格存储和Blink的大数据实时计算

表格存储: 数据存储和数据消费All in one 表格存储(Table Store)是阿里云自研的NoSQL多模型数据库,提供PB级结构化数据存储、千万TPS以及毫秒级延迟的服务能力。在实时计算场景里,表格存储...

2019/03/07 11:20
131
0
揭秘 Flink 1.9 新架构,Blink Planner 你会用了吗?

本文为 Apache Flink 新版本重大功能特性解读之 Flink SQL 系列文章的开篇,Flink SQL 系列文章由其核心贡献者们分享,涵盖基础知识、实践、调优、内部实现等各个方面,带你由浅入深地全面了...

2019/09/26 15:39
13
0
开篇 | 揭秘 Flink 1.9 新架构,Blink Planner 你会用了吗?

本文为 Apache Flink 新版本重大功能特性解读之 Flink SQL 系列文章的开篇,Flink SQL 系列文章由其核心贡献者们分享,涵盖基础知识、实践、调优、内部实现等各个方面,带你由浅入深地全面了...

2019/09/25 15:56
6
0
终于等到你!阿里正式向 Apache Flink 贡献 Blink 源码

阿里妹导读:如同我们去年12月在 Flink Forward China 峰会所约,阿里巴巴内部 Flink 版本 Blink 将于 2019 年 1 月底正式开源。今天,我们终于等到了这一刻。 阿里资深技术专家大沙,将为大...

2019/01/28 10:48
172
0
揭秘 Flink 1.9 新架构,Blink Planner 你会用了吗?

本文为 Apache Flink 新版本重大功能特性解读之 Flink SQL 系列文章的开篇,Flink SQL 系列文章由其核心贡献者们分享,涵盖基础知识、实践、调优、内部实现等各个方面,带你由浅入深地全面了...

2019/09/25 15:47
24
0
阿里 Blink 正式开源,重要优化点解读

Apache Flink 是德国柏林工业大学的几个博士生和研究生从学校开始做起来的项目,早期叫做 Stratosphere。2014 年,StratoSphere 项目中的核心成员从学校出来开发了 Flink,同时将 Flink 计算...

2019/03/06 12:20
65
0
Blink 有何特别之处?菜鸟供应链场景最佳实践

作者:晨笙、缘桥 菜鸟供应链业务链路长、节点多、实体多,使得技术团队在建设供应链实时数仓的过程中,面临着诸多挑战,如:如何实现实时变Key统计?如何实现实时超时统计?如何进行有效地资...

2019/06/17 12:30
92
0

没有更多内容

加载失败,请刷新页面

返回顶部
顶部