我要投搞

标签云

收藏小站

爱尚经典语录、名言、句子、散文、日志、唯美图片

当前位置:双彩网 > 语义合一 >

从Spark Streaming到Apache Flink: 实时数据流在爱奇艺的演进

归档日期:06-24       文本归类:语义合一      文章编辑:爱尚语录

  提供云计算、大数据、微服务、容器技术、运维、机器学习、智能算法等相关云计算技领域的新技术、资讯以及深度实践。...

  技术头条:干货、简洁、多维全面。更多云计算精华知识尽在眼前,get要点、solve难题,统统不在话下!

  本文将为大家介绍Apache Flink在爱奇艺的生产与实践过程。你可以借此了解到爱奇艺引入Apache Flink的背景与挑战,以及平台构建化流程。主要内容如下:

  爱奇艺在2010年正式上线月份在纳斯达克上市。我们拥有规模庞大且高度活跃的用户基础,月活跃用户数5.65亿人,在在线视频领域名列第一。在移动端,爱奇艺月度总有效时长59.08亿小时,稳居中国APP榜第三名。

  实时计算是基于一些实时到达、速率不可控、到达次序独立不保证顺序、一经处理无法重放除非特意保存的无序时间序列的数据的在线计算。

  因此,在实时计算中,会遇到数据乱序、数据延时、事件时间与处理时间不一致等问题。爱奇艺的峰值事件数达到1100万/秒,在正确性、容错、性能、延迟、吞吐量、扩展性等方面均遇到不小的挑战。

  爱奇艺从2013年开始小规模使用storm,部署了3个独立集群。在2015年,开始引入Spark Streaming,部署在YARN上。在2016年,将Spark Streaming平台化,构建流计算平台,降低用户使用成本,之后流计算开始在爱奇艺大规模使用。在2017年,因为Spark Streaming的先天缺陷,引入Flink,部署在独立集群和YARN上。在2018年,构建Streaming SQL与实时分析平台,进一步降低用户使用门槛。

  爱奇艺主要使用的是Spark Streaming和Flink来进行流式计算。Spark Streaming的实现非常简单,通过微批次将实时数据拆成一个个批处理任务,通过批处理的方式完成各个子Batch。Spark Streaming的API也非常简单灵活,既可以用DStream的java/scala API,也可以使用SQL定义处理逻辑。但Spark Streaming受限于微批次处理模型,业务方需要完成一个真正意义上的实时计算会非常困难,比如基于数据事件时间、数据晚到后的处理,都得用户进行大量编程实现。爱奇艺这边大量使用Spark Streaming的场景往往都在于实时数据的采集落盘。

  Apache Flink框架的实时计算模型是基于Dataflow Model实现的,完全支持Dataflow Model的四个问题:What,支持定义DAG图;Where:定义各类窗口(固定窗口、滑动窗口和Session窗口);When:支持灵活定义计算触发时间;How:支持丰富的Function定义数据更新模式。和Spark Streaming一样,Flink支持分层API,支持DataStream API,Process Function,SQL。Flink最大特点在于其实时计算的正确性保证:Exactly once,原生支持事件时间,支持延时数据处理。由于Flink本身基于原生数据流计算,可以达到毫秒级低延时。

  在爱奇艺实测下来,相比Spark Streaming,Apache Flink在相近的吞吐量上,有更低的延时,更好的实时计算表述能力,原生实时事件时间、延时数据处理等。

  下面通过三个Use Case来介绍一下,爱奇艺具体是怎么使用Flink的,包括海量数据实时ETL,实时风控,分布式调用链分析。

  在爱奇艺这边所有用户在端上的任何行为都会发一条日志到nginx服务器上,总量超过千万QPS。对于具体某个业务来说,他们后续做实时分析,只希望访问到业务自身的数据,于是这中间就涉及一个数据拆分的工作。

  在引入Flink之前,最早的数据拆分逻辑是这样子的,在Ngnix机器上通过“tail -f /xxx/ngnix.log grep xxx”的方式,配置了无数条这样的规则,将这些不同的数据按照不同的规则,打到不同的业务kafka中。但这样的规则随着业务线的规模的扩大,这个tail进程越来越多,逐渐遇到了服务器性能瓶颈。

  于是,我们就有了这样一个设想,希望通过实时流计算将数据拆分到各个业务kafka。具体来说,就是Nginx上的全量数据,全量采集到一级Kafka,通过实时ETL程序,按需将数据采集到各个业务Kafka中。当时,爱奇艺主的实时流计算基本均是基于Spark Streaming的,但考虑到Spark Streaming延迟相对来说比较高,爱奇艺从这个case展开开始推进Apache Flink的应用。

  ①. 解码:各个端的投递日志格式不统一,需要首先将各个端的日志按照各种解码方式解析成规范化的格式,这边选用的是JSON

  ②. 风控:实时拆分这边的数据都会过一下风控的规则,过滤掉很大一部分刷量日志。由于量级太高,如果将每条日志都过一下风控规则,延时会非常大。这边做了几个优化,首先,将用户数据通过DeviceID拆分,不同的DeviceID拆分到不同的task manager上,每个task manager用本地内存做一级缓存,将redis和flink部署在一起,用本地redis做二级缓存。最终的效果是,每秒redis访问降到了平均4k,实时拆分的P99延时小于500ms。

  ④. 采样、再过滤:根据每个业务的拆分过程中根据用户的需求不同,有采样、再过滤等过程

  防机器撞库盗号攻击是安全风控的一个常见需求,主要需求集中于事中和事后。在事中,进行超高频异常检测分析,过滤用户异常行为;在事后,生成IP和设备ID的黑名单,供各业务实时分析时进行防刷使用。

  CEP:因为很多黑产用户是有固定的一些套路,比如刚注册的用户可能在短时间内会进行一两项操作,我们通过CEP模式匹配,过滤掉那些有固定套路的黑产行为

  多窗口聚合:风控这边会有一些需求,它需要在不同的一些时间窗口,有些时间窗口要求比较苛刻,可能是需要在一秒内或亚秒内去看一下某个用户有多少次访问,然后对他进行计数,计数的结果超过某些阈值就判断他是异常用户。通过Flink低延时且支持多窗口的特点,进行超高频的异常检测,比如对同一个用户在1秒内的请求进行计数,超过某个阈值的话就会被识别成黑产。

  分布式调用链追踪系统,即全链路监控,每个公司基本都会有。在一个微服务架构当中,服务间的调用关系错综复杂,往往很难排查问题,识别性能性能瓶颈,这时候就需要分布式调用链追踪系统了。

  上图是一个调用链的追踪拓扑图,每个点是一个具体的一个应用,就是具体经过哪个应用,每条边是说明这个应用到下一个应用当中耗时了多久。

  除了宏观分析外,业务还想去看具体某一条日志的分析,具体某一次调用它是哪里慢了,哪里快了?所以,调用链还有另外一个需求,就是对于具体某次调用,想看一下它的具体耗时。

  系统简单架构如上图,上半部分偏重于埋点,下半部分偏于分析。埋点简单来讲,就是通过客户端SDK埋点以及Agent采集,将系统调用日志全部打到Kafka中,我们通过Flink对他们进行各类分析。对于统计类的分析,就是通过Flink计算存储到HBase当中,提供一些监控报警、调用链拓普查询等这种分析。针对这类需求,我们运用了Flink的多窗口聚合的特性,通过一分钟或者多分钟的窗口,从茫茫日志中寻找哪条是实际的调用链,构建APP各个应用的拓扑调用关系,第二级是基于第一级分析的一个结果,分析出那个拓普图按各个窗口、各个不同的边去算每条边的平均耗时的统计。除此之外,我们还将通过Flink将原始数据打到ES里面供用户直接去查询。

  接下来将主要介绍爱奇艺的大数据平台的构建。上图不限于Flink,是大数据平台的整体架构图。在爱奇艺,存储层基本是基于Hadoop生态的,比如像HDFS、HBase、Kudu等;计算层,使用YARN,支持MapReduce、Spark、Flink、Hive、Impala等这些引擎;数据开发层,主要是一些自研产品,批处理开发在爱奇艺有工作流开发,数据集成等。实时计算开发,有流计算开发、Streaming SQL、实时分析等平台工具可以使用。

  流任务平台是爱奇艺实时计算的底层平台,支持流任务的提交运行与管理。流任务平台支持YARN, Mesos, Flink独立集群等多种资源调度框架;支持Storm, Spark Streaming, Flink, Streaming SQL等计算任务的托管与运行。在功能上,我们支持用户直接打包程序上传部署流任务,也支持用户通过Streaming SQL工具编写SQL进行流计算开发。为了更好地对计算任务进行管理,流计算平台提供JAR包、函数管理,任务指标监控,以及资源审计功能。

  无论对于Spark Streaming还是Flink来说,他们均有一个较好的SQL优化引擎,但均缺乏DDL、DML创建的语义。于是对于业务来说,均需要业务先编程定义Source以及Sink,才可以使用SQL进行后续开发。

  因此,爱奇艺自研的Streaming SQL定义了一套DDL和DML语法。其中,我们定义了4种表:

  流表:定义了输入源是什么?具体的解码方式是什么?系统支持Json的解码方式,也支持用户自定义解码函数。

  结果表:定义了具体输出的类型,输出的源是什么?怎么访问?这边的输出源支持,就是常见的比如Kafka、MySQL、Kudu、ES、Druid、HBase等这样一些分析型数据库。

  为了更好地支持业务需求,StreamingSQL默认也支持IP库相关的预定义函数,也支持用户自定义函数。

  为了更好地支持业务使用Streaming SQL,StreamingSQL提供Web IDE,提供代码高亮、关键词提示、语法检查、代码调试等功能。

  实时分析平台,是爱奇艺基于Druid构建的分钟级延时的实时分析平台,支持通过Web向导配置,完成超大规模实时数据多维度的分析,并生成分钟级延时的可视化报表。支持的功能有,接入实时数据进行OLAP分析;制作实时报警;生产实时数据接口,配置监控报警等。

  实时分析平台,将整个分析流程抽象成数据接入,数据处理,模型配置和报表配置4个过程。其中,模型配置完全按照OLAP模型,要求实时数据符合星型模型,存在时间戳、指标、维度等字段。

  在数据处理层,实时分析平台提供向导配置页面,支持用户通过纯页面的方式就可以配置数据处理过程,这主要应对一些简单场景,针对部分连SQL都不熟悉的小白用户提供页面配置方案;初次之外,类似StreamingSQL,实时分析也提供用户自定义SQL方式定义数据处理过程。

  在Flink平台化的时候,我们遇到了几个Flink的问题,分别对其进行了些改进。

  第一个改进是关于checkpoint的优雅恢复。这个问题的出发点是,业务希望使用Spark Streaming可以通过代码控制从哪个checkpoint恢复,但对于Flink来讲,业务没法通过代码控制checkpoint恢复点,需要手动指定检查点去恢复checkpoint。于是,我们希望Flink可以像Spark Streaming一样,直接通过代码方式恢复checkpoint。

  针对这个问题,我们修改源码,在Flink任务启动时,从实际的路径当中找到他最新的一个checkpoint,直接从那个checkpoint当中恢复,当然这个也是可以让用户选的,他如果还想用原生方式恢复也可以,但提供一个选项,它可以支持从最近的checkpoint恢复。

  第二个改进是关于Kafka Broker HA的一个问题,比如像Kafka Broker故障的时候,Kafka还可以正常工作,但Flink程序往往会挂掉。针对这个问题,我们处理了Flink在Kafka Broker退出之后的sockerTimeOutException,支持用户重试次数配置来解决这个问题。

  最后,介绍一下爱奇艺在Apache Flink的未来工作。目前StreamingSQL还只支持Spark Streaming和Structured Streaming引擎,后续很快会支持Flink引擎,大幅降低业务的Flink开发成本。随着Flink任务规模不断变大,我们将重点提升Flink在爱奇艺的成熟度,完善监控报警,增加资源审计流程(目前还仅对Spark Streaming进行资源审计)。另外,我们要研究下Flink 1.6的一些新特性,尝试下Kafka 2.0,调研Exactly once方案;另外,我们将对Flink新版本进行一些尝试,推进批流统一。

  扫描添加小编微信,备注“姓名+公司职位”,加入【云计算学习交流群】,和志同道合的朋友们共同打卡学习!

  出品 CSDN云计算 有问有答,一问一答的形式,帮助大家快速解决更多专业难题。 边缘计算精华问答 边缘计算有哪些应用场景? 物联网对物联网技术的快速发展和云服务的推动使得云计算模型已...

  今天跟大家讲讲云计算、大数据和人工智能。为什么讲这三个东西呢?因为这三个东西现在非常火,并且它们之间好像互相有关系,可是很多人却不知道什么是云计算或者云计算应用在哪:一般谈云计算的时候会提到大数据、谈...

  Python将纳入高考内容、小学生教材开始接触Python、Python列入全国计算机等级考试……全民学Python的话题铺天盖地,中国的Python学习者是全球第一,人......

  戳蓝字“CSDN云计算”关注我们哦!作者 小枣君来源鲜枣课堂很久很久以前,有一个村子,名叫“通信童心村”。村里的每一户,都有一个男人和一个女人。每一户,都以搬砖......

  戳蓝字“CSDN云计算”关注我们哦!作者 表姐也有线年普通高等程序员招生统一考试题号一二三总得分一、选择题(每题5分,共计50分)1、S......

  戳蓝字“CSDN云计算”关注我们哦!嗨,大家好,重磅君带来的【云重磅】特别栏目,如期而至,每周五第一时间为大家带来重磅新闻。把握技术风向标,了解行业应用与实践,就交给我重......

  事情是这样的,自前年给学妹修了半年电脑后,我俩一直没联系,最近这位学妹最近又联系我,问我是否了解人工智能,在得知我已经研究并且从事相关工作后,她立马约我出来认真聊聊。我......

  戳蓝字“CSDN云计算”关注我们哦!作者 Frank Brown来源RancherLabs介 绍容器已迅速成为现代数据中心的必要组成部分。容器可以构建在各类操......

  自诞生以来,OpenStack 似乎一直被质疑,其背后最重要的两大推手 NASA 和 Rackspace 都弃它而去,惠普、思科接连宣布关闭基于 OpenStack 的公......

  戳蓝字“CSDN云计算”关注我们哦!Apache Storm是一个分布式实时大数据处理系统。Storm设计用于在容错和水平可扩展方法中处理大量数据。它是一个流数据框架,具......

  戳蓝字“CSDN云计算”关注我们哦!整理 胡巍巍出品 CSDN(ID:CSDNnews)天府之国四川,又遭地震!据中国地震台网测定:6月17日22时55分,四川省......

  戳蓝字“CSDN云计算”关注我们哦!作者 刘晶晶在2018年,京东云的营收达到了三位数的增长,10倍于行业增速;18个月的时间,京东云推出了超过200项的PaaS/I......

  受 5G 冲击最大的领域终将会是谁?作者 屠敏 整理出品 CSDN(ID:CSDNnews)提及当前科技圈有哪些热点词,那 5G 必是其中之一。6 月 6 日,工......

  戳蓝字“CSDN云计算”关注我们哦!作者 刘晶晶伴随5G时代的脚步渐进,物联网发展也将成井喷式增长,“网络安全”这个老生常谈的话题似乎进入了新阶段。数据是天使?还是魔......

  高通和英特尔向美国政府施压,要求减轻华为禁令;AT&T又裁员1800人,一年解雇2.3万人;Facebook加密货币推出在即……...

  关注并标星星CSDN云计算极客头条:速递、最新、绝对有料。这里有企业新动、这里有业界要闻,打起十二分精神,紧跟fashion你可以的!每周三次,打卡即read更快、更全了......

  戳蓝字“CSDN云计算”关注我们哦!2006年项目成立的一开始,“Hadoop”这个单词只代表了两个组件——HDFS和MapReduce。到现在的13个年头,这个单词代表......

  戳蓝字“CSDN云计算”关注我们哦!作者 宝哥@devops运维来源容器技术是近几年云行业发展中不可缺少的一环。Docke......

  亚马逊重组游戏开发部门:数个未发布游戏被“扼杀”;台积电明年开始为苹果iPhone生产5nm处理器……...

  关注并标星星CSDN云计算极客头条:速递、最新、绝对有料。这里有企业新动、这里有业界要闻,打起十二分精神,紧跟fashion你可以的!每周三次,打卡即read更快、更全了......

  戳蓝字“CSDN云计算”关注我们哦!作者 刘晶晶只用一部手机就可在线“试用”口红,效果堪比美妆男主李佳琪,厉不厉害?只要轻轻一点就可一目了然购买的家具在家中摆放的效果......

  什么是分布式计算?所谓分布式计算是一门计算机科学,它研究如何把一个需要非常巨大的计算能力才能解决的问题分成许多小的部分,然后把这些部分分配给许多计算机进行处理,最后把这些......

  华为内测基于Android 10.0的EMUI 10系统;2019年Q1真无线耳机市场份额,苹果占半壁江山……...

  关注并标星星CSDN云计算极客头条:速递、最新、绝对有料。这里有企业新动、这里有业界要闻,打起十二分精神,紧跟fashion你可以的!每周三次,打卡即read更快、更全了......

  戳蓝字“CSDN云计算”关注我们哦!作者 邴越来源技术琐话Kafka的消息是保存或缓存在磁盘上的,一般认为在磁盘上读写数据是会降低性能的,因为寻址会比较消耗时间......

  戳蓝字“CSDN云计算”关注我们哦!微服务(Microservice Architecture)是近几年流行的一种架构思想,关于它的概念很难一言以蔽之。今天,就让我们来看......

  戳蓝字“CSDN云计算”关注我们哦!作者 孙浩峰DB-Engines 数据库流行度排行榜发布了5 月份的数据,前六名的排名“千年不变”,分别是:Oracle、MySQ......

  戳蓝字“CSDN云计算”关注我们哦!来源 高效运维本文介绍几款 Linux 运维比较实用的工具,希望对 Linux 运维人员有所帮助。1. 查看进程占用带宽情况 - ......

  戳蓝字“CSDN云计算”关注我们哦!作者 倪升武责编 郭 芮可能每个技术人都有个阿里梦,我也不例外。最近准备跳槽,前一阵子在准备各种面试,也面了几个大厂,包括......

  戳蓝字“CSDN云计算”关注我们哦!程序员有了老婆之后就是累,上次好不容易给她解释了什么是Restful,这不,麻烦又来了…一个周日的清晨,阳光洒在我的脸上,慢慢把我唤醒......

  戳蓝字“CSDN云计算”关注我们哦!作者 蠢萌的小灰来源 程序员小灰————— 第二天 —————什么意思呢?我们来举两个栗子:给定一个有序数组2,5,7,......

  kubernetes,简称K8S,是用8代替8个字符“ubernete”而成的缩写。是一个开源的,用于管理云平台中多个主机上的容器化的应用,Kubernetes的目标是让......

  苹果宣布加入CNCF;华为要求美国运营商支付专利费;微软删除最大的公开人脸识别数据集...

  戳蓝字“CSDN云计算”关注我们哦!嗨,大家好,重磅君带来的【云重磅】特别栏目,如期而至,每周五第一时间为大家带来重磅新闻。把握技术风向标,了解行业应用与实践,就交给我重......

  戳蓝字“CSDN云计算”关注我们哦!作者:Feng来源:哈尔的数据城堡现代商业市场是一个数据驱动的环境,可以说不论技术怎么更新换代,数据都有着不可替代的地位,而且抛开数据......

  戳蓝字“CSDN云计算”关注我们哦!技术头条:干货、简洁、多维全面。更多云计算精华知识尽在眼前,get要点、solve难题,统统不在话下!随着Docker 容器技术的不断......

  戳蓝字“CSDN云计算”关注我们哦!是的 ,你没猜错!就是人工智能!AI的炽手可热程度和重要性无需多提。最近,笔者在网上发现了一个报告,报告名字:《BAT人工智能领域人才......

  戳蓝字“CSDN云计算”关注我们哦!作者 李运华出品 技术琐话微服务是近几年非常火热的架构设计理念,大部分人认为是MartinFlower提出了微服务概念,但事实......

  Spring框架是一个开源的Java平台,它提供了非常容易,非常迅速地开发健壮的Java应用程序的全面的基础设施支持。今天就让我们一起来看看关于Spring的精华问答吧。......

  Hadoop再火,火得过Spark吗?今天我们继续关于Spark的精华问答吧。1Q:RDD的核心概念是什么?A:Client:客户端进程,负责提交作业到Master。Ma......

  联想成立数据智能事业部,前京东蓝烨回归;华为或已向多国知识产权组织提交「鸿蒙」商标申请……...

  关注并标星星CSDN云计算极客头条:速递、最新、绝对有料。这里有企业新动、这里有业界要闻,打起十二分精神,紧跟fashion你可以的!每周三次,打卡即read更快、更全了......

  戳蓝字“CSDN云计算”关注我们哦!作者 郭芮出品 CSDN(ID:CSDNnews)回首刚刚过去的五月,注定会给很多技术人留下浓墨重彩的一笔。2018 年 4 ......

  戳蓝字“CSDN云计算”关注我们哦!众所周知,秦始皇陵及兵马俑坑一早就被联合国教科文组织批准列入《世界遗产名录》,并同时被誉为“世界第八大奇迹”,逐渐成长为中国古代辉煌文......

  Python勇者无敌!最近一份PYPL 6月报告了来了,通过半年的发展,Python基本已奠定2019年-2020的地位,持续称王就对了!PLPY 6月榜单,JS跌惨只见......

  戳蓝字“CSDN云计算”关注我们哦!Storm是Twitter开源的分布式实时大数据处理框架,被业界称为实时版Hadoop。随着越来越多的场景对Hadoop的MapRed......

  关注并标星星CSDN云计算极客头条:速递、最新、绝对有料。这里有企业新动、这里有业界要闻,打起十二分精神,紧跟fashion你可以的!每周三次,打卡即read更快、更全了......

  戳蓝字“CSDN云计算”关注我们哦!“我觉得有一个词是肯定的:纯粹,另一个词可能是极致。但这个词我有些犹豫,因为我们做的还不够好。”UCloud技术副总裁杨镭在UClou......

  “我觉得有一个词是肯定的:纯粹,另一个词可能是极致。但这个词我有些犹豫,因为我们做的还不够好。”UCloud技术副总裁杨镭在UCloud用户大会期间接受老孙独家采访时这样形容UCloud。 UCl...

  裁员1700人,IBM 声称内部调整团队;谷歌将以26亿美元全现金收购Looker,绝对大手笔...

  关注并标星星CSDN云计算极客头条:速递、最新、绝对有料。这里有企业新动、这里有业界要闻,打起十二分精神,紧跟fashion你可以的!每周三次,打卡即read更快、更全了......

  戳蓝字“CSDN云计算”关注我们哦!“未来双方的合作会针对智慧城市、智慧建筑以及智慧地域开发等领域开展创新型的解决方案,这种创造对于目前已经存在的,该领域技术甚至是竞争对......

  Docker是个划时代的开源项目,它彻底释放了计算虚拟化的威力,极大提高了应用的维护效率,降低了云计算应用开发的成本!使用 Docker,可以让应用的部署、测试和分发都......

  戳蓝字“CSDN云计算”关注我们哦!我们知道,对于一个Java变量,我们可以赋给其一个“值”。如果你想把“一块代码”赋给一个Java变量,应该怎么做呢?比如,我想把右边那......

本文链接:http://furymagazine.com/yuyiheyi/101.html