第六章大数据和空间限制

1,布隆过滤器及其应用
此题在另一篇博客已经有介绍。
2,只用2GB内存在20亿个整数中找到出现次数最多的数
题目:有一个包含20亿个全是32位整型的大文件,在其中找到出现次数最多的数。
要求:内存限制为2GB。
    思路:要找出出现次数最多的数,通常的做法是使用哈希表对出现的每一个数做词频统计,哈希表的key是某一个整数,value是这个数出现的次数。就本题来说,一共有20亿个数,哪怕只是一个数出现了20亿次,用32位的整数也可以表示其出现的次数而不会产生溢出,所以哈希表的key需要占用4B,value也是4B。那么哈希表的一条记录(key,value)需要占用8B,当哈希表记录数为2亿个时,需要至少1.6GB内存。
但如果20亿个数中不同的数超过2亿种,最极端的情况是20亿个数都不同,那么在哈希表中可能需要产生20亿条记录,这样内存会不够用,所以一次性用哈希表统计20亿个数的方法是有很大风险的。
解决方法是把20亿个数用哈希函数分成16个小文件,根据哈希函数的性质,同一种数不可能被哈希到不同的小文件上,同时每个小文件中不同的数一定不会大于2亿种,假设哈希函数足够好。然后对每一个小文件用哈希表来统计其中每种数出现的次数,这样我们就得到了16个小文件中各自出现次数最多的数,还有各自的统计次数。接下来只要选出16个小文件各自的第一名中谁出现的次数最多即可。
把一个大的集合通过哈希函数分配到多台机器中,或者分配到多个文件里,这种技巧是处理大数据面试题时常有的技巧之一。但是到底分配多少台机器、分配多少文件,在解题时一定要确定下来。可能是在与面试官沟通的过程中由面试官指定,也可能是根据具体的限制来确定,比如本题确定分成16个文件,就是根据内存限制2GB的条件来确定的。
3,40亿个非负整数中找到没出现的数
题目:32位无符号数的范围是0~4294967295,现在有一个正好包含40亿个无符号整数的文件,所以在整个范围中必然有没出现过的数。可以使用最多1GB的内存,怎么找到所有没出现过的数?
进阶问题:内幕才能限制为10MB,但是只用找到一个没出现过的数即可。
思路:原问题,若用哈希表来保存出现过的数,那么如果40亿个数都不同,则哈希表的记录数为40亿条,存一个32位整型需要4B,所以最差情况下需要40亿 * 4B=160亿字节,大约需要16GB的空间,这是不符合要求的。
4,找到100亿个URL中重复的URL以及搜索词汇的topK问题
题目:有一个包含100亿个URL的大文件,假设每个URL占用64B,请找出所有重复的URL。
补充题目:某搜索公司一天的用户搜索词汇是海量(百亿数据量)的,请设计一种求出每天最热top100词汇的可行方法。
思路:

5,一致性哈希算法的基本原理
题目:工程师经常使用服务器集群来设计和实现数据缓存,以下是常见的策略:
    1),无论是添加、查询还是删除数据,都是先将数据的id通过哈希函数转换成一个哈希值,记为key。
    2),如果目前机器有n台,则计算key%n的值,这个值就是该数据所属的机器编号,无论是添加、删除还是查询操作,都只在这台机器上进行。
请分析这种策略可能带来的问题,并提出改进的方案。
解答:题目描述的缓存策略的潜在问题是如果增加或删除机器时(n变化)代价会很高,所有的数据都不得不根据id重新计算一遍哈希值,并将哈希值对新的机器数进行取模操作,然后进行大规模的数据迁移。
为了解决这些问题,下面介绍一下一致性哈希算法,这是一种很好的数据缓存设计方案。我们假设数据的id通过哈希函数转换成的哈希值范围是2的32次方,这样我们可以将这些数头尾相连,想象成一个闭合的环,那么一个数据id在计算出哈希值之后认为对应到环中的一个位置上。
接下来想象有三台机器也处在这样一个环中,这三台机器在环中的位置根据机器id计算出的哈希值来决定。那么一条数据如何确定属于哪台机器呢?首先把该数据的id用哈希函数算出哈希值,并映射到环中的相应位置,然后顺时针寻找离这个位置最近的机器,那台机器就是该数据的归属。
机器负载不均时的处理。如果机器较少,很有可能造成机器在整个环上的分布不均匀,从而导致机器之间的负载不均衡。
 为了解决问题,一致性哈希算法引入了虚拟节点机制,即对每一台机器通过不同的哈希函数计算出多个哈希值,对多个位置都放置一个服务节点,称为虚拟节点。具体做法可以在机器ip或主机名的后面增加编号或端口来实现。
 基于一致性哈希的原理有多重具体的实现,包括Chord算法、KAF算法。

猜你喜欢

转载自blog.csdn.net/u010075989/article/details/81117566
今日推荐