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

原始數據集是以.csv文件組織的,為了方便spark讀取生成RDD或者DataFrame,首先將usa-counties.csv轉換為.txt文本格式文件usa-counties.txt。轉換操作使用python語言代碼實現,代碼組織在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命令把本地文件系統的“/home/hadoop/usa-counties.txt”上傳到HDFS文件系統中,具體路徑是“/user/hadoop/usacounties.txt”。
使用sparkSQL模塊進行數據分析。由于本實驗中使用的數據為結構化數據,因此可以使用spark讀取源文件生成DataFrame以方便進行后續分析實現(共計8個指標參數),在計算指標參數過程中,根據實現的難易程度,采用了DataFrame自帶的相關操作函數,又使用SparkSQL數據庫查詢語言進行了處理[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輕量級數據文件中,由于使用Python讀取HDFS文件系統中的數據源文件不太方便,故將HDFS上結果文件轉儲到本地Linux文件系統中。
本系統采用Python第三方庫pyecharts作為可視化工具,常用的圖表類型包含折線圖、柱形圖、餅圖、散點圖、雷達圖、詞云圖、統計地圖等。結合項目實際,在此選用詞云圖、象柱狀圖共3類圖表進行.html形式的可視化展示。
其次,使用line()函數繪制折線圖,主要代碼段如下。
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()函數繪制雙柱狀圖,主要代碼段如下,執行效果如圖1所示。

圖1 每日出現癥狀并確診人數雙柱狀圖
Bar()
.add_xaxis(date)
.add_yaxis("累計出現癥狀人數", cases, stack="stack1")
.add_yaxis("累計確診人數", deaths, stack="stack1")
.set_series_opts(label_opts=opts.LabelOpts(is_show=False))
.set_global_opts(title_opts=opts.TitleOpts(title="每日累計
流感人數"))
.render("/home/hadoop/result/result1/result1.html"))
從圖1分析可知,出現癥狀與確診人數相近度很高,說明確診率很高,該疾病處于高發期,雙柱狀圖能通過對比分析雙柱的分離度或者相近度,有效推導兩者之間的關聯程度。
最后使用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分析可知,紐約、新澤西、加利福尼亞、馬里蘭州、伊利諾伊州、馬薩諸塞州等地區屬于疾病高發區,可以對排名前三地區進行進一步的關聯構建,探索疾病的傳播路徑。

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