草庐IT

罗强:腾讯新闻如何处理海量商业化数据?

DataFunTalk 2023-03-28 原文

导读: 随着信息化时代的来临,信息呈现出爆炸式的增长。尤其是在移动互联网的推动下,每天大量信息涌入让人们应接不暇,腾讯新闻客户端的出现,就是以帮助用户寻找有用信息而出现。这时,面对海量的数据、繁多的业务,如何处理手中的数据,利用数据赋能是今天会议讨论的重点。
今天的介绍会围绕下面三部分展开:

  • 背景介绍
  • 海量日志处理架构
  • 数据应用举例

--

01 背景介绍

首先介绍一下腾讯新闻的背景。

团队目前承担腾讯新闻客户端,体育和新闻插件的创新业务的输入,广告和用户行为的数据采集、处理、计算和分析的工作。最大的特点就是数据多、业务广。数据庞大,业务应用多样,例如数据会被用于报表展示、算法模型的训练、产品决策等场景。

--

02 海量日志处理架构

1. 总体架构

众所周知,业务在实际开发过程中需要一套有效的数据管理、组织、处理方法,使得整个数据体系更加有序。上图展示的是腾讯新闻整体的处理架构,包括:

  • 采集层:依托于大同数据采集上报服务,大同是目前内部力推的数据治理的客户端上报平台。

  • 计算层:包括实时计算与离线计算。离线是基于TDW(hive表)和HDFS建立的各个业务请求、点击、曝光等维度的数据表,同时利用欧拉平台的数据分层、数据分类、数据血缘等能力完成数据资产的管理。实时计算方面使用Oceanus平台和内部的Datahub完成整个数据的开发。这个设计解决了需求多变、代码复杂、系统高可用、海量数据低延时接入、数据高复用等问题。在ODS原始数据层、DWD数据明细层、DWS主题轻汇聚层,我们采用集团的Tube消息中间件,以及BG内部的CDMQ。Tube消息中间件解决海量数据及时接入的问题。数据各层由流式计算引擎进行业务的清洗与转化,结果会回流到下一个消息中间件,供下游使用。对于ODS层的实时数据我们会每隔一个小时同步到TDW,大概存储周期为3天,这部分数据既能用于离线计算,又能作为数据的备份。比如一些链路发生异常,可以利用这部分数据进行问题排查和数据恢复。

  • 数据存储层:组件比较丰富,有Impala、ClickHouse、Mysql、Redis等。Impala主要应用在内部灯塔平台和Datatalk平台进行报表和数据探测的工作中。

2.数据上报

这部分详细地讲解整个数据上报体系。目前数据上报会根据数据源进行分类上报。数据源主要分为四大类:

  • 客户端:包括客户端、PC、H5这类数据。采用灯塔SDK进行上报,使用大同SDK进行采集。同时会基于大同平台进行事件的管理,例如埋点的事件管理和统一参数的上报。大同平台有效地解决需求散乱、数据难校验、上报不规范等问题。在整个实时链路中,这部分数据接着会通过atta分发到TDW(hive表)和CDMQ实时中间件供下游进行实时消费。

  • 后台:主要包括后台服务器日志的上报。这部分数据会上报到Tdbank。Tdbank会同时将数据转化为TDW(hive表),同时还会分发到Tube实时流中,供下游进行实时消费。

  • DB:跟后台数据上报类似。以前的方式是DB同步,例如按小时更新或者按天更新将Mysql更新数据放到Hive表中。目前,会通过Flink CDC监听Mysql的binLog实时更新业务维表。

  • 文件:例如业务配置和运营的配置文件,量不大,会通过手动的方式离线同步到TDW(hive表)中去。

3. 实时计算框架

实时计算架构整体上选择Lamda架构,ODS层到DWD层数据的处理,实时和离线部分是公用的,也体现了流批一体的概念。下面就分模块介绍实时计算部分的整体架构。

  • 存储/接入层:负责客户端与后台的实时中间数据上报。数据被上报到消息中间件中,消息中间件一方面负责消息的存储,另一方面承担数据分发给离线和在线处理平台的功能,同时它是数据源和数据处理系统之间的桥梁。

  • DWD:DWD层的设计是为了减少下游频繁对ODS层数据进行消费。对于新的需求开发我们只需要申请DWD层的Tube消费节点即可。这样处理极大地节省了计算单元。

  • 计算层:主要负责数据的ETL、维表关联、特征抽取等业务逻辑的计算。

  • 数据仓库存储层:主要采用TDW(hive表)、HDFS和Impala作为存储介质。ODS层的原始数据默认保存在HDFS上,保存周期默认为3天。

另外,DWD和DWS层数据支持写入TDW和HDFS去做离线计算。同时也支持导入Impala进行存储,以供灯塔平台和DataTalk平台等进行数据探测和报表展示。

4. 离线计算框架

