王源 陳智勇
廣州理工學(xué)院 廣東 廣州 510540
大數(shù)據(jù)技術(shù)引發(fā)各行各業(yè)的深刻變革,并已提升為國(guó)家戰(zhàn)略,處于快速發(fā)展的大數(shù)據(jù)技術(shù)浪潮中,新技術(shù)的涌現(xiàn)層出不窮,Hadoop和Spark等開(kāi)發(fā)框架已成為其中的代表。在離線大數(shù)據(jù)處理領(lǐng)域,Hadoop已然成為主流的應(yīng)用開(kāi)發(fā)平臺(tái),并在企業(yè)開(kāi)發(fā)實(shí)踐中得到了廣泛的應(yīng)用[1]。同時(shí),由于Hadoop的MapReduce計(jì)算模型延遲過(guò)高,很難適應(yīng)ms速度級(jí)的實(shí)時(shí)高速運(yùn)算要求,而只能適用于離線批處理場(chǎng)景。Spark采用先進(jìn)的計(jì)算引擎,并支持循環(huán)數(shù)據(jù)流和內(nèi)存運(yùn)算,其響應(yīng)靈敏度相較于Hadoop有了大幅度的提升,并迅速獲得了學(xué)界與業(yè)界的廣泛關(guān)注與應(yīng)用,Spark已逐漸發(fā)展成為大數(shù)據(jù)領(lǐng)域最熱門(mén)的計(jì)算平臺(tái)之一。
Spark采用基于內(nèi)存與DAG的計(jì)算模型及任務(wù)調(diào)度機(jī)制,能有效減少內(nèi)存I/O開(kāi)銷,使得任務(wù)響應(yīng)更為靈敏。同時(shí)Spark完美兼容Python、Java、Scala、R等編程語(yǔ)言,豐富的接口支持大大降低了開(kāi)發(fā)難度,能提供更高效的編程體驗(yàn)[2]。
Spark專注于數(shù)據(jù)的分析處理,其核心組件包含Spark Core、Spark SQL、Spark Streaming、Stuctured Streaming、MLlib機(jī)器學(xué)習(xí)和GraphX圖計(jì)算等,其中數(shù)據(jù)存儲(chǔ)模塊功能依然要基于Hadoop中的HDFS分布式文件系統(tǒng)Amazon S3等來(lái)實(shí)現(xiàn)。因此,Spark流計(jì)算框架可以完美兼容Hadoop生態(tài)系統(tǒng),從而使現(xiàn)有的Hadoop應(yīng)用程序可以高效遷移到Spark流計(jì)算框架中執(zhí)行。
Flask是一個(gè)輕量級(jí)Web應(yīng)用開(kāi)發(fā)框架框架,使用Python語(yǔ)言編寫(xiě),靈活、輕便、安全且容易上手,并可以很好地結(jié)合MVC模式進(jìn)行開(kāi)發(fā),能高效實(shí)現(xiàn)中小型網(wǎng)站開(kāi)發(fā)與Web服務(wù)[3]。此外,F(xiàn)lask具備較強(qiáng)的定制性,開(kāi)發(fā)者可以根據(jù)自己的需求來(lái)添加相應(yīng)的功能,其強(qiáng)大的擴(kuò)展插件庫(kù)可以讓用戶實(shí)現(xiàn)個(gè)性化的網(wǎng)站定制,實(shí)現(xiàn)功能強(qiáng)大的網(wǎng)站開(kāi)發(fā)。
Python語(yǔ)言以其語(yǔ)法簡(jiǎn)單、風(fēng)格簡(jiǎn)約,交互式編程等特點(diǎn),已被學(xué)界業(yè)界廣泛應(yīng)用。由于其開(kāi)源屬性,因此能兼容移植到包括Linux、Windows、Android等主流開(kāi)發(fā)平臺(tái)[4]。作為一門(mén)解釋性語(yǔ)言,Python天生具有跨平臺(tái)的特性,只要平臺(tái)提供相應(yīng)的解釋器,Python都能兼容運(yùn)行,如今Python已廣泛應(yīng)用于科學(xué)計(jì)算、大數(shù)據(jù)、人工智能、云計(jì)算等行業(yè)領(lǐng)域。
Pyecharts是百度開(kāi)源的一個(gè)用于生成Echarts圖表的類庫(kù),兼容Python語(yǔ)言,方便源碼數(shù)據(jù)生成圖表,內(nèi)置直觀,生動(dòng),可交互,可個(gè)性化定制的數(shù)據(jù)可視化圖表庫(kù),提供了開(kāi)箱即用的20多種的圖表和十幾種組件[5]。支持響應(yīng)式設(shè)計(jì),提供靈活的配置選項(xiàng)方便開(kāi)發(fā)者定制。有健康的開(kāi)源社區(qū),有API和友好接口文檔。官方提供了很多第三的插件。Pyecharts憑借良好的交互性,精巧的圖表設(shè)計(jì),得到了眾多開(kāi)發(fā)者的認(rèn)可。
本系統(tǒng)采用的軟件集群包括Linux系統(tǒng)Ubuntu18.04LTS、Hadoop-3.1.3、Spark-2.4.0、Python3.7.3、PyCharm2021.02,大數(shù)據(jù)框架采用偽分布式Hadoop集群配置、Spark采用本地模式,便于單機(jī)環(huán)境下運(yùn)行測(cè)試。
本系統(tǒng)使用的數(shù)據(jù)集來(lái)自美國(guó)數(shù)據(jù)網(wǎng)站Kaggle中的uscounties.csv流感數(shù)據(jù)集,該數(shù)據(jù)集以數(shù)據(jù)表組織,數(shù)據(jù)包含以下字段:

