2014-06-04 11:55 451人阅读 评论(0) 收藏 举报

1. 简介

参见《Hadoop in Action》P102 以及 《Hadoop实战(第2版)》(陆嘉恒)P69

2. 案例

网上大部分的说明仅仅是按照《Hadoop in Action》中的示例代码给出,这里是Hadoop0.20.2版本,在该版本中已经实现了BloomFilter。

案例文件如下:

customers.txt

1,Stephanie Leung,555-555-5555
    2,Edward Kim,123-456-7890
    3,Jose Madriz,281-330-8004
    4,David Stork,408-555-0000

-----------------------------------------------------------------

orders.txt

3,A,12.95,02-Jun-2008
    1,B,88.25,20-May-2008
    2,C,32.00,30-Nov-2007
    3,D,25.02,22-Jan-2009
    5,E,34.59,05-Jan-2010
    6,F,28.67,16-Jan-2008
    7,G,49.82,24-Jan-2009

两个文件通过customer ID关联。

3. 代码

  1. import java.io.BufferedReader;
  2. import java.io.IOException;
  3. import java.io.InputStreamReader;
  4. import java.util.ArrayList;
  5. import org.apache.hadoop.conf.Configuration;
  6. import org.apache.hadoop.fs.FSDataInputStream;
  7. import org.apache.hadoop.fs.FileSystem;
  8. import org.apache.hadoop.fs.Path;
  9. import org.apache.hadoop.io.Text;
  10. import org.apache.hadoop.mapreduce.Job;
  11. import org.apache.hadoop.mapreduce.Mapper;
  12. import org.apache.hadoop.mapreduce.Reducer;
  13. import org.apache.hadoop.mapreduce.lib.input.FileInputFormat;
  14. import org.apache.hadoop.mapreduce.lib.input.FileSplit;
  15. import org.apache.hadoop.mapreduce.lib.input.TextInputFormat;
  16. import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;
  17. import org.apache.hadoop.mapreduce.lib.output.TextOutputFormat;
  18. import org.apache.hadoop.util.GenericOptionsParser;
  19. import org.apache.hadoop.util.bloom.BloomFilter;
  20. import org.apache.hadoop.util.bloom.Key;
  21. import org.apache.hadoop.util.hash.Hash;
  22. public class BloomMRMain {
  23. public static class BloomMapper extends Mapper<Object, Text, Text, Text> {
  24. BloomFilter bloomFilter = new BloomFilter(10000, 6, Hash.MURMUR_HASH);
  25. protected void setup(Context context) throws IOException ,InterruptedException {
  26. Configuration conf = context.getConfiguration();
  27. String path = "hdfs://localhost:9000/user/hezhixue/input/customers.txt";
  28. Path file = new Path(path);
  29. FileSystem hdfs = FileSystem.get(conf);
  30. FSDataInputStream dis = hdfs.open(file);
  31. BufferedReader reader = new BufferedReader(new InputStreamReader(dis));
  32. String temp;
  33. while ((temp = reader.readLine()) != null) {
  34. //              System.out.println("bloom filter temp:" + temp);
  35. String[] tokens = temp.split(",");
  36. if (tokens.length > 0) {
  37. bloomFilter.add(new Key(tokens[0].getBytes()));
  38. }
  39. }
  40. }
  41. protected void map(Object key, Text value, Context context) throws IOException ,InterruptedException {
  42. //获得文件输入路径
  43. String pathName = ((FileSplit) context.getInputSplit()).getPath().toString();
  44. if (pathName.contains("customers")) {
  45. String data = value.toString();
  46. String[] tokens = data.split(",");
  47. if (tokens.length == 3) {
  48. String outKey = tokens[0];
  49. String outVal = "0" + ":" + tokens[1] + "," + tokens[2];
  50. context.write(new Text(outKey), new Text(outVal));
  51. }
  52. } else if (pathName.contains("orders")) {
  53. String data = value.toString();
  54. String[] tokens = data.split(",");
  55. if (tokens.length == 4) {
  56. String outKey = tokens[0];
  57. System.out.println("in map and outKey:" + outKey);
  58. if (bloomFilter.membershipTest(new Key(outKey.getBytes()))) {
  59. String outVal = "1" + ":" + tokens[1] + "," + tokens[2]+ "," + tokens[3];
  60. context.write(new Text(outKey), new Text(outVal));
  61. }
  62. }
  63. }
  64. }
  65. }
  66. public static class BloomReducer extends Reducer<Text, Text, Text, Text> {
  67. ArrayList<Text> leftTable = new ArrayList<Text>();
  68. ArrayList<Text> rightTable = new ArrayList<Text>();
  69. protected void reduce(Text key, Iterable<Text> values, Context context) throws IOException ,InterruptedException {
  70. leftTable.clear();
  71. rightTable.clear();
  72. for (Text val : values) {
  73. String outVal = val.toString();
  74. System.out.println("key: " + key.toString() + " : " + outVal);
  75. int index = outVal.indexOf(":");
  76. String flag = outVal.substring(0, index);
  77. if ("0".equals(flag)) {
  78. leftTable.add(new Text(outVal.substring(index+1)));
  79. } else if ("1".equals(flag)) {
  80. rightTable.add(new Text(outVal.substring(index + 1)));
  81. }
  82. }
  83. if (leftTable.size() > 0 && rightTable.size() > 0) {
  84. for(Text left : leftTable) {
  85. for (Text right : rightTable) {
  86. context.write(key, new Text(left.toString() + "," + right.toString()));
  87. }
  88. }
  89. }
  90. }
  91. }
  92. public static void main(String[] args) throws Exception {
  93. Configuration conf = new Configuration();
  94. String[] otherArgs = new GenericOptionsParser(conf, args).getRemainingArgs();
  95. if (otherArgs.length != 2) {
  96. System.err.println("Usage: BloomMRMain <in> <out>");
  97. System.exit(2);
  98. }
  99. Job job = new Job(conf, "BloomMRMain");
  100. job.setJarByClass(BloomMRMain.class);
  101. job.setMapperClass(BloomMapper.class);
  102. job.setReducerClass(BloomReducer.class);
  103. job.setInputFormatClass(TextInputFormat.class);
  104. job.setOutputFormatClass(TextOutputFormat.class);
  105. job.setMapOutputKeyClass(Text.class);
  106. job.setMapOutputValueClass(Text.class);
  107. job.setOutputKeyClass(Text.class);
  108. job.setOutputValueClass(Text.class);
  109. FileInputFormat.addInputPath(job, new Path(otherArgs[0]));
  110. FileOutputFormat.setOutputPath(job, new Path(otherArgs[1]));
  111. System.exit(job.waitForCompletion(true) ? 0 : 1);
  112. }
  113. }

