百亿级全网舆情分析系统存储设计
百亿级全网舆情分析系统存储设计
前言
在时下互联网信息的浪潮下,信息的传播速度远超我们的想象。 微博里一条大V的帖子,朋友圈的一个状态更新,热门论坛的一条新闻, 购物平台的购物评价,可能会产生数以万计的转发,关注,点赞。 如果是一些非理性负面的评论会激发人们的负面感, 甚至影响到消费者对企业品牌的认同,如果不能及时的采取正确的应对措施, 会造成难以估计的损失。所以我们需要一个高效的全网舆情分析系统, 帮助我们实时的观测舆情。
这个全网舆情分析系统,可以实现百亿条网页数据的存储、 实时新增网页的抓取和存储并能对新增网页做实时的元数据提取。 有了提取结果,我们还需要进行进一步的挖掘分析,这些分析包括但不限于
- 舆情的影响力诊断,从传播量级和扩散趋势来做预测,确定是否最终形成舆情。
- 传播路径分析,分析舆情传播的关键路径。
- 用户画像,对舆情的参与者提供共性特征勾勒,如性别,年龄,地域和感兴趣话题。
- 情感分析,分析新闻或者评价是正面还是负面。情感分类后进行统计聚合。
- 预警设置,我们支持舆情讨论量阈值设置,达到阈值后通知推送业务方,避免错过舆情的黄金参与时间。
这些挖掘后的舆情结果会被推送至需求方,同时也提供接口给各业务方搜索,查询使用。 下面我们就展开讨论系统设计中可能会遇到的问题, 我们会重点关注系统设计中存储相关的话题, 针对这些问题找到一个最优化的方案。
系统设计
对于一个舆情系统,首先需要一个爬虫引擎,去采集各大主流门户,购物网站, 社区论坛原始页面内容,微博,朋友圈的各类消息信息。 采集到的海量网页,消息数据(百亿级别)需要实时存储下来。 再根据网站url获取网页之前还需要判断一下是否是之前爬过的页面,避免不必要的重复爬取。 采集网页后我们需要对网页进行萃取,去除不必要的标签, 提取标题,摘要,正文内容,评论等。萃取后的内容进入存储系统方便后续查询, 同时还需要把新增的抽取结果推送至计算平台进行统计分析, 出报表,或者后续提供舆情检索等功能。 计算的内容根据算法不同可能需要新增数据,也可能需要全量数据。 而舆情本身的时效敏感性决定了我们系统一定要能高效处理这些新增内容, 最好是秒级别延时后就可以检索到新热搜。
我们可以总结下整个数据流如下:
根据上图我们不难发现,设计一个全网舆情的存储分析平台, 我们需要处理好抓取,存储,分析,搜索和展示。
具体我们需要解决如下问题:
- 如何高效存储百亿级别的网页原始信息,为了提高舆情分析的全面性,准确性, 我们往往希望可以尽可能多的爬取网页信息,再根据我们设置的权重聚合。 所以网页的历史全库会比较大,积累数百亿的网页信息,数据量可以达到百TB甚至数PB。 在数据量如此之大的情况下,我们还需要做到读写毫秒级别的低延时, 这使得传统数据库难以满足需求。
- 如何在爬虫爬取网页之前判断是否之前已经爬取过, 针对普通网页,舆情在意他们的时效性,可能我们对同一个网页只希望爬取一次, 那我们就可以利用网页地址做爬取前去重,减少不必要的网页资源浪费。 所以我们需要分布式存储提供基于网页的高效随机查询。
- 如何新增原始网页存储完成后进行实时的结构化提取,并存储提取结果。 这里我们原始的网页可能是包括各种html的标签,我们需要去除这些html的标签, 提取出文章的标题,作者,发布时间等。 这些内容为后续舆情情感分析提供必要的结构化数据。
- 如何高效的对接计算平台,流式新增提取后的结构化数据进行实时的计算。 这里我们需要根据网页,消息描述的内容做分类,进行情感识别,识别后的结果统计分析。 由于全量分析时效性差,加上舆情往往关注最新的新闻,评论,所以我们必须做增量分析。
- 如何提供高效的舆情搜索,用户除了订阅固定关键词的舆情以外,做一些关键词搜索。 例如希望了解竞争公司新产品的一些舆情分析。
- 如何实现新增舆情的实时推送,为了保证舆情的时效性,我们不仅需要持久化舆情分析结果, 同时也要支持推送舆情结果。推送的内容通常是我们实时分析出来的新增舆情。
系统架构
针对上面介绍这些问题, 我们下面来介绍下如何基于阿里云上的各类云产品来打造全网百亿级别的舆情分析平台, 我们会重点关注存储产品的选型和如何高效的对接各类计算,搜索平台。
爬虫引擎我们选用ECS,可以根据爬取量决定使用ECS的机器资源数, 在每天波峰的时候也可以临时扩容资源进行网页爬取。 原始网页爬取下来后,原始网页地址,网页内容写入存储系统。 同时如果想避免重复爬取,爬虫引擎抓取之前要根据url列表进行去重。 存储引擎需要支持低延时的随机访问查询,确定当前url是否已经存在, 如果存在则无需重复抓取。
为了实现网页原始内容的实时抽取,我们需要把新增页面推送至计算平台。 之前的架构往往需要做应用层的双写,即原始网页数据入库同时, 我们重复写入一份数据进入计算平台。这样的架构会需要我们维护两套写入逻辑。 同样的在结构化增量进入舆情分析平台中,也有类似的问题, 抽取后的结构化元数据也需要双写进入舆情分析平台。 舆情的分析结果也需要一份写入分布式存储,一份推送至搜索平台。 到这里我们可以发现,图中的三根红线会带来我们对三个数据源的双写要求。 这会加大代码开发工作量,也会导致系统实现,维护变的复杂。 每一个数据源的双写需要感知到下游的存在,或者使用消息服务,通过双写消息来做解耦。 传统数据库例如mysql支持订阅增量日志binlog,如果分布式存储产品在可以支撑较大访问, 存储量的同时也可以提供增量订阅就可以很好的简化我们的架构。
网页数据采集入库后,增量流入我们的计算平台做实时的元数据抽取, 这里我们可以选用函数计算,当有新增页面需要提取时触发函数计算的托管函数进行网页元数据抽取。 抽取后的结果进入存储系统持久化后,同时推送至MaxCompute进行舆情分析,例如情感分析,文本聚类等。 这里可能会产生一些舆情报表数据,用户情感数据统计等结果。 舆情结果会写入存储系统和搜索引擎,部分报表, 阈值报警会被推送给订阅方。 搜索引擎的数据提供给在线舆情检索系统使用。
在介绍完整体架构后,下面我们看下在阿里云上如何做存储选型。
存储选型
通过架构介绍我们再总结一下对存储选型的要求:
- 可以支撑海量数据存储(TB/PB级别), 高并发访问(十万TPS~千万TPS),访问延时低。
- 业务随着采集订阅的网页源调整,采集量会动态调整。 同时一天内,不同时间段爬虫爬下来的网页数也会有明显波峰波谷, 所以数据库需要可以弹性扩展,缩容。
- 自由的表属性结构,普通网页和社交类平台页面的信息我们需要关注的属性可能会有较大区别。 灵活的schema会方便我们做扩展。
- 对老数据可以选择自动过期或者分层存储。 因为舆情数据往往关注近期热点,老的数据访问频率较低。
- 需要有较好的增量通道,可以定期把新增的数据导出至计算平台。 上面的图中有三段红色虚线, 这三部分都有个共同的特点需要可以实时的把增量导至对应的计算平台做计算, 计算后的结果再写入对应的存储引擎。如果数据库引擎本身就支持增量,则可以很大程度简化架构, 减少之前需要全量读区筛选增量,或者客户端双写来实现得到增量的逻辑。
- 需要可以有较好的搜索解决方案(本身支持或者可以数据无缝对接搜索引擎)。
有了这些需求后,我们需要使用一款分布式的NoSQL数据来解决海量数据的存储,访问。 多个环节的增量数据访问的需求, 业务的峰值访问波动进一步确定弹性计费的表格存储是我们在这套架构中的最佳选择。 表格存储的架构介绍可以参考 表格存储数据模型
TableStore(表格存储)相比同类数据库一个很大的功能优势就是TableStore(表格存储)有较完善的增量接口, 即Stream增量API,Stream的介绍可以参考 表格存储Stream概述。 场景介绍可以参考 Stream应用场景介绍, 具体API使用可以参考 JAVA SDK Stream。 有了Stream接口,我们可以很方便的订阅TableStore(表格存储)的所有修改操作,也就是新增的各类数据。 同时我们基于Stream打造了很多数据通道,对接各类下游计算产品, 用户甚至不需要直接调用Stream API,使用我们的通道直接在下游订阅增量数据, 自然的接入了整个阿里云的计算生态。 针对上面架构中提到的函数计算,MaxCompute,ElasticSearch和DataV, TableStore(表格存储)都已经支持,具体使用可以参考:
- Stream和函数计算对接
- Stream和MaxCompute
- Stream和Elasticsearch
- 通过DataV展示表格存储的数据
TableStore(表格存储)在属性列上,是自由的表结构。 针对舆情分析这个场景,随着舆情分析算法的升级我们可能会新增属性字段, 同时针对普通网页和微博这类社交页面的属性也可能不尽相同。 所以自由表结构相比传统数据库可以很好的匹配我们这个需求。
在架构中,我们有三个存储库需求。分别是原始页面库, 结构化元数据库和舆情结果库。前两者一般是一个离线存储分析库, 最后一个是一个在线数据库。他们对访问性能,存储成本有着不同的需求。 表格存储有两种类型的实例类型支持存储分层,即高性能和容量型。 高性能适用于写多读多的场景也就是做为在线业务存储使用。 容量型适合写多读少的场景,也就是离线业务存储用。 他们的写入单行延时都可以控制在10毫秒内,读取高性能可以保持在毫秒级别。 TableStore(表格存储)同时支持TTL,设置表级别数据过期时间。 根据需求,舆情结果我们可以设置TTL,只提供近期数据的查询, 较老的舆情自动过期删除。
有了TableStore(表格存储)的这些功能特性,系统对存储选型的六项要求就可以得到很好的满足, 基于TableStore(表格存储)可以完美的设计和实现全网舆情存储分析系统。
后记
本文对实现海量数据舆情分析这一场景中会遇到的存储和分析问题进行了总结, 介绍了如何通过使用阿里云自研的TableStore(表格存储)在满足业务基本数据量的前提下, 通过Stream接口和计算平台的对接实现架构简化。T ableStore(表格存储)是阿里云自主研发的专业级分布式NoSQL数据库, 是基于共享存储的高性能、低成本、易扩展、全托管的半结构化数据存储平台, 舆情数据存储分析是TableStore在大数据处理领域的重要应用之一。 其他场景使用可以参考 TableStore进阶之路。
百亿级全网舆情分析系统存储设计相关推荐
- 微博舆情分析系统的设计与实现(python)
背景分析 随着互联网大趋势的到来,社会的方方面面,各行各业都在考虑利用互联网作为媒介将自己的信息更及时有效地推广出去,而其中最好的方式就是建立网络管理系统,并对其进行信息管理.由于现在网络的发达,微博 ...
- Python 基于微博舆情分析系统的设计与实现,GUI可视化界面(毕业设计,附源码,教程)
文章目录 1. 简介 2. 技术选型 3. 实现功能简介 **第4章系统总体设计** 5. 系统选型 1. 简介 微博舆情分析系统软件是一款方便,快捷,实用的信息服务查询软件.随着智能手机在全球市场的 ...
- 数据查询和业务流分开_基于大数据的舆情分析系统架构 - 架构篇
前言 互联网的飞速发展促进了很多新媒体的发展,不论是知名的大V,明星还是围观群众都可以通过手机在微博,朋友圈或者点评网站上发表状态,分享自己的所见所想,使得"人人都有了麦克风".不 ...
- 京东APP百亿级商品与车关系数据检索实践 | 京东云技术团队
导读 本文主要讲解了京东百亿级商品车型适配数据存储结构设计以及怎样实现适配接口的高性能查询.通过京东百亿级数据缓存架构设计实践案例,简单剖析了jimdb的位图(bitmap)函数和lua脚本应用在高性 ...
- java时序图工具_基于时序数据库,实现百亿级话单实时全景监控分析
背景 随着流量业务的高速发展以及已经到来的5G时代,业务支撑系统的规模不断增大.服务不断增多,业务.应用和系统运行性能指标数据持续以指数级的速度增长,每日计费话单量已突破百亿.系统监控的实时性.准确性 ...
- [NewLife.XCode]分表分库(百亿级大数据存储)
NewLife.XCode是一个有15年历史的开源数据中间件,支持netcore/net45/net40,由新生命团队(2002~2019)开发完成并维护至今,以下简称XCode. 整个系列教程会大量 ...
- Redis 大数据量(百亿级)Key存储需求及解决方案
点击下方公众号「关注」和「星标」 回复"1024"获取独家整理的学习资料! 最近我在思考实时数仓问题的时候,想到了巨量的redis的存储的问题,然后翻阅到这篇文章,与各位分享. 需 ...
- 我国老年相亲市场的现状分析:百亿级市场的难点与机遇
随着我国老龄化程度日趋严重,独居老人的数量也在增加.早在2015年,60岁及以上老年人口中空巢老人占比达到51.3%,空巢已经取代传统的与子女同住的家庭居住模式,成为中国老年人最主要的居住方式.201 ...
- 【Redis】大数据量(百亿级)Key存储需求及解决方案
原文链接:http://www.cnblogs.com/colorfulkoala/p/5783556.html 问题导读: 1. 需求背景是什么? 2. 存储何种数据? 3. 数据特点是什么? 4. ...
- Github星标90K?京东架构师一篇讲明白百亿级并发系统架构设计
学习高并发系统设计的原因 高并发到底是什么,想必各位多多少少对此都有所了解,那我在这就不多说了.真正经历过"双11"以及"618"的小伙伴应该都知道,在大促时如 ...
最新文章
- 「SAP技术」SAP MM 批次管理的物料创建DN时无存储地点就不能输入批次值?
- C#中自定义PictureBox控件
- 打开PDF文件弹出阅读未加标签文档的解决方法
- Python使用PDFMiner解析PDF
- Objectice-C之类层次结构
- unittest 多个测试文件只开一次浏览器_接口测试平台代码实现75: 多接口用例15
- c++中的 extern C
- python如何修改excel数据库_python修改excel数据库
- 软件开发如同木匠做桌子
- CVPR 2020 | 旷视新方法优化解决遮挡行人重识别
- java中io创建文件和读取文件
- 设计模式详解(链接)
- Every cloud has a silver lining
- 通达信手机版分时图指标大全_今天教大家怎么把通达信副图指标源码导入手机通达信软件上。...
- webflux excel文件上传:java.io.IOException: Unable to read entire header; 0 bytes read; expected 512 byte
- Android 自动朗读(TTS)
- android 驱动程序,安卓设备安装USB驱动程序教程
- 别说华为语音助手不智能了,这3大隐藏功能都知道吗?实用又贴心
- MCU 微控制器,在实际项目中如何选型(以 STM32为例)
- 高中数学公式总结:解析几何(非常全)
热门文章
- stc8a循迹小车程序编写实验:完成循迹功能,包括直角转弯,以及调头
- 手把手教你使用Python写贪吃蛇游戏(pygame)
- 计算机cad名词解释,CAD全部名词解释
- 攻略:简易病毒制作(Windows)
- 网易云音乐 网络错误 linux,解决ubuntu安装网易云音乐失败的方法
- ghost linux pe,winPE下安装系统ghost的详细教程
- F2FS文件系统实现分析及其在移动设备上的优化
- matlab人脸识别论文,基于matlab的人脸识别系统设计本科毕业论文(设计).doc
- 睡眠阶段分期——SVM和ELM分别与粒子群算法结合(function)
- 我的世界暮色森林java下载_我的世界暮色森林整合包