日处理数据量超10亿:友信金服基于Flink构建实时用户画像系统的实践

作者 | 杨毅,穆超峰,贺小兵,胡夕

导读: 当今生活节奏日益加快,企业面对不断增加的海量信息,其信息筛选和处理效率低下的困扰与日俱增。由于用户营销不够细化,企业 App 中许多不合时宜或不合偏好的消息推送很大程度上影响了用户体验,甚至引发了用户流失。在此背景下,友信金服公司推行全域的数据体系战略,通过打通和整合集团各个业务线数据,利用大数据、人工智能等技术构建统一的数据资产,如 ID-Mapping、用户标签等。友信金服用户画像项目正是以此为背景成立,旨在实现“数据驱动业务与运营”的集团战略。目前该系统支持日处理数据量超 10 亿,接入上百种合规数据源。

一、技术选型

传统基于 Hadoop 生态的离线数据存储计算方案已在业界大规模应用,但受制于离线计算的高时延性,越来越多的数据应用场景已从离线转为实时。这里引用一张表格对目前主流的实时计算框架做个对比。

Apache Storm 的容错机制需要对每条数据进行应答(ACK),因此其吞吐量备受影响,在数据大吞吐量的场景下会有问题,因此不适用此项目的需求。

Apache Spark 总体生态更为完善,且在机器学习的集成和应用性暂时领先,但 Spark 底层还是采用微批(Micro Batching)处理的形式。

Apache Flink 在流式计算上有明显优势:首先其流式计算属于真正意义上的单条处理,即每一条数据都会触发计算。在这一点上明显与 Spark 的微批流式处理方式不同。其次,Flink 的容错机制较为轻量,对吞吐量影响较小,使得 Flink 可以达到很高的吞吐量。最后 Flink 还拥有易用性高,部署简单等优势。相比之下我们最终决定采用基于 Flink 的架构方案。

二、用户画像业务架构

用户画像系统目前为集团线上业务提供用户实时标签数据服务。为此我们的服务需要打通多种数据源,对海量的数字信息进行实时不间断的数据清洗、聚类、分析,从而将它们抽象成标签,并最终为应用方提供高质量的标签服务。在此背景下,我们设计用户画像系统的整体架构如下图所示:

整体架构分为五层:

  1. 接入层:接入原始数据并对其进行处理,如 Kafka、Hive、文件等。

  2. 计算层:选用 Flink 作为实时计算框架,对实时数据进行清洗,关联等操作。

  3. 存储层:对清洗完成的数据进行数据存储,我们对此进行了实时用户画像的模型分层与构建,将不同应用场景的数据分别存储在如 Phoenix,HBase,HDFS,Kafka 等。

  4. 服务层:对外提供统一的数据查询服务,支持从底层明细数据到聚合层数据的多维计算服务。

  5. 应用层:以统一查询服务对各个业务线数据场景进行支撑。目前业务主要包含用户兴趣分、用户质量分、用户的事实信息等数据。

三、用户画像数据处理流程

在整体架构设计方案设计完成之后,我们针对数据也设计了详尽的处理方案。在数据处理阶段,鉴于 Kafka 高吞吐量、高稳定性的特点,我们的用户画像系统统一采用 Kafka 作为分布式发布订阅消息系统。数据清洗阶段利用 Flink 来实现用户唯一性识别、行为数据的清洗等,去除冗余数据。这一过程支持交互计算和多种复杂算法,并支持数据实时 / 离线计算。目前我们数据处理流程迭代了两版,具体方案如下:

1.0 版数据处理流程

  • 数据接入、计算、存储三层处理流程

整体数据来源包含两种:

  1. 历史数据:从外部数据源接入的海量历史业务数据。接入后经过 ETL 处理,进入用户画像底层数据表。

  2. 实时数据:从外部数据源接入的实时业务数据,如用户行为埋点数据,风控数据等。

