蔣煥亮
摘 要: 隨著電商平臺、門戶網站的訪問量越來越大,產生的日志信息也越來越多,傳統的日志文件處理方法無法滿足需求。通過分析Hadoop分布式文件系統(HDFS)、并行計算框架MapReduce和數據倉庫Hive技術特點,研究日志倉庫的體系結構及關鍵技術并建立日志數據倉庫。與數據庫相比,數據處理效率顯著提升。
關鍵詞: 日志; 數據倉庫; MapReduce; Hive
中圖分類號:TP393 文獻標志碼:A 文章編號:1006-8228(2016)11-21-04
Establishment of Web logs data warehouses based on Hive
Jiang Huanliang
(Shaoxing Vocational&Technical College, Shaoxing, Zhejiang 312000, China)
Abstract: With the amount of access to the web-portal and electronic business platform more and more, the related Web logs is steadily increasing and the traditional Web logs file is unable to meet the requirements. The Web logs data warehouse is finally established by analyzing the technical characteristics of HDFS, MapReduce and Hive, and studying the architecture and key technology of logs data warehouse. Compared with the database, the data processing efficiency is significantly improved.
Key words: Web logs; data warehouses; MapReduce; Hive
0 引言
隨著電商平臺、門戶網站的訪問量越來越大,產生的日志信息也越來越多,傳統的日志文件存儲和日志處理難于滿足要求。Web訪問日志中包含了大量的用戶行為信息,如訪問信息、瀏覽信息、購買信息、偏好、關注點等。通過對日志的處理,并進行用戶行為建模,可以得到有價值的信息,如用戶的屬性信息、用戶標簽、用戶興趣愛好、購買意向、再對這些用戶的信息進行聚類,劃分用戶集,為Web個性化應用提供服務[1]。因此,日志文件的存儲和處理具有非常重要的意義。
1 相關技術
1.1 hadoop技術
Hadoop系統運行于一個由普通服務器組成的計算集群,集群的主控節點控制和管理集群的正常工作、協調管理集群中從節點的數據存儲和數據計算,每個節點均具數據存儲和數據計算兩種功能。Hadoop分布式文件系統(Hadoop Distributed File System,HDFS)負責控制和管理的主控節點是NameNode,而每個具體負責存儲的從節點是DataNode。數據存儲節點DataNode和計算機節點TaskTracker會設置在同一物理的從節點服務器上。為了能進行并行化計算,Hadoop提供了MapReduce并行計算框架,該框架能有效管理和調度整個集群中的節點來完成并行化程序的執行和數據處理,負責管理和調度整個集群進行計算的主控節點成為JobTracker,而每個負責具體的數據計算的是從節點TaskTracker。JobTracker和NameNode設置在同一物理的主控服務器上,但系統規模較大則可分開設置 [2]。Hadoop分布式存儲與并行計算框架如圖1所示。
HDFS提供的大規模數據分布式存儲管理系統具有可擴展、高可靠、高可用特性,采用多副本的數據冗余存儲機制,并提供了有效的數據出錯檢查和數據恢復機制,大大提高數據冗余存儲的可靠性[2]。
MapReduce并行計算框架將負責調度和分配計算資源,劃分和輸入數據,調度程序執行,監控程序執行狀態,并負責程序執行時各計算節點的同步以及中間結果的收集整理,程序執行流程如圖2,分Map和Reduce兩階段并行處理。TaskTracker節點從HDFS讀取數據,InputFormat負責讀取數據輸入格式,然后數據劃分多個分片(Split),RecoredREader讀取每個分片交,轉換成Key-Value鍵值對,然后交由Map處理,Map所輸出的數據進行分區(Partitioner)后,發送到合適的Reduce節點,Reduce節點完成計算后經OutPutFormat輸出格式處理,最終將輸出數據寫回到HDFS[3]。
1.2 hive技術
Hive是基于Hadoop的開源數據倉庫,分析查詢結構化的海量數據,Hive執行與SQL類似的HiveQL語句,具有選擇、插入、合并、子查詢、分析等功能。Hive與關系數據相似,支持數據庫、表和視圖等。通過命令行界面和java數據庫編程連接數據庫。HiveQL可以擺脫復雜的MapReduce程序設計,將中心放在數據分析、業務需求上[4]。Hive架構如圖3所示。
2 日志倉庫體系結構
2.1 體系結構
從架構上看,基于Hive的日志數據倉庫有用戶接口層(Client)、數據分析層和數據存儲及處理層構成,如圖4所示。具體功能如下[5]。
用戶接口層:負責接收用戶輸入指令,并將指令發送到Hive引擎進行處理。用戶層接口包括數據庫方法編程接口(JDBC)、命令行接口(Command—Line Interface,CLI)。
數據分析層:包含元數據存儲層(Metostore)、Hive驅動(Driver)、編譯器(compiler)、執行引擎(Execution Engine)組建,主要功能:存儲、數據轉換、會話處理、查詢獲取、執行驅動、HiveQL編譯、HiveQL語言分析、執行計劃、優化、數據查詢等執行操作。
數據存儲及處理層:存儲數據并從數據分析層(Hive引擎)接收指令,通過HDFS、MapReduce實現數據處理。日志數據倉庫關鍵技術如下。
2.2 按時間劃分表
按時間劃分表是一種模式,即在表中加入時間戳。日志數據會隨時間不斷增加,按時間創建表(如按天劃分表),實現時間順序存儲日志[2]。如:
Hive>create table weblogs_2016_08_28(id int,….);
Hive>select * from weblogs_2016_08_28
>union all
>select * from weblogs_2016_08_29;
當Hive查詢分區表時,通過where子句中的表達式來選擇查詢所需的指定分區,查詢執行效率高。
Hive>select * from weblogs where day>=
20160828 and day<=20160830;
2.3 分區與分區裁剪
Hive通過分區表來提高數據庫性能,可以從一個數據源產生多個數據聚合,減少遍歷時間,對于大的數據輸入集,處理數據時間效率顯著[6]。數據以字段進行分片存儲。當查詢的where子句中包含此分區字段時,只查詢與where條件匹配的表分區范圍內的數據,減少掃描的數據量而提高查詢速度[2]。如:
Hive>CREATE TABLE WEBLOGS2016_08_26
(ID INT, ……)
>PARTITION BY(day STRING, ……);
Hive>INSERT OVER TABLE WEBLOGS2016_08_26
>PARTITION (day='20160826', ……);
數據寫入時,Hive不分析數據內容,需手工指定存儲分區。數據倉庫將按日期數據存儲在同一目錄中。
當需要對目標表的某一區域內的數據進行分析而不要涉及其他區域時,使用分區裁剪,將目標區域以條件形式存放在HiveQL中,如執行SELECT * FROM WEBLOGS WHERE DATE='20160826'查詢時,Hive將直接指向所需目錄,而不是對表中的所有數據進行遍歷。
2.4 分桶表數據
分區提供一個隔離數據和優化數據查詢的便利方式,但是并非所有的數據集都可以形成合理的分區,如按天劃分分區,每天的日志量并不一定一樣,要確定合適劃分大小分區是非常困難。
分桶是將數據集處理成更容易管理的技術。為了取樣更高效和更好的查詢處理效率,Hive可以將表組織桶(Bucket)。桶是通過對指定列進行哈希計算來實現,并使每個桶對應于列名下的一個存儲文件。如表的一級分區是日期(day),二級分區是性別,有可能會產生過多的小分區,而Hive的動態分區數量上是有限的。如:對表進行分桶,并使用用戶id字段作為分桶字段,則字段值會根據用戶指定的值進行哈希分發到桶中。同一用戶id的日志會存儲在同一個桶內。一個桶可能會包含多個用戶記錄。
Hive>SET hive.enforce.bucketing = true ;
Hive>CREATE TABLE WEBLOG (user_id INT, ……)
>PARTITION BY (day STRING, ……)
>CLUSTERED BY (user_id ) INTO 20 BUCKETS;
分桶的數量是固定的,沒有數量變化,桶對于抽樣非常合適。若兩個表都以用戶id進行分桶,hive可以創建邏輯上正確的抽樣,并對map-side JOIN執行效率提升[2]。
3 日志倉庫構建
實驗采用虛擬環境測試,物理機和虛擬機配置如下:物理機處理器是Intel(R) Core (TM) i7-4500u 1.8GHz,內存4.0GB,操作系統是Windows 8。虛擬機采用VMware Workstation,Master和Slave節點均使用Centos6,Hadoop-2.5.1,JDK1.7.0,Kafka_0.13.1。
啟動Hadoop集群,打開Hive客戶端創建數據庫、外部表和分區表并灌入數據,如下是創建分區數據表。
Hive>CREATE DATABASE weblogs;
Hive>CREATE EXTERNAL TABLE
weblogs_20160826_partition (
uid STRING,
…… )
COMMENT 'This is the weblogs search data by partition'
PARTITIONED BY (
year INT,
month INT,
day INT,
hour IN T,
)
CLUSTERED BY (user_id ) INTO 20 BUCKETS;
ROW FORMAT DELIMITED
FIELDS TERMINATED BY '\t'
STORED AS TEXTFILE;
Hive日志倉庫與MySQL數據庫相比,在數據量較少的情況下,插入和查詢時間效率相似,當數據量較大時(5000萬行),MySQL的select進程killed,而Hive日志倉庫能高效查詢。測試結果如表1。
4 結束語
本文根據Hadoop和Hive的特點,利用分時、分區和分桶技術,設計并實現了基于Hive 的日志數據倉庫。實驗表明,在Hive上構建日志數據倉庫是可行且性能良好,特別是當數據量較大時,數據操作性能明顯提高。基于hive的數據倉庫可用于離線數據的處理,但對于實時數據處理還需進一步研究。
參考文獻(Reference):
[1] 江三鋒,王元亮.基于Hive的海量Web日志分析系統設計研
究[J].軟件,2015.4(36):93-96.
[2] 黃宜華,苗凱翔.深入理解大數據[M].機械工業出版社,2014.
[3] Tansel Dokeroglu, Serkan Ozal, Murat Ali Bayir. Improving
the performance of Hadoop Hive by sharing scan and computation tasks[J]. Journal of Cloud Computing,2014.3:1-12
[4] 王德文,肖凱,肖磊.基于Hive的電力設備狀態胸襲數據倉庫[J].
電力系統保護與控制,2011.9(41):125-130
[5] 王德文,肖凱,肖磊.基于Hive的電力設備狀態胸襲數據倉庫[J].
電力系統保護與控制,2011.9(41):125-130
[6] 卡普廖洛,萬普勒,盧森格.Hive編程指南[M].人民郵電出版
社,2013.