TableStore是阿里云自研的在线数据平台,提供高可靠的存储,实时和丰富的查询功能,适用于结构化、半结构化的海量数据存储以及各种查询、分析。

爬虫数据特点

在众多大数据场景中,爬虫类型的数据非常适合存储在TableStore。主要是因为爬虫类型数据的一些特征和TableStore和匹配:

数据量大

爬虫数据一般都是抓取的互联网上的某个行业或领域的数据,数据规模和这个行业的数据规模有关,比如资讯类,每时每刻都在产生大量新闻报道,这个数据规模可能在10 TB到100 TB级别,如果考虑到历史存量数据,那么规模可能会更大。这么大量的数据存储已经不适合用单机的关系型数据库了,也不适合分库分表了,而需要一款分布式NoSQL数据库,这样可以将数据按一定的路由规则分布到不同机器上,实现自动的水平扩展,非常适合存储海量数据,尤其是爬虫类。

宽行和稀疏列

爬虫的数据一般来源于多个数据源,比如资讯数据可以来自人民网、新浪或者腾讯,每个数据源的数据特征不可能完全一样,每家有每家的特殊性,这样就会出现每一行数据的属性列有差异,虽然可以归一化处理后,可以将通用的属性列统一,但是不同数据源还是会存在一定差异性。如果为每个数据源建立一张表,那么工作量就会非常大,也不适合。这时候,就需要用到宽行和稀疏列功能,既能保证列数无上限,也能保证不同行不同列,还可以不额外增加存储成本和运维成本。

查询类型多样

爬虫数据的存储后,一般有两个出口,一个是数据处理程序,数据处理程序会读取最新的爬虫数据,然后按照自定义的处理逻辑做数据加工,处理完后会新数据写入原表或新表。

数据处理完之后,数据可以提供给下游企业客户或终端用户使用了,场景的查询需求有下列几种:

  • 多种属性列组合查询。比如全网简历信息里面,通过年龄、学历、专长查询,且每个人查询的条件可能都完全不一样,需要多种属性列的自由组合查询。
  • 分词查询。不管是咨询类,还是简历类,都有大量的文本描述,这部分内容都需要支持分词后再查询。
  • 排序能力。比如资讯类数据中,查询某个新闻后,需要按时间逆序返回,越新的数据价值越大。
  • 随机读能力。如果是用来做全局数据分析或处理,那么随机读是一种必须要有的能力。
  • 轻量级统计分析。比如资讯类,想查看某个热点新闻的传播时间段和趋势,就需要统计每个时间段的此类新闻出现次数。
    这些查询能力,在传统的关系型数据库或者开源NoSQL中都无法提供。

开源解决方案

爬虫数据存储的方案已经演进了将近二十年了,千奇百怪的各种方案都有,主要的差异来源于两点:

  • 当前能获取到的存储系统能力。
  • 自身对系统可靠性、可用性的要求高低。
    我们下面以当前业界流行的开源系统为材料,打造一个爬虫数据存储的系统。

当前业内的开源存储系统有两大类,一类是开源的关系型数据库,比如MySQL等,一类是NoSQL,比如HBase等。这两类数据存储系统都不能支持分词查询,那么还需要一个全文检索的系统,当前可选的有solr和Elasticsearch。

基于上述的素材,我们就可以搭建一个存储爬虫的系统了:

  • 首先,选择存储系统,MySQL和HBase都可以,如果使用MySQL,则需要分库分表,两者架构图差不多,这里我们就选择HBase。
  • 再次,选择查询系统,可选的solr和Elasticsearch,虽然是同一类型系统,但是Elasticsearch的目前更流行,那我们也选择Elasticsearch。
    这样,架构图大致如下:

