http://blog.csdn.net/amuseme_lu/article/details/6584661

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代码

[java] view plaincopy
  1. // 事先在MongoDB的test数据库的in表中加入的测试样本,使用如下方法
  2. /**
  3. * test.in db.in.insert( { x : "eliot was here" } ) db.in.insert( { x :
  4. * "eliot is here" } ) db.in.insert( { x : "who is here" } ) =
  5. */
  6. ublic class WordCount {
  7. private static final Log log = LogFactory.getLog( WordCount.class );
  8. // 这是一个Map操作
  9. public static class TokenizerMapper extends Mapper<Object, BSONObject, Text, IntWritable> {
  10. private final static IntWritable one = new IntWritable( 1 );
  11. private final Text word = new Text();
  12. public void map( Object key , BSONObject value , Context context ) throws IOException, InterruptedException{
  13. System.out.println( "key: " + key );
  14. System.out.println( "value: " + value );
  15. // 对词进行按空格切分
  16. final StringTokenizer itr = new StringTokenizer( value.get( "x" ).toString() );
  17. while ( itr.hasMoreTokens() ) {
  18. word.set( itr.nextToken() );
  19. context.write( word, one ); // 这里的key为词,而value为1
  20. }
  21. }
  22. }
  23. // 这是Reduce操作,用于计算词出现的频率
  24. public static class IntSumReducer extends Reducer<Text, IntWritable, Text, IntWritable> {
  25. private final IntWritable result = new IntWritable();
  26. public void reduce( Text key , Iterable<IntWritable> values , Context context ) throws IOException, InterruptedException{
  27. // 计算词出现的频率,把相同词的value相加
  28. int sum = 0;
  29. for ( final IntWritable val : values ) {
  30. sum += val.get();
  31. }
  32. result.set( sum );
  33. context.write( key, result ); // key为单个词,value为这个词所对应的词频率
  34. }
  35. }
  36. public static void main( String[] args ) throws Exception{
  37. final Configuration conf = new Configuration();
  38. // 定义MongoDB数据库的输入与输出表名,这里是调用本地的MongoDB,默认端口号为27017
  39. MongoConfigUtil.setInputURI( conf, "mongodb://localhost/test.in" );
  40. MongoConfigUtil.setOutputURI( conf, "mongodb://localhost/test.out" );
  41. System.out.println( "Conf: " + conf );
  42. final Job job = new Job( conf , "word count" );
  43. job.setJarByClass( WordCount.class );
  44. // 定义Mapper,Reduce与Combiner类
  45. job.setMapperClass( TokenizerMapper.class );
  46. job.setCombinerClass( IntSumReducer.class );
  47. job.setReducerClass( IntSumReducer.class );
  48. // 定义Mapper与Reduce的输出key/value的类型
  49. job.setOutputKeyClass( Text.class );
  50. job.setOutputValueClass( IntWritable.class );
  51. // 定义InputFormat与OutputFormat的类型
  52. job.setInputFormatClass( MongoInputFormat.class );
  53. job.setOutputFormatClass( MongoOutputFormat.class );
  54. System.exit( job.waitForCompletion( true ) ? 0 : 1 );
  55. }

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

http://www.cnblogs.com/end/archive/2012/08/10/2632335.html

MongoDB之Hadoop驱动介绍相关推荐

  1. 大数据和Hadoop平台介绍

    大数据和Hadoop平台介绍 定义 大数据是指其大小和复杂性无法通过现有常用的工具软件,以合理的成本,在可接受的时限内对其进行捕获.管理和处理的数据集.这些困难包括数据的收入.存储.搜索.共享.分析和 ...

  2. MongoDB之bson的介绍

    转自:https://blog.csdn.net/zengxiaosen/article/details/54908248 MongoDB之bson的介绍 1. 什么是bson BSON是一种类jso ...

  3. Hadoop端口介绍及各种启动命令列表

    Hadoop端口介绍 9000 namenode的常用端口 给机子 8020 namenode的RPC调用端口(接收Client连接的RPC端口,用于获取文件系统metadata信息) 50070 n ...

  4. Keyboard驱动介绍

     Keyboard驱动介绍 最近手里面没啥事,就想看看一些Driver的MDD层. 以前改过Keyboard Driver的PDD层,但是对它的MDD层还真是一片空白,这两天随便看了看Keyboard ...

  5. hadoop简单介绍_Hadoop:简单介绍

    hadoop简单介绍 什么是Hadoop: Hadoop是用Java编写的框架,用于在大型商品硬件群集上运行应用程序,并具有类似于Google File System和MapReduce的功能 . H ...

  6. MongoDB的Java驱动使用整理 (转)

    MongoDB Java Driver 简单操作  一.Java驱动一致性 MongoDB的Java驱动是线程安全的,对于一般的应用,只要一个Mongo实例即可,Mongo有个内置的连接池(池大小默认 ...

  7. Hadoop学习总结(1)——大数据以及Hadoop相关概念介绍

    一.大数据的基本概念 1.1.什么是大数据 大数据指的就是要处理的数据是TB级别以上的数据.大数据是以TB级别起步的.在计算机当中,存放到硬盘上面的文件都会占用一定的存储空间,例如: 文件占用的存储空 ...

  8. 04 ARM Mali-V VPU硬件视频编解码驱动介绍V61

    ARM Mali-V VPU硬件视频编解码驱动介绍V61 作者 将狼才鲸 创建日期 2022-12-13 CSDN文章地址:ARM Mali-V VPU硬件视频编解码驱动介绍V61 一.PC上的VPU ...

  9. 大数据以及Hadoop相关概念介绍

    一.大数据的基本概念 1.1.什么是大数据 大数据指的就是要处理的数据是TB级别以上的数据.大数据是以TB级别起步的.在计算机当中,存放到硬盘上面的文件都会占用一定的存储空间,例如: 文件占用的存储空 ...

最新文章

  1. python接口自动化5-Json数据处理
  2. KNN分类器之NearestNeighbors详解及实践
  3. 使 WebBrowser 更简单的新加和执行 js, 可安装 jQuery 脚本的 C# 开源代码 - IEBrowser [1]...
  4. 最小二乘法拟合非线性函数及其Matlab/Excel 实现(转)
  5. Linux 组合命令/命令组合的符号
  6. lua math.random()
  7. python分词统计词频_基于结巴分词做的全文分词统计词频小脚本
  8. mysql执行ref_MySql执行分析
  9. linux 类似winscp_联合使用winscp和putty管理你的linux远程机器
  10. 实战OO设计——类的关系:依赖、关联、聚合和组合
  11. python实现设计模式
  12. ClearCase的一些基本概念
  13. 低效程序员的9个坏习惯
  14. mysql hugepage_Linux配置HugePage
  15. SHA1WithRSA签名使用openssl 实现
  16. 信息学奥赛第十节 —— 贪心算法(渡河问题POJ 1700 Crossing River + 拦截导弹的系统数量求解)
  17. arm开发板与windows下的pjsip建立通话
  18. 一个程序员的奋斗历程(偶像程序员)
  19. ORB-SLAM2从理论到代码实现(十二):Frame类
  20. qq邮箱发送,mail from address must be same as authorization user

热门文章

  1. 【数字图像处理】五.MFC图像点运算之灰度线性变化、灰度非线性变化、阈值化和均衡化处理详解
  2. LeetCode Algorithm 268. 丢失的数字
  3. 《数据库原理与应用》(第三版)第 1 章 数据库概述 习题参考答案
  4. 《算法竞赛入门经典》 例题 4-4 信息编码 (Message Decoding,ACM,ICPC World Finals 1991,UVa 213)
  5. ubuntu 16.04 安装教程
  6. 【Qt】2D绘图之图形视图框架(一)
  7. java 过滤文件名_Java FileNameFilter过滤文件名
  8. OpenSSL(加密方式,加密算法,自签证书)
  9. Qt -- 非常详细的pro文件的语法说明
  10. 51nod 1021 石子归并 (动态规划 简单代码)