Partition类与布隆过滤器 报告人:蔡珉星 厦大数据库实验室 2014-08-02.

Slides:



Advertisements
Similar presentations
因数与倍数 2 、 5 的倍数的特征
Advertisements

3 的倍数特征 抢三十

3 的倍数的特征 的倍数有 : 。 5 的倍数有 : 。 既是 2 的倍数又是 5 的倍数有 : 。 12 , 18 , 20 , 48 , 60 , 72 , , 25 , 60 ,
2 和 5 的倍数的特征 运动热身 怎样找一个数的倍数? 从小到大写出 2 的倍数( 10 个): 写出 5 的倍数( 6 个) 2 , 4 , 6 , 8 , 10 , 12 , 14 , 16 , 18 , 20 5 , 10 , 15 , 20 , 25 , 30.
2 、 5 的倍数的特征 玉田百姓. 1 、在 2 、 3 、 5 、 8 、 10 、 12 、 25 、 40 这几个数中, 40 的因数有几个? 5 的倍数有几个? 复习: 2 、在 6 、 10 、 12 、 15 、 18 、 20 这几个数中,哪些数 是 2 的倍数?哪些数是 5 的倍数?
重庆市九龙坡区走马小学 邓华. 一、复习导入,揭示课题 下面哪些数是 2 的倍数?哪些数是 5 的倍数? 2,5的倍数的特征:只看个位上数就能进行判断。 2的倍数:个位上是0,2,4,6,8的数。
练一练: 在数轴上画出表示下列各数的点, 并指出这些点相互间的关系: -6 , 6 , -3 , 3 , -1.5, 1.5.
2 、 5 的倍数特征 集合 2 的倍数(要求) 在百数表上依次将 2 的倍数找出 并用红色的彩笔涂上颜色。
一、二阶行列式的引入 用消元法解二元线性方程组. 一、二阶行列式的引入 用消元法解二元线性方程组.
小学生游戏.
2-7、函数的微分 教学要求 教学要点.
C++中的声音处理 在传统Turbo C环境中,如果想用C语言控制电脑发声,可以用Sound函数。在VC6.6环境中如果想控制电脑发声则采用Beep函数。原型为: Beep(频率,持续时间) , 单位毫秒 暂停程序执行使用Sleep函数 Sleep(持续时间), 单位毫秒 引用这两个函数时,必须包含头文件
在PHP和MYSQL中实现完美的中文显示
Hadoop I/O By ShiChaojie.
强连通分量 无向图 1、任意两顶点连通称该图为连通图 2、否则将其中的极大连通子图称为连通分量 A D C B E 有向图
Skew Join相关论文 报告人:蔡珉星 厦大数据库实验室
辅导课程六.
网络常用常用命令 课件制作人:谢希仁.
Homework 1(上交时间:10月14号) 倒排索引.
Windows网络操作系统管理 ——Windows Server 2008 R2.
第十章 IDL访问数据库 10.1 数据库与数据库访问 1、数据库 数据库中数据的组织由低到高分为四级:字段、记录、表、数据库四种。
以ISI平台为例,为您演示一下如何在Endnote文献中查看该文献的References
2019/1/12 GDP设计协同 超级管理员操作手册 GDP项目组.
逆向工程-汇编语言
用event class 从input的root文件中,由DmpDataBuffer::ReadObject读取数据的问题
使用矩阵表示 最小生成树算法.
从zval看PHP变量
第一章 函数与极限.
C++语言程序设计 C++语言程序设计 第七章 类与对象 第十一组 C++语言程序设计.
数列.
简单介绍 用C++实现简单的模板数据结构 ArrayList(数组, 类似std::vector)
顺序表的删除.
模型分类问题 Presented by 刘婷婷 苏琬琳.
本节内容 随机读取 视频提供:昆山爱达人信息技术有限公司.
Three stability circuits analysis with TINA-TI
VB与Access数据库的连接.
Cassandra应用及高性能客户端 董亚军 来自Newegg-NESC.
实验七 安全FTP服务器实验 2019/4/28.
<编程达人入门课程> 本节内容 内存的使用 视频提供:昆山爱达人信息技术有限公司 官网地址: 联系QQ: QQ交流群: ,
Lightweight Data-flow Analysis for Execution-driven Constraint Solving
实体描述呈现方法的研究 实验评估 2019/5/1.
1.2 有理数 第1课时 有理数 伏家营中学 付宝华.
实验三 16位算术逻辑运算实验 不带进位控制的算术运算 置AR=1: 设置开关CN 1 不带进位 0 带进位运算;
基于MapReduce的Join算法优化
3.16 枚举算法及其程序实现 ——数组的作用.
数据集的抽取式摘要 程龚, 徐丹云.
本节内容 结构体 视频提供:昆山爱达人信息技术有限公司 官网地址: 联系QQ: QQ交流群 : 联系电话:
1.2 子集、补集、全集习题课.
第4课时 绝对值.
多层循环 Private Sub Command1_Click() Dim i As Integer, j As Integer
2、5的倍数的特征 马郎小学 陈伟.
第15讲 特征值与特征向量的性质 主要内容:特征值与特征向量的性质.
实验目的:掌握数据的顺序存储结构及它们在计算机中的操作。 实验内容:
第六章 Excel的应用 五、EXCEL的数据库功能 1、Excel的数据库及其结构 2、Excel下的数据排序 (1)Excel的字段名行
基于位置感知和负载均衡 MapReduce的Join算法优化 汇报人:黄梓铭 厦大数据库实验室
基于列存储的RDF数据管理 朱敏
C++语言程序设计 C++语言程序设计 第一章 C++语言概述 第十一组 C++语言程序设计.
Chinese Virtual Observatory
C++语言程序设计 C++语言程序设计 第九章 类的特殊成员 第十一组 C++语言程序设计.
第四节 向量的乘积 一、两向量的数量积 二、两向量的向量积.
VB与Access数据库的连接.
第十七讲 密码执行(1).
第十二讲 密码执行(上).
插入排序的正确性证明 以及各种改进方法.
FVX1100介绍 法视特(上海)图像科技有限公司 施 俊.
§4.5 最大公因式的矩阵求法( Ⅱ ).
第二次课后作业答案 函数式编程和逻辑式编程
§2 自由代数 定义19.7:设X是集合,G是一个T-代数,为X到G的函数,若对每个T-代数A和X到A的函数,都存在唯一的G到A的同态映射,使得=,则称G(更严格的说是(G,))是生成集X上的自由T-代数。X中的元素称为生成元。 A变, 变 变, 也变 对给定的 和A,是唯一的.
《手把手教你学STM32-STemWin》 主讲人 :正点原子团队 硬件平台:正点原子STM32开发板 版权所有:广州市星翼电子科技有限公司
Presentation transcript:

