https://tech.youzan.com/lambda/

有赞广告平台依托于有赞微商城,帮助商家投放广告。通过有赞广告平台,商家可以在腾讯广点通、云堆、小博无线等流量渠道投放广告。 对于有赞广告平台,除了提供基础的广告编辑、投放、素材管理等功能,最重要的就是广告的投放效果的展示、分析功能了。有赞广告平台的数据分析模块提供了不同的时间维度(天、小时),不同的实体维度(广告计划、广告、性别、年龄、地域)下的不同类型指标(曝光、点击、花费、转化下单、增粉数)的分析。所有这些数据都是秒级到10min级别的准实时数据,为了做到将实时数据和离线数据方便的结合,我们引入了大数据系统的lambda架构, 并在这样的lambda架构的基础下演进了几个版本。在这里想把广告系统的数据统计服务演进历程以及踩过的坑、得到的感悟和各位同僚分享一下?

大数据系统的Lambda架构

大数据处理技术需要解决数据的可伸缩性与复杂性。首先要很好地处理分区与复制,不会导致错误分区引起查询失败。当需要扩展系统时,可以非常方便地增加节点,系统也能够针对新节点进行rebalance。其次是要让数据成为不可变的。原始数据永远都不能被修改,这样即使犯了错误,写了错误数据,原来好的数据并不会受到破坏。

Lambda架构的主要思想是将大数据系统架构为多个层次:批处理层(batchlayer)、实时处理层(speedlayer)、服务层(servinglayer)。批处理层生产离线数据,是每天重新计算的,实时处理层的数据增量更新,数据时效过去之后会被清理,由批处理层的数据替代。服务层则对外提供数据服务,综合批处理层以及实时处理层的数据。典型的lambda架构图如下: 
- 批处理层每天离线的计算历史数据,全量刷新昨日之前的历史统计数据,产生batch Views - 实时处理层实时的获取增量数据,产生当日实时的增量统计数据,产生real-time Views - 服务层从batch Views以及real-time View读取数据,向外提供实时+离线的数据统计服务

有赞广告平台的数据来源

有赞广告平台展示的数据指标包含两类:曝光类(包括曝光数、点击数、点击单价、花费),转化类(包括转化下单数,转化下单金额,转化付款数,转化付款金额)。前一类的数据主要由流量方以接口的方式提供(比如对接的腾讯广点通平台),后一类则是有赞特有的数据,通过买家的浏览、下单、付款日志算出来。

第一版架构

第一版采用了典型的lambda架构形式。批处理层每天凌晨将kafka中的浏览、下单消息同步到hdfs中,再将hdfs中的日志数据解析成hive表,用hive sql/spark sql计算出分区的统计结果hive表,最终将hive表导出到mysql中供服务层读取。另一方面,曝光、点击、花费等外部数据指标则是通过定时任务,调用第三方的api,每天定时写入另一张mysql表中。

实时处理层方面,用spark streaming程序监听kafka中的下单、付款消息,计算出每个追踪链接维度的转化数据,存储在redis中。

服务层则是一个java服务,向外提供http接口。java服务读取两张mysql表+一个redis库的数据。

第一版的数据处理层比较简单,性能的瓶颈在java服务层这一块。 java服务层收到一条数据查询请求之后,需要查询两张mysql表,按照聚合的维度把曝光类数据与转化类数据合并起来,得到全量离线数据。同时还需要查询业务mysql,找到一条广告对应的所有redis key,再将redis中这些key的统计数据聚合,得到当日实时的数据。最后把离线数据和实时数据相加,返回给调用方。 
这个复杂的业务逻辑导致了java服务层的代码很复杂,数据量大了之后性能也跟不上系统要求。

另一方面,实时数据只对接了内部的kafka消息,没有实时的获取第三方的曝光/点击/浏览数据。因此,第一版虽然满足了历史广告效果分析的功能,却不能满足广告操盘手实时根据广告效果调整价格、定向的需求。

第二版架构

