1.2 数据采集:四面八方皆来客,五湖四海齐聚首
如前所述,世界上每时每刻都在产生大量的数据,包括物联网传感器数据、社交网络数据、商品交易数据等。面对海量的数据,与之相关的采集、存储和分析等环节产生了一系列的问题。如何收集这些数据并且进行转换、分析、存储以及有效率的分析,为企业带来了巨大的挑战。数据采集技术是对大数据进行有效利用的先决条件。数据采集并不是随意且缺乏章法的随机采集,而是以当下主体业务需求为出发点,以该出发点为前提,有限度、有规则地采集特定的数据,而基于该需求的、可用的、具体的采集方法包含系统日志采集、数据库采集、网络数据采集和传感器采集等,可谓是“四面八方皆来客,五湖四海齐聚首”。
1.2.1 系统日志采集
日志从最初的面向人类演变到现在的面向机器,发生了巨大的变化。最初,日志的主要消费者是软件工程师,他们通过读取日志来排查问题。如今,大量机器日以继夜地处理日志数据,生成具有可读性的报告,并以此来帮助人类做出相应的决策。
公司的平台每天都会产生大量的日志,这些日志一般为流式数据,如搜索引擎的页面浏览量(Page View,PV)和查询等。处理这些日志需要特定的日志系统,这些系统需要具备以下特征。
- 作为应用系统和分析系统之间的桥梁,并将它们之间的关联解耦。
- 支持近实时的在线分析系统和分布式并发的离线分析系统。
- 具有高可扩展性,也就是说,当数据量增加时,可以较容易地进行扩容,从而提高数据上限。
目前,业界比较流行的日志采集工具主要有Fluentd、Logstash、Flume、Scribe等。阿里巴巴内部采用的是Logagent,阿里云采用的则是Logtail,系统日志采集工具均采用分布式架构,能够满足每秒数百兆字节的日志数据采集和传输需求。
1. Fluentd
Fluentd是一个用于收集、处理和转发日志的系统。通过丰富的插件系统,Fluentd可以收集来自各种系统或应用的日志,在将其转化为用户指定的格式后,再转发到用户指定的日志存储系统中。
通过Fluentd,你可以非常容易地实现日志文件的追踪,并将其过滤后转存到MongoDB这样的数据库中。Fluentd可以将你从烦琐的日志处理中彻底解放出来。
Fluentd目前已经拥有500多种插件,借助于Fluentd,我们只需要很少的系统资源即可轻松实现记录每一件事。
下面我们用一组图片来说明使用Fluentd的优势。使用Fluentd以前,系统对日志的处理可能需要在大量接口间转换脚本或程序,如图1-2所示。
图1-2 日志处理转换示意图
使用了Fluentd之后,系统可以将Fluentd作为统一的数据转换对接处理方,从而实现精简高效的日志采集,如图1-3所示。
图1-3 基于Fluentd统一日志对接示意图
2. Logstash
ElasticSearch是当前主流的分布式大数据存储和搜索引擎,可以为用户提供强大的全文本检索功能,目前广泛应用于日志检索、全站搜索等领域。Logstash作为ElasicSearch常用的实时数据采集引擎,可以采集来自不同数据源的数据,对数据进行处理并将其输出到多种输出源,它是Elastic Stack的重要组成部分。
与Fluentd类似,Logstash可以动态地将来自不同数据源的数据统一起来,并将数据标准化到你所选择的目的地,如图1-4所示。
图1-4 基于Logstash统一日志对接的示意图
3. Flume
Apache Flume是一个分布式的可靠且可用的系统,可用于有效地从不同的源收集、聚合和移动大量的日志数据到一个集中式的数据存储区。
实际上,Flume的使用不只限于处理日志数据。因为数据源(Source)可以定制,所以Flume也可用于传输大量事件数据,这些数据中可以包括诸如网络通信数据、社交媒体产生的数据、电子邮件等。
Flume的核心就是从数据源收集数据,再将收集到的数据发送到指定的目的地(Smk)。
如图1-5所示,为了确保输送的过程成功,在将数据发送到目的地之前,Flume会将数据先缓存到管道(Channel)中,待数据真正到达目的地后,Flume再删除缓存的数据。
图1-5 Flume数据传输示意图
4. Scribe
Scribe是Facebook的一个开源的实时分布式日志收集系统,在Facebook内部已经得到了大量的应用。如图1-6所示,Scribe能够从各种日志源上收集日志,将其存储到一个中央存储系统(可以是NFS或分布式文件系统等)上,以便进行集中统计分析处理。它为日志的“分布式收集和统一处理”提供了一个可扩展的、高容错的方案。在中央存储系统的网络或机器出现故障时,Scribe又会将日志转存到本地或另一个位置,在中央存储系统恢复后,Scribe又会将转存的日志重新传输给中央存储系统。Scribe提高了大规模日志收集的可靠性和可扩展性。
图1-6 Scribe数据传输示意图
5. Logagent
Logagent是Sematext提供的传输工具,如图1-7所示,用于将日志传输到Logsene(一个基于SaaS平台的ElasticSearch API)上,因为Logsene会提供ElasticSearch API,所以它可以很容易地将数据推送到ElasticSearch上。Logagent可以掩盖敏感的数据信息,例如,个人验证信息(Personally Identifiable Information,PII)、出生日期、信用卡号码等;它还可以基于IP做GeoIP,丰富地理位置信息(如Access Logs)。因为它轻量又快速,所以可以置入任何日志块中。
图1-7 LogAgent数据传输示意图
6. Logtail
Logtail是日志服务提供的日志采集代理(Agent),可用于采集阿里云ECS、自建互联网数据中心(Internet Data Center,IDC)、其他云厂商等服务器上的日志,采集流程如图1-8所示。
图1-8 Logtail数据采集流程示意图
多年来,Logtail一直承载着阿里巴巴集团重要服务的数据采集工作。每天采集数百万服务器上的实时数据,日流量数十拍字节,并历经多次“双十一”的高并发挑战。
1.2.2 数据库采集
一些企业会使用传统的关系型数据库MySQL和Oracle等来存储数据。除此之外,Redis和MongoDB这样的NoSQL数据库也常用于数据的采集。企业产生的业务数据均以行记录的形式直接写入数据库中。通过数据库采集,系统可直接与企业业务后台服务器结合,将企业业务后台产生的大量业务记录写入数据库中,最后由特定的处理分析系统对业务记录进行系统分析。
目前,比较流行的数据库采集技术是基于Hive的大数据采集分析技术。
Hive是Facebook团队开发的具有可伸缩性的数据仓库。它是一个建立在Hadoop之上的开源数据仓库解决方案,可用于进行数据提取、转化和加载。基于Hive可以存储、查询和分析存储在Hadoop中的大规模数据。如图1-9所示,Hive数据仓库工具能将结构化的数据文件映射为一张数据库表,并提供SQL查询功能,也能将SQL语句转变成MapReduce任务来执行。Hive的优点是学习成本较低,可以通过类似的SQL语句快速实现MapReduce统计,使MapReduce变得更加简单,不必开发专门的MapReduce应用程序。Hive尤其适合对数据仓库进行统计和分析。
图1-9 Hive架构示意图
1.2.3 网络数据采集
网络数据采集一般包含网络爬虫爬取以及公共API获取这两种方式,也就是说,可通过网络爬虫和一些网站平台提供的公共API(如Twitter和新浪微博API)等从网站上获取数据。这样就可以将非结构化数据和半结构化数据的网页数据从网页中提取出来,并对其进行清洗,然后转换成结构化数据,存储为统一的本地文件数据。网络数据采集包括图片、音频、视频等文件或附件的采集,附件与正文可以自动关联。
网络爬虫是一种按照一定的规则自动抓取Web信息的程序或脚本。在互联网时代,网络爬虫主要是为搜索引擎提供最全面、最新的数据;在大数据时代,网络爬虫更是从互联网上采集数据的有利工具。
网络爬虫可以自动采集所有能够访问到的页面内容,为搜索引擎和大数据分析提供数据来源。从功能上来讲,网络爬虫一般包含数据采集、处理和存储这三部分功能。
网页中除了包含供用户阅读的文字信息之外,还包含一些超链接信息。网络爬虫系统正是通过网页中的超链接信息,不断获得网络上的其他网页信息的。网络爬虫从一个或若干个初始网页的URL(Uniform Resource Locator,统一资源定位器)开始,获得初始网页上所包含的其他网页URL,在抓取网页的过程中,不断从当前页面上抽取新的URL放入队列,直到满足指定的停止条件为止。
网络爬虫系统一般会选择比较重要的、出度(即网页中链出的超链接数)较大的网站的URL作为种子URL集合。
网络爬虫系统以这些种子集合作为初始URL进行数据抓取操作。因为网页中通常含有其他网页的链接信息,所以可以通过已有网页的URL得到一些新的URL。
我们可以把网页之间的指向结构看作一片“森林”,每个“种子”URL对应的网页看作“森林”中“一棵树的根结点”,这样网络爬虫系统就可以根据广度优先搜索算法或深度优先搜索算法遍历所有的网页了。
由于深度优先搜索算法可能会使爬虫系统深陷于某个网站内部,不利于搜索靠近网站首页的网页信息,因此一般采用广度优先搜索算法采集网页数据。
网络爬虫系统先将“种子”URL放入下载队列,然后简单地从队首取出一个URL并下载与之对应的网页,在得到网页的内容并将其存储后,解析网页中的链接信息,得到一些新的URL。
之后,它会根据一定的网页分析算法过滤掉与主题无关的链接,保留有用的链接,并将其放入等待抓取的URL队列。
最后,取出一个URL,下载与之对应的网页再解析,如此反复循环,直到遍历整个网络,或者满足某种特定的条件为止。
综上所述,网络爬虫的基本工作流程具体如下。
1)选取一部分“种子”URL。
2)将这些URL放入待抓取URL队列。
3)从待抓取URL队列中取出待抓取的URL,解析DNS,得到主机的IP地址,然后将URL对应的网页下载下来,存储到已下载的网页库中。此外,将这些URL放进已抓取URL队列中。
4)分析已抓取URL队列中的URL,分析其中包含的其他网页的URL,并且将这些URL放入待抓取URL队列,进入下一个循环。
基于上述流程,网络爬虫的工作示意图如图1-10所示。
图1-10 网络爬虫的基本工作流程示意图
目前,已知的各种网络爬虫工具已经有上百个,网络爬虫工具基本上可以分为如下三大类。
- 分布式网络爬虫工具,如Nutch。
- Java网络爬虫工具,如Crawler4j、WebMagic、WebCollector。
- 非Java网络爬虫工具,如Scrapy(基于Python语言开发)。
同时需要注意的是,当使用爬虫技术时,需在法律允许的范围内爬取数据,避免爬虫技术滥用所导致的对非公开信息的采集。未经许可,使用网络爬虫对网站合法收集的个人敏感信息、受法律保护的特定数据或信息等进行采集,均属于侵权以及违法行为。
1.2.4 传感器采集
传感器是一种检测装置,能用于感受被测量的信息,并且能够将检测系统感受到的信息按一定的规律变换成电信号或其他所需形式的信息输出,以满足信息的传输、处理、存储、显示、记录和控制等要求。生产车间中通常会有许多传感节点,它们24小时监控着整个生产过程,如果发现异常则可迅速反馈至上位机。传感器可以算得上是数据采集的感官接受系统,属于数据采集的底层环节。
在采集数据的过程中,如果传感器被测量的各个值处于稳定状态,也就是输入为常量或变化极慢,那么这就称为传感器的静态特性。现实应用中,我们总是希望传感器的输入与输出呈唯一对照关系,最好是线性关系。但是,一般情况下,输入与输出不会符合我们的要求,并且由于受到迟滞、蠕变等因素的影响,输入与输出关系的唯一性也不能实现。因此我们不能忽视工厂环境中外界的影响,其影响程度取决于传感器本身,可通过改善传感器加以抑制,有时也可以对外界条件加以限制。