蔣煥亮
摘 要: 隨著電商平臺、門戶網(wǎng)站的訪問量越來越大,產(chǎn)生的日志信息也越來越多,傳統(tǒng)的日志文件處理方法無法滿足需求。通過分析Hadoop分布式文件系統(tǒng)(HDFS)、并行計算框架MapReduce和數(shù)據(jù)倉庫Hive技術(shù)特點,研究日志倉庫的體系結(jié)構(gòu)及關(guān)鍵技術(shù)并建立日志數(shù)據(jù)倉庫。與數(shù)據(jù)庫相比,數(shù)據(jù)處理效率顯著提升。
關(guān)鍵詞: 日志; 數(shù)據(jù)倉庫; MapReduce; Hive
中圖分類號:TP393 文獻標(biāo)志碼: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 引言
隨著電商平臺、門戶網(wǎng)站的訪問量越來越大,產(chǎn)生的日志信息也越來越多,傳統(tǒng)的日志文件存儲和日志處理難于滿足要求。Web訪問日志中包含了大量的用戶行為信息,如訪問信息、瀏覽信息、購買信息、偏好、關(guān)注點等。通過對日志的處理,并進行用戶行為建模,可以得到有價值的信息,如用戶的屬性信息、用戶標(biāo)簽、用戶興趣愛好、購買意向、再對這些用戶的信息進行聚類,劃分用戶集,為Web個性化應(yīng)用提供服務(wù)[1]。因此,日志文件的存儲和處理具有非常重要的意義。
1 相關(guān)技術(shù)
1.1 hadoop技術(shù)
Hadoop系統(tǒng)運行于一個由普通服務(wù)器組成的計算集群,集群的主控節(jié)點控制和管理集群的正常工作、協(xié)調(diào)管理集群中從節(jié)點的數(shù)據(jù)存儲和數(shù)據(jù)計算,每個節(jié)點均具數(shù)據(jù)存儲和數(shù)據(jù)計算兩種功能。Hadoop分布式文件系統(tǒng)(Hadoop Distributed File System,HDFS)負(fù)責(zé)控制和管理的主控節(jié)點是NameNode,而每個具體負(fù)責(zé)存儲的從節(jié)點是DataNode。數(shù)據(jù)存儲節(jié)點DataNode和計算機節(jié)點TaskTracker會設(shè)置在同一物理的從節(jié)點服務(wù)器上。為了能進行并行化計算,Hadoop提供了MapReduce并行計算框架,該框架能有效管理和調(diào)度整個集群中的節(jié)點來完成并行化程序的執(zhí)行和數(shù)據(jù)處理,負(fù)責(zé)管理和調(diào)度整個集群進行計算的主控節(jié)點成為JobTracker,而每個負(fù)責(zé)具體的數(shù)據(jù)計算的是從節(jié)點TaskTracker。JobTracker和NameNode設(shè)置在同一物理的主控服務(wù)器上,但系統(tǒng)規(guī)模較大則可分開設(shè)置 [2]。Hadoop分布式存儲與并行計算框架如圖1所示。
HDFS提供的大規(guī)模數(shù)據(jù)分布式存儲管理系統(tǒng)具有可擴展、高可靠、高可用特性,采用多副本的數(shù)據(jù)冗余存儲機制,并提供了有效的數(shù)據(jù)出錯檢查和數(shù)據(jù)恢復(fù)機制,大大提高數(shù)據(jù)冗余存儲的可靠性[2]。
MapReduce并行計算框架將負(fù)責(zé)調(diào)度和分配計算資源,劃分和輸入數(shù)據(jù),調(diào)度程序執(zhí)行,監(jiān)控程序執(zhí)行狀態(tài),并負(fù)責(zé)程序執(zhí)行時各計算節(jié)點的同步以及中間結(jié)果的收集整理,程序執(zhí)行流程如圖2,分Map和Reduce兩階段并行處理。TaskTracker節(jié)點從HDFS讀取數(shù)據(jù),InputFormat負(fù)責(zé)讀取數(shù)據(jù)輸入格式,然后數(shù)據(jù)劃分多個分片(Split),RecoredREader讀取每個分片交,轉(zhuǎn)換成Key-Value鍵值對,然后交由Map處理,Map所輸出的數(shù)據(jù)進行分區(qū)(Partitioner)后,發(fā)送到合適的Reduce節(jié)點,Reduce節(jié)點完成計算后經(jīng)OutPutFormat輸出格式處理,最終將輸出數(shù)據(jù)寫回到HDFS[3]。
1.2 hive技術(shù)
Hive是基于Hadoop的開源數(shù)據(jù)倉庫,分析查詢結(jié)構(gòu)化的海量數(shù)據(jù),Hive執(zhí)行與SQL類似的HiveQL語句,具有選擇、插入、合并、子查詢、分析等功能。Hive與關(guān)系數(shù)據(jù)相似,支持?jǐn)?shù)據(jù)庫、表和視圖等。通過命令行界面和java數(shù)據(jù)庫編程連接數(shù)據(jù)庫。HiveQL可以擺脫復(fù)雜的MapReduce程序設(shè)計,將中心放在數(shù)據(jù)分析、業(yè)務(wù)需求上[4]。Hive架構(gòu)如圖3所示。
2 日志倉庫體系結(jié)構(gòu)
2.1 體系結(jié)構(gòu)
從架構(gòu)上看,基于Hive的日志數(shù)據(jù)倉庫有用戶接口層(Client)、數(shù)據(jù)分析層和數(shù)據(jù)存儲及處理層構(gòu)成,如圖4所示。具體功能如下[5]。
用戶接口層:負(fù)責(zé)接收用戶輸入指令,并將指令發(fā)送到Hive引擎進行處理。用戶層接口包括數(shù)據(jù)庫方法編程接口(JDBC)、命令行接口(Command—Line Interface,CLI)。
數(shù)據(jù)分析層:包含元數(shù)據(jù)存儲層(Metostore)、Hive驅(qū)動(Driver)、編譯器(compiler)、執(zhí)行引擎(Execution Engine)組建,主要功能:存儲、數(shù)據(jù)轉(zhuǎn)換、會話處理、查詢獲取、執(zhí)行驅(qū)動、HiveQL編譯、HiveQL語言分析、執(zhí)行計劃、優(yōu)化、數(shù)據(jù)查詢等執(zhí)行操作。
數(shù)據(jù)存儲及處理層:存儲數(shù)據(jù)并從數(shù)據(jù)分析層(Hive引擎)接收指令,通過HDFS、MapReduce實現(xiàn)數(shù)據(jù)處理。日志數(shù)據(jù)倉庫關(guān)鍵技術(shù)如下。
2.2 按時間劃分表
按時間劃分表是一種模式,即在表中加入時間戳。日志數(shù)據(jù)會隨時間不斷增加,按時間創(chuàng)建表(如按天劃分表),實現(xiàn)時間順序存儲日志[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;
當(dāng)Hive查詢分區(qū)表時,通過where子句中的表達式來選擇查詢所需的指定分區(qū),查詢執(zhí)行效率高。
Hive>select * from weblogs where day>=
20160828 and day<=20160830;
2.3 分區(qū)與分區(qū)裁剪
Hive通過分區(qū)表來提高數(shù)據(jù)庫性能,可以從一個數(shù)據(jù)源產(chǎn)生多個數(shù)據(jù)聚合,減少遍歷時間,對于大的數(shù)據(jù)輸入集,處理數(shù)據(jù)時間效率顯著[6]。數(shù)據(jù)以字段進行分片存儲。當(dāng)查詢的where子句中包含此分區(qū)字段時,只查詢與where條件匹配的表分區(qū)范圍內(nèi)的數(shù)據(jù),減少掃描的數(shù)據(jù)量而提高查詢速度[2]。如:
Hive>CREATE TABLE WEBLOGS2016_08_26
(ID INT, ……)
>PARTITION BY(day STRING, ……);
Hive>INSERT OVER TABLE WEBLOGS2016_08_26
>PARTITION (day='20160826', ……);
數(shù)據(jù)寫入時,Hive不分析數(shù)據(jù)內(nèi)容,需手工指定存儲分區(qū)。數(shù)據(jù)倉庫將按日期數(shù)據(jù)存儲在同一目錄中。
當(dāng)需要對目標(biāo)表的某一區(qū)域內(nèi)的數(shù)據(jù)進行分析而不要涉及其他區(qū)域時,使用分區(qū)裁剪,將目標(biāo)區(qū)域以條件形式存放在HiveQL中,如執(zhí)行SELECT * FROM WEBLOGS WHERE DATE='20160826'查詢時,Hive將直接指向所需目錄,而不是對表中的所有數(shù)據(jù)進行遍歷。
2.4 分桶表數(shù)據(jù)
分區(qū)提供一個隔離數(shù)據(jù)和優(yōu)化數(shù)據(jù)查詢的便利方式,但是并非所有的數(shù)據(jù)集都可以形成合理的分區(qū),如按天劃分分區(qū),每天的日志量并不一定一樣,要確定合適劃分大小分區(qū)是非常困難。
分桶是將數(shù)據(jù)集處理成更容易管理的技術(shù)。為了取樣更高效和更好的查詢處理效率,Hive可以將表組織桶(Bucket)。桶是通過對指定列進行哈希計算來實現(xiàn),并使每個桶對應(yīng)于列名下的一個存儲文件。如表的一級分區(qū)是日期(day),二級分區(qū)是性別,有可能會產(chǎn)生過多的小分區(qū),而Hive的動態(tài)分區(qū)數(shù)量上是有限的。如:對表進行分桶,并使用用戶id字段作為分桶字段,則字段值會根據(jù)用戶指定的值進行哈希分發(fā)到桶中。同一用戶id的日志會存儲在同一個桶內(nèi)。一個桶可能會包含多個用戶記錄。
Hive>SET hive.enforce.bucketing = true ;
Hive>CREATE TABLE WEBLOG (user_id INT, ……)
>PARTITION BY (day STRING, ……)
>CLUSTERED BY (user_id ) INTO 20 BUCKETS;
分桶的數(shù)量是固定的,沒有數(shù)量變化,桶對于抽樣非常合適。若兩個表都以用戶id進行分桶,hive可以創(chuàng)建邏輯上正確的抽樣,并對map-side JOIN執(zhí)行效率提升[2]。
3 日志倉庫構(gòu)建
實驗采用虛擬環(huán)境測試,物理機和虛擬機配置如下:物理機處理器是Intel(R) Core (TM) i7-4500u 1.8GHz,內(nèi)存4.0GB,操作系統(tǒng)是Windows 8。虛擬機采用VMware Workstation,Master和Slave節(jié)點均使用Centos6,Hadoop-2.5.1,JDK1.7.0,Kafka_0.13.1。
啟動Hadoop集群,打開Hive客戶端創(chuàng)建數(shù)據(jù)庫、外部表和分區(qū)表并灌入數(shù)據(jù),如下是創(chuàng)建分區(qū)數(shù)據(jù)表。
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數(shù)據(jù)庫相比,在數(shù)據(jù)量較少的情況下,插入和查詢時間效率相似,當(dāng)數(shù)據(jù)量較大時(5000萬行),MySQL的select進程killed,而Hive日志倉庫能高效查詢。測試結(jié)果如表1。
4 結(jié)束語
本文根據(jù)Hadoop和Hive的特點,利用分時、分區(qū)和分桶技術(shù),設(shè)計并實現(xiàn)了基于Hive 的日志數(shù)據(jù)倉庫。實驗表明,在Hive上構(gòu)建日志數(shù)據(jù)倉庫是可行且性能良好,特別是當(dāng)數(shù)據(jù)量較大時,數(shù)據(jù)操作性能明顯提高。基于hive的數(shù)據(jù)倉庫可用于離線數(shù)據(jù)的處理,但對于實時數(shù)據(jù)處理還需進一步研究。
參考文獻(Reference):
[1] 江三鋒,王元亮.基于Hive的海量Web日志分析系統(tǒng)設(shè)計研
究[J].軟件,2015.4(36):93-96.
[2] 黃宜華,苗凱翔.深入理解大數(shù)據(jù)[M].機械工業(yè)出版社,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的電力設(shè)備狀態(tài)胸襲數(shù)據(jù)倉庫[J].
電力系統(tǒng)保護與控制,2011.9(41):125-130
[5] 王德文,肖凱,肖磊.基于Hive的電力設(shè)備狀態(tài)胸襲數(shù)據(jù)倉庫[J].
電力系統(tǒng)保護與控制,2011.9(41):125-130
[6] 卡普廖洛,萬普勒,盧森格.Hive編程指南[M].人民郵電出版
社,2013.