2022年2022年海量数据处理专题共页 .pdf





《2022年2022年海量数据处理专题共页 .pdf》由会员分享,可在线阅读,更多相关《2022年2022年海量数据处理专题共页 .pdf(10页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、第 1 页海量数据 处理专题海量数据处理专题(一)大数据量的问题是很多面试笔试中经常出现的问题,比如baidu google腾讯这样的一些涉及到海量数据的公司经常会问到。下面的方法是我对海量数据的处理方法进行了一个一般性的总结,当然这些方法可能并不能完全覆盖所有的问题,但是这样的一些方法也基本可以处理绝大多数遇到的问题。下面的一些问题基本直接来源于公司的面试笔试题目,方法不一定最优,如果你有更好的处理方法,欢迎与我讨论。本贴从解决这类问题的方法入手,开辟一系列专题来解决海量数据问题。拟包含以下几个方面。Bloom FilterHashBit-Map堆(Heap)双层桶划分数据库索引倒排索引(I
2、nverted Index)外排序 Trie 树 MapReduce 在这些解决方案之上,再借助一定的例子来剖析海量数据处理问题的解决方案。欢迎大家关注。海量数据处理专题(二)【什么是 Bloom Filter】Bloom Filter是一种空间效率很高的随机数据结构,它利用位数组很简洁地表示一个集合,并能判断一个元素是否属于这个集合。Bloom Filter的这种高效是有一定代价的:在判断一个元素是否属于某个集合时,有可能会把不属于这个集合的元素误认为属于这个集合(false positive)。因此,Bloom Filter不适合那些 零错误 的应用场合。而在能容忍低错误率的应用场合下,B
3、loom Filter通过极少的错误换取了存储空间的极大节省。这里有一篇关于 Bloom Filter的详细介绍,不太懂的博友可以看看。【适用范围】可以用来实现数据字典,进行数据的判重,或者集合求交集【基本原理及要点】对于原理来说很简单,位数组+k 个独立 hash 函数。将 hash 函数对应的值的位数组置 1,查找时如果发现所有hash 函数对应位都是 1 说明存在,很明显这个过程并不保证查找的结果是100%正确的。同时也不支持删除一个已经插入的关键字,因为该关键字对应的位会牵动到其他的关键字。所以一个简单的改进就是 counting Bloom filter,用一个 counter 数组
4、代替位数组,就可以支持删除了。名师资料总结-精品资料欢迎下载-名师精心整理-第 1 页,共 10 页 -第 2 页还有一个比较重要的问题,如何根据输入元素个数n,确定位数组 m的大小及 hash 函数个数。当 hash 函数个数 k=(ln2)*(m/n)时错误率最小。在错误率不大于 E的情况下,m至少要等于 n*lg(1/E)才能表示任意 n 个元素的集合。但 m还应该更大些,因为还要保证bit数组里至少一半为0,则 m应该=nlg(1/E)*lge大概就是 nlg(1/E)1.44倍(lg表示以 2 为底的对数)。举个例子我们假设错误率为0.01,则此时 m应大概是 n 的 13 倍。这样
5、 k大概是 8 个。注意这里 m与 n 的单位不同,m是 bit为单位,而 n 则是以元素个数为单位(准确的说是不同元素的个数)。通常单个元素的长度都是有很多bit的。所以使用 bloom filter内存上通常都是节省的。【扩展】Bloom filter将集合中的元素映射到位数组中,用k(k 为哈希函数个数)个映射位是否全1 表示元素在不在这个集合中。Counting bloom filter(CBF)将位数组中的每一位扩展为一个counter,从而支持了元素的删除操作。Spectral Bloom Filter(SBF)将其与集合元素的出现次数关联。SBF采用counter 中的最小值来近
6、似表示元素的出现频率。【问题实例】给你 A,B 两个文件,各存放50亿条 URL,每条 URL占用 64 字节,内存限制是 4G,让你找出 A,B 文件共同的 URL。如果是三个乃至n 个文件呢?根据这个问题我们来计算下内存的占用,4G=232大概是 40 亿*8 大概是340 亿,n=50亿,如果按出错率0.01 算需要的大概是650 亿个 bit。现在可用的是 340亿,相差并不多,这样可能会使出错率上升些。另外如果这些urlip是一一对应的,就可以转换成ip,则大大简单了。海量数据处理专题(三)什么是 Hash Hash,一般翻译做 散列,也有直接音译为 哈希 的,就是把任意长度的输入(
7、又叫做预映射,pre-image),通过散列算法,变换成固定长度的输出,该输出就是散列值。这种转换是一种压缩映射,也就是,散列值的空间通常远小于输入的空间,不同的输入可能会散列成相同的输出,而不可能从散列值来唯一的确定输入值。简单的说就是一种将任意长度的消息压缩到某一固定长度的消息摘要的函数。HASH 主要用于信息安全领域中加密算法,它把一些不同长度的信息转化成杂乱的 128位的编码,这些编码值叫做HASH 值.也可以说,hash 就是找到一种数据内容和数据存放地址之间的映射关系。名师资料总结-精品资料欢迎下载-名师精心整理-第 2 页,共 10 页 -第 3 页数组的特点是:寻址容易,插入和
8、删除困难;而链表的特点是:寻址困难,插入和删除容易。那么我们能不能综合两者的特性,做出一种寻址容易,插入删除也容易的数据结构?答案是肯定的,这就是我们要提起的哈希表,哈希表有多种不同的实现方法,我接下来解释的是最常用的一种方法-拉链法,我们可以理解为 链表的数组 ,如图:左边很明显是个数组,数组的每个成员包括一个指针,指向一个链表的头,当然这个链表可能为空,也可能元素很多。我们根据元素的一些特征把元素分配到不同的链表中去,也是根据这些特征,找到正确的链表,再从链表中找出这个元素。元素特征转变为数组下标的方法就是散列法。散列法当然不止一种,下面列出三种比较常用的。1,除法散列法最直观的一种,上图
9、使用的就是这种散列法,公式:index=value%16 学过汇编的都知道,求模数其实是通过一个除法运算得到的,所以叫 除法散列法。2,平方散列法求 index 是非常频繁的操作,而乘法的运算要比除法来得省时(对现在的CPU来说,估计我们感觉不出来),所以我们考虑把除法换成乘法和一个位移操作。公式:index=(value*value)28 如果数值分配比较均匀的话这种方法能得到不错的结果,但我上面画的那个图的各个元素的值算出来的index 都是 0-非常失败。也许你还有个问题,value 如果很大,value*value不会溢出吗?答案是会的,但我们这个乘法不关心溢出,因为我们根本不是为了获
10、取相乘结果,而是为了获取index。3,斐波那契(Fibonacci)散列法平方散列法的缺点是显而易见的,所以我们能不能找出一个理想的乘数,而不是拿 value 本身当作乘数呢?答案是肯定的。1,对于 16位整数而言,这个乘数是40503 2,对于 32 位整数而言,这个乘数是 2654435769 3,对于 64 位整数而言,这个乘数是11400714819323198485 名师资料总结-精品资料欢迎下载-名师精心整理-第 3 页,共 10 页 -第 4 页这几个 理想乘数 是如何得出来的呢?这跟一个法则有关,叫黄金分割法则,而描述黄金分割法则的最经典表达式无疑就是著名的斐波那契数列,如果
11、你还有兴趣,就到网上查找一下斐波那契数列 等关键字,我数学水平有限,不知道怎么描述清楚为什么,另外斐波那契数列的值居然和太阳系八大行星的轨道半径的比例出奇吻合,很神奇,对么?对我们常见的 32位整数而言,公式:i ndex=(value*2654435769)28 如果用这种斐波那契散列法的话,那我上面的图就变成这样了:很明显,用斐波那契散列法调整之后要比原来的取摸散列法好很多。【适用范围】快速查找,删除的基本数据结构,通常需要总数据量可以放入内存。【基本原理及要点】hash 函数选择,针对字符串,整数,排列,具体相应的hash 方法。碰撞处理,一种是open hashing,也称为拉链法;另
12、一种就是closed hashing,也称开地址法,opened addressing。【扩展】d-left hashing中的 d 是多个的意思,我们先简化这个问题,看一看2-left hashing。2-left hashing指的是将一个哈希表分成长度相等的两半,分别叫做 T1和 T2,给 T1和 T2 分别配备一个哈希函数,h1 和 h2。在存储一个新的 key 时,同时用两个哈希函数进行计算,得出两个地址h1key 和h2key。这时需要检查T1中的 h1key 位置和 T2中的 h2key 位置,哪一个位置已经存储的(有碰撞的)key 比较多,然后将新key 存储在负载少的位置。如
13、果两边一样多,比如两个位置都为空或者都存储了一个key,就把新 key 存储在左边的 T1子表中,2-left也由此而来。在查找一个key 时,必须进行两次 hash,同时查找两个位置。【问题实例】1).海量日志数据,提取出某日访问百度次数最多的那个IP。IP 的数目还是有限的,最多232 个,所以可以考虑使用hash 将 ip 直接存入内存,然后进行统计。海量数据处理专题(四)名师资料总结-精品资料欢迎下载-名师精心整理-第 4 页,共 10 页 -第 5 页【什么是 Bit-map】所谓的 Bit-map 就是用一个 bit 位来标记某个元素对应的Value,而 Key即是该元素。由于采用
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 2022年2022年海量数据处理专题共页 2022 海量 数据处理 专题

限制150内