大概解释下:

  • 流程:爬虫系统将抓取的数据写入HBase离线集群,然后数据处理系统周期性或流式的处理新到的数据,将处理后的结果写入HBase在线集群。HBase在线集群存储所有属性列的值,然后将需要查询的列通过co-processor发送给消息队列,最后再将消息队列中的数据被Elasticsearch消费,生成索引。最后,用户通过索引查询到PK,然后通过proxy到HBase在线集群读取这一行完整数据,最后返回给用户。
  • 数据存储集群有两个,一个是在线集群,一个是离线集群,原因是为了避免减少离线集群对在线查询的影响,因为离线系统重吞吐,而在线系统重延迟,所以,这里会分成两个集群,目的是挺高系统可用性。
  • 消息队列的目的是削峰填谷,减少对下游系统:Elasticsearch的压力,同时当Elasticsearch写入慢或者出故障后,不至于影响上游系统,目的也是为了提高系统可用性,避免单点故障导致整个系统雪崩。
  • Proxy的目的是减轻客户端工作量,提高易用性的工具,原因是爬虫数据是系数列,这些列不可能全部都在Elasticsearch中创建索引,只有部分需要查询、分析的属性列才会在Elasticsearch中建立索引,但是查询的时候也需要未建立索引的字段,这样就需要一个系统做反查和合并,就是先查Elasticsearch获取到PK,然后通过PK到HBase在线集群查询这一行完整数据。
  • 这个系统中,需要运维6个不同开源系统,运维压力比较大。

TableStore云解决方案

最开始,我们说TableStore很适合存储爬虫数据,在介绍了开源系统的解决方案后,我们再来看一下TableStore的解决方案,以及相对于开源系统,可以为客户带来的收益。

也先看一下架构图:

大概解释下:

  • 爬虫系统抓取的数据写入TableStore的离线表,然后经过TunnelService的流式通道,数据进入数据处理系统做处理加工,再将加工后的数据写入在线表,用户直接查询在线表即可。
  • 将离线表和在线表同时放在TableStore服务中,会不会出现离线表干扰在线表的情况?这个不会的,TableStore服务内部有自动的负载均衡和隔离系统,会自动处理这些问题。
  • 所有的查询都可以直接查询在线表及其索引,提供了多字段组合查询、分词查询、排序和统计分析等功能,完全可以满足用户对查询的需求。
  • 数据处理部分一般有两种处理方式,一种是离线全量处理,这种可以使用阿里云的MaxCompute系统,MaxCompute可以直读TableStore的数据做计算,不需要额外把数据导过去。另一种是流式实时处理,TableStore提供了TunnelService系统,可以获取到实时的Table中的数据更新记录,然后将更新记录发送到函数计算、流式计算系统,或者自己的应用、flink等系统处理。
  • 这个架构中,用户只需要运维2个系统即可。

示例

我们接下来举一个简历类爬虫数据存储和查询的示例,帮忙读者快速理解。

简历一般是一个PDF文档或者doc文档,是一个文件,但是我们可以从这些文件中抽取出结构化的信息,比如姓名、电话号码、身份证、邮箱、毕业学校、学历、专业领域、项目经验、兴趣、期望薪水和工作年限等。

首先,我们设计TableStore中主表结构:

主键列 属性列 属性列 属性列 属性列 属性列 属性列 属性列 属性列 属性列
身份证 姓名 电话号码 邮箱 毕业学校 学历 专业领域 项目经验 兴趣 期望薪水 工作年限
String String String String String String String String String Long Double
61xxx5 王一 152xxx7 aa@xx.com MIT 硕士 [数据库,MySQL] 1.数据库binlog优化。 [足球] 20000 3.5

大概解释下:

  • 主键列需要一个唯一值,用来唯一确定某个人,这里我们用了身份证,有些场景获取不到身份证,那可以用手机号或其他ID。
  • 后面几个全部是属性列,包括姓名,电话号码等。期望薪水因为都是整数,所以可以选择Long类型,工作年限由于有小数,所以可以是Double类型。
  • 通过这张表,我们可以通过身份证,查询到该用户的详细信息。但是无法通过属性列查询,如果需要通过属性列查询,则需要创建多元索引。

然后,我们再创建多元索引,多元索引的结构如下:

属性列 属性列 属性列 属性列 属性列 属性列 属性列 属性列 属性列
姓名 电话号码 毕业学校 学历 专业领域 项目经验 兴趣 期望薪水 工作年限
Text:单字分词 Keyword Keyword Keyword Keyword Array Text:多层语义 Keyword Array Long Double