根据不同业务的指标需求我们直接从集团数据仓库抽取数据并落入 Kafka,或者直接从业务端以 CDC(Capture Data Change)的方式写入 Kafka。在计算层,数据被导入到 Flink 中,通过 DataStream 生成 ID-Mapping、用户标签碎片等数据,然后将生成数据存入 JanusGraph(JanusGraph 是以 HBase 作为后端存储的图数据库介质)与 Kafka,并由 Flink 消费落入 Kafka 的用户标签碎片数据,进行聚合生成最新的用户标签碎片(用户标签碎片是由用户画像系统获取来自多种渠道的碎片化数据块处理后生成的)。

  • 数据服务层处理流程

服务层将存储层存储的用户标签碎片数据,通过 JanusGraph Spark On Yarn 模式,执行 TinkerPop OLAP 计算生成全量用户 Yids 列表文件。Yid 是用户画像系统中定义的集团级用户 ID 标识。结合 Yids 列表文件,在 Flink 中批量读取 HBase 聚合成完整用户画像数据,生成 HDFS 文件,再通过 Flink 批量操作新生成的数据生成用户评分预测标签,将用户评分预测标签落入 Phoenix,之后数据便可通过统一数据服务接口进行获取。下图完整地展示了这一流程。

  • ID-Mapping 数据结构

为了实现用户标签的整合,用户 ID 之间的强打通,我们将用户 ID 标识看成图的顶点、ID pair 关系看作图的边,比如已经识别浏览器 Cookie 的用户使用手机号登陆了公司网站就形成了<cookie,mobile>对应关系。这样所有用户 ID 标识就构成了一张大图,其中每个小的连通子图 / 连通分支就是一个用户的全部标识 ID 信息。

ID-Mapping 数据由图结构模型构建,图节点包含 UserKey、Device、IdCard、Phone 等类型,分别表示用户的业务 ID、设备 ID、身份证以及电话等信息。节点之间边的生成规则是通过解析数据流中包含的节点信息,以一定的优先级顺序进行节点之间的连接,从而生成节点之间的边。比如,识别了用户手机系统的 Android_ID,之后用户使用邮箱登陆了公司 App,在系统中找到了业务线 UID 就形成了<Android_ID,mail>和<mail,UID>关系的 ID pair,然后系统根据节点类型进行优先级排序,生成 Android_ID、mail、UID 的关系图。数据图结构模型如下图所示:

Gephi

  • 1.0 版本数据处理流程性能瓶颈

1.0 版本数据处理流程在系统初期较好地满足了我们的日常需求,但随着数据量的增长,该方案遇到了一些性能瓶颈:

  1. 首先,这版的数据处理使用了自研的 Java 程序来实现。随着数据量上涨,自研 JAVA 程序由于数据量暴增导致 JVM 内存大小不可控,同时它的维护成本很高,因此我们决定在新版本中将处理逻辑全部迁移至 Flink 中。

  2. 其次,在生成用户标签过程中,ID-Mapping 出现很多大的连通子图(如下图所示)。这通常是因为用户的行为数据比较随机离散,导致部分节点间连接混乱。这不仅增加了数据的维护难度,也导致部分数据被“污染”。另外这类异常大的子图会严重降低 JanusGraph 与 HBase 的查询性能。

    Gephi

  3. 最后,该版方案中数据经 Protocol Buffer(PB)序列化之后存入 HBase,这会导致合并 / 更新用户画像标签碎片的次数过多,使得一个标签需要读取多次 JanusGraph 与 HBase,这无疑会加重 HBase 读取压力。此外,由于数据经过了 PB 序列化,使得其原始存储格式不可读,增加了排查问题的难度。

鉴于这些问题,我们提出了 2.0 版本的解决方案。在 2.0 版本中,我们通过利用 HBase 列式存储、修改图数据结构等优化方案尝试解决以上三个问题。

2.0 版数据处理流程

  • 版本流程优化点

如下图所示,2.0 版本数据处理流程大部分承袭了 1.0 版本。新版本数据处理流程在以下几个方面做了优化:

