馬延超+王超+李尚同
摘要: 隨著大數(shù)據(jù)時(shí)代的來(lái)臨,網(wǎng)絡(luò)數(shù)據(jù)呈現(xiàn)爆炸式增長(zhǎng),IDC數(shù)據(jù)表明,全球企業(yè)數(shù)據(jù)正以62%的速度逐年增長(zhǎng),大量數(shù)據(jù)當(dāng)中隱藏著巨大的商業(yè)價(jià)值,引起了企業(yè)的廣泛關(guān)注。然而,大數(shù)據(jù)給數(shù)據(jù)的同步、存儲(chǔ)、和數(shù)據(jù)統(tǒng)計(jì)分析帶來(lái)了一定的問(wèn)題和困難。本文旨在實(shí)現(xiàn)基于大數(shù)據(jù)技術(shù)的日志統(tǒng)計(jì)分析系統(tǒng),解決了現(xiàn)有的工具逐漸無(wú)法有效的處理大量數(shù)據(jù)的問(wèn)題。 本文在對(duì)此系統(tǒng)進(jìn)行需求分析的基礎(chǔ)上,設(shè)計(jì)了以多個(gè)分布式集群為基礎(chǔ),數(shù)據(jù)源層、存儲(chǔ)層、計(jì)算層相互融合的體系結(jié)構(gòu),設(shè)計(jì)并實(shí)現(xiàn)了日志數(shù)據(jù)轉(zhuǎn)碼、日志傳輸、自動(dòng)識(shí)別新文件的產(chǎn)生、日志存儲(chǔ)、數(shù)據(jù)查詢的功能。日志數(shù)據(jù)轉(zhuǎn)碼對(duì)于GBK格式編碼的日志進(jìn)行格式轉(zhuǎn)換;日志傳輸提供數(shù)據(jù)從不同終端到儲(chǔ)存系統(tǒng)的數(shù)據(jù)收集、聚合和移動(dòng),以便模擬生產(chǎn)環(huán)境中數(shù)據(jù)實(shí)時(shí)產(chǎn)生的過(guò)程;自動(dòng)識(shí)別新文件的產(chǎn)生,不同模塊之間完成通信加載數(shù)據(jù)功能。本文綜合使用了大數(shù)據(jù)生態(tài)圈的各種開(kāi)源技術(shù),包括Hadoop、Flume NG、Kfaka、Sqoop、Hive、MySQL。從日志數(shù)據(jù)的收集同步,到日志的存儲(chǔ)和計(jì)算分析,到最終分析結(jié)果的查詢,涵蓋了使用大數(shù)據(jù)技術(shù)進(jìn)行日志統(tǒng)計(jì)分析的典型流程。本文使用開(kāi)發(fā)語(yǔ)言Java和shell腳本語(yǔ)言,開(kāi)發(fā)工具為IntelliJ IDEA,VIM。在多臺(tái)CentOS6.5機(jī)器之上搭建集群,進(jìn)行分布式存儲(chǔ)和計(jì)算。用戶通過(guò)統(tǒng)計(jì)分析系統(tǒng)進(jìn)行日志同步、傳輸、任務(wù)提交和調(diào)度、結(jié)果查詢等操作。
關(guān)鍵詞:大數(shù)據(jù);網(wǎng)絡(luò)數(shù)據(jù);日志統(tǒng)計(jì)分析;流程自動(dòng)化
中圖分類號(hào):TP311 文獻(xiàn)標(biāo)志碼:A 文章編號(hào):1009-3044(2016)34-0009-03
1 概述
搜索引擎的日志文件是由使用者的搜索行為產(chǎn)生的,是對(duì)用戶在終端行為的一種記錄。通過(guò)對(duì)日志文件的分析可以獲得很多有價(jià)值的數(shù)據(jù),可以對(duì)不同用戶的個(gè)性進(jìn)行更加全面的分析,實(shí)現(xiàn)更加個(gè)性化的推薦方案。隨著時(shí)間的推移,網(wǎng)站的用戶訪問(wèn)量快速增長(zhǎng),搜索引擎產(chǎn)生的日志數(shù)據(jù)快速增長(zhǎng)。傳統(tǒng)的日志分析方式已經(jīng)無(wú)法滿足大數(shù)據(jù)量日志分析的需求,使用大數(shù)據(jù)技術(shù)可以為日志分析設(shè)計(jì)一整套自動(dòng)化流程包括從數(shù)據(jù)采集,傳輸,存儲(chǔ),計(jì)算和查詢,這種方式可以使得數(shù)據(jù)的處理過(guò)程更加高效。
2 集群概述
本系統(tǒng)為了模擬真實(shí)線上搜索日志產(chǎn)生的情況,使用腳本語(yǔ)言模擬連續(xù)生成的日志數(shù)據(jù),通過(guò)Flume集群進(jìn)行實(shí)時(shí)的采集。Flume采集到數(shù)據(jù)之后,使用Kafka集群對(duì)數(shù)據(jù)進(jìn)行消費(fèi),將數(shù)據(jù)先存入到HDFS文件系統(tǒng)中。搭建Hive集群使用HQL語(yǔ)句對(duì)數(shù)據(jù)進(jìn)行過(guò)濾分析。使用Sqoop工具把Hive中的數(shù)據(jù)導(dǎo)入到MySQL提供實(shí)時(shí)查詢。
目標(biāo)日志是由搜狗實(shí)驗(yàn)室提供的用戶查詢?nèi)罩?。下面是訪問(wèn)日志中一條典型記錄:
00:00:01 0014362172758659586 [明星合成] 64 21 link.44box.com/
這行內(nèi)容由6項(xiàng)構(gòu)成:1)訪問(wèn)時(shí)間。2)用戶ID。3)查詢?cè)~。4)該URL在返回結(jié)果中的排名。5)用戶點(diǎn)擊的順序號(hào)。6)用戶點(diǎn)擊的URL。其中,用戶ID是根據(jù)用戶使用瀏覽器訪問(wèn)搜索引擎時(shí)的Cookie信息自動(dòng)賦值,即同一次使用瀏覽器輸入的不同查詢對(duì)應(yīng)同一個(gè)用戶ID。
3 系統(tǒng)的設(shè)計(jì)與實(shí)現(xiàn)
3.1 系統(tǒng)的基本目標(biāo)
利用分布式的架構(gòu)對(duì)模擬生產(chǎn)環(huán)境下實(shí)時(shí)產(chǎn)生的用戶查詢?nèi)罩具M(jìn)行采集,傳輸和存儲(chǔ),按查詢過(guò)濾條件對(duì)日志數(shù)據(jù)進(jìn)行分析。
3.2 集群部署
3.2.1 Hadoop部署
圖1介紹了Hadoop集群部署的架構(gòu),包含一個(gè)主控節(jié)點(diǎn)namenode和兩個(gè)從節(jié)點(diǎn)datanode。namenode主要職責(zé)是跟蹤文件如何被分割成文件塊、文件塊又被哪些節(jié)點(diǎn)存儲(chǔ)、以及分布式文件系統(tǒng)的整體運(yùn)行狀態(tài)是否正常等工作。ResourceManager負(fù)責(zé)集群中所有資源的統(tǒng)一管理和分配,它接收來(lái)自各個(gè)節(jié)點(diǎn)(NodeManager)的資源匯報(bào)信息,并把這些信息按照一定的策略分配給各個(gè)應(yīng)用程序。SecondaryNamenode定時(shí)查詢namenode節(jié)點(diǎn)中集群?jiǎn)?dòng)時(shí)對(duì)文件系統(tǒng)的改動(dòng)序列,并保持同步;然后將得到的信息更新到namenode節(jié)點(diǎn)文件系統(tǒng)快照文件中。Nodemanager管理Hadoop集群中單個(gè)計(jì)算節(jié)點(diǎn),包括與ResourceManager保持通信,監(jiān)督任務(wù)的生命周期管理,監(jiān)控每個(gè)任務(wù)的資源使用,追蹤節(jié)點(diǎn)健康狀況,管理日志和不同應(yīng)用程序用到的附屬服務(wù)。
3.2.2 Flume部署
Flume本身不限制Agent中Source、Channel和Sink的數(shù)量。因此Flume Source可以接收事件,并可以通過(guò)配置將事件復(fù)制到多個(gè)目的地。如圖2所示,可以將事件發(fā)送到多個(gè)Kafka終端,進(jìn)行分布式的處理過(guò)程。
3.2.3 Kafka部署
圖3介紹了Kafka集群部署的基本架構(gòu),Producer稱為消息的發(fā)送者,而消息接收者稱為Consumer。Kafka集群由多個(gè)實(shí)例組成,每個(gè)節(jié)點(diǎn)稱為broker,對(duì)消息保存時(shí)根據(jù)Topic進(jìn)行歸類,為了加快讀取速度,多個(gè)comsumer劃分為一個(gè)組,并行消費(fèi)一個(gè)topic。Kafka集群中通過(guò)Zookeeper管理集群配置,選舉leader,以及在Consumer Group發(fā)生變化時(shí)進(jìn)行rebalance。
3.3 日志數(shù)據(jù)的HDFS存儲(chǔ)
圖4展示了HDFS的工作原理。當(dāng)用戶查詢?nèi)罩具M(jìn)入集群時(shí),HDFS Client負(fù)責(zé)切分文件,與NameNode交互,獲取文件位置信息;與DataNode交互,讀取和寫入數(shù)據(jù)。NameNode是m主節(jié)點(diǎn),管理HDFS的名稱空間和數(shù)據(jù)塊映射信息,配置副本策略,處理客戶端請(qǐng)求。Datanode是從節(jié)點(diǎn),存儲(chǔ)實(shí)際的數(shù)據(jù),匯報(bào)存儲(chǔ)信息給NmaeNode。Secodary NameNode輔助NameNode分擔(dān)其工作量;定期合并fsimage和fsedits,推送給NameNode;緊急情況下,可輔助恢復(fù)NameNode。
3.4 日志采集與傳輸
3.4.1 模擬產(chǎn)生日志
通過(guò)shell腳本模擬生產(chǎn)環(huán)境下日志產(chǎn)生過(guò)程,實(shí)現(xiàn)原理是把已經(jīng)存在的搜狗用戶查詢?nèi)罩緝?nèi)容重定向到另一個(gè)文件中,利用時(shí)間字符串定義初始文件的名字,將日志按照一定的時(shí)間間隔進(jìn)行傳輸。
3.4.2 文件到Kafka
文件傳輸?shù)終afka的過(guò)程使用Flume實(shí)現(xiàn)。Flume的配置文件中使用SpoolDirectorySource實(shí)現(xiàn),定義type為spooldir,指定數(shù)據(jù)輸入路徑spoolDir,實(shí)現(xiàn)文件輸入。本文使用的搜狗用戶查詢?nèi)罩静捎肎BK編碼格式,通過(guò)修改SpoolDirectorySourceConfigurationConstants參數(shù),定義InputCharset配置項(xiàng)為GBK,實(shí)現(xiàn)GBK編碼格式的文件輸入。Flume的source端輸出使用OutputCharset配置項(xiàng)定義文件輸出格式。從Flumed的Source傳輸?shù)紺hannel時(shí),為了使日志按時(shí)間格式顯示文件名,本文通過(guò)將文件名信息傳遞到Kafka由其依據(jù)名稱生成目標(biāo)目錄的方式實(shí)現(xiàn);利用Flume的event中的header傳遞文件名信息時(shí),定義鍵值目錄結(jié)構(gòu)為a/b/c;相關(guān)的配置項(xiàng)為fileHeader和fileHeaderKey;定義fileHeaderKey的值為Key。最終實(shí)現(xiàn)帶著目錄結(jié)構(gòu)的數(shù)據(jù)文件緩存到Kafka。
3.4.3 Kafka到hdfs
Kafka到hdfs數(shù)據(jù)的持久化,本文通過(guò)自定義Kafka Consumer來(lái)實(shí)現(xiàn)。通過(guò)獲取消息體中每條消息的Key,獲取日期字符串;然后將數(shù)據(jù)存入相應(yīng)位置。文件傳輸完畢之后重命名為.Done結(jié)尾,作為文件傳輸完畢的識(shí)別標(biāo)志。定義輸出流時(shí)開(kāi)啟獨(dú)立的線程將內(nèi)存中的數(shù)據(jù)刷寫到hdfs,減少數(shù)據(jù)的丟失實(shí)現(xiàn)數(shù)據(jù)在hdfs的固化。
3.4.4 Hdfs到Hive
hdfs數(shù)據(jù)傳入到Hive。實(shí)現(xiàn)方法是定義輸入文件路徑和指定hive table兩個(gè)參數(shù),取出輸入目錄下結(jié)尾是.Done的文件,解析出時(shí)間參數(shù)加載到Hive。
3.5 日志分析系統(tǒng)流程
圖5展示了整個(gè)日志分析系統(tǒng)流程。日志采集以及傳輸使用Flume+Kafka的方式。Flume設(shè)計(jì)思想是是數(shù)據(jù)的多樣性、數(shù)據(jù)來(lái)源的多樣性、數(shù)據(jù)流向的多樣性;Kafka設(shè)計(jì)目標(biāo)是高吞吐量、高負(fù)載(topic下可以有多個(gè)partition);所以在日志分析系統(tǒng)使用Flume+Kafka架構(gòu)可以使系統(tǒng)更加高效,保證高性能。存儲(chǔ)使用HDFS實(shí)現(xiàn),實(shí)現(xiàn)分布式存儲(chǔ)目的;查詢使用Hive中的HQL語(yǔ)句,HQL語(yǔ)句查詢過(guò)程是以mapreduce的方式實(shí)現(xiàn)。Sqoop具有數(shù)據(jù)傳遞的功能,利用Sqoop的特性將Hive中的數(shù)據(jù)導(dǎo)入MySQL實(shí)現(xiàn)SQL語(yǔ)句的實(shí)時(shí)查詢。
4 結(jié)果分析
圖6展示了數(shù)據(jù)在各個(gè)階段的情況。下圖分為六個(gè)部分,第一部分展示了模擬實(shí)時(shí)產(chǎn)生172萬(wàn)條搜索日志數(shù)據(jù)進(jìn)入系統(tǒng)的情況;第二部分展示了日志數(shù)據(jù)通過(guò)Flume收集進(jìn)入Kafka;第三部分展示了Kafka開(kāi)始消費(fèi)日志數(shù)據(jù),并且將數(shù)據(jù)加載到hdfs;第四部分展示了數(shù)據(jù)從hdfs加載到Hive;第五部分展示了日志數(shù)據(jù)文件加載到hdfs之后存儲(chǔ)的目錄結(jié)構(gòu);第六部分展示了使用HQL語(yǔ)句完成查詢的功能。整個(gè)系統(tǒng)啟動(dòng)之后172萬(wàn)條實(shí)時(shí)產(chǎn)生的日志數(shù)據(jù)的采集、傳輸、進(jìn)入存儲(chǔ)系統(tǒng)等過(guò)程自動(dòng)開(kāi)始運(yùn)行,對(duì)于大量數(shù)據(jù)的采集、傳輸、與存儲(chǔ)進(jìn)行了分布式高效的處理,達(dá)到了本文研究的目的。
5 小結(jié)
大數(shù)據(jù)技術(shù)受到全世界開(kāi)源社區(qū)的熱烈支持,發(fā)展的越來(lái)越成熟,在未來(lái)的優(yōu)勢(shì)越來(lái)越明顯。用大數(shù)據(jù)技術(shù)能很方便地在廉價(jià)機(jī)器上實(shí)現(xiàn)分布式數(shù)據(jù)處理架構(gòu),多個(gè)系統(tǒng)之間可以很好地協(xié)同工作,體現(xiàn)了系統(tǒng)協(xié)作與互聯(lián)、經(jīng)濟(jì)性、性能和可伸縮性、容錯(cuò)性等很多方面的優(yōu)點(diǎn)。以本文實(shí)例為基礎(chǔ)可以進(jìn)一步進(jìn)行拓展,對(duì)大數(shù)據(jù)任務(wù)進(jìn)行更深入和詳細(xì)的分析和探索,為各個(gè)領(lǐng)域的大數(shù)據(jù)處理提供參考。
參考文獻(xiàn):
[1] 陳森博,陳張杰.基于Hadoop集群的日志分析系統(tǒng)的設(shè)計(jì)與實(shí)現(xiàn)[J].電腦知識(shí)與技術(shù),2013,9(34): 7647-7650.
[2] Tom White.Hadoop權(quán)威指南[M].北京:清華大學(xué)出版社,2015.
[3] Hari Shreedharan.Flume構(gòu)建高可用、可擴(kuò)展的海量日志采集系統(tǒng)[M].北京:電子工業(yè)出版社,2015.
[4] Edward Capriolo,Dean Wampler,Jason Rutherglen .Hive編程指南[M].北京:人民郵電出版社,2013.
[5] Jonathan R Owens,Jon Lentz,Brian Femiano .Hadoop實(shí)戰(zhàn)手冊(cè)[M].北京:人民郵電出版社2014.