解释下:

  • 上面的多元索引结构中包括9列,比Table中少了2列,是因为不需要通过“邮箱”和“身份证”两个属性列查询,所以,在建立index的时候就不需要为这两列创建index了。但是如果业务中确实需要通过邮箱查询,那么多元索引创建时加上邮箱即可。
  • 姓名的类型是Text:单字分词,意思是类型是Text,分词是单子分词,这样好处就是我可以通过搜索“小刚”搜索到“王小刚”、“冯小刚”等。
  • 电话号码、毕业院校、学历都是Keyword类型(对应Table中的String),因为这些都字符串都比较短,且查询方式是直接完全匹配或者前缀查询,那么用String就可以了。
  • 专业领域和项目经验两个属性列是Keyword Array的,因为是这两个属性列中会包括多个值,查询的时候只要有一个满足就可以返回,比如某个人的专业领域是:数据库、MySQL,那么我们查询“数据库”的时候,希望这个人返回。
  • 期望薪水和工作年限是数字类型的Long和Double,这样这两个属性列就可以支持范围查找,比如查找工作年限大于2年,小于5年,且期望薪水小于2万的简历。

至此,我们就把简历库的table和index都建好了,用户就可以往Table中开始写数据,数据写入后会异步同步到Index中,这样就可以通过Index查询了。

总结

使用TableStore解决方案后,相对于开源解决方案,可以带来不少的收益:

减少运维负担

使用开源系统的架构中,需要运维6个系统,包括了3个开源系统:HBase、Kafka和Elasticsearch,为了运维这三个开源系统,需要有人对这三个系统比较熟悉,否则很难运维好。就算比较熟悉,也很难处理线上遇到的所有的问题,总会碰到无法解决的棘手问题而影响生产环境。

如果使用了TableStore云解决方案,那么就不需要运维任何开源系统,只需要运维自己开发的两个系统,同时关注TableStore中的两个表就可以了,这两张表的运维全部是TableStore服务负责,且提供SLA保障,绝对比自己运维开源系统的可用性要高。

同时,采用TableStore方案后,由于TableStore支持实时自动扩容,客户不再需要提前规划水位和集群容量,也不用担心高水位和突发流量对系统的冲击,将这些工作都交给了更擅长的云服务处理。

这样,不仅降低了运维的工作量和压力,同时也降低了系统风险,提高了系统整体的可用性。

减少时间成本

TableStore云架构方案相对于开源方案,系统更少,从零开始到上线需要的开发时间更少,同时,TableStore是serverless的云服务,全球多个区域即开即用,可以大大降低客户的开发上线的时间,提前将产品推出,抢先争取市场领先优势。

同时,TableStore支持按量付费,用户完全可以根据真实使用量付费,不再需要担心低峰期系统资源的浪费了,一定程度上,也能降低使用成本。

最后

目前,已经有不少行业的客户在使用TableStore存储爬虫数据,比如资讯类、生活类、文章类等等,也有部分用户在小数据量级时使用MySQL等关系型数据库,等数据规模大了后被迫迁移到TableStore存储。同时欢迎更多的客户开始使用TableStore存储你们的爬虫数据。

原文链接
本文为云栖社区原创内容,未经允许不得转载。

