生活随笔
收集整理的這篇文章主要介紹了
MongoDB之Hadoop驱动介绍
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
http://blog.csdn.net/amuseme_lu/article/details/6584661
MongoDB之Hadoop驅(qū)動介紹
------------------------
1. 一些概念
Hadoop是一套Apache開源的分布式計(jì)算框架,其中包括了分布式文件系統(tǒng)DFS與分布式計(jì)算模型MapReduce,而MongoDB是一個面向文檔的分布式數(shù)據(jù)庫,它是NoSql的一種,而這里所要介紹的就是一個MongoDB的Hadoop驅(qū)動,這里就是把MongoDB作為MapReduce的輸入源,充分利用MapReduce的優(yōu)勢來對MongoDB的數(shù)據(jù)進(jìn)行處理與計(jì)算。
2. MongoDB的Hadoop驅(qū)動
目前這個版本的Hadoop驅(qū)動還是測試版本,還不能應(yīng)用到實(shí)際的生產(chǎn)環(huán)境中去。
你可以從下面網(wǎng)址https://github.com/mongodb/mongo-hadoop下載到最新的驅(qū)動包,下面是它的一些依賴說明:
- 目前推薦用最新的Hadoop 0.20.203版本,或者是用Cloudera CHD3還做
- MongoDB的版本最好是用1.8+
- 還有是MongoDB的java驅(qū)動必須是2.5.3+
它的一些特點(diǎn):
- 提供了一個Hadoop的Input和Output適配層,讀于對數(shù)據(jù)的讀入與寫出
- 提供了大部分參數(shù)的可配置化,這些參數(shù)都可有XML配置文件來進(jìn)行配置,你可以在配置文件中定義要查詢的字段,查詢條件,排序策略等
目前還不支持的功能:
- 目前還不支持多Sharding的源數(shù)據(jù)讀取
- 還不支持?jǐn)?shù)據(jù)的split操作
3. 代碼分析
運(yùn)行其examples中的WordCount.java代碼
[java]?view plaincopy
?? ???? ? ? ?? ublic?class?WordCount?{?? ?? ?? ???private?static?final?Log?log?=?LogFactory.getLog(?WordCount.class?);?? ?? ?? ?? ???public?static?class?TokenizerMapper?extends?Mapper<Object,?BSONObject,?Text,?IntWritable>?{?? ?? ?? ???????private?final?static?IntWritable?one?=?new?IntWritable(?1?);?? ???????private?final?Text?word?=?new?Text();?? ?? ?? ???????public?void?map(?Object?key?,?BSONObject?value?,?Context?context?)?throws?IOException,?InterruptedException{?? ?? ?? ???????????System.out.println(?"key:?"?+?key?);?? ???????????System.out.println(?"value:?"?+?value?);?? ?? ?? ?????????? ???????????final?StringTokenizer?itr?=?new?StringTokenizer(?value.get(?"x"?).toString()?);?? ???????????while?(?itr.hasMoreTokens()?)?{?? ???????????????word.set(?itr.nextToken()?);?? ???????????????context.write(?word,?one?);??? ???????????}?? ???????}?? ???}?? ?? ?? ?? ???public?static?class?IntSumReducer?extends?Reducer<Text,?IntWritable,?Text,?IntWritable>?{?? ?? ?? ???????private?final?IntWritable?result?=?new?IntWritable();?? ?? ?? ???????public?void?reduce(?Text?key?,?Iterable<IntWritable>?values?,?Context?context?)?throws?IOException,?InterruptedException{?? ?? ?? ?????????? ???????????int?sum?=?0;?? ???????????for?(?final?IntWritable?val?:?values?)?{?? ???????????????sum?+=?val.get();?? ???????????}?? ???????????result.set(?sum?);?? ???????????context.write(?key,?result?);??? ???????}?? ???}?? ?? ?? ???public?static?void?main(?String[]?args?)?throws?Exception{?? ?? ?? ???????final?Configuration?conf?=?new?Configuration();?? ?????? ???????MongoConfigUtil.setInputURI(?conf,?"mongodb://localhost/test.in"?);?? ???????MongoConfigUtil.setOutputURI(?conf,?"mongodb://localhost/test.out"?);?? ???????System.out.println(?"Conf:?"?+?conf?);?? ?? ?? ???????final?Job?job?=?new?Job(?conf?,?"word?count"?);?? ?? ?? ???????job.setJarByClass(?WordCount.class?);?? ?? ?? ?????? ???????job.setMapperClass(?TokenizerMapper.class?);?? ?? ?? ???????job.setCombinerClass(?IntSumReducer.class?);?? ???????job.setReducerClass(?IntSumReducer.class?);?? ?? ?? ?????? ???????job.setOutputKeyClass(?Text.class?);?? ???????job.setOutputValueClass(?IntWritable.class?);?? ?? ?? ?????? ???????job.setInputFormatClass(?MongoInputFormat.class?);?? ???????job.setOutputFormatClass(?MongoOutputFormat.class?);?? ?? ?? ???????System.exit(?job.waitForCompletion(?true?)???0?:?1?);?? ???}?? ??????
4. 分塊機(jī)制的簡單介紹
這里沒有實(shí)現(xiàn)對不同shard的split操作,也就是說,對于分布在不同shard上的數(shù)據(jù),只會產(chǎn)生一個Map操作。
這里本人提供了一個分片的思路,有興趣的可以討論一下。
我們知道,對于Collection分塊后,會產(chǎn)生一個Config數(shù)據(jù)庫,在這個數(shù)據(jù)庫下有一個叫做chunks的表,其中每個chunk記錄了start_row與end_row,而這些chunk可以分布在不同的shard上,我們可以通過分析這個Collection來得到每個shard上的chunk信息,從而把每個shard上的chunk信息組合成一個InputSplit,這就是這里的MongoInputSplit,這樣的話,只要去修改MongoInputFormat這個類的getSplits這個方法,加入對chunks表的分析,得到shard的信息,這樣就可以實(shí)現(xiàn)多split的Map操作,對于不同的Shard,每個Map都會調(diào)用本地的Mongos代理服務(wù),這樣就實(shí)現(xiàn)了移動計(jì)算而不是移動數(shù)據(jù)的目的。
這只是本人的一些想法,有興趣的朋友可以一起來討論一下。
下來我會發(fā)一個具體的實(shí)現(xiàn)。
5. 參考
* https://github.com/mongodb/mongo-hadoop
* http://www.mongodb.org/display/DOCS/Java+Language+Center
http://www.cnblogs.com/end/archive/2012/08/10/2632335.html
總結(jié)
以上是生活随笔為你收集整理的MongoDB之Hadoop驱动介绍的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。