蘇翔宇 朱愛群
摘要:Hadoop作為開源組織Apache的一個(gè)分布式計(jì)算開源框架,可高效的對(duì)海量數(shù)據(jù)進(jìn)行運(yùn)算和處理,可以應(yīng)對(duì)互聯(lián)網(wǎng)上數(shù)以千萬計(jì)的并發(fā)處理和訪問,但其不支持?jǐn)?shù)據(jù)的實(shí)時(shí)讀寫和修改。Cassandra是一款面向列的功能強(qiáng)大的Key-Value分布式數(shù)據(jù)庫系統(tǒng),具有良好的實(shí)時(shí)讀寫性能和可擴(kuò)展性,但缺乏對(duì)海量數(shù)據(jù)進(jìn)行分析運(yùn)算的能力。將Hadoop與Cassandra結(jié)合起來,取長(zhǎng)補(bǔ)短,就能為云計(jì)算模型的實(shí)施提供一個(gè)高效的切實(shí)可行的方案。該文首先闡述了Hadoop整合Cassandra處理海量數(shù)據(jù)的必要性,然后提出了具體的整合方案和實(shí)現(xiàn),最后總結(jié)了Hadoop整合Cassandra所遇到的主要問題。
關(guān)鍵詞:鍵值;云計(jì)算;集群
中圖分類號(hào):TP311 文獻(xiàn)標(biāo)識(shí)碼:A 文章編號(hào):1009-3044(2013)07-1491-03
在當(dāng)今這個(gè)信息爆炸的時(shí)代,互聯(lián)網(wǎng)上的數(shù)據(jù)訪問量正以幾何級(jí)數(shù)的速度增長(zhǎng),提高對(duì)海量數(shù)據(jù)的訪問和處理的需求變得日益迫切。“云計(jì)算”技術(shù)的出現(xiàn)使得快捷高效完成TB乃至PB級(jí)的數(shù)據(jù)挖掘成為可能。Google公司以Map/Reduce為基礎(chǔ),結(jié)合GFS、Bigtable已經(jīng)成為全球互聯(lián)網(wǎng)搜索引擎的翹楚,而Google取得成功的關(guān)鍵恰恰是因?yàn)槠涫亲钤缫彩亲畛晒Φ摹霸朴?jì)算”理念的實(shí)踐者,但Google公司出于技術(shù)保護(hù)并沒有開放其云計(jì)算模型的實(shí)現(xiàn)細(xì)節(jié)。
Hadoop作為Apache組織中一個(gè)專注于DFS和Map/Reduce的開源項(xiàng)目,完成了對(duì)Google的MapReduce編程模型、GFS分布式文件系統(tǒng)等云計(jì)算模型核心技術(shù)的開源實(shí)現(xiàn),使得全球數(shù)以萬計(jì)的開發(fā)者和眾多實(shí)力雄厚的軟件廠商開啟了基于Hadoop研發(fā)“云計(jì)算”模型和應(yīng)用的技術(shù)浪潮。
1 Hadoop整合Cassandra的必要性
1.1 Hadoop的特性
Hadoop是Apache開源組織的一個(gè)能夠?qū)π辛繑?shù)據(jù)進(jìn)行分布式處理的軟件框架,源于Lucene和Nutch兩個(gè)開源項(xiàng)目,其核心技術(shù)是Map/Reduce和HDFS,分別是對(duì)Google的MapReduce和GFS的開源實(shí)現(xiàn)?;贖adoop可以輕松的編寫可處理海量數(shù)據(jù)的分布式并行程序,并將其運(yùn)行于由成百上千個(gè)節(jié)點(diǎn)組成的大規(guī)模計(jì)算機(jī)集群上。
Hadoop的主要特性包括:
1)Hadoop的Map/Reduce能夠運(yùn)行在由數(shù)量龐大的商用服務(wù)器組成的大型集群上,可對(duì)TB級(jí)數(shù)據(jù)以可靠容錯(cuò)的方式進(jìn)行復(fù)雜分析運(yùn)算和并行處理。
2)Hadoop的分布式文件系統(tǒng)HDFS是一個(gè)具有高度容錯(cuò)性能的系統(tǒng),它不但具有良好的錯(cuò)誤檢測(cè)功能還可以快速自動(dòng)的進(jìn)行數(shù)據(jù)恢復(fù)。HDFS被設(shè)計(jì)可以存取TB級(jí)的數(shù)據(jù),適合部署在由大量廉價(jià)計(jì)算機(jī)所組成的大規(guī)模集群上。
Hadoop的主要缺點(diǎn)是其雖然擁有自己的分布式文件系統(tǒng)HDFS,但HDFS的實(shí)時(shí)讀寫性能較差,在并發(fā)性和可擴(kuò)展性方面也較為欠缺,這就使得長(zhǎng)于運(yùn)算能力的Hadoop迫切的需要找到一個(gè)能夠很好的支持并發(fā)處理并且擁有良好的實(shí)時(shí)存取能力和可擴(kuò)展性的數(shù)據(jù)存儲(chǔ)系統(tǒng)。
1.2 Cassandra的特性
Cassandra最初是由Facebook開發(fā)的一套開源的分布式鍵值數(shù)據(jù)庫系統(tǒng),它同時(shí)具備了Google BigTable的數(shù)據(jù)模型和Amazon Dynamo的完全分布式架構(gòu),具有良好的可擴(kuò)展性,目前被很多大型的Web2.0網(wǎng)站所使用,是一種流行的分布式結(jié)構(gòu)化數(shù)據(jù)存儲(chǔ)方案。
Cassandra的主要特性包括:
(1)數(shù)據(jù)具備最終一致性,集群整體的可用性高。
(2)分層數(shù)據(jù)壓縮,能夠有效地減少數(shù)據(jù)體積,同時(shí)也能減少磁盤I/O。
(3)高可用、可擴(kuò)展,無中心節(jié)點(diǎn)設(shè)計(jì)使得單點(diǎn)故障不影響集群服務(wù),集群性能可線性擴(kuò)展。
Cassandra的主要缺點(diǎn)是其雖然支持Map/Reduce計(jì)算,但自身并沒有包含Map/Reduce功能,因此也就不具備自己對(duì)數(shù)據(jù)進(jìn)行復(fù)雜分析運(yùn)算的能力,需要借助于其他分布式計(jì)算工具才可以。
1.3 Hadoop與Cassandra取長(zhǎng)補(bǔ)短
Cassandra是一個(gè)功能非常強(qiáng)大的海量數(shù)據(jù)存儲(chǔ)系統(tǒng),但它的劣勢(shì)是缺乏對(duì)海量數(shù)據(jù)進(jìn)行分析的能力,而Hadoop雖然提供了海量存儲(chǔ)的能力,但是數(shù)據(jù)存儲(chǔ)的特點(diǎn)是一次寫入、多次讀取,不支持?jǐn)?shù)據(jù)的修改,因此無法實(shí)現(xiàn)實(shí)時(shí)讀寫。所以,可以將Cassandra存儲(chǔ)的能力與Hadoop Map/Reduce計(jì)算的能力進(jìn)行整合。Cassandra提供底層的存儲(chǔ),支持?jǐn)?shù)據(jù)的實(shí)時(shí)讀寫,Hadoop提供批量計(jì)算的能力,將Cassandra中的數(shù)據(jù)批量加載到mapper和reducer中進(jìn)行計(jì)算,得出最終的結(jié)果。
2 Hadoop整合Cassandra實(shí)施方案
Hadoop整合Cassandra就是兩者互相取長(zhǎng)補(bǔ)短的過程,即將Hadoop Map/Reduce的計(jì)算能力和Cassandra的存儲(chǔ)能力進(jìn)行結(jié)合。具體實(shí)施方案可以概括為,先將待處理的海量非結(jié)構(gòu)化數(shù)據(jù)通過Hadoop Map/Reduce導(dǎo)入到Key-Value數(shù)據(jù)庫Cassandra中,以實(shí)現(xiàn)數(shù)據(jù)的實(shí)時(shí)存取,解決Hadoop的HDFS存儲(chǔ)能力欠缺的問題;然后,當(dāng)需要對(duì)海量非結(jié)構(gòu)化數(shù)據(jù)進(jìn)行數(shù)據(jù)分析時(shí)再將Cassandra中存儲(chǔ)的數(shù)據(jù)作為輸入通過Hadoop Map/Reduce進(jìn)行計(jì)算得出結(jié)果。這樣一來既發(fā)揮了Hadoop與Cassandra各自的優(yōu)勢(shì),又摒棄了二者的不足,從而相得益彰。
2.1使用Map/Reduce將Hadoop海量數(shù)據(jù)導(dǎo)入Cassandra中
通過Map/Reduce程序,可以將Hadoop分布式文件系統(tǒng)中的海量文件批量導(dǎo)入Cassandra中以實(shí)現(xiàn)實(shí)時(shí)存取。例如某通信系統(tǒng)需要記錄每個(gè)客戶的通話時(shí)長(zhǎng),所以客戶的通話時(shí)長(zhǎng)(以秒為單位)數(shù)據(jù)實(shí)時(shí)寫入Cassandra系統(tǒng)中,并且數(shù)據(jù)分析人員可以在任意時(shí)刻啟動(dòng)Map/Reduce分析程序,從Cassandra中讀取客戶的通話時(shí)長(zhǎng)數(shù)據(jù)進(jìn)行統(tǒng)計(jì)分析。
通信系統(tǒng)按照客戶某天某一小時(shí)劃分,客戶通信記錄文件CallRecord.txt文件格式如下:
18023509018 - 800
數(shù)據(jù)文件CallRecord.txt的每一行中,“–”符號(hào)前是客戶使用的手機(jī)號(hào),“–”符號(hào)后是客戶使用該手機(jī)號(hào)的通話時(shí)長(zhǎng)。存儲(chǔ)呼叫者通話時(shí)長(zhǎng)的ColumnFamily可以采用Standard類型,Column排序規(guī)則為TimeUUIDType,Row的key為呼叫者的手機(jī)號(hào)碼,Column的值為通話時(shí)長(zhǎng)。
Cassandra默認(rèn)的ColumnFamily在Cassandra/conf/schema.example.txt文件中定義,也可自定義ColumnFamily即在Cassandra/conf目錄下新建schema.txt,內(nèi)容如下:
create keyspace MyKeyspace1
with replication_factor = 1 …
2.1.1 編寫Map/Reduce程序
根據(jù)需求,在map過程中需要拆分CallRecord.txt文件中的數(shù)據(jù),提取出呼叫者的手機(jī)號(hào)碼和對(duì)應(yīng)通話時(shí)長(zhǎng)。在map完成之后,關(guān)閉Thrift客戶端,釋放占用的資源。以下是MapReduce程序CallRecord.java的代碼組成:
1)編寫mapper函數(shù)
在mapper中,需要先初始化Thrift客戶端,設(shè)置使用的Keyspace,以將數(shù)據(jù)寫入Cassandra服務(wù)器中,實(shí)現(xiàn)邏輯如下:
tr.open();
cassandraClient.setKeyspace(“MyKeyspace1”);
初始化Thrift客戶端后,在mapper函數(shù)中拆分輸入數(shù)據(jù),找出呼叫者手機(jī)號(hào)碼和對(duì)應(yīng)通話時(shí)長(zhǎng),構(gòu)建需要插入Cassandra的Column,實(shí)現(xiàn)邏輯如下:
cassandraClient.insert(
ByteBuffer.wrap(mobileNum.getBytes(“utf-8”)),cp,c,ConsistencyLevel.ONE);
在mapper函數(shù)執(zhí)行完畢后,還需要將Thrift客戶端關(guān)閉,釋放占用資源。
super.close();
本程序只需編寫mapper函數(shù)即可,所以在Map/ Reduce程序的運(yùn)行設(shè)置中將Reduce的個(gè)數(shù)設(shè)置為0,這樣就不會(huì)執(zhí)行Reduce流程了。
conf.setNumReduceTasks(0);
2.1.2 打包運(yùn)行Map/Reduce程序
將CallRecord程序代碼打成JAR包,名為CallRecord.jar,入口類為CallRecord,然后就可以對(duì)以上這個(gè)Map/Reduce程序進(jìn)行測(cè)試了。
2.2 將Cassandra中的數(shù)據(jù)作為Map/Reduce輸入
當(dāng)需要對(duì)海量非結(jié)構(gòu)化數(shù)據(jù)進(jìn)行數(shù)據(jù)分析計(jì)算時(shí),可以使用Map/Reduce程序?qū)assandra中存儲(chǔ)的某個(gè)Keyspace下的Column中的所有數(shù)據(jù)作為Map/Reduce的數(shù)據(jù)輸入Hadoop,然后由Hadoop得出運(yùn)算結(jié)果。以下是MapReduce程序CallCount.java的代碼組成:
2.2.1 編寫Map/Reduce程序
1)編寫mapper函數(shù)
mapper函數(shù)中輸入的數(shù)據(jù)為Row的Key,以及該Key對(duì)應(yīng)的所有Column。在通話時(shí)長(zhǎng)的統(tǒng)計(jì)中,只需要關(guān)注每一個(gè)Column的Value即可。
2.2.2打包運(yùn)行Map/Reduce程序
將CallRecord程序代碼打成JAR包,名為CallCount.jar,入口類為CallCount,然后就可以對(duì)以上這個(gè)Map/Reduce程序進(jìn)行測(cè)試了
3 整合Hadoop與Cassandra所遇到的主要問題
3.1 數(shù)據(jù)傳輸速率降低造成網(wǎng)絡(luò)阻塞
當(dāng)數(shù)據(jù)達(dá)到海量級(jí)別的時(shí)候,應(yīng)用請(qǐng)求的運(yùn)算離它操作的數(shù)據(jù)越近效率就越高。因?yàn)檫@樣能降低網(wǎng)絡(luò)阻塞的影響,提高數(shù)據(jù)的傳輸速率和吞吐率。將運(yùn)算移動(dòng)到數(shù)據(jù)附近,比將數(shù)據(jù)移動(dòng)到應(yīng)用所在更好。整合Hadoop與Cassandra雖然解決了數(shù)據(jù)實(shí)時(shí)存取與分布式運(yùn)算分析的問題,但在二者之間的數(shù)據(jù)相互傳輸勢(shì)必會(huì)降低整體運(yùn)行的速率。
3.2 Hadoop與Cassandra版本兼容性問題
Hadoop與Cassandra的整合也會(huì)遇到各自不同的版本之間的兼容性問題。例如:Cassandra 0.6.X默認(rèn)只能與Hadoop0.20.X進(jìn)行整合,與Hadoop0.19.X整合就要修改Cassandra的源代碼支持才可以。
4 結(jié)束語
“云計(jì)算”時(shí)代的到來將勢(shì)必改變互聯(lián)網(wǎng)的服務(wù)運(yùn)營(yíng)模式,甚至是對(duì)整個(gè)IT領(lǐng)域的發(fā)展產(chǎn)生廣泛深遠(yuǎn)的影響。在云計(jì)算技術(shù)浪潮席卷全球的今天,無論對(duì)于微軟、谷歌之類的IT巨頭還是廣大的中小軟件企業(yè),這都是一個(gè)拓寬自身發(fā)展空間的絕佳機(jī)會(huì)。Hadoop作為當(dāng)今分布式計(jì)算領(lǐng)域最為成功的開源框架,與可靠性和可擴(kuò)展性俱佳的Cassandra鍵值數(shù)據(jù)庫相結(jié)合,發(fā)揮各自在分析計(jì)算與海量存取方面的優(yōu)勢(shì),將為在開源領(lǐng)域部署云計(jì)算應(yīng)用開創(chuàng)一種全新的切實(shí)有效的技術(shù)模式。
參考文獻(xiàn):
[1] 鄧倩妮,陳全.云計(jì)算及其關(guān)鍵技術(shù)[J].高性能計(jì)算與發(fā)展應(yīng)用,2009,1(26):2-6.
[2] 蘇翔宇. Key-Value數(shù)據(jù)庫及其應(yīng)用研究[J].電腦知識(shí)與技術(shù),2012.
[3] 劉鵬.實(shí)戰(zhàn)Hadoop:開啟通向云計(jì)算的捷徑[M].北京:電子工業(yè)出版社,2011:240-269.
[4] 郭鵬.Cassandra實(shí)戰(zhàn)[M].北京:機(jī)械工業(yè)出版社, 2011:123-145.