针对第一版的两个问题,我们在第二版对数据流的结构做了一些修改: - 在实时处理层做了一个常驻后台的python脚本,不断的调用第三方api的小时报表,更新当日的曝光数据表。 这里有一个小技巧:由于第三方提供的api有每日调用次数上限的限制,将每天的时间段分为两档:1:00-8:00为不活跃时间段,8:00-第二天1:00为活跃时间段,不活跃时间段的同步频率为30min一次,活跃时间段为10min一次。每次同步完数据之后会根据当天消耗的api调用次数和当天过去的时间来计算出在不超过当天调用次数前提下,下一次调用需要间隔的时间。同步脚本会在满足不超过当天限额的前提下尽可能多的调用同步api。从而避免了太快消耗掉当日的调用限额,出现在当天晚上由于达到调用限额而导致数据无法更新的情况。 - 在批处理层,把转化数据表和曝光数据表导入到hive中,用hive sql做好join,将两张表聚合而成的结果表导出到mysql,提供给服务层

完成第二版改动之后,java服务的计算压力明显下降。性能的瓶颈变成了查询redis数据这一块。由于redis里面的实时数据是业务无关的,仅统计了追踪链接维度的聚合数据。每次查询当日的转化数据,需要现在mysql中查询出广告和跟踪链接的关系,找出所有的跟踪链接,再查询出这些跟踪链接的统计数据做聚合。

另一方面,离线计算的过程中涉及到多次mysql和hive之间的导表操作,离线任务依赖链比较长,一旦出错,恢复离线任务的时间会比较久。

第三版架构

考虑到mysql方便聚合、方便服务层读取的优点,在第三版中我们对lambda架构做了一些改动,在数据层面只维护一张包含所有指标的mysql表。mysql表的stday(统计日期)字段作为索引,stday=当天的保存实时数据,st_day<当天的保存离线数据。

在第三版中,我们只维护一张mysql数据统计表,每天的离线任务会生成两张hive表,分别包含转化数据和曝光数据。这两张hive表分别更新mysql表的st_day<today的行中的曝光类指标和转化类指标< p="">

在实时数据这块,常驻后台的python脚本更新stday=当天的数据的曝光类字段。spark streaming程序在处理kafka中的实时下单消息时,不再统计数据到redis,而是请求业务java服务暴露出来的更新数据接口。在更新数据的接口中,找到当前下单的追踪链接所属的广告,更新mysql中stday=当天的数据的转化类字段。这样就把查询阶段的关联操作分散在了每条订单下单的处理过程中,解决了实时数据查询的瓶颈。最终的java服务层也只需要读取一个mysql表,非常简洁。

总结

有赞广告平台经历了三版的数据架构演进,历时大半年,最终做到了结合内部、外部两个数据源,可以在多维度分析离线+实时的数据。在数据架构的设计中,我们一开始完全遵照标准的lambda架构设计,发现了当数据来源比较多的时候,标准lambda架构会导致服务层的任务过重,成为性能的瓶颈。后续两版的改进都是不断的把本来服务层需要做的工作提前到数据收集、计算层处理。第二版将不同来源的指标合并到了同一个mysql表中。第三版则将redis数据与业务数据关联的工作从统计阶段提前到了数据收集阶段,最终暴露给服务层的只有一张mysql表。

综合这两版的经验,我们发现在lambda架构的基础上,尽可能的将一些复杂的合并、关联工作从服务层前提到数据采集层,能够让整个数据流结构更加简洁,最终向外提供的服务性能也会更高。

转载于:https://www.cnblogs.com/davidwang456/articles/9238844.html