Hadoop Bloom filter应用示例的更多相关文章

  1. Hadoop Bloom Filter 使用

    1.Bloom Filter  默认的 BloomFilter filter =new BloomFilter(10,2,1); // 过滤器长度为10 ,用2哈希函数,MURMUR_HASH (1) ...

  2. Bloom Filter 原理与应用

    介绍 Bloom Filter是一种简单的节省空间的随机化的数据结构,支持用户查询的集合.一般我们使用STL的std::set, stdext::hash_set,std::set是用红黑树实现的,s ...

  3. Hadoop0.20.2 Bloom filter应用演示样例

    1. 简单介绍 參见<Hadoop in Action>P102 以及 <Hadoop实战(第2版)>(陆嘉恒)P69 2. 案例 网上大部分的说明不过依照<Hadoop ...

  4. Skip List & Bloom Filter

    Skip List | Set 1 (Introduction)   Can we search in a sorted linked list in better than O(n) time?Th ...

  5. Bloom Filter:海量数据的HashSet

    Bloom Filter一般用于数据的去重计算,近似于HashSet的功能:但是不同于Bitmap(用于精确计算),其为一种估算的数据结构,存在误判(false positive)的情况. 1. 基本 ...

  6. 探索C#之布隆过滤器(Bloom filter)

    阅读目录: 背景介绍 算法原理 误判率 BF改进 总结 背景介绍 Bloom filter(后面简称BF)是Bloom在1970年提出的二进制向量数据结构.通俗来说就是在大数据集合下高效判断某个成员是 ...

  7. Bloom Filter 布隆过滤器

    Bloom Filter 是由伯顿.布隆(Burton Bloom)在1970年提出的一种多hash函数映射的快速查找算法.它实际上是一个很长的二进制向量和一些列随机映射函数.应用在数据量很大的情况下 ...

  8. Bloom Filter学习

    参考文献: Bloom Filters - the math    http://pages.cs.wisc.edu/~cao/papers/summary-cache/node8.html    B ...

  9. 【转】探索C#之布隆过滤器(Bloom filter)

    原文:蘑菇先生,http://www.cnblogs.com/mushroom/p/4556801.html 背景介绍 Bloom filter(后面简称BF)是Bloom在1970年提出的二进制向量 ...