原始數(shù)據(jù)集是以.csv文件組織的,為了方便spark讀取生成RDD或者DataFrame,首先將usa-counties.csv轉(zhuǎn)換為.txt文本格式文件usa-counties.txt。轉(zhuǎn)換操作使用python語(yǔ)言代碼實(shí)現(xiàn),代碼組織在Text.py中:
import pandas as pd
data = pd.read_csv('/home/spark/usa-counties.csv')
with open('/home/spark/us-counties.txt','a+',encoding='utf-8') as f:
for line in data.values:
f.write((str(line[0])+' '+str(line[1])+' '
+str(line[2])+' '+str(line[3])+' '+str(line[4])+' '))
使用$./bin/hdfsdfs -put /home/hadoop/us-counties.txt /user/Hadoop命令把本地文件系統(tǒng)的“/home/hadoop/usa-counties.txt”上傳到HDFS文件系統(tǒng)中,具體路徑是“/user/hadoop/usacounties.txt”。
使用sparkSQL模塊進(jìn)行數(shù)據(jù)分析。由于本實(shí)驗(yàn)中使用的數(shù)據(jù)為結(jié)構(gòu)化數(shù)據(jù),因此可以使用spark讀取源文件生成DataFrame以方便進(jìn)行后續(xù)分析實(shí)現(xiàn)(共計(jì)8個(gè)指標(biāo)參數(shù)),在計(jì)算指標(biāo)參數(shù)過(guò)程中,根據(jù)實(shí)現(xiàn)的難易程度,采用了DataFrame自帶的相關(guān)操作函數(shù),又使用SparkSQL數(shù)據(jù)庫(kù)查詢語(yǔ)言進(jìn)行了處理[6-7]。
#主程序段:
spark = SparkSession.builder.config(conf = SparkConf()).
getOrCreate()
fields = [StructField("date", DateType(),False),StructField("
county", StringType(),False),StructField("state", StringType(
),False),StructField("cases", IntegerType(),False),StructField("
deaths", IntegerType(),False),]
schema = StructType(fields)
rdd0 = spark.sparkContext.textFile("/user/hadoop/usa-counties.
txt")
Spark計(jì)算結(jié)果保存到.json輕量級(jí)數(shù)據(jù)文件中,由于使用Python讀取HDFS文件系統(tǒng)中的數(shù)據(jù)源文件不太方便,故將HDFS上結(jié)果文件轉(zhuǎn)儲(chǔ)到本地Linux文件系統(tǒng)中。
本系統(tǒng)采用Python第三方庫(kù)pyecharts作為可視化工具,常用的圖表類型包含折線圖、柱形圖、餅圖、散點(diǎn)圖、雷達(dá)圖、詞云圖、統(tǒng)計(jì)地圖等。結(jié)合項(xiàng)目實(shí)際,在此選用詞云圖、象柱狀圖共3類圖表進(jìn)行.html形式的可視化展示。
其次,使用line()函數(shù)繪制折線圖,主要代碼段如下。
Line(init_opts=opts.InitOpts(width="1600px", height="800px"))
.add_xaxis(xaxis_data=date)
.add_yaxis(series_name="",
y_axis=cases,
markpoint_opts=opts.MarkPointOpts(data=[opts.
MarkPointItem(type_="max", name="最大值")])
其次,使用Bar()函數(shù)繪制雙柱狀圖,主要代碼段如下,執(zhí)行效果如圖1所示。

圖1 每日出現(xiàn)癥狀并確診人數(shù)雙柱狀圖
Bar()
.add_xaxis(date)
.add_yaxis("累計(jì)出現(xiàn)癥狀人數(shù)", cases, stack="stack1")
.add_yaxis("累計(jì)確診人數(shù)", deaths, stack="stack1")
.set_series_opts(label_opts=opts.LabelOpts(is_show=False))
.set_global_opts(title_opts=opts.TitleOpts(title="每日累計(jì)
流感人數(shù)"))
.render("/home/hadoop/result/result1/result1.html"))
從圖1分析可知,出現(xiàn)癥狀與確診人數(shù)相近度很高,說(shuō)明確診率很高,該疾病處于高發(fā)期,雙柱狀圖能通過(guò)對(duì)比分析雙柱的分離度或者相近度,有效推導(dǎo)兩者之間的關(guān)聯(lián)程度。
最后使用WordCloud()繪制詞云圖,主要代碼段如下;
WordCloud()
.add("", data, word_size_range=[20, 100], shape=SymbolType.DIAMOND)
.set_global_opts(title_opts=opts.TitleOpts(title="美國(guó)各州確診Top10"))
.render("/home/hadoop/result/result4/result1.html"))
從圖2分析可知,紐約、新澤西、加利福尼亞、馬里蘭州、伊利諾伊州、馬薩諸塞州等地區(qū)屬于疾病高發(fā)區(qū),可以對(duì)排名前三地區(qū)進(jìn)行進(jìn)一步的關(guān)聯(lián)構(gòu)建,探索疾病的傳播路徑。

圖2 各州確診人數(shù)詞云圖
本文運(yùn)用主流大數(shù)據(jù)開(kāi)發(fā)技術(shù)(Spark流處理引擎、HDFS分布式文件系統(tǒng)、RDD 彈性分布式數(shù)據(jù)集等)進(jìn)行流數(shù)據(jù)處理分析,并使用Pyecharts可視化工具實(shí)現(xiàn)了圖表展示,設(shè)計(jì)過(guò)程涉及大數(shù)據(jù)采集預(yù)處理、分析與數(shù)據(jù)挖掘、可視化處理等步驟,構(gòu)建了完整的流數(shù)據(jù)分析處理框架,突出了大數(shù)據(jù)開(kāi)發(fā)的實(shí)際項(xiàng)目應(yīng)用,為用戶利用Spark等大數(shù)據(jù)平臺(tái)進(jìn)行數(shù)據(jù)處理提供了一個(gè)較為完整的參照模板。