Lambda架构在有赞广告平台的应用与演进相关推荐

  1. 大数据平台数据处理之Lambda架构和Kappa架构

    首先我们来看一个典型的互联网大数据平台的架构,如下图所示: 在这张架构图中,大数据平台里面向用户的在线业务处理组件用褐色标示出来,这部分是属于互联网在线应用的部分,其他蓝色的部分属于大数据相关组件,使 ...

  2. 联盟广告平台架构及实践

    导读:随着大数据的快速发展,大数据应用已经融入各行各业,在很多场景中得到了商业化实践.今天和大家分享下 58 同城联盟广告平台架构及实践.主要包括:58 联盟广告 SSP 媒体平台.投放平台.程序化创 ...

  3. 某互联网公司广告平台技术架构

    某互联网公司广告平台技术架构 演化 水平扩展一切 并行化,异步调用 演化 Randy的可扩展架构7原则 • 按功能分区(Partition by Function) • 水平切分 • 避免事务 • 异 ...

  4. 大数据平台Lambda架构详解

    Lambda架构由Storm的作者Nathan Marz提出.旨在设计出一个能满足.实时大数据系统关键特性的架构,具有高容错.低延时和可扩展等特. Lambda架构整合离线计算和实时计算,融合不可变( ...

  5. 第十七期:详解大数据处理中的Lambda架构和Kappa架构

    在这张架构图中,大数据平台里面向用户的在线业务处理组件用褐色标示出来,这部分是属于互联网在线应用的部分,其他蓝色的部分属于大数据相关组件,使用开源大数据产品或者自己开发相关大数据组件.   典型互联网 ...

  6. KeyMob推出移动广告平台,服务开发者与广告主

    为什么80%的码农都做不了架构师?>>>    在国内,独立的移动广告平台有很多家,主流的移动广告平台有多盟.点入与KeyMob等.多盟产品量大,对媒体资源的积累,促进了市场占有率的 ...

  7. 5大架构:细数数据平台的组成与扩展

    作为软件工程师,不可避免地受到周围计算机工具的影响,语言.框架.甚至执行过程都会影响我们构建的软件. 数据库亦如此,基于一种特殊的方式,不可避免地影响到我们对应用程序中易变和共享状态的处理. 过去的十 ...

  8. Lambda架构与推荐在电商网站实践

    王富平  现为1号店搜索与精准化部门架构师,之前在百度从事数据挖掘相关工作,对实时处理有着深刻的研究.一直从事大数据相关研发工作,2013年开发了一款SQL实时处理框架,致力于建设高可用的大数据业务系 ...

  9. 专访小米欧阳辰:深度揭秘小米广告平台的构建、底层模块和坑

    专访小米欧阳辰:深度揭秘小米广告平台的构建.底层模块和坑 专访小米架构欧阳辰架构师广告平台数据库 width="22" height="16" src=&quo ...

最新文章

  1. 如何正确强制执行Git推送?
  2. Excel操作:导出到Excel并下载到web客户端
  3. ME3630模块常用指令介绍
  4. SOX 音频处理工具基本使用
  5. 關於@Override
  6. 设计爬虫Hawk背后的故事
  7. Oracle应用容器云上的WildFly Swarm
  8. Java设计模式(4 / 23):单例模式
  9. bzoj4950(二分图最大匹配)
  10. Nginx 上传图片500错误 open() /var/lib/nginx/tmp/
  11. PTA: 6-4建立学生信息链表(20分)
  12. python实现归并算法
  13. 直播防盗链,域名设置
  14. 如何成为一个真正在路上的Linuxer
  15. python写ppt_python可以写PPT吗
  16. win10台式计算机调亮度,台式win10电脑屏幕亮度无法调节怎么办
  17. 牛年学“牛”词:关于牛的短语和句子
  18. SimpleDateFormat的使用:SimpleDateFormat对日期Date类的格式化和解析
  19. 行业应对IDFA缺失各有方案 数盟方案更可靠有效
  20. 为什么要学Python 编程?(附Python学习路线)

热门文章

  1. java 3des解密过程_6. Java 加解密技术系列之 3DES
  2. form参数化 jq_[转载]Jquery Form插件表单参数
  3. java search 不能使用方法_elasticsearch(七)java 搜索功能Search Request的介绍与使用...
  4. 快速mysql导入sql文件_mysql肿么快速从sql文件导入数据库
  5. linux软件升级直接替换,Linux几个命令的升级替代品
  6. python分析双十一销量
  7. 查看mysql view作用_Mysql中View视图的作用
  8. aspen和python一起使用_python-将$cond语句与$project一起使用并在PyMon...
  9. java怎么让表格的字段相乘,excel表格怎么让数据相乘-如何在excel表格中设置乘法公式...
  10. C语言中动态数组的作用,C语言实现动态数组