Partition类与布隆过滤器 报告人:蔡珉星 厦大数据库实验室 2014-08-02

目录 遇到的问题 Partitioner类 Semi-Join中的布隆过滤器

Partition类 Part 1

Partition类 MapReduce中的Partition类: 在Map端输出时,需要对key进行分区,来决定输出数据传输到哪个reducer上进行处理。 在提交MapReduce作业时,可以通过指定Partition类来实现分区。 默认的partitioner是HashPartitioner,通过哈希操作来决定分配到哪个reducer。

Partition类 HashPartitioner:结果返回reducer的编号[0, 1, ... NumreducerTasks-1] 为何要 key.hashCode() & Integer.MAX_VALUE: 若key为Text,其hashCode是通过Horner法则(对多项式求值的高效方法)计算得出的一个int值,若Text太大,则可能int会溢出从而得到一个负值。 所以对hashCode和MAX_VALUE(0111111111111111)与运算,保证其值为正数。

Partition类 优化重分区算法:注意Map输出的key为组合键

Partition类 优化重分区算法: Partition是根据组合键中的Join key来分区的,而默认的hash partition是对整个键进行分区的,所以需要自定义一个Partition类。 二次排序将会用整个组合键来进行排序。组合键包括一个标识源数据集(较大或较小)的整数值,因此可以根据这个整数值来保证较小源数据集的值先于较大源数据的值被reducer接收。

Partition类 优化重分区算法: 与Partition相关的还有次排序(上图蓝色圈起来的部分) setOutputKeyComparatorClass是key值的第二次比较,决定key的排序; setOutputValueGroupingComparator是指定group的划分。 PS: 0.20.0版本后API有变动: setSortComparatorClass、setGroupingComparatorClass

Partition类 一般比较函数的实现: 一般具体排序算法无需用户实现,用户需实现比较函数来决定数据的大小序关系; 返回1, 0, -1来决定大小序关系; 再如PHP中的usort()用于实现用户的自定义排序函数: usort($data, 'sortByLen') -> 使用函数sortByLen(a, b)来排序,返回1, 0, -1。

Semi-Join中的布隆过滤器 Part 2

背景知识 - 位图算法 问题描述:给40亿个不重复的unsigned int的整数,没有排过序,然后再给一个数,如果快速判断这个数是否在那40亿个数当中? 分析: 如果将数据全部存入内存,再遍历判断,需要大约15G内存才能实现(unsigned int为4字节)。 位图算法: 利用2进制位表示是否存在。0表示不存在,1表示存在。 例如: 有{3,5,7,8,2},可以利用一个8位的二进制来表示该集合 11010110 因此,通过申请40亿位长的空间(不到512M)就可以表示这40亿的整数了。 位图算法的实现: Java、C++有BitSe类型,就可以直接定义一个bit数组来实现。 如果没有Bit类型,可以使用int数组,一个int可以表示32个数,通过位操作来实现。

