Menu

Apache Flink改进及其在阿里巴巴搜索中的应用

  • 软文     2019-5-22
<返回列表

本文整理自阿里搜索基础设施团队研究员蒋晓伟在Flink Forward 2016大会上的演讲,原始演讲视频可以扫描以下二维码查看。

以下为演讲整理

阿里是世界上最大的电子商务零售商,其2015年的年销售额就超过了eBay和Amazon的总和,达3940亿。Alibaba Search,个性化搜索和推荐平台,既是顾客的关键入口,也承担了大部分的在线收益。因此,阿里搜索基础设施团队一直在努力改进产品。

对于电子商务网站上的搜索引擎,到底什么最重要?必然是实时地为每一位用户提供最相关和准确的搜索结果。以阿里巴巴的规模,这是个棘手的问题,很多技术也根本无法满足需求。Apache Flink就是这样一项技术,而阿里现在通过基于Flink的Blink系统,来支撑它的搜索基础设施的核心,以向终端用户提供相关、精准的信息。本文讲解Flink在阿里搜索中承担的任务,并概括选择Flink的原因。

同时也会提到Blink与Flink的区别,及如何通过data Aritisans和Flink社区将这些改动反馈。倘若开源项目接受了这些改动,Alibaba Search会积极地把系统从Blink转移到原生Apache Flink。

第一部分:阿里搜索中的Flink

一、 文档的建立

向用户提供一流搜索引擎的第一步是建立可供搜索的文档,对于阿里,文档由数百万条商品列表及相关的产品数据构成。搜索文档的建立并不容易,因为产品数据被保存在很多地方,搜索团队要整合所有相关信息才能建立完整的搜索文档。总的来说,这需要三个步骤:

这三个阶段实际上运行在两条不同的管道中,遵循着“lambda架构”,即一条full-build管道和一条incremental build管道。

二、 对搜索算法的实时A/B测试

工程师会定期测试不同的搜索算法,他们需要尽快对性能进行评估。现在,这种评估每天进行一次,但将来希望让分析实时地进行。因此这里使用Blink来构建实时的A/B测试框架。在线日志(展示次数,点击数,交易数)由分析程序收集和处理,然后根据业务逻辑进行过滤和join。接下来,数据被聚合进Druid,在Druid中,可以通过请求来实现复杂的OLAP分析,并看到不同的算法运行的效果。

三、 在线机器学习

这个方面有不少应用,首先谈谈实时特征更新。阿里搜索排名中,产品CTR,库存、点击数等数据被作为特征值。这些数据会随时间变化,如果总能拿到最新的数据,就能为用户提供相关性更好的搜索排名。Flink管道提供了在线特征更新的功能,大大提高了转化率。

另外,一年中会有几次大型促销(如11.11),这时用户的行为也会发生巨变。交易量会剧增,往往比往日高出好几倍。之前训练好的模型在这种场景下就失效了,所以需要依靠日志和Flink流处理任务来进行在线机器学习,根据实时数据建立模型,大幅提升了在这些不寻常,又十分重要的日子里的转化率。

第二部分:选择能够解决问题的框架

选择Flink来驱动搜索引擎架构有四个方面原因:

一般来说,对于统一的批处理和流处理有两种做法。第一种方是以批处理为出发点并在此基础上建立流处理。可惜这很难满足苛刻的延迟要求,因为通过微型批处理来模拟流处理的方法会产生固定的系统开销,且延迟越低,开销越大。对阿里的规模而言,每次微型批处理需要解决1000秒的任务量。过程中链接被重新建立,状态被重新加载。因此微型批处理的方法的代价会过高。

Flink则采用了另一种方式。它以流处理为出发点,并在此基础上建立了批处理的解决方案,也就是把批处理当成了流的一种特殊情况。而且通过这种方式,用户也可以对批处理进行优化。

第三部分:Blink是什么

Blink是Flink的一个分支,通过维护它来满足阿里的一些特殊需求。当前,Blink在几个不同的集群上运行,而每个集群大约有1000台机器。因此,大规模运行的性能至关重要。

