本文来自于王新春在2018年7月29日 Flink China社区线下 Meetup·上海站的分享。王新春目前在唯品会负责实时平台相关内容,主要包括实时计算框架和提供实时基础数据,以及机器学习平台的工作。之前在美团点评,也是负责大数据平台工作。他已经在大数据实时处理方向积累了丰富的工作经验。

本文主要内容如下:

  • 唯品会实时平台现状

  • Flink在唯品会的实践

  • Flink On K8S

  • 后续规划

一、唯品会实时平台现状

目前在唯品会实时平台并不是一个统一的计算框架,而是包括Storm,Spark,Flink在内的三个主要计算框架。由于历史原因,当前在Storm平台上的job数量是最多的,但是从去年开始,业务重心逐渐切换到Flink上面,所以今年在Flink上面的应用数量有了大幅增加。

实时平台的核心业务包含八大部分:实时推荐作为电商的重点业务,包含多个实时特征;大促看板,包含各种维度的统计指标(例如:各种维度的订单、UV、转化率、漏斗等),供领导层、运营、产品决策使用;实时数据清洗,从用户埋点收集来数据,进行实时清洗和关联,为下游的各个业务提供更好的数据;此外还有互联网金融、安全风控、与友商比价等业务,以及Logview、Mercury、Titan作为内部服务的监控系统、VDRC实时数据同步系统等。

实时平台的职责主要包括实时计算平台和实时基础数据。实时计算平台在Storm、Spark、Flink等计算框架的基础上,为监控、稳定性提供了保障,为业务开发提供了数据的输入与输出。实时基础数据包含对上游埋点的定义和规范化,对用户行为数据、MySQL的Binlog日志等数据进行清洗、打宽等处理,为下游提供质量保证的数据。

在架构设计上,包括两大数据源。一种是在App、微信、H5等应用上的埋点数据,原始数据收集后发送到在kafka中;另一种是线上实时数据的MySQL Binlog日志。数据在计算框架里面做清洗关联,把原始的数据通过实时ETL为下游的业务应用(包括离线宽表等)提供更易于使用的数据。

二、Flink在唯品会的实践

场景一:Dataeye实时看板

Dataeye实时看板是支持需要对所有的埋点数据、订单数据等进行实时计算时,具有数据量大的特点,并且需要统计的维度有很多,例如全站、二级平台、部类、档期、人群、活动、时间维度等,提高了计算的复杂程度,统计的数据输出指标每秒钟可以达到几十万。

以UV计算为例,首先对Kafka内的埋点数据进行清洗,然后与Redis数据进行关联,关联好的数据写入Kafka中;后续Flink计算任务消费Kafka的关联数据。通常任务的计算结果的量也很大(由于计算维度和指标特别多,可以达到上千万),数据输出通过也是通过Kafka作为缓冲,最终使用同步任务同步到HBase中,作为实时数据展示。同步任务会对写入HBase的数据限流和同类型的指标合并,保护HBase。与此同时还有另一路计算方案作为容灾。

在以Storm进行计算引擎中进行计算时,需要使用Redis作为中间状态的存储,而切换到Flink后,Flink自身具备状态存储,节省了存储空间;由于不需要访问Redis,也提升了性能,整体资源消耗降低到了原来的1/3。

在将计算任务从Storm逐步迁移到Flink的过程中,对两路方案先后进行迁移,同时将计算任务和同步任务分离,缓解了数据写入HBase的压力。

切换到Flink后也需要对一些问题进行追踪和改进。对于FlinkKafkaConsumer,由于业务原因对kafka中的Aotu Commit进行修改,以及对offset的设定,需要自己实现支持kafka集群切换的功能。对不带window的state数据需要手动清理。还有计算框架的通病——数据倾斜问题需要处理。同时对于同步任务追数问题,Storm可以从Redis中取值,Flink只能等待。

场景二:Kafka数据落地HDFS

之前都是通过Spark Streaming的方式去实现,现在正在逐步切换到Flink上面,通过OrcBucketingTableSink将埋点数据落地到HDFS上的Hive表中。在Flink处理中单Task Write可达到3.5K/s左右,使用Flink后资源消耗降低了90%,同时将延迟30s降低到了3s以内。目前还在做Flink对Spark Bucket Table的支持。

场景三:实时的ETL

