蘇樹鵬
摘 要 在校園信息化過程中,傳統的業務平臺升級方法復雜,硬件成本太高,軟硬件利用率低等缺點,本文在云計算基礎上構建用于處理海量數據的數字校園倉庫系統。該系統基于Hadoop+Hive框架實現對海量數據的并行處理,降低系統開發復雜度,提高高效性。
關鍵詞 云計算 海量數據 Hadoop Map-Reduce Hive
中圖分類號:TP315 文獻標識碼: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
隨著以云計算、物聯網等為代表的新型信息技術的不斷涌現,校園信息化過程中各系統產生結構化以及非結構化海量數據,傳統業務平臺的數據倉庫已無法滿足需求,構建新的大數據存儲及并行處理、分析的架構應運而生。Hadoop是利用廉價的集群設備進行計算大規模數據的分布式平臺,其主要特點高效率、可靠、擴展能力強。本文基于Hadoop 和Hive 構建數字校園的數據倉庫,快速對數字校園不斷膨脹的數據進行處理和分析,為各部門提供有價值的業務決策。
1 Hadoop與Hive
1.1 Hadoop
Hadoop是由Apache公司開發的開源分布式存儲和計算系統,其由兩大核心部件組成:HDFS(Hadoop Distributed File System)和M/R(Map/Reduce),HDFS是存儲系統,存儲文件會被分割成多個文件塊,每個文件塊被分配存儲到HDFS數據節點上,且會根據配置通過復制文件塊來保證數據的安全性。M/R用于大規模數據集的并行運算模型。一個作業通常會把輸入的數據集切分為若干獨立的數據塊,M/R把數據塊分發給集群的節點進行Map任務計算,節點會周期性向主節點報告完成的工作和狀態,如果節點存在故障,主節點把數據分發到其他節點完成計算。框架把Map的輸出的結果交給Reduce任務,作業整個計算過程的數據都存儲在HDFS中,框架負責任務的調度和監控。
1.2 Hive
Hive是基于Hadoop的開源數據倉庫工具,提供了一套類數據庫的數據存儲和處理機制,用于存儲和處理海量結構化數據,它把海量數據存儲于Hadoop文件系統,Hive提供了完整的sql查詢功能,將用戶編寫的SQL語句進行解析和轉換,最終生成一系列基于Hadoop的map/reduce任務,通過執行這些任務完成數據處理。Hive 擁有元數據存儲,主要用于存儲模式和統計信息,這些在數據探索,查詢優化和查詢編譯中很有作用。
2 基于Hadoop和Hive數據倉庫
2.1 Hive的特性
(1)靈活的存儲引擎。Hive沒有固定的數據存儲格式,用戶可以自由組織Hive中的表,加載數據的過程中,不需要進行數據格式的轉換,只需告訴Hive數據中的列分隔符和行分隔符,Hive就可以解析數據。所以Hive加載數據只需將數據內容復制到相應的HDFS目錄中。(2)高效執行引擎。Hive的編譯器對源代碼進行語法分析、語義分析并生成目標代碼生成,Hive基于MapReduce,Hive的Sort和GroupBy都依賴MapReduce,而 MapReduce相當于固化了執行算子,Map的MergeSort必須執行,GroupBy算子只有一種模式,Reduce的Merge-Sort也必須選。(3)容錯機制。Hive的執行計劃在MapReduce框架上以作業的方式執行,每個作業的中間結果文件寫到本地磁盤,最終輸出文件寫到HDFS文件系統,利用HDFS的多副本機制來保證數據的可靠性,從而達到作業的容錯性。如果在作業執行過程中某節點出現故障,那么Hive執行計劃基本不會受到影響。因此,基于Hive實現的數據倉庫可以部署在由普通機器構建的分布式集群之上。(4)可視化。Hive的可視化界面基本屬于字符終端,用戶的技術水平一般比較高。面向不同的應用和用戶,提供個性化的可視化展現,是Hive改進的一個重要方向。個性化的可視化也可以理解為用戶群體的分層,例如,圖形界面方式提供初級用戶,簡單語言方式提供中級用戶,復雜程序方式提供高級用戶。
2.2 基于Hadoop與Hive的數據倉庫架構
系統的數據倉庫架構如下圖1所示,各業務系統的數據通過ETL導入HDFS 中。Hive構架基于Hadoop平臺上,Hive的Driver將HiveQL聲明傳遞給編譯器進行標準解析,類型檢查和語義分析,然后編譯器生成一個邏輯計劃且進行優化,最后,將優化后的DAG形式的Map/Reduce任務使用M/R按照依賴順序執行任務,快速地將數據反饋給上層的應用。
圖1 基于Hadoop 與Hadoop 的數據倉庫架構
3 Hive在數字校園的數據倉庫中的應用
本文在搭建Hadoop+Hive架構上對網絡日志數據進行統計,包括類別訪問量、關鍵詞收索和每秒訪問量等。日志數據分布在5臺前端機,后臺腳本根據時間戳將每小時同步傳過來的日志數據合并成一個日志文件,導入Hive系統。
3.1 數據導入
由于Hive只支持單字符的分隔符如”\001”,所以在數據導入期必須把網絡日記數據的分隔符替換成”\001”。通過自定義函數進行格式化:
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 ;}
轉換好格式之后,使用hive都提供了“ local ”關鍵字,將數據導入到hive。
3.2 數據處理:編寫hql語句進行數據統計
(1)創建表格keyword_2014,將統計每個關鍵詞的搜索量結構傳入該表格
create table keyword_2014 as select keyword,count(keyword) as count from searchlog_20140403 group by keyword order by count desc;
(2)創建表格device_2014,將統計每類用戶終端的搜索量存入該表格
create table device_2014 as select device,count(device) as count from searchlog_20140403 group by device order by count desc;
(3)創建表 time_2014,將統計每秒訪問量 TPS存入該表
insert overwrite table time_20140403 select time,count(time) as count from searchlog_20140403 group by time order by count desc;
(4)計算每個搜索請求響應時間的最大值,最小值和平均值
insert overwrite table response_20140403 select max(responsetime) as max,min(responsetime) as min,avg(responsetime) as avg from searchlog_20140403;
(5)創建一個表用于存放今天與昨天的關鍵詞搜索量和增量及其增量比率create external table if not exists keyword_20140404_20140403(keyword string, count int, increment int, incrementrate double)
(6)統計兩天關鍵詞統計結果兩個表keyword_20140404,keyword_20140403,其數據文件內容將為 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 統計結果以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( "
"
"
"