TableStore:爬虫数据存储和查询利器相关推荐

  1. 达梦两个表模糊查询_TableStore:爬虫数据存储和查询利器

    TableStore是阿里云自研的在线数据平台,提供高可靠的存储,实时和丰富的查询功能,适用于结构化.半结构化的海量数据存储以及各种查询.分析. 爬虫数据特点 在众多大数据场景中,爬虫类型的数据非常适 ...

  2. 基于云上分布式NoSQL的海量气象数据存储和查询方案

    前言 气象数据是一类典型的大数据,具有数据量大.时效性高.数据种类丰富等特点.气象数据中大量的数据是时空数据,记录了时间和空间范围内各个点的各个物理量的观测量或者模拟量,每天产生的数据量常在几十TB到 ...

  3. Python爬虫数据存储不同格式在excel表中通用代码

    爬虫数据存储在excel表通用代码 一..xls格式 import xlwt #创建workbook对象 workbook = xlwt.Workbook(encoding='utf8') #添加sh ...

  4. python数据存储和查询代码_【Python分享】如何便捷地存储、查询数据

    前言在之前的文章(如下)中,分享了爬取天天基金.中债指数的代码.爬取的数据很多,如何方便地存储.查询,也是一个麻烦的问题.本文分享一下我实现的基于 lsm-db 的本地文件数据存储.查询模块. 分享天 ...

  5. 爬虫数据存储—数据库和MySQL

    爬虫数据存储-数据库 一.什么是数据库? 数据库是一个以某种有组织的方式存储的数据集合.简单来说,我们可以将数据库想象为一个文件柜,文件柜里面有很多文件,这些文件我们称之为表. 举一个实际例子:比如说 ...

  6. 药品监管系统架构揭秘:海量溯源数据存储与查询...

    前言 在刚刚过去的2018年,"毒疫苗"事件再次触及了大众的敏感神经,因为十年前的"毒奶粉"事件还历历在目.我们急需创建一个全国性的药品(食品)监控追踪体系.与 ...

  7. 药品监管系统架构揭秘:海量溯源数据存储与查询

    前言 在刚刚过去的2018年,"毒疫苗"事件再次触及了大众的敏感神经,因为十年前的"毒奶粉"事件还历历在目.我们急需创建一个全国性的药品(食品)监控追踪体系.与 ...

  8. 爬虫数据存储到数据库/增量爬虫+多级页面获取=====安居客信息爬取

    文章目录 前言 一.增量爬虫是什么? 二.python数据存储到数据库 三.多级页面的跳转获取 四:遇到的问题以及解决 五:代码 总结 前言:这次的爬取内容是安居客网页里面的信息,首先是我爬取的页面是 ...

  9. 数据库技术:数据存储和查询知识笔记

    1.存储管理器 存储管理器作用:负责数据库中数据的存查询和更新.存储管理器负责和文件系统交互,将不同的DML语句翻译成底层文件系统命令,通过这种方式原始数据就通过文件系统存储在磁盘上. 存储管理器是存 ...

最新文章

  1. 获取用户电脑的上网IP地址
  2. 【Codeforces】808D Array Division(前后两部分和相等)
  3. IE下及标准浏览器下的图片旋转(二)—— Canvas(1)
  4. 【机器学习基础】非常详细!机器学习模型评估指标总结!
  5. XHTML、HTML4,HTML5 之间的区别
  6. android加载so文件失败,Android无法加载'.so.1'文件
  7. 都说不要装箱,那装箱到底带来了什么开销?
  8. 哈希表的构造和查找算法
  9. Maven安装教程详解与导入
  10. Vue路由设置嵌套(一级二级三级展示并且显示定向选中)
  11. 使用aliyun镜像源下载镜像及仓库搭建
  12. installshield basic msi 更新时覆盖不了上一个版本文件解决方案1
  13. Eclipse 格式化代码且不影响注释
  14. 全国计算机考试一级在线模拟,全国计算机等级考试一级模拟试题和答案
  15. 计算机键盘静音键咋不亮,键盘上的声音开关键不能用为什么
  16. 编程都是人上人,果不其然!2020年度十大高薪岗位,程序员独领风骚!
  17. gsoap 的好网站 http://www.cs.fsu.edu/~engelen/soapexamples.html
  18. 网页在线 运行 html 代码
  19. 异性相处,关系再好,也要懂得这些“分寸”
  20. ICCV 2021 | 美团“LargeFineFoodAI“研讨会开幕在即,互动有奖

热门文章

  1. yolov4 开发环境搭建_YOLOv4 的各种新实现、配置、测试、训练资源汇总
  2. php 一键登录插件,FastAdmin一键管理插件
  3. vue.js能美化界面吗_vue将单页面改造成多页面应用的方法
  4. sqlserver 过滤html,sqlserver 过滤掉某些字段查询剩余字段的方法
  5. python画三维立体图难吗_万万没想到,Python竟能绘制出如此酷炫的三维图
  6. matlab jp2格式,JP2文件扩展名_JP2是什么格式_JP2文件怎么打开-文件百科
  7. php ob 缓存,php中ob函数缓冲机制深入理解
  8. linux mysql 操作命令_Linux mysql常用操作命令
  9. dac0832控制电机驱动流程图_某驱动电机控制器拆解实拍照片
  10. 青岛外卖小哥帮崩溃程序员写代码,网友看完破防了:佩服又感动。