任務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中??梢园袰hannel看作一個緩沖區,它將保存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)智能模式
在智能模式下,只需要輸入網址,單擊搜索,八爪魚采集器便會自動采集網頁數據,并以表格形式呈現出來??梢赃M行刪除或修改字段、翻頁、數據導出等操作,以Excel格式導出。
在智能模式下,還可以通過輸入關鍵詞搜索數據。比如搜索“招聘”,單擊查詢,跳轉到招聘模板。用戶可以選擇獲取數據的規則放到八爪魚采集器中運行,以獲取想要的數據。
2. 采集方式
八爪魚采集器為數據采集提供了不同的采集方式,主要有本地采集、云采集等方式。
1)本地采集
本地采集也稱單機采集。本地采集(單機采集),是用自己的電腦進行采集的。本地采集可以實現大多數網頁數據的爬取,在采集過程中可以對數據進行初步清洗。如使用八爪魚采集器自帶的正則工具,利用正則表達式將數據格式化,在數據源頭實現去除空格、篩選日期等多種操作。
其次,八爪魚采集器還提供分支判斷功能,對網頁中信息進行是與否的邏輯判斷,實現用戶篩選需求。
2)云采集
云采集是八爪魚采集器提供的一種云服務集群對數據進行的采集,這種方式不占用本地電腦資源。當規則配置好之后,啟動云采集,采集任務便可以在云端自行采集。
云采集提供的功能有定時采集、實時監控、數據自動去重并入庫、增量采集、自動識別驗證碼、API接口多元化導出數據等。
云采集方式可以利用云端多節點并發運行,采集速度將遠超于本地采集(單機采集)。
3. 活動成效
1)查閱Scrapy相關資料,簡述Scrapy與Python的關系。
2)了解Scrapy各組件的功能和作用。
3)熟悉網頁工作原理。
1.2.4 任務效果
1. 認識數據采集平臺。
2. 查閱Apache Flume采集平臺處理流程。
3. 結合HTML、Python知識,熟悉Scrapy處理流程。