2.0 版本数据处理流程

  1. 历史数据的离线补录方式由 JAVA 服务变更为使用 Flink 实现。

  2. 优化用户画像图数据结构模型,主要是对边的连接方式进行了修改。之前我们会判断节点的类型并根据预设的优先级顺序将多个节点进行连接,新方案则采用以 UserKey 为中心的连接方式。做此修改后,之前的大的连通子图(图 6)优化为下面的小的连通子图(图 8),同时解决了数据污染问题,保证了数据准确性。另外,1.0 版本中一条数据需要平均读取十多次 HBase 的情况也得到极大缓解。采用新方案之后平均一条数据只需读取三次 HBase,从而降低 HBase 六七倍的读取压力(此处优化是数据计算层优化)。

    Gephi

  3. 旧版本是用 Protocol Buffer 作为用户画像数据的存储对象,生成用户画像数据后作为一个列整体存入 HBase。新版本使用 Map 存储用户画像标签数据,Map 的每对 KV 都是单独的标签,KV 在存入 HBase 后也是单独的列。新版本存储模式利用 HBase 做列的扩展与合并,直接生成完整用户画像数据,去掉 Flink 合并 / 更新用户画像标签过程,优化数据加工流程。使用此方案后,存入 HBase 的标签数据具备了即席查询功能。数据具备即席查询是指在 HBase 中可用特定条件直接查看指定标签数据详情的功能,它是数据治理可以实现校验数据质量、数据生命周期、数据安全等功能的基础条件。

  4. 在数据服务层,我们利用 Flink 批量读取 HBase 的 Hive 外部表生成用户质量分等数据,之后将其存入 Phoenix。相比于旧方案中 Spark 全量读 HBase 导致其读压力过大,从而会出现集群节点宕机的问题,新方案能够有效地降低 HBase 的读取压力。经过我们线上验证,新方案对 HBase 的读负载下降了数十倍(此处优化与 2 优化不同,属于服务层优化)。

四、问题

目前,线上部署的用户画像系统中的数据绝大部分是来自于 Kafka 的实时数据。随着数据量越来越多,系统的压力也越来越大,以至于出现了 Flink 背压与 Checkpoint 超时等问题,导致 Flink 提交 Kafka 位移失败,从而影响了数据一致性。这些线上出现的问题让我们开始关注 Flink 的可靠性、稳定性以及性能。针对这些问题,我们进行了详细的分析并结合自身的业务特点,探索并实践出了一些相应的解决方案。

CheckPointing 流程分析与性能优化方案

  • CheckPointing 流程分析

下图展示了 Flink 中 checkpointing 执行流程图:

Flink 中 checkpointing 执行流程

  1. Coordinator 向所有 Source 节点发出 Barrier。

  2. Task 从输入中收到所有 Barrier 后,将自己的状态写入持久化存储中,并向自己的下游继续传递 Barrier。

  3. 当 Task 完成状态持久化之后将存储后的状态地址通知到 Coordinator。

  4. 当 Coordinator 汇总所有 Task 的状态,并将这些数据的存放路径写入持久化存储中,完成 CheckPointing。

  • 性能优化方案

通过以上流程分析,我们通过三种方式来提高 Checkpointing 性能。这些方案分别是:

  1. 选择合适的 Checkpoint 存储方式

  2. 合理增加算子(Task)并行度

  3. 缩短算子链(Operator Chains)长度

  • 选择合适的 Checkpoint 存储方式

CheckPoint 存储方式有 MemoryStateBackend、FsStateBackend 和 RocksDBStateBackend。由官方文档可知,不同 StateBackend 之间的性能以及安全性是有很大差异的。通常情况下,MemoryStateBackend 适合应用于测试环境,线上环境则最好选择 RocksDBStateBackend。

这有两个原因:首先,RocksDBStateBackend 是外部存储,其他两种 Checkpoint 存储方式都是 JVM 堆存储。受限于 JVM 堆内存的大小,Checkpoint 状态大小以及安全性可能会受到一定的制约;其次,RocksDBStateBackend 支持增量检查点。增量检查点机制(Incremental Checkpoints)仅仅记录对先前完成的检查点的更改,而不是生成完整的状态。与完整检查点相比,增量检查点可以显著缩短 checkpointing 时间,但代价是需要更长的恢复时间。

  • 合理增加算子(Task)并行度

