哈希函数又叫散列函数,输入域可以是很大的范围,输出域是固定范围。(MD5)
Map-Reduce
1.map 阶段 :将大任务分为子任务
2.reduce 阶段:子任务并发处理,然后合并结果
常见海量处理题目关键:
1.分而治之,通过哈希函数将大任务分流到机器,或分流到小人物。
2.常用到hashmap 或则bitmap
1.请对十亿个IPV4的IP地址进行排序,每个ip只出现一次
思路:ipv4 =42 亿个,ip->转化为无符号整数
十亿个IP(每个整数4字节,空间4G),然后进行排序。
bitmap:申请2的32次方的bit类型数组,对十亿个ip 位置,设置对应的值为1,然后扫描bitmap,依次提取1对应的位置整数还原成 ip.
2.有一个包含20亿个全是32位整数的大文件,在其中找到出现次数最多的书,内存限制只有2G.
思路:如果用hashmap,key 记录32位整数(四字节) value 记录出现次数(4字节) 则一条记录8字节,记录条数为2亿时候,大约1.6G…所以哈希表直接统计20亿个整数的方案导致内存不足。
解决方案:使用哈希函数进行分流分流成16个文件,得到16个文件中出现次数最多的数,然乎比较选择。
3.32位无符号整数范围 0~4294967295。现在有一个正好包含40亿无符号整数的文件,所以必有没有出现过的数,现在最多用10M的内存,只用找到一个没出现过的数即可?
思路:
hashmap :每条记录4字节 40亿 则是16GB pass
bitmap:申请长度2的32次方的byte. 也需要512 MB pass
0~2^32 :分成64 个区间,单个区间应该装下 2^32/64个数,总共范围42亿,但是数一共40亿,存在某一个区间计数不满,在该对应的空间用bitmap 做词频统计,差不多占用8 M 空间。
4.某公司一天用户搜索词汇是海量的,假设百亿的数据量,设计出每天百热词的可行办法。
思路:
step1:使用哈希函数进行分流
step2:得到每个小文件的词频统计,利用小根堆进行Top100的筛选【如果要选出前K大,则将数据中的前K个元素建立成一个小根堆,从第K+1个元素开始往后依次比较,如果元素大于小根堆的堆顶,那么就和堆顶交换,交换后重新调整为小根堆。这样变量一遍所有数据,最后得到的大小为K的小根堆就是前K大的树】(一般升序大根堆,此时是所有数据放入到堆中)
step3:再次利用小根堆或则外排序获得总体的top100.
一致性哈希算法。。。