Hadoop Bloom filter应用示例
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. 代码
- import java.io.BufferedReader;
- import java.io.IOException;
- import java.io.InputStreamReader;
- import java.util.ArrayList;
- import org.apache.hadoop.conf.Configuration;
- import org.apache.hadoop.fs.FSDataInputStream;
- import org.apache.hadoop.fs.FileSystem;
- import org.apache.hadoop.fs.Path;
- import org.apache.hadoop.io.Text;
- import org.apache.hadoop.mapreduce.Job;
- import org.apache.hadoop.mapreduce.Mapper;
- import org.apache.hadoop.mapreduce.Reducer;
- import org.apache.hadoop.mapreduce.lib.input.FileInputFormat;
- import org.apache.hadoop.mapreduce.lib.input.FileSplit;
- import org.apache.hadoop.mapreduce.lib.input.TextInputFormat;
- import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;
- import org.apache.hadoop.mapreduce.lib.output.TextOutputFormat;
- import org.apache.hadoop.util.GenericOptionsParser;
- import org.apache.hadoop.util.bloom.BloomFilter;
- import org.apache.hadoop.util.bloom.Key;
- import org.apache.hadoop.util.hash.Hash;
- public class BloomMRMain {
- public static class BloomMapper extends Mapper<Object, Text, Text, Text> {
- BloomFilter bloomFilter = new BloomFilter(10000, 6, Hash.MURMUR_HASH);
- protected void setup(Context context) throws IOException ,InterruptedException {
- Configuration conf = context.getConfiguration();
- String path = "hdfs://localhost:9000/user/hezhixue/input/customers.txt";
- Path file = new Path(path);
- FileSystem hdfs = FileSystem.get(conf);
- FSDataInputStream dis = hdfs.open(file);
- BufferedReader reader = new BufferedReader(new InputStreamReader(dis));
- String temp;
- while ((temp = reader.readLine()) != null) {
- // System.out.println("bloom filter temp:" + temp);
- String[] tokens = temp.split(",");
- if (tokens.length > 0) {
- bloomFilter.add(new Key(tokens[0].getBytes()));
- }
- }
- }
- protected void map(Object key, Text value, Context context) throws IOException ,InterruptedException {
- //获得文件输入路径
- String pathName = ((FileSplit) context.getInputSplit()).getPath().toString();
- if (pathName.contains("customers")) {
- String data = value.toString();
- String[] tokens = data.split(",");
- if (tokens.length == 3) {
- String outKey = tokens[0];
- String outVal = "0" + ":" + tokens[1] + "," + tokens[2];
- context.write(new Text(outKey), new Text(outVal));
- }
- } else if (pathName.contains("orders")) {
- String data = value.toString();
- String[] tokens = data.split(",");
- if (tokens.length == 4) {
- String outKey = tokens[0];
- System.out.println("in map and outKey:" + outKey);
- if (bloomFilter.membershipTest(new Key(outKey.getBytes()))) {
- String outVal = "1" + ":" + tokens[1] + "," + tokens[2]+ "," + tokens[3];
- context.write(new Text(outKey), new Text(outVal));
- }
- }
- }
- }
- }
- public static class BloomReducer extends Reducer<Text, Text, Text, Text> {
- ArrayList<Text> leftTable = new ArrayList<Text>();
- ArrayList<Text> rightTable = new ArrayList<Text>();
- protected void reduce(Text key, Iterable<Text> values, Context context) throws IOException ,InterruptedException {
- leftTable.clear();
- rightTable.clear();
- for (Text val : values) {
- String outVal = val.toString();
- System.out.println("key: " + key.toString() + " : " + outVal);
- int index = outVal.indexOf(":");
- String flag = outVal.substring(0, index);
- if ("0".equals(flag)) {
- leftTable.add(new Text(outVal.substring(index+1)));
- } else if ("1".equals(flag)) {
- rightTable.add(new Text(outVal.substring(index + 1)));
- }
- }
- if (leftTable.size() > 0 && rightTable.size() > 0) {
- for(Text left : leftTable) {
- for (Text right : rightTable) {
- context.write(key, new Text(left.toString() + "," + right.toString()));
- }
- }
- }
- }
- }
- public static void main(String[] args) throws Exception {
- Configuration conf = new Configuration();
- String[] otherArgs = new GenericOptionsParser(conf, args).getRemainingArgs();
- if (otherArgs.length != 2) {
- System.err.println("Usage: BloomMRMain <in> <out>");
- System.exit(2);
- }
- Job job = new Job(conf, "BloomMRMain");
- job.setJarByClass(BloomMRMain.class);
- job.setMapperClass(BloomMapper.class);
- job.setReducerClass(BloomReducer.class);
- job.setInputFormatClass(TextInputFormat.class);
- job.setOutputFormatClass(TextOutputFormat.class);
- job.setMapOutputKeyClass(Text.class);
- job.setMapOutputValueClass(Text.class);
- job.setOutputKeyClass(Text.class);
- job.setOutputValueClass(Text.class);
- FileInputFormat.addInputPath(job, new Path(otherArgs[0]));
- FileOutputFormat.setOutputPath(job, new Path(otherArgs[1]));
- System.exit(job.waitForCompletion(true) ? 0 : 1);
- }
- }
Hadoop Bloom filter应用示例的更多相关文章
- Hadoop Bloom Filter 使用
1.Bloom Filter 默认的 BloomFilter filter =new BloomFilter(10,2,1); // 过滤器长度为10 ,用2哈希函数,MURMUR_HASH (1) ...
- Bloom Filter 原理与应用
介绍 Bloom Filter是一种简单的节省空间的随机化的数据结构,支持用户查询的集合.一般我们使用STL的std::set, stdext::hash_set,std::set是用红黑树实现的,s ...
- Hadoop0.20.2 Bloom filter应用演示样例
1. 简单介绍 參见<Hadoop in Action>P102 以及 <Hadoop实战(第2版)>(陆嘉恒)P69 2. 案例 网上大部分的说明不过依照<Hadoop ...
- Skip List & Bloom Filter
Skip List | Set 1 (Introduction) Can we search in a sorted linked list in better than O(n) time?Th ...
- Bloom Filter:海量数据的HashSet
Bloom Filter一般用于数据的去重计算,近似于HashSet的功能:但是不同于Bitmap(用于精确计算),其为一种估算的数据结构,存在误判(false positive)的情况. 1. 基本 ...
- 探索C#之布隆过滤器(Bloom filter)
阅读目录: 背景介绍 算法原理 误判率 BF改进 总结 背景介绍 Bloom filter(后面简称BF)是Bloom在1970年提出的二进制向量数据结构.通俗来说就是在大数据集合下高效判断某个成员是 ...
- Bloom Filter 布隆过滤器
Bloom Filter 是由伯顿.布隆(Burton Bloom)在1970年提出的一种多hash函数映射的快速查找算法.它实际上是一个很长的二进制向量和一些列随机映射函数.应用在数据量很大的情况下 ...
- Bloom Filter学习
参考文献: Bloom Filters - the math http://pages.cs.wisc.edu/~cao/papers/summary-cache/node8.html B ...
- 【转】探索C#之布隆过滤器(Bloom filter)
原文:蘑菇先生,http://www.cnblogs.com/mushroom/p/4556801.html 背景介绍 Bloom filter(后面简称BF)是Bloom在1970年提出的二进制向量 ...
随机推荐
- kuangbin_ShortPath P (HDU 4725)
很有挑战的一题 直接暴力建图的话毫无疑问O(n^2)会TLE 每层虚拟一个点又会让没有点的层也能连过去 参考kuangbin菊苣的方法每层用了两个虚拟点 n+i*2-1 是入口 n+i*2 是出口 然 ...
- JAVA 线程池, 多线程
http://tutorials.jenkov.com/java-util-concurrent/executorservice.html http://howtodoinjava.com/core- ...
- Memory Barriers ,cache-coherency
http://www.rdrop.com/users/paulmck/scalability/paper/whymb.2010.07.23a.pdf Shared-Memory Synchroniza ...
- C++文件输入和输出
1.引入头文件fstreamfstream头文件定义了用于文件输入的类ifstream和文件输出的类ofstream 2.写文件1)创建一个ofstream对象来管理输出流2)将该对象与文件关联起来3 ...
- C++重载,重写,重定义
1.重载:重载是在一个类中,函数名一样,参数类型或参数个数不同的一系列函数需要注意的是,与返回类型无关. class Test { public: void show(); void show(int ...
- ASP.NET会话(Session)保存模式--终于知道session为什么丢失了
[原创]ASP.NET会话(Session)保存模式 作者:寒羽枫(cityhunter172) 大家好,已有四个多月没写东东啦.今日抽空就说一下 Session 在 .Net v1.0/v1.1 中 ...
- axure 母版 模板
axure的模板区域是非常重要的一个功能,网站的头部.尾部部分等很多页面同时用到的内容,都可以使用母版,因为在母版中只需要修改一次,就可以实现所有的页面更新,可以大大的加速原型的制作速度.需要重复理解 ...
- JS兼容IE浏览器的方法
背景 系统需要兼容蛋疼的IE6... 解决方案 *{ 兼容IE6-8 }* <!--[if lt IE 9]> <script src="@{'/public/mng/ja ...
- angular模板加载 ----ng-template
Angularjs作为mvc(或者说mvvm)框架,同样具备模板这一基本概念. NG加载模板的顺序为 内存加载---AJAX加载. 如果排版乱掉,请查阅https://www.zybuluo.com/ ...
- Android 常遇错误解决方案
遇到问题描述: 运行android程序控制台输出 [2012-07-18 16:18:26 - ] The connection to adb is down, and a severe error ...