对于ETL处理工作而言,存在的一个痛点就是字典表存储在HDFS中,并且是不断变化的,而实时的数据流需要与字典表进行join。字典表的变化是由离线批处理任务引起的,目前的做法是使用ContinuousFileMonitoringFunction和ContinuousFileReaderOperator定时监听HDFS数据变化,不断地将新数据刷入,使用最新的数据去做join实时数据。

我们计划做更加通用的方式,去支持Hive表和Stream的join,实现Hive表数据变化之后,数据自动推送的效果。

三、Flink On K8S

在唯品会内部有一些不同的计算框架,有实时计算的,有机器学习的,还有离线计算的,所以需要一个统一的底层框架来进行管理,因此将Flink迁移到了K8S上。

在K8S上使用了思科的网络组件,每个docker容器都有独立的ip,对外也是可见的。实时平台的融合器整体架构如下图所示。

唯品会在K8S上的实现方案与Flink社区提供的方案差异还是很大的。唯品会使用K8S StatefulSet模式部署,内部实现了cluster相关的一些接口。一个job对应一个mini cluster,并且支持HA。对于Flink来说,使用StatefulSet的最大的原因是pod的hostname是有序的;这样潜在的好处有:

1.hostname为-0和-1的pod可以直接指定为jobmanager;可以使用一个statefulset启动一个cluster,而deployment必须2个;Jobmanager和TaskManager分别独立的deployment。

2. pod由于各种原因fail后,由于StatefulSet重新拉起的pod的hostname不变,集群recover的速度理论上可以比deployment更快(deployment每次主机名随机)。

镜像的docker entrypoint脚本里面需要设置的环境变量设置说明:

对应Flink集群所依赖的HDFS等其他配置,则通过创建configmap来管理和维护。

kubectl create configmap hdfs-conf --from-file=hdfs-site.xml --from-file=core-site.xml

四、后续计划

当前实时系统,机器学习平台要处理的数据分布在各种数据存储组件中,如Kafka、Redis、Tair和HDFS等,如何方便高效的访问,处理,共享这些数据是一个很大的挑战,对于当前的数据访问和解析常常需要耗费很多的精力,主要的痛点包括:

对于Kafka,Redis,Tair中的binary(PB/Avro等格式)数据,使用者无法快速直接的了解数据的schema与数据内容,采集数据内容及与写入者的沟通成本很高。

由于缺少独立的统一数据系统服务,对Kafka,Redis,Tair等中的binary数据访问需要依赖写入者提供的信息,如proto生成类,数据格式wiki定义等,维护成本高,容易出错。

缺乏relational schema使得使用者无法直接基于更高效易用的SQL或LINQ层API开发业务。

无法通过一个独立的服务方便的发布和共享数据。

实时数据无法直接提供给Batch SQL引擎使用。

此外,对于当前大部分的数据源的访问也缺少审计,权限管理,访问监控,跟踪等特性。

UDM(统一数据管理系统)包括Location Manager, Schema Metastore以及Client Proxy等模块,主要的功能包括:

1. 提供从名字到地址的映射服务,使用者通过抽象名字而不是具体地址访问数据。

2. 用户可以方便的通过Web GUI界面方便的查看数据Schema,探查数据内容。

3. 提供支持审计,监控,溯源等附加功能的Client API Proxy。

4. 在Spark/Flink/Storm等框架中,以最适合使用的形式提供这些数据源的封装。

UDM的整体架构如下图所示。

UDM的使用者包括实时,机器学习以及离线平台中数据的生产者和使用者。在使用Sql API或Table API的时候,首先完成Schema的注册,之后使用Sql进行开发,降低了开发代码量。

以Spark访问Kafka PB数据的时序图来说明UDM的内部流程

在Flink中,使用UDMExternalCatalog来打通Flink计算框架和UDM之间的桥梁,通过实现ExternalCatalog的各个接口,以及实现各自数据源的TableSourceFactory,完成Schema和接入管控等各项功能。

转自:https://mp.weixin.qq.com/s/Tf47g4wwunI_qaJf88a5LA

