MongoDB之Hadoop驱动介绍
来源:互联网 发布:淘宝手机端上传很模糊 编辑:程序博客网 时间:2024/05/20 06:52
MongoDB之Hadoop驱动介绍
------------------------1. 一些概念
Hadoop是一套Apache开源的分布式计算框架,其中包括了分布式文件系统DFS与分布式计算模型MapReduce,而MongoDB是一个面向文档的分布式数据库,它是NoSql的一种,而这里所要介绍的就是一个MongoDB的Hadoop驱动,这里就是把MongoDB作为MapReduce的输入源,充分利用MapReduce的优势来对MongoDB的数据进行处理与计算。2. MongoDB的Hadoop驱动
目前这个版本的Hadoop驱动还是测试版本,还不能应用到实际的生产环境中去。你可以从下面网址https://github.com/mongodb/mongo-hadoop下载到最新的驱动包,下面是它的一些依赖说明:
- 目前推荐用最新的Hadoop 0.20.203版本,或者是用Cloudera CHD3还做
- MongoDB的版本最好是用1.8+
- 还有是MongoDB的java驱动必须是2.5.3+
它的一些特点:
- 提供了一个Hadoop的Input和Output适配层,读于对数据的读入与写出
- 提供了大部分参数的可配置化,这些参数都可有XML配置文件来进行配置,你可以在配置文件中定义要查询的字段,查询条件,排序策略等
- 目前还不支持多Sharding的源数据读取
- 还不支持数据的split操作
3. 代码分析
运行其examples中的WordCount.java代码
// 事先在MongoDB的test数据库的in表中加入的测试样本,使用如下方法 /** * test.in db.in.insert( { x : "eliot was here" } ) db.in.insert( { x : * "eliot is here" } ) db.in.insert( { x : "who is here" } ) = */public class WordCount { private static final Log log = LogFactory.getLog( WordCount.class );// 这是一个Map操作 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 ); // 这里的key为词,而value为1 } } }// 这是Reduce操作,用于计算词出现的频率 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{// 计算词出现的频率,把相同词的value相加 int sum = 0; for ( final IntWritable val : values ) { sum += val.get(); } result.set( sum ); context.write( key, result ); // key为单个词,value为这个词所对应的词频率 } } public static void main( String[] args ) throws Exception{ final Configuration conf = new Configuration();// 定义MongoDB数据库的输入与输出表名,这里是调用本地的MongoDB,默认端口号为27017 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 );// 定义Mapper,Reduce与Combiner类 job.setMapperClass( TokenizerMapper.class ); job.setCombinerClass( IntSumReducer.class ); job.setReducerClass( IntSumReducer.class );// 定义Mapper与Reduce的输出key/value的类型 job.setOutputKeyClass( Text.class ); job.setOutputValueClass( IntWritable.class );// 定义InputFormat与OutputFormat的类型 job.setInputFormatClass( MongoInputFormat.class ); job.setOutputFormatClass( MongoOutputFormat.class ); System.exit( job.waitForCompletion( true ) ? 0 : 1 ); }}
4. 分块机制的简单介绍
这里没有实现对不同shard的split操作,也就是说,对于分布在不同shard上的数据,只会产生一个Map操作。这里本人提供了一个分片的思路,有兴趣的可以讨论一下。
我们知道,对于Collection分块后,会产生一个Config数据库,在这个数据库下有一个叫做chunks的表,其中每个chunk记录了start_row与end_row,而这些chunk可以分布在不同的shard上,我们可以通过分析这个Collection来得到每个shard上的chunk信息,从而把每个shard上的chunk信息组合成一个InputSplit,这就是这里的MongoInputSplit,这样的话,只要去修改MongoInputFormat这个类的getSplits这个方法,加入对chunks表的分析,得到shard的信息,这样就可以实现多split的Map操作,对于不同的Shard,每个Map都会调用本地的Mongos代理服务,这样就实现了移动计算而不是移动数据的目的。
这只是本人的一些想法,有兴趣的朋友可以一起来讨论一下。
下来我会发一个具体的实现。
5. 参考
* https://github.com/mongodb/mongo-hadoop* http://www.mongodb.org/display/DOCS/Java+Language+Center
- MongoDB之Hadoop驱动介绍
- MongoDB之Hadoop驱动介绍
- mongodb入门之mongodb介绍
- MongoDB系列之Java驱动
- hadoop之HDFS介绍
- Hadoop之HDFS介绍
- MongoDB之bson的介绍
- MongoDB之介绍和安装
- MongoDB之bson的介绍
- MongoDB之bson的介绍
- MongoDB程序开发之使用Java驱动
- MongoDB程序开发之使用Java驱动
- MongoDB- C# 驱动之增删改查
- Hadoop 之 Secondary Sort介绍
- Hadoop之map/reduce介绍
- hadoop mongodb
- android驱动开发之介绍
- 触摸屏驱动之概念介绍
- 工作中要主动
- 生活小贴士(1)
- SSH 整合-之jar包冲突
- 【转载】unicode编码转换
- Simple DirectShow Player for Windows Mobile
- MongoDB之Hadoop驱动介绍
- C++中的static
- 【转】【Android游戏开发十五】关于Android 游戏开发中 OnTouchEvent() 触屏事件的性能优化笔记!
- Parser Generator
- 调用系统组件:拨号程序
- vs2010调试启动慢
- 了解Github
- oracle 主键索引和unique 索引 和sql server 主键的异同
- 互联网IT巨头