Blink的改进主要体现在两方面:

Table API

首先添加了对可定义函数的支持,这样用户就能更方便地把业务逻辑写入Flink。这里还添加了流对流连接,这并不容易,但Flink对状态的支持简化了相关工作。另外还添加了一些不同的aggregations,其中最有趣的当属distinct_count和windowing支持。

(编者按:FLIP-11包含了一系列上文提及的Table API和对SQL的改进,供有兴趣的读者参考)

接下来,将会通过四个方面来谈runtime中的改进。

Blink on Yarn

当项目开始时,Flink支持两种集群模式:standalone及Yarn。在Yarn模式中,一个job不能动态请求和释放资源,而是要提前获得所有所需资源。不同的工作共享JVM进程,从而资源利用率优先于隔离性。

Blink引进了一种新的架构,每个job都有一个JobMaster来请求和释放它所需的资源,不同的job不能在同一个Java进程中运行。这就在job和task之间实现了隔离。阿里的团队正与Flink社区合作将这部分工作合并到开源项目中。这些改进可参考FLIP-6(除了Yarn以外还涉及其他的集群管理器)。

Operator Rescale

在生产中,客户端需要在保持状态的同时改变operators的并行模式。刚开始做Blink时,Flink还不支持这一点。而Blink引进了“bucket”的概念作为管理状态的单元。bucket的数量比task多得多,且每个task与多个桶绑定。当parallelism发生变化时,会重新给任务分配“bucket”。通过这种方式就能在维持状态的同时改变operators的parallelism了。

(编者按:Flink社区已经在Flink 1.2中解决了这一问题,该特性存在于主分支的最新版本中。Flink的“key groups”概念和这里所说的“bucket”基本等价的,但采用了不同的数据结构来实现。详情参考FLINK-3755 in Jira.)

增量Checkpointing

Flink中,Checkpointing的建立有两个阶段:在本地获取状态快照,并把它放到HDFS(或者其他的存储系统)上,这样整个状态快照就能和每个快照一起存储在HDFS中了。可惜这里的状态太大了,这种方法行不通,因此Blink只把被修改的状态存储在HDFS中。这种方式大幅度提高了Checkpointing建立的效率,使得在生产中使用大的状态成为可能。

异步I/O

在生产环境中,性能瓶颈往往在于访问外部存储,如HBase。为了解决这一问题,这里引入了异步I/O技术。这部分工作也被回馈给了开源社区,细节见FLIP-12。

(编者按:因为FLIP-12内容较多,Data Artisans将在近期发表单独介绍它的文章。在此一笔带过,如果想了解更多请参考FLIP writeup。另外,本文发表时这部分功能已加入Flink。)

原文链接:Blink: How Alibaba Uses Apache Flink (作者/蒋晓伟)

-END-

云栖社区

ID:yunqiinsight

云计算丨互联网架构丨大数据丨机器学习丨运维

更多精彩内容点击下方↓↓↓阅读原文↓↓↓,进入云栖社区“大数据频道”。


更多阅读

直击泛家居产行业20强的品牌定位策略

软文 2019-5-22
大材研究注意到,近几年来,有不少公司重塑定位,或者放大原来的优势定位。此事,如果做好了,少则省几千万,多则可省几个亿的广告费。 ...

卖家成长 选取关键词得注意 前期关键词调研更重要

软文 2019-5-22
如今在亚马逊上开个店看似很容易,但要保证出单,持续的出单却很难。原因有很多,老话说的没错,三分靠运气七分靠打拼,而做亚马逊前期...

国庆假期借势海报 杜蕾斯发挥正常 宝马海报无文案 ofo大手笔

软文 2019-5-22
文 | PR天下 今年国庆假期与去年最大不一样的地方在于,期间还要累加一天中秋节假期,共计八天,而这竟成为数家品牌借势创意的发力点。...
返回列表
扫描二维码分享到微信
确 认

Copyright © 2015-2021 发稿网

     
扫码二维码立即咨询
确 认