随机推荐

  1. spring源码学习之【准备】jdk动态代理例子

    一:被代理的对象所要实现的接口 package com.yeepay.testpoxy; import java.util.Map; /** * 被动态代理的接口 * @author shangxia ...

  2. 关于margin和padding的总结

    总结一下: 要想实现如(图一)效果,(即一个div中的子元素与父元素有间距): 如果类名为.middle的父元素没有写border,则类名为firstChild的子元素设置margin-top,会导致 ...

  3. C++静态存储,动态存储

    什么是静态存储,动态存储静态存储变量通常是在变量定义时就分定存储单元并一直保持不变, 直至整个程序结束. 动态存储变量是在程序执行过程中,使用它时才分配存储单元, 使用完毕立即释放.典型的例子是函数的 ...

  4. 如何使用投影看着备注分享自己的PPT

    1.  设置多屏幕 一般你的笔记本就是1,   投影是2 2. 设置幻灯片的放映方式 设置幻灯片显示于另外一个监视器  并勾选显示演示者视图 3.  点击放映 就会出现 左上角是ppt本身, 右上角是 ...

  5. ASP.NET MVC中的拦截器

    在ASP.NET MVC中,有三种拦截器:Action拦截器.Result拦截器和Exception拦截器, 所谓的拦截器也没有什么的,只是写一个类,继承另一个类和一个接口,顺便实现接口里面的方法而以 ...

  6. Apache 性能优化

    有一个升级服务器,这几天一直访问的比较慢.导致部分用户升级不了.看了一下服务器的负载,发现 CPU和内存占用的都不是很高,可能是Apache配置不当造成的,一番搜索,找到了MPM的配置,提速很明显哦 ...

  7. java找jar包、搜索class类 搜索maven

    sourceforge.net https://github.com/ http://www.findmaven.net/搜索class类 http://mvnrepository.com/

  8. java通过ftp和sftp上传war包上传到Linux服务器实现自动重启tomcat的脚本代码

    ar包自动上传Linux并且自动重启tomcat 用的是jdk1.7出的文件监控 支持ftp和sftp,支持多服务器负载等 配置好config 非maven项目导入直接使用 #\u76D1\u542C ...

  9. 常见的java 错误--转

    Java常见错误列表: 找不到符号(symbol) 类X是public的,应该被声明在名为X.java的文件中 缺失类.接口或枚举类型 缺失X 缺失标识符 非法的表达式开头 类型不兼容 非法的方法声明 ...

  10. Zabbix的安装与部署---问题处理(php65.6.28 mysqli 报错误 处理)

    1)php65.6.28  mysqli  报错误 处理 http://www.xiaochengfu.com/index.php/index/detail/aid/92.html 2)linux下p ...