Flink应用实践-唯品会相关推荐

  1. kylin如何支持flink_Kylin 在腾讯的平台化及 Flink 引擎实践

    △Meetup 现场视频 Kylin 平台化实践 首先,介绍下我们为什么进行平台化改造? 我们部门为公司内其他业务线提供了各种大数据平台,如 Kylin.HBase.Spark.Flink 等等,提供 ...

  2. 阿里妈妈Dolphin智能计算引擎基于Flink+Hologres实践

    作者:徐闻春(花名 陌奈) 阿里妈妈事业部技术专家 本文整理至Flink+Hologres实时数仓Workshop北京站,点击查看视频回放>>> 阿里妈妈数据引擎团队负责广告营销计算 ...

  3. Flink 最佳实践之使用 Canal 同步 MySQL 数据至 TiDB

    摘要:本文将介绍如何将 MySQL 中的数据,通过 Binlog + Canal 的形式导入到 Kafka 中,继而被 Flink 消费的案例.内容包括: 背景介绍 环境介绍 部署 TiDB Clus ...

  4. Flink项目实践【一】实时热门商品统计

    第1章 项目整体介绍 1.1 电商的用户行为 电商平台中的用户行为频繁且较复杂,系统上线运行一段时间后,可以收集到大量的用户行为数据,进而利用大数据技术进行深入挖掘和分析,得到感兴趣的商业指标并增强对 ...

  5. Flink rpc实践

    Flink的RPC服务是基于Akka Remote实现的 一个简单的Akka Remoting ActorSystem的配置如下(基于akka 2.6.0版本): 服务端配置及代码:applicati ...

  6. flink集成springboot案例_Flink从流处理到流批一体的19个最佳实践

    近年来,随着实时化需求的场景日益增多,企业已不满足于简单使用流计算或批计算进行数据处理,采用一套引擎即可实现低延迟.高吞吐.高稳定的强大性能逐渐成为更多企业的追求.Apache Flink 作为领先的 ...

  7. Spark、Flink、CarbonData技术实践最佳案例解析

    当前无论是传统企业还是互联网公司对大数据实时分析和处理的要求越来越高,数据越实时价值越大,面向毫秒~秒级的实时大数据计算场景,Spark和Flink各有所长.CarbonData是一种高性能大数据存储 ...

  8. flink入门_阿里巴巴为何选择Flink?20年大佬分11章讲解Flink从入门到实践!

    前言 Apache Flink 是德国柏林工业大学的几个博士生和研究生从学校开始做起来的项目,之前叫做 Stratosphere.他们在2014 年开源了这个项目,起名为 Flink. Apache ...

  9. Flink 在有赞的实践和应用

    简介:本文介绍了Flink 在有赞的实践和应用,内容包括:Flink 的容器化改造和实践.Flink SQL 的实践和应用.未来规划. 作者:沈磊 简介:今天主要分享的内容是 Flink 在有赞的实践 ...

最新文章

  1. 综述:如何给模型加入先验知识
  2. android+notepad教程,Android Sample学习——NotePad
  3. 不做会死!互联网时代的企业必定都要实现中台
  4. vue-cli3创建项目时报错
  5. Xcode6 部署iphone4s出现的问题 No architectures to compile for
  6. 带SN切换流程_贴片电阻生产工艺流程简介
  7. chrome浏览器更新后重新安装配置chromedriver
  8. 银行核心系统之假期表
  9. mysql ndb 关闭,监控mysql、ndb进程重启
  10. 做量化交易需要了解的国外在线量化平台有哪些?
  11. 3-2-1 程序控制结构-while循环结构-多次求解一元二次方程?-while循环常见错误?
  12. html + layui 打开word文档
  13. 如何合法学习黑客技术?这9个项目可以帮到你!
  14. 猴子搬香蕉Java实现,儿童编程游戏CodeMonkey,让你的小猴子不停地吃香蕉
  15. 计算机硬件交通灯课程设计,交通灯计算机硬件课程设计(附件).doc
  16. [解锁越狱]诺基亚 Lumia 710 800 最详细的解锁越狱教程
  17. 用于风控模型的九种数据维度(常用的金融数据)
  18. 计算机专业买苹果笔记本哪款好,2019苹果笔记本电脑哪款好,MacBook Pro值得买吗?...
  19. Java默认的排序算法
  20. [绍棠] 关于 @synchronized

热门文章

  1. 贴片共模电感有没有分方向
  2. PPTP和L2TP哪种好?
  3. Android APK 签名指令
  4. 生产计划erp管理系统
  5. 泡妞与23种设计模式(转)
  6. [读书笔记]软件架构师职业导读
  7. 智能物联网有哪些应用场景?_串口WiFi模块,蓝牙模块,WiFi+蓝牙组合模块
  8. hexo给文章插入图片、进行图片样式控制
  9. mathtype服务器 消息通知区域,MathType打开窗口太多怎么办
  10. mathtype中打空格