Checkpointing 需要对每个 Task 进行数据状态采集。单个 Task 状态数据越多则 Checkpointing 越慢。所以我们可以通过增加 Task 并行度,减少单个 Task 状态数据的数量来达到缩短 CheckPointing 时间的效果。

  • 缩短算子链(Operator Chains)长度

Flink 算子链(Operator Chains)越长,Task 也会越多,相应的状态数据也就更多,Checkpointing 也会越慢。通过缩短算子链长度,可以减少 Task 数量,从而减少系统中的状态数据总量,间接的达到优化 Checkpointing 的目的。下面展示了 Flink 算子链的合并规则:

  1. 上下游的并行度一致

  2. 下游节点的入度为 1

  3. 上下游节点都在同一个 Slot Group 中

  4. 下游节点的 Chain 策略为 ALWAYS

  5. 上游节点的 Chain 策略为 ALWAYS 或 HEAD

  6. 两个节点间数据分区方式是 Forward

  7. 用户没有禁用 Chain

基于以上这些规则,我们在代码层面上合并了相关度较大的一些 Task,使得平均的操作算子链长度至少缩短了 60%~70%。

Flink 背压产生过程分析及解决方案

  • 背压产生过程分析

在 Flink 运行过程中,每一个操作算子都会消费一个中间 / 过渡状态的流,并对它们进行转换,然后生产一个新的流。这种机制可以类比为:Flink 使用阻塞队列作为有界的缓冲区。跟 Java 里阻塞队列一样,一旦队列达到容量上限,处理速度较慢的消费者会阻塞生产者向队列发送新的消息或事件。下图展示了 Flink 中两个操作算子之间的数据传输以及如何感知到背压的:

首先,Source 中的事件进入 Flink 并被操作算子 1 处理且被序列化到 Buffer 中,然后操作算子 2 从这个 Buffer 中读出该事件。当操作算子 2 处理能力不足的时候,操作算子 1 中的数据便无法放入 Buffer,从而形成背压。背压出现的原因可能有以下两点:1、下游算子处理能力不足;2、数据发生了倾斜。

  • 背压解决方案

实践中我们通过以下方式解决背压问题。首先,缩短算子链会合理的合并算子,节省出资源。其次缩短算子链也会减少 Task(线程)之间的切换、消息的序列化 / 反序列化以及数据在缓冲区的交换次数,进而提高系统的整体吞吐量。最后,根据数据特性将不需要或者暂不需要的数据进行过滤,然后根据业务需求将数据分别处理,比如有些数据源需要实时的处理,有些数据是可以延迟的,最后通过使用 keyBy 关键字,控制 Flink 时间窗口大小,在上游算子处理逻辑中尽量合并更多数据来达到降低下游算子的处理压力。

优化结果

经过以上优化,在每天亿级数据量下,用户画像可以做到实时信息实时处理并无持续背压,Checkpointing 平均时长稳定在 1 秒以内。

五、未来工作的思考和展望

端到端的实时流处理

目前用户画像部分数据都是从 Hive 数据仓库拿到的,数据仓库本身是 T+1 模式,数据延时性较大,所以为了提高数据实时性,端到端的实时流处理很有必要。

端到端是指一端采集原始数据,另一端以报表 / 标签 / 接口的方式对这些对数进行呈现与应用,连接两端的是中间实时流。在后续的工作中,我们计划将现有的非实时数据源全部切换到实时数据源,统一经过 Kafka 和 Flink 处理后再导入到 Phoenix/JanusGraph/HBase。强制所有数据源数据进入 Kafka 的一个好处在于它能够提高整体流程的稳定性与可用性:首先 Kafka 作为下游系统的缓冲,可以避免下游系统的异常影响实时流的计算,起到“削峰填谷”的作用;其次,Flink 自 1.4 版本开始正式支持与 Kafka 的端到端精确一次处理语义,在一致性方面上更有保证。