针对离线计算部分,我们对数据进行了分层管理,简单概括为以下四层:

  • ODS:原始数据存储层。存储大同上报或后台上报的原始数据,例如广告点击曝光等数据。

  • DWD:数据明细存储层。存储经过清洗和标准化的数据。

  • DWS:数据轻度汇合层。基于单业务场景或者单用户行为的汇总。

  • ADS:数据应用层。只要存储最终的,呈现结果的数据。例如存储报表和进入Impala之前的数据,或者 存储需要进入Redis、ClickHouse等的数据。

我们对数据层的调用进行了约束:

  • DWD层必须存在。且所有的ETL逻辑都在DWD层上。

  • DWS层优先调用DWD层。ADS优先调用DWS层。

  • DWD层不做过多与DIM维表的关联

同时我们对于表的命名进行规范,该命名规范使得杂乱无章的数据表变得规范有序,使得内部业务合作变得便利。具体规范如下:

5. 数据质量及链路保障

关于数据质量以及链路保障,分为在线和离线两部分进行讲解。

离线部分,一方面会依托平台提供指标监控告警以及SLA保障的能力;另一方面,在代码层面进行设计,通过异常捕获、分级告警,出错分层管理,重置机制等,提高整个系统的高可用和稳定性。

实时部分,最容易出错的就是Flink实时计算部分,例如出现内存不足、TaskManager突然减少、网络抖动导致的服务连接超时等。我们会依托于Oceanus平台提供的告警能力。我们设计了一套代码层级的告警作为报警独立模块。首先我们通过try catch捕捉Flink Task中的异常,同时这些报警信息会被发送到消息中间件,然后报警信息会在消息中间件中被聚合,为了预防报警疲劳,报警信息会被分级,错误码会被沉淀,然后报警会统一通过企业微信进行通知,正常情况问题可在5min内被解决。

6. 总结

我们在实时和离线对海量日志处理设计方案上的收益可以总结如下:

  • 首先,通过大同平台上报,使得上报更加规范化;

  • 第二是事件规范化,各个BG之间可以应用同一规范数据,有统一规范的数据格式和命名规则;

  • 第三就是数据仓库规范化,包括分层、主题、管理等,使得整体管理更加清晰。


03 数据应用举例

这部分,我们通过Flink CDC的DB数据同步技术,进一步举例说明我们的海量数据处理流程。上图是通过Flink CDC进行实时更新维表和实时排行榜更新的设计方案,整体主要包括输入数据源、Flink实时ETL模块、Flink核心计算模块和数据存储模块四部分。Flink内部继承开源组件Debezium和Kafka,CDC技术可以实时捕捉Mysql的增删改,然后将数据同步到下游,同步到多个数据源,然后通过抽取数据库日志的方式完成数据上报。

Flink CDC实现方式主要有两种:SQL模式和自定义反序列化模式。个人倾向于选择第二种方式,可以更加灵活地实现业务需求。通过实现反序列化相关接口,数据库的变更数据可以通过SourceRecord得到,解析之后的数据可以通过collect进行收集然后传到下游进行消费。

今天的分享就到这里,谢谢大家。
本文首发于微信公众号“DataFunTalk”。

