王源 陳智勇
廣州理工學院 廣東 廣州 510540
大數(shù)據(jù)技術引發(fā)各行各業(yè)的深刻變革,并已提升為國家戰(zhàn)略,處于快速發(fā)展的大數(shù)據(jù)技術浪潮中,新技術的涌現(xiàn)層出不窮,Hadoop和Spark等開發(fā)框架已成為其中的代表。在離線大數(shù)據(jù)處理領域,Hadoop已然成為主流的應用開發(fā)平臺,并在企業(yè)開發(fā)實踐中得到了廣泛的應用[1]。同時,由于Hadoop的MapReduce計算模型延遲過高,很難適應ms速度級的實時高速運算要求,而只能適用于離線批處理場景。Spark采用先進的計算引擎,并支持循環(huán)數(shù)據(jù)流和內存運算,其響應靈敏度相較于Hadoop有了大幅度的提升,并迅速獲得了學界與業(yè)界的廣泛關注與應用,Spark已逐漸發(fā)展成為大數(shù)據(jù)領域最熱門的計算平臺之一。
Spark采用基于內存與DAG的計算模型及任務調度機制,能有效減少內存I/O開銷,使得任務響應更為靈敏。同時Spark完美兼容Python、Java、Scala、R等編程語言,豐富的接口支持大大降低了開發(fā)難度,能提供更高效的編程體驗[2]。
Spark專注于數(shù)據(jù)的分析處理,其核心組件包含Spark Core、Spark SQL、Spark Streaming、Stuctured Streaming、MLlib機器學習和GraphX圖計算等,其中數(shù)據(jù)存儲模塊功能依然要基于Hadoop中的HDFS分布式文件系統(tǒng)Amazon S3等來實現(xiàn)。因此,Spark流計算框架可以完美兼容Hadoop生態(tài)系統(tǒng),從而使現(xiàn)有的Hadoop應用程序可以高效遷移到Spark流計算框架中執(zhí)行。
Flask是一個輕量級Web應用開發(fā)框架框架,使用Python語言編寫,靈活、輕便、安全且容易上手,并可以很好地結合MVC模式進行開發(fā),能高效實現(xiàn)中小型網(wǎng)站開發(fā)與Web服務[3]。此外,F(xiàn)lask具備較強的定制性,開發(fā)者可以根據(jù)自己的需求來添加相應的功能,其強大的擴展插件庫可以讓用戶實現(xiàn)個性化的網(wǎng)站定制,實現(xiàn)功能強大的網(wǎng)站開發(fā)。
Python語言以其語法簡單、風格簡約,交互式編程等特點,已被學界業(yè)界廣泛應用。由于其開源屬性,因此能兼容移植到包括Linux、Windows、Android等主流開發(fā)平臺[4]。作為一門解釋性語言,Python天生具有跨平臺的特性,只要平臺提供相應的解釋器,Python都能兼容運行,如今Python已廣泛應用于科學計算、大數(shù)據(jù)、人工智能、云計算等行業(yè)領域。
Pyecharts是百度開源的一個用于生成Echarts圖表的類庫,兼容Python語言,方便源碼數(shù)據(jù)生成圖表,內置直觀,生動,可交互,可個性化定制的數(shù)據(jù)可視化圖表庫,提供了開箱即用的20多種的圖表和十幾種組件[5]。支持響應式設計,提供靈活的配置選項方便開發(fā)者定制。有健康的開源社區(qū),有API和友好接口文檔。官方提供了很多第三的插件。Pyecharts憑借良好的交互性,精巧的圖表設計,得到了眾多開發(fā)者的認可。
本系統(tǒng)采用的軟件集群包括Linux系統(tǒng)Ubuntu18.04LTS、Hadoop-3.1.3、Spark-2.4.0、Python3.7.3、PyCharm2021.02,大數(shù)據(jù)框架采用偽分布式Hadoop集群配置、Spark采用本地模式,便于單機環(huán)境下運行測試。
本系統(tǒng)使用的數(shù)據(jù)集來自美國數(shù)據(jù)網(wǎng)站Kaggle中的uscounties.csv流感數(shù)據(jù)集,該數(shù)據(jù)集以數(shù)據(jù)表組織,數(shù)據(jù)包含以下字段:
原始數(shù)據(jù)集是以.csv文件組織的,為了方便spark讀取生成RDD或者DataFrame,首先將usa-counties.csv轉換為.txt文本格式文件usa-counties.txt。轉換操作使用python語言代碼實現(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模塊進行數(shù)據(jù)分析。由于本實驗中使用的數(shù)據(jù)為結構化數(shù)據(jù),因此可以使用spark讀取源文件生成DataFrame以方便進行后續(xù)分析實現(xiàn)(共計8個指標參數(shù)),在計算指標參數(shù)過程中,根據(jù)實現(xiàn)的難易程度,采用了DataFrame自帶的相關操作函數(shù),又使用SparkSQL數(shù)據(jù)庫查詢語言進行了處理[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計算結果保存到.json輕量級數(shù)據(jù)文件中,由于使用Python讀取HDFS文件系統(tǒng)中的數(shù)據(jù)源文件不太方便,故將HDFS上結果文件轉儲到本地Linux文件系統(tǒng)中。
本系統(tǒng)采用Python第三方庫pyecharts作為可視化工具,常用的圖表類型包含折線圖、柱形圖、餅圖、散點圖、雷達圖、詞云圖、統(tǒng)計地圖等。結合項目實際,在此選用詞云圖、象柱狀圖共3類圖表進行.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("累計出現(xiàn)癥狀人數(shù)", cases, stack="stack1")
.add_yaxis("累計確診人數(shù)", deaths, stack="stack1")
.set_series_opts(label_opts=opts.LabelOpts(is_show=False))
.set_global_opts(title_opts=opts.TitleOpts(title="每日累計
流感人數(shù)"))
.render("/home/hadoop/result/result1/result1.html"))
從圖1分析可知,出現(xiàn)癥狀與確診人數(shù)相近度很高,說明確診率很高,該疾病處于高發(fā)期,雙柱狀圖能通過對比分析雙柱的分離度或者相近度,有效推導兩者之間的關聯(lián)程度。
最后使用WordCloud()繪制詞云圖,主要代碼段如下;
WordCloud()
.add("", data, word_size_range=[20, 100], shape=SymbolType.DIAMOND)
.set_global_opts(title_opts=opts.TitleOpts(title="美國各州確診Top10"))
.render("/home/hadoop/result/result4/result1.html"))
從圖2分析可知,紐約、新澤西、加利福尼亞、馬里蘭州、伊利諾伊州、馬薩諸塞州等地區(qū)屬于疾病高發(fā)區(qū),可以對排名前三地區(qū)進行進一步的關聯(lián)構建,探索疾病的傳播路徑。
圖2 各州確診人數(shù)詞云圖
本文運用主流大數(shù)據(jù)開發(fā)技術(Spark流處理引擎、HDFS分布式文件系統(tǒng)、RDD 彈性分布式數(shù)據(jù)集等)進行流數(shù)據(jù)處理分析,并使用Pyecharts可視化工具實現(xiàn)了圖表展示,設計過程涉及大數(shù)據(jù)采集預處理、分析與數(shù)據(jù)挖掘、可視化處理等步驟,構建了完整的流數(shù)據(jù)分析處理框架,突出了大數(shù)據(jù)開發(fā)的實際項目應用,為用戶利用Spark等大數(shù)據(jù)平臺進行數(shù)據(jù)處理提供了一個較為完整的參照模板。