作者介绍:

杨毅:友信金服计算平台部 JAVA 工程师

穆超峰:友信金服计算平台部数据开发高级工程师

贺小兵:友信金服计算平台部数据开发工程师

胡夕:友信金服计算平台部技术总监


关注 Ververica,获取更多 Flink 技术干货

你也「在看」吗?????

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
用户画像,作为一种勾画目标用户、联系用户诉求与设计方向的有效工具,用户画像在各领域得到了广泛的应用。用户画像最初是在电商领域得到应用的,在大数据时代背景下,用户信息充斥在网络中,将用户的每个具体信息抽象成标签,利用这些标签将用户形象具体化,从而为用户提供有针对性的服务。还记得年底收到的支付宝年度消费账单吗?帮助客户回顾一年的消费细节,包括消费能力、消费去向、信用额度等等,再根据每位客户的消费习惯,量身定制商品推荐列表……这一活动,将数据这个量化的词以形象生动的表现手法推到了大众面前。这就是用户画像在电商领域的一个应用,随着我国电子商务的高速发展,越来越多的人注意到数据信息对于电商市场的推动作用。基于数据分析的精准营销方式,可以最大限度的挖掘并留住潜在客户,数据统计与分析为电商市场带来的突破不可估量。在大数据时代,一切皆可“量化”,看似普通的小小数字背后,蕴藏着无限商机,也正在被越来越多的企业所洞悉。如何从大数据中挖掘商机?建立用户画像和精准化分析是关键。什么是用户画像呢?用户画像是根据市场研究和数据,创建的理想中客户虚构的表示。创建用户画像,这将有助于理解现实生活中的目标受众。企业创建的人物角色画像,具体到针对他们的目标和需求,并解决他们的问题,同时,这将帮助企业更加直观的转化客户。用户画像最重要的一个步骤就是对用户标签化,我们要明确要分析用户的各种维度,才能确定如何对用户进行画像。用户画像建立步骤首先,基础数据收集,电商领域大致分为行为数据、内容偏好数据、交易数据,如浏览量、访问时长、家具偏好、回头率等等。而金融领域又有贷款信息,信用卡,各种征信信息等等。然后,当我们对用户画像所需要的基础数据收集完毕后,需要对这些资料进行分析和加工,提炼关键要素,构建可视化模型。对收集到的数据进行行为建模,抽象出用户的标签。电商领域可能是把用户的基本属性、购买能力、行为特征、兴趣爱好、心理特征、社交网络大致的标签化,而金融风控领域则是更关注用户的基本信息,风险信息,财务信息等等。随后,要利用大数据的整体架构对标签化的过程进行开发实现,对数据进行加工,将标签管理化。同时将标签计算的结果进行计算。这个过程中需要依靠Hive,Hbase等大数据技术,为了提高数据的实时性,还要用到Flink,Kafka等实时计算技术。最后,也是最关键的一步,要将我们的计算结果,数据,接口等等,形成服务。比如,图表展示,可视化展示。基于Flink+Alink构建全端亿实时用户画像系统课程,将带领大家一步一步实现一个强大的实时用户画像系统,该系统以热门的互联网电商实际业务应用场景为案例讲解,具体包含:标签管理(支持动态标签扩展,动态标签指标)、用户预测、用户群体画像、用户行为画像、用户中心、几大内容。本课程采用全新的大数据技术栈:Flink+Alink,让你体验到全新技术栈的强大,感受时代变化的气息,通过学习完本课程可以节省你摸索的时间,节省企业成本,提高企业开发效率。本课程包含的技术: 开发工具为:IDEA、WebStorm Flink1.13.0Alink1.5.0 ClickHouseDolphinSchedulerHadoopHbaseKafkaZookeeper SpringBoot2.0.8.RELEASE SpringCloud Finchley.SR2BinlogCanal MySQL MybatisVue.js、Nodejs、ElementUI 课程亮点: 1.与企业接轨、真实工业界产品2.标签化管理模块功能,支持动态标签扩展3.动态标签指标分析和维护4.Alink算法技术框架 5.大数据热门技术Flink新版本 6.主流微服务后端系统 7.数据库实时同步解决方案 8.涵盖主流前端技术VUE+NodeJS+ElementUI 9.集成SpringCloud实现统一整合方案 10.互联网大数据企业热门技术栈 11.支持海量数据的实时画像 12.支持全端实时画像 13.全程代码实操,提供全部代码和资料 14.提供答疑和提供企业技术方案咨询 
用户画像作为大数据的根基,它抽象出一个用户的信息全貌,为进一步精准、快速地分析用户行为习惯、消费习惯等重要信息,提供了足够的数据基础,奠定了大数据时代的基石。 用户画像,即用户信息标签化,就是企业通过收集与分析消费者社会属性、生活习惯、消费行为等主要信息的数据之后,抽象出一个用户的商业全貌作是企业应用大数据技术的基本方式。用户画像为企业提供了足够的信息基础,能够帮助企业快速找到精准用户群体以及用户需求等更为广泛的反馈信息。 用户画像系统能很好地帮助企业分析用户的行为与消费习惯,可以预测商品的发展的趋势,提高产品质量,同时提高用户满意度。构建一个用户画像,包括数据源端数据收集、数据预处理、行为建模、构建用户画像。有些标签是可以直接获取到的,有些标签需要通过数据挖掘分析到!本套课程会带着你一步一步的实现用户画像案例,掌握了本套课程内容,可以让你感受到Flink+ClickHouse技术架构的强大和大数据应用的广泛性。 在这个数据爆发的时代,像大型电商的数据量达到百亿级别,我们往往无法对海量的明细数据做进一步层次的预聚合,大量的业务数据都是好几亿数据关联,并且我们需要聚合结果能在秒级返回。 包括我们的画像数据,也是有这方便的需求,那怎么才能达到秒级返回呢?ClickHouse正好满足我们的需求,它是非常的强大的。 本课程采用Flink+ClickHouse技术架构实现我们的画像系统,通过学习完本课程可以节省你摸索的时间,节省企业成本,提高企业开发效率。希望本课程对一些企业开发人员和对新技术栈有兴趣的伙伴有所帮助,如对我录制的教程内容有建议请及时交流。项目中采用到的算法包含Logistic Regression、Kmeans、TF-IDF等,Flink暂时支持的算法比较少,对于以上算法,本课程将带大家用Flink实现,并且结合真实场景,学完即用。系统包含所有终端的数据(移动端、PC端、小程序端),支持亿数据量的分析和查询,并且是实时和近实时的对用户进行画像计算。本课程包含的画像指标包含:概况趋势,基础属性,行为特征,兴趣爱好,风险特征,消费特征,营销敏感度,用户标签信息,用户群里,商品关键字等几大指标模块,每个指标都会带大家实现。课程所涵盖的知识点包括:开发工具为:IDEA FlinkClickhouseHadoopHbaseKafkaCanalbinlogSpringBootSpringCloudHDFSVue.jsNode.jsElemntUIEcharts等等 课程亮点: 1.企业级实战、真实工业界产品 2.ClickHouse高性能列式存储数据库 3.提供原始志数据进行效果检测 4.Flink join企业级实战演练 5.第四代计算引擎Flink+ClickHouse技术架构6.微服务架构技术SpringBoot+SpringCloud技术架构7.算法处理包含Logistic Regression、Kmeans、TF-IDF等8.数据库实时同步落地方案实操9.统计终端的数据(移动端、PC端、小程序端) 10.支撑亿级海量数据的用户画像平台11.实时和近实时的对用户进行画像计算12.后端+大数据技术栈+前端可视化13.提供技术落地指导支持 14.课程凝聚讲师多年实战经验,经验直接复制15.掌握全部内容能独立进行大数据用户平台的设计和实操企业一线架构师讲授,代码在老师的指导下企业可以复用,提供企业解决方案。  版权归作者所有,盗版将进行法律维权。 

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值