背景知识 - 位图算法 位图算法更多应用: 给40亿个unsigned int的整数,如何判断这40亿个数中哪些数重复? 同理,可以申请512M的内存空间,然后读取40亿个整数,并且将相应的bit位置1。如果是第一次读取某个数据,则在将该bit位置1之前,此bit位必定是0;如果是第二次读取该数据,则可根据相应的bit位是否为1判断该数据是否重复。 给40亿个unsigned int的整数排序? 全部存到内存中可能放不下,可使用外部排序(归并排序)来实现,但实现复杂、效率不高。更有效的方法--位图算法: 用位数组表示所有数据,然后从最高位(或最低位)开始遍历,遇到为1的则输出相应的数据。 位图算法的局限: 节省空间,但只能用于整数型的数据,并且需要知道最大范围。

布隆过滤器(Bloom Filter) 问题描述:1亿个不重复的正整数(大致范围已知)中,是否存在某个数可以使用位图来实现,若是1亿个邮件地址,如何确定某个邮件地址是否在这1亿个地址中? 分析: 通常情况下是利用Hash表,但Hash表不可避免的会发生碰撞,且Hash表需要较大的存储空间。 布隆过滤器: 是一种数据结构,由Burton Howard Bloom在1970年提出的,它结合了位图和Hash表两者的优点,位图的优点是节省空间,但是只能处理整型值一类的问题,无法处理字符串一类的问题,而Hash表却恰巧解决了位图无法解决的问题,然而Hash太浪费空间。针对这个问题,布隆提出了一种基于二进制向量和一系列随机函数的数据结构-布隆过滤器。它的空间利用率和时间效率是很多算法无法企及的。

布隆过滤器(Bloom Filter) 布隆过滤器的原理: 布隆过滤器需要的是一个位数组和k个映射函数,在初始状态时,长度为m的位数组array,其所有位都置为0。

布隆过滤器(Bloom Filter) 布隆过滤器的原理: 对于有n个元素的集合S={s1,s2......sn},通过k个映射函数{f1,f2,......fk},将集合S中的每个元素sj(1<=j<=n)映射为k个值{g1,g2......gk},然后再将位数组array中相对应的array[g1],array[g2]......array[gk]置为1: 如果要查找某个元素item是否在S中,则通过映射函数{f1,f2.....fk}得到k个值{g1,g2.....gk},然后再判断array[g1],array[g2]......array[gk]是否都为1,若全为1,则item在S中,否则item不在S中。

布隆过滤器(Bloom Filter) 布隆过滤器存在的问题:误判 集合中的若干个元素通过映射之后得到的数值恰巧同为g1,g2,.....gk,那么这种情况下就会造成误判。布隆过滤器的误判率和这k个映射函数的设计有关。 另外布隆过滤器不允许删除元素。 邮件实例分析: 假设一个邮件地址为8 bytes 使用hash存储,装填因子为0.5,则需要1*10^8*8/0.5 bytes = 1.6G 使用布隆过滤器,空间利用率为50%,k=8,则需要1*10^8*8/0.5 bits = 200MB 显然,布隆所需空间比哈希结构小得多。 PS: 误判率为p,位数组大小为m,集合数据个数为n,映射函数个数为k 这几个量存在一定的关系,通常是先设定一个误判率,然后去确定m和k。 (有兴趣可查阅更详细的介绍)

布隆过滤器(Bloom Filter) 布隆过滤器的常见应用: 垃圾邮件地址过滤(前面分析的例子) 网页爬虫对重复URL的判别:若将url存入数据库中,当url数量很多时,效率低下,可使用布隆过滤器来实现。 适合的使用场景: 内存空间受限,用于节约空间 如Semi-Join

Semi-Join(半连接) 半连接算法: 假设一个场景,需要连接两个很大的数据集,例如,用户日志和和用户数据。任何一个数据集都不是足够小到可以缓存在map作业的内存中(这样就可以使用广播连接算法)。 进一步考虑,如果在数据集的连接操作中,一个数据集中有的记录由于因为无法连接到另一个数据集的记录,将会被移除。这样就不必将整个数据集放到内存中了。 所以在这个例子中,在用户日志中的出现的用户仅仅是用户数据里,所有用户当中的很小的一部分。因此可以从用户数据里只取出存在于用户日志中的那部分用户的数据,这样就可以得到足够小、可以放在内存中的数据集了。

Semi-Join(半连接) 问题:万一提取的用户集不够小,不能放入内存中,怎么办? 解决:使用布隆过滤器,节约内存空间。 半连接算法步骤:使用三个MapReduce Job来完成: 从日志文件中提取出用户名/用户标识,生成一个唯一用户名/用户标识的集合; 采用复制连接,过滤掉用户数据中,不存在日志文件中的用户数据; 同样使用复制连接,进行最后的数据连接。 问题:万一提取的用户集不够小,不能放入内存中,怎么办? 解决:使用布隆过滤器,节约内存空间。

Semi-Join(半连接) 使用布隆过滤器的半连接算法: 将小表中的key保存到BloomFilter中,在map阶段过滤大表,可能有一些不在小表中的记录没有过滤掉(误判,不过没关系,只是增加了少量网络I/O),但是在小表中的记录一定不会过滤掉。 Ps: Hadoop早已支持布隆过滤器,调用相应的API即可。

遇到的问题 Thanks. 21