现代社会每天都有大量信息产生,抖音、小红书等自媒体的普及,不断丰富着人们表达看法、传播诉求、分享信息的渠道和形式。如何完成多源异构数据的收集和处理,挖掘海量信息中的价值,洞察事件背后的观点和情绪,是做好政府和企业舆情监测工作不可忽视的问题。
百分点舆情洞察系统(Mediaforce)是一款面向政企客户的舆情监测 SaaS 产品,自 2014 年上线至今,已累计服务客户近万家,积累了逾 20 PB 的全网数据,通过构建丰富的上层应用,为客户提供精准、实时、全面、多维度的洞察服务。
本文从底层数据治理、上层应用架构,以及数据个性化和智能化角度,分享了大数据平台架构、AI 平台架构和微服务架构在舆情产品上的实践。
伴随着互联网内容形态的蓬勃发展,Mediaforce 平台数据量增长迅速,在产品创新和迭代过程中,自身平台架构也在不断的演进。
互联网舆情本质上是对互联网公开信息的采集、分析、研判,并产生业务价值,是一个价值数据挖掘的过程,我们覆盖了 90%以上的网络公开数据,包含但不限于以下信源:
百分点科技通过对以上数据进行存储、挖掘、可视化分析等一系列处理,最终为用户呈现多终端触达、一站式的舆情监测和价值分析平台。
到目前为止,大体分为如下三个平台架构,对应职责如下:
百分点舆情洞察系统最初是通过自主构建 IDC 来支撑,IaaS 层由单独的运维团队来进行维护。
大数据平台(IaaS 层除外)分层如下:
舆情的数据应用场景不同于海量日志、海量商品检索等的侧重于简单标签聚合,舆情应用完全基于自然语言全文检索,同时结合内存复杂聚合计算。为了保证检索准确率,往往会配置复杂的关键词和距离限定,因此对于检索引擎的内存优化策略要求很高。可以说,数据存储和检索架构的升级,是舆情业务的核心之一。在百分点科技大数据平台架构演进历程中,大致可以分为三个阶段:业务共享数据仓库阶段、业务自建数据集市阶段、湖仓一体阶段。
在业务规模初期,大部分精力集中于业务系统的迭代和开发,采用共享数据仓库的解决方案。流程如下:
可以看到,随着客户规模和数据量的增大,以及业务复杂度的提升,仅仅依靠共享的数据仓库,已经无法满足需求。产生的主要问题如下:
随着客户量及数据量的增多,百分点科技对数据仓库进行了冷热数据隔离,并通过自主构建数据集市来满足业务的快速响应。
下面将从数据仓库层、数据集市层进行介绍。
调整后,业务查询响应延迟基本可控,并且具有良好的隔离性。但同时也面临着下述挑战:
随着舆情在客户群中深入使用,在保证查询低延迟的情况下,需要能支撑 3~5 年的长跨度数据检索。同时为应对 SaaS 产品矩阵的扩充,需要易用、可扩展的数据平台支撑。本次架构优化的核心目标为:
对客户和线上日志进分析,得到如下结果:
(1)客户数据量级
对线上客户数据量进行采样,统计一年数据量,千万级数据量的客户群体占 1%。所以我们将目标定义为千万级数据量下的,复杂聚合查询分析响应时长在 3~5 秒内。
(2)查询类型统计
借助数据集市,将大量的依据全文检索聚合统计分析场景转化为 OLAP 场景。对线上日志进行分析,二次全文检索查询流量占比不到 20%。
依据上述结论,将数据集市层要解决的问题进行汇总如下:
通常来说,面对海量数据的低成本存储+高效检索的需求,业界通常使用 HBase+ Elasticsearch 的组合方案,但该方案除了开发维护复杂、数据一致性弱等常见问题,通常还要由 Elasticsearch 来承担 OLAP,以及全文检索的功能职责。对于重 OLAP 查询场景,使用 MPP 查询引擎往往能获得较低的查询延迟,如:Clickhouse、DorisDB 等。在考虑支持实时更新等多种条件下,我们将方案集中于 Elasticsearch、TiDB+ Elasticsearch、DorisDB+Elasticsearch 三种技术进行尝试:
Elasticsearch
ES 是一款面向 OLAP 场景的全文检索分析引擎,下面是在 Elasticsearch 7.8.0 环境中的测试:
(1)集群环境
(2)测试索引
使用单 shard、无副本、百万级别索引 32 个,十万级别索引 18 个。
(3)测试结论
将客户端并发数等价于索引数目,持续 20 轮进行压测。对业务进行抽象,选取如下测试用例:
{"size":0,"query":{"bool":{"filter":[{"bool":{"adjust_pure_negative":true,"boost":1}},{"range":{"pubTime":{"from":1551430186000,"to":1615366186000,"include_lower":true,"include_upper":true,"boost":1}}},{"bool":{"adjust_pure_negative":true,"boost":1}}],"must_not":[{"term":{"mask":{"value":true,"boost":1}}}],"adjust_pure_negative":true,"boost":1}},"track_total_hits":2147483647,"aggregations":{"termsAgg":{"terms":{"field":"titleSimHash","size":2000,"min_doc_count":1,"shard_min_doc_count":0,"show_term_doc_count_error":false,"order":[{"_count":"desc"},{"_key":"asc"}]}},"carAgg":{"cardinality":{"field":"titleSimHash","precision_threshold":10000}}}}
复制代码
测试中发现集群相对稳定,相对于单线程,多线程下的平均延迟高于 1s 也较少。在 Elasticsearch6.0.0 上进行相同的测试,其中平均延迟延迟高于 1s 占 80%。
TiDB+Elasticsearch
TiDB 4.0 版本已经是一款 HTAP 混合型分析引擎,将测试数据集限定为千万级,在测试中设置:tidb_hashagg_final_concurrency=20 和 tidb_hashagg_partial_concurrency = 20,平均耗时稳定在 8s~9s。由于聚合后的基数较大,压力都集中在 TiDB 侧,未能达到去 ES 的 OLAP 的场景。更多信息请参照 AskTUG:千万级数据 group by 性能调优[1]。随着 TiDB 5.0 发布,TiFlash 已经不仅仅是一个列式存储引擎这么简单。TiFlash 引入了 MPP 模式,使得整个 TiFlash 从单纯的存储节点升级成为一个全功能的分析引擎。
[1] https://asktug.com/t/topic/68474/1
DorisDB+Elasticsearch
Mpp 引擎列式存储设计对于数据更新是极其不友好的。借助 DorisDB 的更新模型引擎,内部通过版本号,可以支持大规模的数据实时更新,当然在查询时需要完成多版合并。同时 Doris-On-ES 将 Doris 的分布式查询规划能力和 ES(Elasticsearch)的全文检索能力相结合,提供更完善的 OLAP 分析场景解决方案。目前 Doris On ES 不支持聚合操作如 sum,avg, min/max 等下推,计算方式是批量流式的从 ES 获取所有满足条件的文档,然后在 Doris 中进行计算。在测试场场景下,性能是可以满足 OLAP 场景。实践中发现,由于自建 IDC 机器较为老旧,无法支持 SIMD 指令,致使无法安装 DorisDB。
在目前的业务场景下,百分点科技最终选择单一的 Elasticsearch 来作为数据集市层的存储和计算引擎。后续如果数据集市有更大的数据量以及业务低延迟的 OLAP 查询场景,还是会考虑结合 MPP 查询引擎来满足业务的扩展。
在之前的很长一段时间内,Elasticsearch Cluster 承担了大量数仓的职能。通过多集群进行冷热数据隔离。在本次调整中,百分点科技借助索引生命周期管理(ILM)和 Hot\Warm 架构来实现在一个集群中进行数据的管理。在实践中,我们将 Elasticsearch 率先升级到 7.12.0,以满足向量化检索等更多场景。
之前会将采集的数据存储至 kafka,作为数据传输中转。但 kafka 一般存储的时间周期较短,且功能单一。因此需要一套统一的存储计算平台,需要满足如下要求:
在最新的架构中,百分点科技将数据先入湖,构建 ODS,辅助构建上层 DW 和 DM。关于 Data Lake,最终选取 Hudi 作为源数据层存储计算方案,并做了以下尝试:
Iceberg
Iceberg 工程架构具有极高的抽象,可以与各种引擎无缝融合。字符串模糊匹配是一种重要场景,测试中遇到以下问题:如果某个字段存储为空字符串,在匹配中就会出现异常:java.lang.IllegalArgumentException: Truncate length should be positive[2]。另外就是查询对 Stream 相关支持还处于开发阶段,对于增量数据处理只能以 Java Api 方式实现。
[2] https://github.com/apache/iceberg/issues/2065
Hudi
Hudi 显得尤为成熟,但是与 Spark 引擎绑定的较为紧密。在 Hudi 0.6 中对底层代码进行抽象,以适配 Flink 等主流计算引擎。同时其完善的增量查询机制非常适合实时数据集市的构建。另外 Hudi Table 并不需要提前创建,可以在写入数据时自动创建,这也是区别于 Iceberg 的一个点。
Hudi 的引入,为底层数据平台带来了 ACID 能力,并且提供较好实时性。特别是为数据集市实时数据构建带来便捷,提供可扩展性。目前的简易数据架构如下:
在海量的文本数据上,利用丰富的数据挖掘、深度学习、人工智能算法,训练在线和离线语义模型,一站式挖掘满足客户需要的舆情分析需求。在这一历程中,大致分为两个阶段:
在上述演进中,最主要的变化在于各行各业都已经积累了较多的高价值数据,并且越来越需要定制满足自己场景的个性化模型。下面主要从这两个阶段分别展开对应的工作。
在舆情分析场景中,依赖于分词、词性、新词发现、命名实体、主体分类、文本聚类、关键词提取、自动摘要、文本去重、情感分析、内容转换(简繁、拼音)、自动纠错、自动补全、文档解析等各种功能。产品架构和数据流程如下:
随着深度迁移学习成熟和行业应用,带来最大的益处在于可以依据少量的训练数据便可以得到较好的训练结果。从下述对比中:可以看到 Bert 在少训练集下就能达到较好的结果,也为后续的定制化模型奠定了基础。
舆情系统本身可以看作为信息工程架构,客户可以容忍数据精准度,但是不允许相同的数据持续犯错。可学习、可持续、可定制已经变的尤为重要。这也是深度学习建模平台的由来。
下面是整体的业务架构和流程分析,具体技术细节可参照:NLP模型开发平台在舆情分析中的设计和实践。
下面对互联网架构演进之路进行总结如下,其中带颜色标记的为实践中的产物。
舆情业务应用系统从最核心几个业务功能,目前已经扩展至几十个业务模块。同时借助成熟的底层模块,快速沉淀出金融舆情、行业版等众多项目。大致经过以下三个阶段。
在业务初期,使用 SpringBoot 作为单体应用开发程序,可极大加快业务推进速度,简易架构如下:
单体架构的优点在于其易开发、易测试、易部署、易扩展,但是业务耦合严重,也为业务扩展、服务治理带来了新的挑战。例如:登录服务和查询服务在一个单体应用中,因为查询服务是一个耗内存的操作,高峰时会引起 FullGC,致使登录功能异常。
微服务可以定义如下:
随着业务扩展,业务耦合严重,开发效率低下、排查问题困难等。秉承业务维度垂直拆分和功能维度水平拆分的原则,同时尽量避免分布式事务等复杂度问题。拆分后架构图如下:
微服务拆分功效:
云原生包含了一组应用的模式,用于帮助企业快速,持续,可靠,规模化的交付业务软件。其特点如下:
借助百分点科技内部云平台,将微服务结构容器化封装,极大的降低了部署、运维的成本,也为服务的稳定性增加了保证机制。下面主要介绍一下云平台的基础概念和应用成效。
平台基础概念:
平台资源对象层级关系:
目前平台代码构建支持三种模式:
平台 Scale 功能包含水平伸缩和垂直伸缩,以下是水平伸缩的例子:
平台提供容器实例监控,可以按照时间区间图形化展示容器的 CPU、内存和网络的使用情况:
企业 SaaS 一般是围绕获客、转化、留存这三个阶段展开,平台的易用性、数据的准确性和实时性等都是客户留存的核心要素。在多年的实践中,大数据架构以数据湖为 ODS 层,来保证对原始数据高效、灵活的处理,同时为其他业务线开放数据处理能力。AI 平台架构提供一套端到端的闭环流水线,打造个性化、智能化的业务。微服务架构通过容器化,极大的降低维护成本,同时保证线上稳定性。随着 SaaS 产品矩阵的扩充,百分点科技在金融舆情、企业品牌监测等多个方向进行积极尝试,底层平台架构在业务的快速落地中起到了重要作用。
本文转载自:百分点大数据团队(ID:baifendian_com)
领取专属 10元无门槛券
私享最新 技术干货