有关罗强:腾讯新闻如何处理海量商业化数据?的更多相关文章

  1. ruby - 解析 RDFa、微数据等的最佳方式是什么,使用统一的模式/词汇(例如 schema.org)存储和显示信息 - 2

    我主要使用Ruby来执行此操作,但到目前为止我的攻击计划如下:使用gemsrdf、rdf-rdfa和rdf-microdata或mida来解析给定任何URI的数据。我认为最好映射到像schema.org这样的统一模式,例如使用这个yaml文件,它试图描述数据词汇表和opengraph到schema.org之间的转换:#SchemaXtoschema.orgconversion#data-vocabularyDV:name:namestreet-address:streetAddressregion:addressRegionlocality:addressLocalityphoto:i

  2. ruby-on-rails - Enumerator.new 如何处理已通过的 block ? - 2

    我在理解Enumerator.new方法的工作原理时遇到了一些困难。假设文档中的示例:fib=Enumerator.newdo|y|a=b=1loopdoy[1,1,2,3,5,8,13,21,34,55]循环中断条件在哪里,它如何知道循环应该迭代多少次(因为它没有任何明确的中断条件并且看起来像无限循环)? 最佳答案 Enumerator使用Fibers在内部。您的示例等效于:require'fiber'fiber=Fiber.newdoa=b=1loopdoFiber.yieldaa,b=b,a+bendend10.times.m

  3. ruby - Ruby 有 `Pair` 数据类型吗? - 2

    有时我需要处理键/值数据。我不喜欢使用数组,因为它们在大小上没有限制(很容易不小心添加超过2个项目,而且您最终需要稍后验证大小)。此外,0和1的索引变成了魔数(MagicNumber),并且在传达含义方面做得很差(“当我说0时,我的意思是head...”)。散列也不合适,因为可能会不小心添加额外的条目。我写了下面的类来解决这个问题:classPairattr_accessor:head,:taildefinitialize(h,t)@head,@tail=h,tendend它工作得很好并且解决了问题,但我很想知道:Ruby标准库是否已经带有这样一个类? 最佳

  4. ruby - 我如何添加二进制数据来遏制 POST - 2

    我正在尝试使用Curbgem执行以下POST以解析云curl-XPOST\-H"X-Parse-Application-Id:PARSE_APP_ID"\-H"X-Parse-REST-API-Key:PARSE_API_KEY"\-H"Content-Type:image/jpeg"\--data-binary'@myPicture.jpg'\https://api.parse.com/1/files/pic.jpg用这个:curl=Curl::Easy.new("https://api.parse.com/1/files/lion.jpg")curl.multipart_form_

  5. 世界前沿3D开发引擎HOOPS全面讲解——集3D数据读取、3D图形渲染、3D数据发布于一体的全新3D应用开发工具 - 2

    无论您是想搭建桌面端、WEB端或者移动端APP应用,HOOPSPlatform组件都可以为您提供弹性的3D集成架构,同时,由工业领域3D技术专家组成的HOOPS技术团队也能为您提供技术支持服务。如果您的客户期望有一种在多个平台(桌面/WEB/APP,而且某些客户端是“瘦”客户端)快速、方便地将数据接入到3D应用系统的解决方案,并且当访问数据时,在各个平台上的性能和用户体验保持一致,HOOPSPlatform将帮助您完成。利用HOOPSPlatform,您可以开发在任何环境下的3D基础应用架构。HOOPSPlatform可以帮您打造3D创新型产品,HOOPSSDK包含的技术有:快速且准确的CAD

  6. FOHEART H1数据手套驱动Optitrack光学动捕双手运动(Unity3D) - 2

    本教程将在Unity3D中混合Optitrack与数据手套的数据流,在人体运动的基础上,添加双手手指部分的运动。双手手背的角度仍由Optitrack提供,数据手套提供双手手指的角度。 01  客户端软件分别安装MotiveBody与MotionVenus并校准人体与数据手套。MotiveBodyMotionVenus数据手套使用、校准流程参照:https://gitee.com/foheart_1/foheart-h1-data-summary.git02  数据转发打开MotiveBody软件的Streaming,开始向Unity3D广播数据;MotionVenus中设置->选项选择Unit

  7. 使用canal同步MySQL数据到ES - 2

    文章目录一、概述简介原理模块二、配置Mysql使用版本环境要求1.操作系统2.mysql要求三、配置canal-server离线下载在线下载上传解压修改配置单机配置集群配置分库分表配置1.修改全局配置2.实例配置垂直分库水平分库3.修改group-instance.xml4.启动监听四、配置canal-adapter1修改启动配置2配置映射文件3启动ES数据同步查询所有订阅同步数据同步开关启动4.验证五、配置canal-admin一、概述简介canal是Alibaba旗下的一款开源项目,Java开发。基于数据库增量日志解析,提供增量数据订阅&消费。Git地址:https://github.co

  8. ruby-on-rails - 创建 ruby​​ 数据库时惰性符号绑定(bind)失败 - 2

    我正在尝试在Rails上安装ruby​​,到目前为止一切都已安装,但是当我尝试使用rakedb:create创建数据库时,我收到一个奇怪的错误:dyld:lazysymbolbindingfailed:Symbolnotfound:_mysql_get_client_infoReferencedfrom:/Library/Ruby/Gems/1.8/gems/mysql2-0.3.11/lib/mysql2/mysql2.bundleExpectedin:flatnamespacedyld:Symbolnotfound:_mysql_get_client_infoReferencedf

  9. STM32读取串口传感器数据(颗粒物传感器,主动上传) - 2

    文章目录1.开发板选择*用到的资源2.串口通信(个人理解)3.代码分析(注释比较详细)1.主函数2.串口1配置3.串口2配置以及中断函数4.注意问题5.源码链接1.开发板选择我用的是STM32F103RCT6的板子,不过代码大概在F103系列的板子上都可以运行,我试过在野火103的霸道板上也可以,主要看一下串口对应的引脚一不一样就行了,不一样的就更改一下。*用到的资源keil5软件这里用到了两个串口资源,采集数据一个,串口通信一个,板子对应引脚如下:串口1,TX:PA9,RX:PA10串口2,TX:PA2,RX:PA32.串口通信(个人理解)我就从串口采集传感器数据这个过程说一下我自己的理解,

  10. SPI接收数据异常问题总结 - 2

    SPI接收数据左移一位问题目录SPI接收数据左移一位问题一、问题描述二、问题分析三、探究原理四、经验总结最近在工作在学习调试SPI的过程中遇到一个问题——接收数据整体向左移了一位(1bit)。SPI数据收发是数据交换,因此接收数据时从第二个字节开始才是有效数据,也就是数据整体向右移一个字节(1byte)。请教前辈之后也没有得到解决,通过在网上查阅前人经验终于解决问题,所以写一个避坑经验总结。实际背景:MCU与一款芯片使用spi通信,MCU作为主机,芯片作为从机。这款芯片采用的是它规定的六线SPI,多了两根线:RDY和INT,这样从机就可以主动请求主机给主机发送数据了。一、问题描述根据从机芯片手

随机推荐