徐州工程學(xué)院 洪保劉
隨著互聯(lián)網(wǎng)時(shí)代的逐步發(fā)展,越來越多的人開始關(guān)注互聯(lián)網(wǎng)上的熱點(diǎn)新聞、時(shí)事政治等官方權(quán)威數(shù)據(jù),越來越多的網(wǎng)民也開始在互聯(lián)網(wǎng)上發(fā)布自己的日常生活、視頻評(píng)論等瑣事數(shù)據(jù)。互聯(lián)網(wǎng)產(chǎn)生的大量數(shù)據(jù)無法通過普通的軟件工具達(dá)到分析處理的目的,大數(shù)據(jù)處理技術(shù)于是應(yīng)運(yùn)而生。將大量數(shù)據(jù)收集、存儲(chǔ)在支持PB 級(jí)別的數(shù)據(jù)庫中,通過MapReduce、Spark 等大數(shù)據(jù)計(jì)算引擎實(shí)現(xiàn)對(duì)大量數(shù)據(jù)的處理分析,通過數(shù)據(jù)可視化技術(shù)將處理結(jié)果以圖表形式展現(xiàn)在平臺(tái)上,能夠讓所有網(wǎng)民清晰直觀地得到了解。本文首先介紹了隨著互聯(lián)網(wǎng)的發(fā)展,大數(shù)據(jù)處理技術(shù)的應(yīng)用越來越廣泛。然后通過Python 語言爬蟲技術(shù)獲取全國傳染病詳細(xì)數(shù)據(jù),并通過Hadoop大數(shù)據(jù)處理技術(shù)進(jìn)行收集、清洗、處理和計(jì)算,將處理結(jié)果傳輸?shù)組ySQL 數(shù)據(jù)庫中。最后,使用SpringBoot后端框架和ECharts 可視化技術(shù)展示數(shù)據(jù)。采用柱狀圖、時(shí)間線、折線圖、地圖和列表等圖表,并通過地圖顏色深淺、時(shí)間線和柱狀圖結(jié)合以及詳情按鈕等方式,展示了全國15 天的傳染病情況。這種處理數(shù)據(jù)通過可視化展示的方法,可以讓用戶更加清晰直觀地了解到相關(guān)信息。
為了獲取展示的數(shù)據(jù)源,在網(wǎng)絡(luò)上進(jìn)行了查詢、篩選并最終確定了想要爬取的數(shù)據(jù)來源網(wǎng)站,確定爬蟲目標(biāo)之后,開始本腳本的編寫。
本腳本分為三部分:獲取源數(shù)據(jù)、提取數(shù)據(jù)和保存數(shù)據(jù)。第一部分使用Requests 模塊模擬瀏覽器訪問源數(shù)據(jù)所在的網(wǎng)址,獲取源代碼;第二部分使用RE 模塊提取源代碼中的源數(shù)據(jù),并轉(zhuǎn)換為JSON 格式;第三部分使用OS 模塊將源數(shù)據(jù)以結(jié)構(gòu)化的TXT 格式文本保存至本地磁盤。
腳本設(shè)計(jì)完成之后,為了每天都能爬到該網(wǎng)站的實(shí)時(shí)更新數(shù)據(jù),于是在Windows 上采用定時(shí)任務(wù)計(jì)劃程序[1],定于每天下午6 點(diǎn)執(zhí)行本腳本。
爬蟲結(jié)果數(shù)據(jù)保存到本地文件后并不是最終的結(jié)果,因?yàn)槲覀冞€需要使用大數(shù)據(jù)技術(shù)框架Hadoop 對(duì)數(shù)據(jù)進(jìn)行處理[2],而在Windows 系統(tǒng)上目前還不支持安裝Hadoop,所以我們還需要將本地文件通過Linux 系統(tǒng)上的Lrzsz 技術(shù)上傳到服務(wù)器中。
開發(fā)工具:Python;需要安裝的Python 庫有:Requests;運(yùn)行環(huán)境:Windows 操作系統(tǒng)。
2.1.1 系統(tǒng)架構(gòu)設(shè)計(jì)
承接爬蟲腳本獲取網(wǎng)絡(luò)數(shù)據(jù)到服務(wù)器后,平臺(tái)的開發(fā)就來到了第二階段,即大數(shù)據(jù)開發(fā)系統(tǒng),本系統(tǒng)是整個(gè)數(shù)據(jù)可視化平臺(tái)開發(fā)過程中最為關(guān)鍵也最為重要的一環(huán),對(duì)于大量數(shù)據(jù)的處理,其處理能力及結(jié)果直接影響了可視化數(shù)據(jù)的準(zhǔn)確性和穩(wěn)定性,當(dāng)前主流的數(shù)據(jù)處理技術(shù)如MySQL 已無法滿足大量數(shù)據(jù)的業(yè)務(wù)需求,于是本開發(fā)系統(tǒng)選擇了大數(shù)據(jù)技術(shù)框架,即Hadoop。本系統(tǒng)分為三個(gè)模塊,分別為數(shù)據(jù)清洗模塊、數(shù)據(jù)處理模塊和數(shù)據(jù)存儲(chǔ)模塊。
2.1.2 系統(tǒng)架構(gòu)介紹本系統(tǒng)的開發(fā)架構(gòu)選擇了Hadoop 生態(tài)系統(tǒng),其中Flume 作為日志收集系統(tǒng)負(fù)責(zé)收集爬蟲腳本獲取到的數(shù)據(jù)文件并對(duì)其進(jìn)行清洗過濾[3];HDFS 分布式文件存儲(chǔ)系統(tǒng)負(fù)責(zé)存儲(chǔ)數(shù)據(jù)[4];Hive 數(shù)據(jù)庫工具負(fù)責(zé)分析處理數(shù)據(jù)[5];Sqoop 負(fù)責(zé)將處理后的結(jié)果數(shù)據(jù)遷移到MySQL 數(shù)據(jù)庫。Hadoop 作為分布式計(jì)算平臺(tái),經(jīng)過十幾年的發(fā)展其處理海量數(shù)據(jù)的能力已超越了市場中其他技術(shù),且普通用戶可以使用極低成本在自己的PC 機(jī)上搭建Hadoop 集群。
2.1.3 系統(tǒng)開發(fā)工具
根據(jù)系統(tǒng)的功能要求和架構(gòu)設(shè)計(jì),系統(tǒng)選定遠(yuǎn)程服務(wù)器的操作系統(tǒng)為Linux 并在阿里云購買了云服務(wù)器,利用Xshell 與遠(yuǎn)程服務(wù)器連接。
2.2.1 數(shù)據(jù)清洗模塊
數(shù)據(jù)清洗模塊主要用于將Python 爬蟲獲得的原始數(shù)據(jù)文件通過Flume 進(jìn)行數(shù)據(jù)的收集、清洗并上傳到HDFS 分布式文件存儲(chǔ)系統(tǒng)中。由于爬蟲獲得的數(shù)據(jù)是第三方網(wǎng)站服務(wù)器提供的數(shù)據(jù),還無法通過大數(shù)據(jù)處理技術(shù)來處理,所以使用Flume 來將原始數(shù)據(jù)進(jìn)行清洗過濾一些不需要的數(shù)據(jù),然后上傳到HDFS 等待Hive 來進(jìn)行真正的數(shù)據(jù)處理。
數(shù)據(jù)清洗的技術(shù)選型有很多,比如Flume 中收集過程中自定義的Interceptor 攔截器、或是數(shù)據(jù)上傳到HDFS過后編寫的Mapreduce、或是第三方ETL 技術(shù)軟件如Kettle 等,都可以對(duì)數(shù)據(jù)進(jìn)行清洗過濾。本系統(tǒng)選擇了Flume 自定義攔截器Interceptor。
Flume 在收集數(shù)據(jù)時(shí),由于爬蟲結(jié)果保存在了服務(wù)器上的統(tǒng)一目錄下,于是采用了Spooldir 類型的Source收集目錄下的所有數(shù)據(jù)文件。在數(shù)據(jù)到達(dá)File Channel之前,自定義Interceptor 攔截器對(duì)每個(gè)數(shù)據(jù)文件進(jìn)行清洗過濾,最后再到達(dá)HDFS Sink,將數(shù)據(jù)保存到HDFS分布式文件存儲(chǔ)系統(tǒng)中。
2.2.2 數(shù)據(jù)處理模塊
數(shù)據(jù)處理模塊主要使用Hive 數(shù)據(jù)庫工具對(duì)清洗后數(shù)據(jù)進(jìn)行處理分析,Hive 數(shù)據(jù)庫工具能將結(jié)構(gòu)化的數(shù)據(jù)文件映射為一張數(shù)據(jù)庫表,并提供SQL 查詢功能,能將SQL 語句轉(zhuǎn)化為MapReduce 任務(wù)來執(zhí)行。Hive 的優(yōu)點(diǎn)是學(xué)習(xí)成本低,可以通過類似SQL 語句實(shí)現(xiàn)快速M(fèi)apReduce 統(tǒng)計(jì),使MapReduce 變得更加簡單,而不必開發(fā)專門的MapReduce應(yīng)用程序。Hive 十分適合對(duì)數(shù)據(jù)倉庫進(jìn)行統(tǒng)計(jì)分析。
由于Hive 默認(rèn)的底層計(jì)算引擎使用的是MapReduce,而MapReduce 進(jìn)行數(shù)據(jù)迭代時(shí)需要經(jīng)過落盤到系統(tǒng)磁盤上,這使得計(jì)算速度降低了許多,所以本系統(tǒng)使用TEZ--數(shù)據(jù)迭代在內(nèi)存上進(jìn)行,大大減少了IO 落盤的時(shí)間消耗。
Hive 數(shù)據(jù)處理分為三層:ODS 原始數(shù)據(jù)層、DWD 數(shù)據(jù)處理層、ADS 結(jié)果數(shù)據(jù)層。ODS 原始數(shù)據(jù)層存放的是Flume 收集清洗完成后保存在HDFS 上的數(shù)據(jù),通過Hive的Load Data 命令保存在這一層;DWD 數(shù)據(jù)處理層存放的是處理業(yè)務(wù)需求時(shí)創(chuàng)建的中間數(shù)據(jù)表,將ODS 層的數(shù)據(jù)表進(jìn)行了處理分析,為結(jié)果數(shù)據(jù)的完成創(chuàng)建做中間處理;ODS 結(jié)果數(shù)據(jù)層存放的是完成業(yè)務(wù)需求后的結(jié)果表,緊接著結(jié)果表數(shù)據(jù)將通過數(shù)據(jù)存儲(chǔ)模塊進(jìn)入MySQL 數(shù)據(jù)庫。
2.2.3 業(yè)務(wù)邏輯分析
為滿足全國傳染病數(shù)據(jù)展示的全面性,本系統(tǒng)提出了三個(gè)業(yè)務(wù)需求,具體分析過程如下。
業(yè)務(wù)需求1:每日全國各項(xiàng)總數(shù)據(jù)。首先,ods_total 表存儲(chǔ)每日各省份的各項(xiàng)數(shù)據(jù);其次,dwd_total 表對(duì)每日的各項(xiàng)數(shù)據(jù)進(jìn)行分組求和;最后,ads_total 表取消每日的分組依據(jù),為數(shù)據(jù)存儲(chǔ)模塊做準(zhǔn)備。業(yè)務(wù)需求2:當(dāng)前日最新各省份各項(xiàng)數(shù)據(jù)。根據(jù)最新日期對(duì)ods_total 表進(jìn)行過濾,取出dt='最新日期'的各省份各項(xiàng)數(shù)據(jù)。業(yè)務(wù)需求3:每日各省份總確診數(shù)。根據(jù)Provinces 字段不為空對(duì)ods_total表進(jìn)行過濾,取出每日各省份中第一行數(shù)據(jù),即各省份總數(shù)據(jù),最后篩選字段為confirmed_cases(總確診數(shù))的數(shù)據(jù)。
2.2.4 數(shù)據(jù)存儲(chǔ)模塊
數(shù)據(jù)存儲(chǔ)模塊主要用于將Hive 數(shù)據(jù)庫工具中的結(jié)果數(shù)據(jù)表數(shù)據(jù)通過Sqoop 數(shù)據(jù)遷移工具遷移到MySQL數(shù)據(jù)庫中。Sqoop 主要用于在Hadoop 與傳統(tǒng)數(shù)據(jù)庫如MySQL 間進(jìn)行數(shù)據(jù)的傳遞,Sqoop 專為大數(shù)據(jù)批量傳輸設(shè)計(jì),能夠分割數(shù)據(jù)集并創(chuàng)建Maptask 任務(wù)來處理每個(gè)區(qū)塊。Sqoop 在傳輸Hive 數(shù)據(jù)到MySQL 時(shí),需要在MySQL 中提前創(chuàng)建與Hive 中對(duì)應(yīng)表的表結(jié)構(gòu)一樣的空表,之后才可使用Sqoop 命令進(jìn)行傳輸,且需要指定MySQL 數(shù)據(jù)庫地址與Hive 在HDFS 上的地址。最終存儲(chǔ)到MySQL 數(shù)據(jù)庫的表。Day_province 表存儲(chǔ)的是每日各省份的總確診數(shù);TotalCases 表存儲(chǔ)的是每日全國總數(shù)據(jù)(總確診數(shù)、總疑似數(shù)、總治愈數(shù)、總死亡數(shù));Province_city 表存儲(chǔ)的是當(dāng)前日實(shí)時(shí)最新的各省份總數(shù)據(jù)。
3.1.1 系統(tǒng)架構(gòu)設(shè)計(jì)
本平臺(tái)由兩個(gè)模塊實(shí)現(xiàn),分別為Web 前端模塊和Web后端模塊。Web 前端模塊負(fù)責(zé)設(shè)計(jì)渲染網(wǎng)站UI 界面和訪問后端API 接口獲取數(shù)據(jù),Web 后端模塊負(fù)責(zé)連接數(shù)據(jù)庫提取數(shù)據(jù)并創(chuàng)建API 接口提供數(shù)據(jù)給前端。
3.1.2 系統(tǒng)開發(fā)環(huán)境與運(yùn)行說明
系統(tǒng)在Windows 平臺(tái)下采用Idea 作為Ide 使用Java 進(jìn)行開發(fā),平臺(tái)主體使用SpringBoot 作為后端框架,ECharts作為前端可視化技術(shù),采用MySQL 作為數(shù)據(jù)庫。
系統(tǒng)運(yùn)行環(huán)境要求如下:
(1).Java8;(2).SpringBoot 框架:SpringMVC、.Spring 和.Mybatis;(3).MySQL 的Server 端在默認(rèn)端口運(yùn)行;(4).ECharts。
3.2.1 前端模塊
前端模塊是用戶訪問本平臺(tái)時(shí)第一眼看到的可視化UI 界面設(shè)計(jì),直接決定了圖表數(shù)據(jù)展示效果的好壞,通過前端基本技術(shù)HTML+CSS+JS 渲染界面,再由ECharts+Ajax 技術(shù)訪問后端模塊提供的接口獲取數(shù)據(jù)并設(shè)計(jì)圖表展示。
/templates/index.html 是ECharts 界面設(shè)計(jì)的主頁。
static 是ECharts 和頁面設(shè)計(jì)需要的靜態(tài)資源。
Controller 包是Ajax 訪問的API 接口,此類通過訪問后端模塊的API 接口獲取數(shù)據(jù)庫數(shù)據(jù)。
Entity 包是數(shù)據(jù)承載的實(shí)體類,數(shù)據(jù)成為實(shí)體類后再通過FastJson 轉(zhuǎn)換為前端需要的JSON 格式數(shù)據(jù)。
ECharts 是一款基于JavaScript 的數(shù)據(jù)可視化圖表庫,提供直觀、生動(dòng)、可交互、可個(gè)性化定制的數(shù)據(jù)可視化圖表。
3.2.2 后端模塊
后端模塊采用的是SpringBoot 框架,SpringBoot 是Spring 家族中的一個(gè)全新框架,用來簡化Spring 程序的創(chuàng)建和開發(fā)過程。在以往我們通過SpringMVC+Spring+MyBatis 框架進(jìn)行開發(fā)的時(shí)候,需要配置Web.XML,Spring 配置,MyBatis 配置,然后整合在一起,而Spring Boot 拋棄了繁瑣的XML 配置過程,采用大量默認(rèn)的配置來簡化我們的Spring 開發(fā)過程。
SpringBoot 化繁為簡,使開發(fā)變得更加的簡單迅速。在SpringBoot 框架中,Controller 層是與前端進(jìn)行交互,提供API 接口給前端獲取數(shù)據(jù)的控制層;Service 層是處理業(yè)務(wù)邏輯、調(diào)用持久化方法的服務(wù)層;DAO 層是與數(shù)據(jù)庫交互的持久化層。通過編寫Mapper 映射文件SQL語句訪問數(shù)據(jù)庫;Application.yml 是配置主程序的接口、Mapper 映射文件的路徑以及數(shù)據(jù)庫的連接信息等。
4.1.1 爬蟲腳本運(yùn)行環(huán)境
Python 3.10.1,使用Python 庫Requests、OS、RE、Time、JSON。跨平臺(tái)的系統(tǒng)設(shè)計(jì),測(cè)試環(huán)境為Windows10,Centos7。
4.1.2 大數(shù)據(jù)框架運(yùn)行環(huán)境
Flume-1.7.0、Hadoop-2.7.2、Hive-1.2.1、Sqoop-1.4.6、Tez-0.9.1、MySQL-5.5.47。系統(tǒng)安裝運(yùn)行在服務(wù)器上,服務(wù)器版本為Centos7。
4.1.3 Web 平臺(tái)運(yùn)行環(huán)境
后端技術(shù)選型:Java8、SpringBoot-2.2.2、MyBatis-1.3.0、MySQL-5.5.47。
前端技術(shù)選型:Html、CSS、JavasCript、jQuery-3.6.0、Ajax、ECharts。
4.2.1 爬蟲腳本運(yùn)行測(cè)試
腳本使用Python 運(yùn)行g(shù)et_yq_info_txt.py,運(yùn)行時(shí)創(chuàng)建數(shù)據(jù)結(jié)果保存的目錄,定時(shí)每天下午六點(diǎn)執(zhí)行該腳本,并將結(jié)果數(shù)據(jù)保存至此目錄下。數(shù)據(jù)爬取到Windows 系統(tǒng)本地文件后,服務(wù)器上使用Lrzsz 命令下載到dachuang_2022/data 目錄下。
4.2.2 大數(shù)據(jù)框架運(yùn)行測(cè)試
本框架首先啟動(dòng)Hadoop,使用Hadoop 安裝目錄下的/sbin 目錄下的start-all.sh 命令。
Hadoop 啟動(dòng)后執(zhí)行Flume 配置文件file-flumehdfs.Conf 收集并清洗數(shù)據(jù)文件到HDFS 分布式文件存儲(chǔ)系統(tǒng)上。
啟動(dòng)Hive 提取HDFS 上的數(shù)據(jù)映射成ODS 層原始數(shù)據(jù)表。
Hive 再通過編寫HQL 語句對(duì)原始數(shù)據(jù)表進(jìn)行處理分析,得到結(jié)果數(shù)據(jù)表。
Hive 最終處理完成的結(jié)果數(shù)據(jù)表再通過Sqoop 遷移數(shù)據(jù)到MySQL。
4.2.3 Web 平臺(tái)運(yùn)行測(cè)試
數(shù)據(jù)遷移到MySQL 數(shù)據(jù)庫后,進(jìn)入Web 平臺(tái)設(shè)計(jì)模塊。
首先配置SpringBoot 的pom.xml 導(dǎo)入MyBatis,SpringBoot 相關(guān)依賴;其次配置Application.yml。
DAO 層創(chuàng)建持久化接口,編寫Mapper 映射文件指定接口路徑并訪問數(shù)據(jù)庫。
Service 層創(chuàng)建業(yè)務(wù)接口,編寫實(shí)現(xiàn)類調(diào)用DAO 接口方法并編寫業(yè)務(wù)邏輯。
Controller 層創(chuàng)建控制接口,編寫方法指定映射地址并調(diào)用Service 接口方法獲取數(shù)據(jù),將數(shù)據(jù)以JSON 格式傳遞。
接下來進(jìn)入Web 前端模塊,首先配置前端技術(shù)所需的JS 文件,然后創(chuàng)建HTML 文件渲染設(shè)計(jì)UI 界面,使用Ajax 調(diào)用后端Controller 接口獲取數(shù)據(jù),并由ECharts 實(shí)現(xiàn)可視化。
我們通過大數(shù)據(jù)處理計(jì)算每日數(shù)據(jù)并與昨日數(shù)據(jù)進(jìn)行對(duì)比,通過Ajax 技術(shù)獲取后端結(jié)果數(shù)據(jù),動(dòng)態(tài)更新各項(xiàng)指標(biāo)的每日數(shù)據(jù),清晰反映每日數(shù)據(jù)變化。ECharts采用時(shí)間線、直方圖、折線圖、表格等形式,直觀地說明傳染病在不同地區(qū)的數(shù)據(jù)變化情況。此外,我們使用ECharts 繪制地圖功能,通過不同省份確診人數(shù)的大小來體現(xiàn)地區(qū)顏色的深淺,能夠直觀感受全國傳染病的分布情況。
全國傳染病數(shù)據(jù)具有海量性、無規(guī)則性,也是未來互聯(lián)網(wǎng)數(shù)據(jù)將面臨的現(xiàn)狀,大數(shù)據(jù)處理技術(shù)正是為解決分析這類數(shù)據(jù)而生,其不僅具有高效率、低成本、高擴(kuò)容、高容錯(cuò)性的框架體系,同時(shí)具有支持存儲(chǔ)PB 級(jí)別的數(shù)據(jù)庫存儲(chǔ)和分布式存儲(chǔ)大量數(shù)據(jù)的分布式文件系統(tǒng),以及并行計(jì)算與運(yùn)行的處理框架。大數(shù)據(jù)技術(shù)處理分析后的數(shù)據(jù)結(jié)果最后存儲(chǔ)在了關(guān)系型數(shù)據(jù)庫中,這讓W(xué)eb可視化平臺(tái)的搭建簡單了許多,只需要從數(shù)據(jù)庫中提取結(jié)果數(shù)據(jù)并通過可視化技術(shù)在平臺(tái)上展示出來,便可以讓所有的網(wǎng)民看到全國傳染病的多方面分析、多圖表展示。大數(shù)據(jù)可視化擁有其海量數(shù)據(jù)的分析處理和可視化圖表的高可讀性兩大優(yōu)點(diǎn),讓傳染病狀況變得明了清晰,讓防護(hù)工作可以更有效地開展,讓居民對(duì)傳染病的嚴(yán)重性有更高的認(rèn)識(shí),對(duì)全國傳染病的把握控制有著至關(guān)重要的作用。