蘇樹鵬
摘 要 在校園信息化過程中,傳統(tǒng)的業(yè)務(wù)平臺(tái)升級(jí)方法復(fù)雜,硬件成本太高,軟硬件利用率低等缺點(diǎn),本文在云計(jì)算基礎(chǔ)上構(gòu)建用于處理海量數(shù)據(jù)的數(shù)字校園倉庫系統(tǒng)。該系統(tǒng)基于Hadoop+Hive框架實(shí)現(xiàn)對(duì)海量數(shù)據(jù)的并行處理,降低系統(tǒng)開發(fā)復(fù)雜度,提高高效性。
關(guān)鍵詞 云計(jì)算 海量數(shù)據(jù) Hadoop Map-Reduce Hive
中圖分類號(hào):TP315 文獻(xiàn)標(biāo)識(shí)碼:A
Data Warehouse Research Based on Hadoop and Hive Digital Campus
SU Shupeng
(Guangxi Technological College of Machinery and Electricity, Nanning, Guangxi 530007)
Abstract In the process of campus information, the traditional method of complex business platform upgrades, hardware cost is too high, and low utilization of hardware and software shortcomings, this paper constructs a digital campus system for processing massive data warehouse in the cloud computing basis. The system is based on Hadoop + Hive framework to achieve the massive data parallel processing, reduce system development complexity and improve efficiency.
Key words cloud computing; massive data; Hadoop; Map-Reduce; Hive
隨著以云計(jì)算、物聯(lián)網(wǎng)等為代表的新型信息技術(shù)的不斷涌現(xiàn),校園信息化過程中各系統(tǒng)產(chǎn)生結(jié)構(gòu)化以及非結(jié)構(gòu)化海量數(shù)據(jù),傳統(tǒng)業(yè)務(wù)平臺(tái)的數(shù)據(jù)倉庫已無法滿足需求,構(gòu)建新的大數(shù)據(jù)存儲(chǔ)及并行處理、分析的架構(gòu)應(yīng)運(yùn)而生。Hadoop是利用廉價(jià)的集群設(shè)備進(jìn)行計(jì)算大規(guī)模數(shù)據(jù)的分布式平臺(tái),其主要特點(diǎn)高效率、可靠、擴(kuò)展能力強(qiáng)。本文基于Hadoop 和Hive 構(gòu)建數(shù)字校園的數(shù)據(jù)倉庫,快速對(duì)數(shù)字校園不斷膨脹的數(shù)據(jù)進(jìn)行處理和分析,為各部門提供有價(jià)值的業(yè)務(wù)決策。
1 Hadoop與Hive
1.1 Hadoop
Hadoop是由Apache公司開發(fā)的開源分布式存儲(chǔ)和計(jì)算系統(tǒng),其由兩大核心部件組成:HDFS(Hadoop Distributed File System)和M/R(Map/Reduce),HDFS是存儲(chǔ)系統(tǒng),存儲(chǔ)文件會(huì)被分割成多個(gè)文件塊,每個(gè)文件塊被分配存儲(chǔ)到HDFS數(shù)據(jù)節(jié)點(diǎn)上,且會(huì)根據(jù)配置通過復(fù)制文件塊來保證數(shù)據(jù)的安全性。M/R用于大規(guī)模數(shù)據(jù)集的并行運(yùn)算模型。一個(gè)作業(yè)通常會(huì)把輸入的數(shù)據(jù)集切分為若干獨(dú)立的數(shù)據(jù)塊,M/R把數(shù)據(jù)塊分發(fā)給集群的節(jié)點(diǎn)進(jìn)行Map任務(wù)計(jì)算,節(jié)點(diǎn)會(huì)周期性向主節(jié)點(diǎn)報(bào)告完成的工作和狀態(tài),如果節(jié)點(diǎn)存在故障,主節(jié)點(diǎn)把數(shù)據(jù)分發(fā)到其他節(jié)點(diǎn)完成計(jì)算??蚣馨袽ap的輸出的結(jié)果交給Reduce任務(wù),作業(yè)整個(gè)計(jì)算過程的數(shù)據(jù)都存儲(chǔ)在HDFS中,框架負(fù)責(zé)任務(wù)的調(diào)度和監(jiān)控。
1.2 Hive
Hive是基于Hadoop的開源數(shù)據(jù)倉庫工具,提供了一套類數(shù)據(jù)庫的數(shù)據(jù)存儲(chǔ)和處理機(jī)制,用于存儲(chǔ)和處理海量結(jié)構(gòu)化數(shù)據(jù),它把海量數(shù)據(jù)存儲(chǔ)于Hadoop文件系統(tǒng),Hive提供了完整的sql查詢功能,將用戶編寫的SQL語句進(jìn)行解析和轉(zhuǎn)換,最終生成一系列基于Hadoop的map/reduce任務(wù),通過執(zhí)行這些任務(wù)完成數(shù)據(jù)處理。Hive 擁有元數(shù)據(jù)存儲(chǔ),主要用于存儲(chǔ)模式和統(tǒng)計(jì)信息,這些在數(shù)據(jù)探索,查詢優(yōu)化和查詢編譯中很有作用。
2 基于Hadoop和Hive數(shù)據(jù)倉庫
2.1 Hive的特性
(1)靈活的存儲(chǔ)引擎。Hive沒有固定的數(shù)據(jù)存儲(chǔ)格式,用戶可以自由組織Hive中的表,加載數(shù)據(jù)的過程中,不需要進(jìn)行數(shù)據(jù)格式的轉(zhuǎn)換,只需告訴Hive數(shù)據(jù)中的列分隔符和行分隔符,Hive就可以解析數(shù)據(jù)。所以Hive加載數(shù)據(jù)只需將數(shù)據(jù)內(nèi)容復(fù)制到相應(yīng)的HDFS目錄中。(2)高效執(zhí)行引擎。Hive的編譯器對(duì)源代碼進(jìn)行語法分析、語義分析并生成目標(biāo)代碼生成,Hive基于MapReduce,Hive的Sort和GroupBy都依賴MapReduce,而 MapReduce相當(dāng)于固化了執(zhí)行算子,Map的MergeSort必須執(zhí)行,GroupBy算子只有一種模式,Reduce的Merge-Sort也必須選。(3)容錯(cuò)機(jī)制。Hive的執(zhí)行計(jì)劃在MapReduce框架上以作業(yè)的方式執(zhí)行,每個(gè)作業(yè)的中間結(jié)果文件寫到本地磁盤,最終輸出文件寫到HDFS文件系統(tǒng),利用HDFS的多副本機(jī)制來保證數(shù)據(jù)的可靠性,從而達(dá)到作業(yè)的容錯(cuò)性。如果在作業(yè)執(zhí)行過程中某節(jié)點(diǎn)出現(xiàn)故障,那么Hive執(zhí)行計(jì)劃基本不會(huì)受到影響。因此,基于Hive實(shí)現(xiàn)的數(shù)據(jù)倉庫可以部署在由普通機(jī)器構(gòu)建的分布式集群之上。(4)可視化。Hive的可視化界面基本屬于字符終端,用戶的技術(shù)水平一般比較高。面向不同的應(yīng)用和用戶,提供個(gè)性化的可視化展現(xiàn),是Hive改進(jìn)的一個(gè)重要方向。個(gè)性化的可視化也可以理解為用戶群體的分層,例如,圖形界面方式提供初級(jí)用戶,簡單語言方式提供中級(jí)用戶,復(fù)雜程序方式提供高級(jí)用戶。
2.2 基于Hadoop與Hive的數(shù)據(jù)倉庫架構(gòu)
系統(tǒng)的數(shù)據(jù)倉庫架構(gòu)如下圖1所示,各業(yè)務(wù)系統(tǒng)的數(shù)據(jù)通過ETL導(dǎo)入HDFS 中。Hive構(gòu)架基于Hadoop平臺(tái)上,Hive的Driver將HiveQL聲明傳遞給編譯器進(jìn)行標(biāo)準(zhǔn)解析,類型檢查和語義分析,然后編譯器生成一個(gè)邏輯計(jì)劃且進(jìn)行優(yōu)化,最后,將優(yōu)化后的DAG形式的Map/Reduce任務(wù)使用M/R按照依賴順序執(zhí)行任務(wù),快速地將數(shù)據(jù)反饋給上層的應(yīng)用。
圖1 基于Hadoop 與Hadoop 的數(shù)據(jù)倉庫架構(gòu)
3 Hive在數(shù)字校園的數(shù)據(jù)倉庫中的應(yīng)用
本文在搭建Hadoop+Hive架構(gòu)上對(duì)網(wǎng)絡(luò)日志數(shù)據(jù)進(jìn)行統(tǒng)計(jì),包括類別訪問量、關(guān)鍵詞收索和每秒訪問量等。日志數(shù)據(jù)分布在5臺(tái)前端機(jī),后臺(tái)腳本根據(jù)時(shí)間戳將每小時(shí)同步傳過來的日志數(shù)據(jù)合并成一個(gè)日志文件,導(dǎo)入Hive系統(tǒng)。
3.1 數(shù)據(jù)導(dǎo)入
由于Hive只支持單字符的分隔符如”\001”,所以在數(shù)據(jù)導(dǎo)入期必須把網(wǎng)絡(luò)日記數(shù)據(jù)的分隔符替換成”\001”。通過自定義函數(shù)進(jìn)行格式化:
public boolean next(LongWritable key, BytesWritable value)
throws IOException {
while ( reader .next(key, text ) ) {
String strReplace = text .toString().toLowerCase().replace( "@$_$@" , "\001" );
Text txtReplace = new Text();
txtReplace.set(strReplace );
value.set(txtReplace.getBytes(), 0, txtReplace.getLength());
return true ; }
return false ;}
轉(zhuǎn)換好格式之后,使用hive都提供了“ local ”關(guān)鍵字,將數(shù)據(jù)導(dǎo)入到hive。
3.2 數(shù)據(jù)處理:編寫hql語句進(jìn)行數(shù)據(jù)統(tǒng)計(jì)
(1)創(chuàng)建表格keyword_2014,將統(tǒng)計(jì)每個(gè)關(guān)鍵詞的搜索量結(jié)構(gòu)傳入該表格
create table keyword_2014 as select keyword,count(keyword) as count from searchlog_20140403 group by keyword order by count desc;
(2)創(chuàng)建表格device_2014,將統(tǒng)計(jì)每類用戶終端的搜索量存入該表格
create table device_2014 as select device,count(device) as count from searchlog_20140403 group by device order by count desc;
(3)創(chuàng)建表 time_2014,將統(tǒng)計(jì)每秒訪問量 TPS存入該表
insert overwrite table time_20140403 select time,count(time) as count from searchlog_20140403 group by time order by count desc;
(4)計(jì)算每個(gè)搜索請(qǐng)求響應(yīng)時(shí)間的最大值,最小值和平均值
insert overwrite table response_20140403 select max(responsetime) as max,min(responsetime) as min,avg(responsetime) as avg from searchlog_20140403;
(5)創(chuàng)建一個(gè)表用于存放今天與昨天的關(guān)鍵詞搜索量和增量及其增量比率create external table if not exists keyword_20140404_20140403(keyword string, count int, increment int, incrementrate double)
(6)統(tǒng)計(jì)兩天關(guān)鍵詞統(tǒng)計(jì)結(jié)果兩個(gè)表keyword_20140404,keyword_20140403,其數(shù)據(jù)文件內(nèi)容將為 XML 格式。
insert overwrite table keyword_20140404_20140403 select cur.keyword, cur.count, cur.count-yes.count as increment, (cur.count-yes.count)/yes.count as incrementrate from keyword_20140404 cur join keyword_20140403 yes on (cur.keyword = yes.keyword) order by incrementrate desc;
3.3 統(tǒng)計(jì)結(jié)果以XML格式輸出,借助XmlResultOutputFormat 格式化成 XML 文件
public void write(Writable w) throws IOException {
String[] strFields = ((Text)w).toString().split("\001");
StringBuffer sbXml = new StringBuffer();
if ( strResultType .equals( "keyword" )) {
sbXml.append( "
"
"
"