任务1.2 了解大数据采集平台
1.2.1 任务描述
数据处理第一步需要获得大量数据才能完成后续数据处理工作,大量数据的获得离不开合适的数据采集平台,大多数数据采集平台都能实现高可靠和高扩展的数据采集功能,具有输入、输出和中间的缓冲架构。
由于数据来源、数据格式、数据存储方式等不同,不同的数据采集平台具有不同的优势,了解数据采集工具可以帮助用户选择不同的数据采集工具。本次任务主要是了解几大数据采集平台及其特点。
1.2.2 知识准备
有数据来源才有数据采集,数据采集的主要目的是解决数据孤岛问题。不管是结构化的数据,还是非结构化的数据,在没有数据采集前,这些数据一般是分散存在,互相独立的。数据采集就是将这些零散的数据采集规整到数据仓库中,然后对这些数据进行综合分析和挖掘利用。
根据数据来源和类型的不同,数据采集工具大体有:系统文件日志采集平台、网络数据采集工具和应用程序接口采集工具。
1. 系统文件日志采集平台
互联网时代,许多企业平台每天都会产生大量的日志,并且数据类型一般为流式数据,如搜索引擎查询等,相应地出现了许多日志数据采集工具,多用于系统日志采集。这些工具均采用分布式架构,能满足每秒数百兆字节的日志数据采集和传输的需求。
比如,开源的日志收集系统Scribe,可以从各种日志源上收集日志,存储到一个中央存储系统上,以便于进行集中的统计分析和处理。Scribe为日志的“分布式收集、统一处理”提供了一个可扩展的、高容错的方案。
2. 网络数据采集工具
网络数据采集通常指通过网络爬虫或网站公开API等方式从网站上获取数据信息。一般是将网页中的非结构化数据抽取出来,以结构化的方式统一存储到本地数据文件中。网络数据采集同时支持图片、音频、视频等文件或附件的采集。
在互联网上,网络爬虫主要是为搜索引擎提供全面和最新的数据。网络爬虫工具可以分为以下3类。
• 分布式网络爬虫工具,如Nutch。
• Java网络爬虫工具,如Crawler4j、WebMagic、WebCollector。
• 非Java网络爬虫工具,如Scrapy(基于Python语言开发)。
3. 应用程序接口采集工具
软件接口方式需要对被采集的软件系统的业务流程及数据库相关的结构设计等非常了解,同时,需要通过编码才能实现数据的采集工作,具有专用型的特点。
1.2.3 任务实施
本次任务由3个活动组成,主要是熟悉日志采集工具和网页数据采集工具,重点熟悉Flume日志采集工具和网页数据采集工具Scrapy。
活动1 认识Apache Flume系统日志采集工具及特点
系统日志采集工具一般采用分布式架构设计,比较有影响的有Hadoop的Chukwa,Apache的Flume,Facebook(2021年10月28日,更名为Meta)的Scribe和LinkedIn的Kafka等。
Chukwa是Hadoop的一个开源项目,具有诸多Hadoop组件(用HDFS存储,用MapReduce处理数据),提供多种模块以支持Hadoop集群日志分析,主要架构有Adaptor,Agent和Collector。
Kafka主要是开源消息发布订阅系统,采用Scala语言编写和多种效率优化机制,适合异构集群。
Scribe也是一款开源日志收集系统,主要在Facebook内部大量使用,它能够从各种日志源上收集日志,存储到一个中央存储系统(可以是NFS,也可以是分布式文件系统等),以便于进行集中统计和分析处理。它最重要的特点是容错性好,当后端的存储系统崩溃时,Scribe会将数据写到本地磁盘上。当存储系统恢复正常后,Scribe将日志重新加载到存储系统中。
Flume是Apache旗下的一款开源、高可靠、高扩展、容易管理、支持客户扩展的数据采集系统。
1. Apache Flume工具
Apache Flume是一个分布式、高可靠和高可用的海量日志采集整合系统,支持各类数据采集源定义,用于收集、存储采集到的数据到一个集中的数据存储区域,是一种基于数据流技术的采集系统。
Apache Flume起源于Cloudera软件公司开发的分布式日志收集系统,初始的发行版本称为Flume OG(Original Generation),后来Flume被纳入Apache旗下,Cloudera Flume也被称为Apache Flume。
2. Apache Flume组成架构
Apache Flume是一个分布式的管道架构,在数据源和目的地之间由称为代理(Agent)的组件连接,如图1-3所示。
图1-3 Apache Flume架构
Apache Flume运行的核心是Agent。它是一个完整的数据收集工具,是一个独立的Flume进程,是Flume系统的核心内容,通常运行在日志采集点。Agent主要包含3个核心组件Source、Channel、Sink,如图1-4所示。
图1-4 Agent结构图
1)Flume Agent组件:Apache Flume的数据从Source流向Channel,再到Sink。Source完成对日志数据的收集,通过Transtion和Event推送到Channel之中。
① Source:Source负责从外部数据发生器接收数据,并将接收的数据封装成Flume的Event格式传递给一个或者多个Channel。Source支持接收多种类型的数据,比如Netcat,Exec,Avro,Thrift,twitter等。
② Channel:Channel存储是Agent的核心组件之一。Channel从Source接收数据,临时存放数据,然后发送给Sink。Channel类似于队列,是数据缓冲区,用于存储数据源已经接收到的数据。简单来说,就是对Source采集到的数据进行缓存,可以缓存在Memory、File、JDBC、Kafka等中。
③ Sink:Agent的核心组件之一,用于把数据发送到给定目标。目标可以是下一个Agent,或者最终目的地。Sink支持的目的地种类有HDFS、Hive、HBase、ES、Kafka、Logger、File等。
2)Event:Apache Flume传输的数据的基本单位是Event,这也是事务的基本单位。如果数据是文本文件,通常是一行记录。Event代表着一个数据流的最小完整单元,来源于外部数据源,终止于外部目的地。
Event由Agent中数据源(Source)生成,是Apache Flume要传递的消息数据,也称为数据单元。Apache Flume中的数据流由Event贯穿始终。它携带日志数据(字节数组形式)。一个Event由标题和正文组成,标题格式是键/值映射,正文内容是任意字节数组,如图1-5所示。
图1-5 Flume Event组成
当数据源(Source)捕获Event后会进行特定的格式化。然后,Source会把Event推入(单个或多个)Channel中。可以把Channel看作一个缓冲区,它将保存Event直到Sink处理完该事件。Sink负责持久化日志或者把事件推送给另一个Source或目的地。
3. Apache Flume特点
Apache Flume的特点见表1-2。
表1-2 Apache Flume的特点
4. 活动成效
本次活动后,能了解Apache Flume系统结构。
1)Apache Flume核心Agent的组件。
2)Apache Flume事件和数据流概念。
3)Apache Flume组件的功能和作用。
活动2 认识Logstash系统采集平台及特点
1. Logstash数据采集平台
Logstash是一款开源数据收集引擎,是著名的开源数据栈ELK(ElasticSearch, Logstash, Kibana)之一。Logstash作为数据源与数据存储分析工具之间的桥梁,结合ElasticSearch及Kibana,能够很方便地处理与分析数据。
Logstash可以提供多个插件,接受各种各样的数据,包括日志、网络请求、关系型数据库、传感器或物联网数据等,具备实时数据传输能力,负责将数据信息从管道的输入端传输到管道的输出端。
Logstash是基于JRuby实现的,可以跨平台运行在JVM上,采用模块化设计,具有很强的扩展性和互操作性。
2. Logstash工作原理
Logstash通过管道进行数据采集工作,管道有两个必需的元素:输入和输出,还有一个可选的元素:过滤器。输入插件从数据源获取数据,过滤器插件根据用户指定的数据格式修改数据,输出插件将数据写入目的地。Logstash工作流程如图1-6所示。
图1-6 Logstash工作流程
1)工作原理
Logstash管道引擎主要包括输入、过滤、输出三部分。另外,在输入和输出中,可以使用编解码器对数据格式进行处理。各部分均以插件形式存在,由多个插件配合工作。由于这种插件式的组织方式,使得Logstash变得易于扩展和定制。
用户通过定义管道(Pipeline)配置文件,设置需要使用的输入插件、过滤器插件、输出插件、编解码器,以实现特定的数据采集、数据处理、数据输出等功能。Logstash管道引擎插件如图1-7所示。
图1-7 Logstash管道引擎插件
① 输入插件:用于从数据源获取数据并发送给Logstash,常见的输入插件如file, syslog, redis, beats等。
② 过滤器插件:用于处理数据格式转换、数据派生等,常见的过滤器插件有grok, mutate, drop, clone, geoip等。
③ 输出插件:用于数据输出,是Logstash管道的最后一个阶段。管道中的事件可以经过多个输出接收端。常见的输出插件有ElasticSearch, file, graphite, statsd等。
④ 编解码器:编解码器不是一个单独的过程,而是在输入和输出等插件中用于数据转换的模块,使用编解码器可以轻松地分割已经被序列化的数据,用于对数据进行编解码处理,常见的插件有json,multiline等。
一个典型的Logstash配置包括输入配置、输出配置、过滤器配置,如图1-8所示。
图1-8 Logstash典型配置
2)执行过程
在Logstash实例中,包括3个处理阶段:输入(input)→过滤(filter)(不是必须的)→输出(output)。Logstash通过管道方式协调输入、过滤器和输出组件的执行。
① 输入启动一个线程,从对应数据源获取数据。
② 输入线程将数据写入一个队列(默认为内存中的有界队列,此队列如果意外停止将导致数据丢失)。为了防止数据丢失,Logstash提供以下两个功能:
• Persistent Queues:通过磁盘上的Queue来防止数据丢失;
• Dead Letter Queues:保存无法处理的Event(仅支持ElasticSearch作为输出源)。
③ Logstash会有多个管道工作器(Pipeline Worker)。每一个管道工作器会从队列中取一批数据,然后执行过滤操作和输出数据(工作器数目及每次处理的数据量由配置确定)。
3. Flume与Logstash比较
Flume和Logstash是常用的用于日志数据采集的平台。如果数据系统是ElasticSearch,Logstash也许是首选,因为ELK栈提供了很好的集成。Flume与Logstash的比较如表1-3所示。
表1-3 Flume与Logstash的比较
Flume和Logstash平台都采用了输入、输出和中间缓冲的架构,利用分布式的网络连接,在一定程度上保证了平台扩展性和高可靠性。
4. 活动效果评价
1)画出Logstash工作框架图。
2)写出典型的Logstash的配置。
3)请动手查阅资料,解释Logstash如何通过管道方式协调输入、过滤器和输出组件的执行?
活动3 认识Scrapy网页数据采集工具及特点
网页数据采集通常指通过网络爬虫或网站公开的API从网站上获取数据信息。将非结构化数据从网页中抽取出来,存储为统一的本地数据文件,并以结构化的方式存储。网页数据采集支持图片、音频、视频等文件或附件的采集。
一个网页的内容实质上是一个HTML文本,爬取网页内容主要是根据网页URL下载网页内容。当一个网页下载后,对网页内容进行分析,并提取需要的数据。同时,将数据以某种格式如csv或josn形式写入文件,或保存到数据库(如MySQL,MongoDB等)。
如果需要的数据分布在多个网页上,就需要从相关网页中将其他网页的链接提取出来,再度链接网页进行数据爬取和链接提取。
1. Scrapy工具
Scrapy工具是为爬取和提取网页结构性数据而编写的,是基于Python实现的开源和协作式Web抓取工具,主要应用在包括数据挖掘、信息处理或历史数据存储等程序中。
Scrapy工具有运行速度快、操作简单、可扩展性强的特点,是通用爬虫工具。
2. Scrapy架构
Scrapy的整体架构由Scrapy引擎(Scrapy Engine)、调度器(Scheduler)、下载器(Downloader)、爬虫(Spiders)和实体管道(Item Pipeline)5个组件组成。Scrapy架构图如图1-9所示。
图1-9 Scrapy架构图
从图1-9可知,Scrapy架构主要由不同组件组成,各组件名称和作用如表1-4所示。
表1-4 Scrapy组件名称与作用
Scrapy组件在Scrapy引擎的组织下,共同完成爬取任务。图1-9架构中箭头的方向是数据流动方向,从初始URL开始,调度将请求交于下载器下载,下载完成后交于爬虫进行分析,分析结果将决定数据方向。如果结果是需要保存的数据,将送到实体管道,后面将被用于数据后期处理;如果结果是需要进行下一步爬取的地址,将会被回传给调度器进行数据爬取。
3. Scrapy运作流程
Scrapy中的数据流由Scrapy引擎控制,整体流程如下。
1)Scrapy引擎打开一个网站,找到处理该网站的爬虫,并询问爬虫第一次要爬取的URL。
2)Scrapy引擎从爬虫中获取第一次要爬取的URL,并以Request方式发送给调度器。
3)Scrapy引擎向调度器请求下一个要爬取的URL。
4)调度器返回下一个要爬取的URL给Scrapy引擎,Scrapy引擎将URL通过下载器中间件转发给下载器。
5)下载器下载给定的网页。下载完毕后,生成一个该页面的结果,并将其通过下载器中间件发送给Scrapy引擎。
6)Scrapy引擎从下载器中接收下载结果,并通过爬虫中间件发送给爬虫进行处理。
7)爬虫对结果进行处理,并返回爬取到的数据项及需要跟进的新的URL给Scrapy引擎。
8)Scrapy引擎将爬取到的数据项发送给实体管道,将爬虫生成的新的请求发送给调度器。
9)从步骤2)开始重复,直到调度器中没有更多的请求,Scrapy引擎才关闭该网站。
活动4 认识八爪鱼采集器及特点
八爪鱼是不用代码采集网页内容的一款通用网页数据采集器,可以简单、快速地将网页数据转化为结构化数据,如存储为Excel或数据库等文件数据格式,采集网页上的各种数据,提供基于云计算的大数据采集解决方案。
八爪鱼采集器主要是通过浏览器,模拟人浏览网页的行为、复制数据等操作过程(如打开网页,单击网页中的某个按钮等操作),借助简单的工作流程设计,自动对网页内容进行采集。
1. 采集模式
八爪鱼采集器提供了不同的采集模式,用户可以根据需求选择不同的采集模式。
1)简易模式
简易模式就是八爪鱼采集器已经内置了国内一些主流网站的采集规则。如果要采集的网站和字段在简易模式的模板中,可直接调用,如图1-10所示。
图1-10 八爪鱼采集器内置采集规则
简易模式下也可自定义修改参数,调整采集规则,采集所需数据。
2)向导模式
向导模式是通过简单易懂的语言,指引用户熟悉网页结构,了解八爪鱼采集流程。通过向导模式,可明白规则配置的方法和八爪鱼采集器的采集思路。
3)智能模式
在智能模式下,只需要输入网址,单击搜索,八爪鱼采集器便会自动采集网页数据,并以表格形式呈现出来。可以进行删除或修改字段、翻页、数据导出等操作,以Excel格式导出。
在智能模式下,还可以通过输入关键词搜索数据。比如搜索“招聘”,单击查询,跳转到招聘模板。用户可以选择获取数据的规则放到八爪鱼采集器中运行,以获取想要的数据。
2. 采集方式
八爪鱼采集器为数据采集提供了不同的采集方式,主要有本地采集、云采集等方式。
1)本地采集
本地采集也称单机采集。本地采集(单机采集),是用自己的电脑进行采集的。本地采集可以实现大多数网页数据的爬取,在采集过程中可以对数据进行初步清洗。如使用八爪鱼采集器自带的正则工具,利用正则表达式将数据格式化,在数据源头实现去除空格、筛选日期等多种操作。
其次,八爪鱼采集器还提供分支判断功能,对网页中信息进行是与否的逻辑判断,实现用户筛选需求。
2)云采集
云采集是八爪鱼采集器提供的一种云服务集群对数据进行的采集,这种方式不占用本地电脑资源。当规则配置好之后,启动云采集,采集任务便可以在云端自行采集。
云采集提供的功能有定时采集、实时监控、数据自动去重并入库、增量采集、自动识别验证码、API接口多元化导出数据等。
云采集方式可以利用云端多节点并发运行,采集速度将远超于本地采集(单机采集)。
3. 活动成效
1)查阅Scrapy相关资料,简述Scrapy与Python的关系。
2)了解Scrapy各组件的功能和作用。
3)熟悉网页工作原理。
1.2.4 任务效果
1. 认识数据采集平台。
2. 查阅Apache Flume采集平台处理流程。
3. 结合HTML、Python知识,熟悉Scrapy处理流程。