直通BAT-大数据

哈希函数

直通BAT-大数据_第1张图片

直通BAT-大数据_第2张图片

Map-Reduce

直通BAT-大数据_第3张图片

直通BAT-大数据_第4张图片

案例1一

用map-reduce方法统计一篇文章中每个单词出现的个数

直通BAT-大数据_第5张图片

直通BAT-大数据_第6张图片

直通BAT-大数据_第7张图片

海量数据的常见处理技巧

直通BAT-大数据_第8张图片

案例二

请对10亿个IPV4的ip地址进行排序,每个ip只会出现一次

考虑到IPV4的ip地址最多约等于42亿,而题目中也说是10亿。我们知道无符号整数的最大值是42亿+(接近43亿)
因此,我们可以考虑把ip地址(32位)转换位无符号整数。


所以方法一:把10亿个ip地址转换为32位无符号整数,再排序,最后按照排序的顺序再一次转换为ip地址就可以得到排序后的ip地址。
但是,这种方法占用内存比较大,10亿*4B=40亿B,大概占用4GB

方法二:位图法:
申请2^32长度的比特数组,即512MB的空间,每个位置上是一个bit,只表示0或1。把ip地址转换为相应的整数k,然后把下标为k-1的位置1,一次处理完所有的ip。
之后,按照下标从小到大的顺序依次看该下标对应的比特是否为1,如果是1,转换为相应的ip地址即可。

案例三

请对10亿个人的年龄进行排序

由于每个人的年龄在1-200之间,因此可以维护一个长度为200的整形数组,进行计数排序即可。

关于计数排序

案例四

有一个包含20亿个全是32位整数的大文件,在其中找到出现次数最多的数,但是内存限制只有2G。

如果用hashtable来记录所有数出现的次数。
那么我们可以设定key存储某一数,为整形,占据4字节
也可以设定value存储某一值,即该数出现的次数,为整形,占据4字节

所以一条记录(key,value)占有8字节。记录条数为2亿时,大约占据1.6G内存。
所以直接用哈希表来统计20亿个整数的方案,会导致内存不足。


我们可以把20亿个32位整数的大文件利用哈希函数进行分流,将大文件分流为多个小文件,假设为16个小文件。

直通BAT-大数据_第9张图片

所以每一个小文件中不同的数一定不会大于2亿种,即占用的内存不会大于1.6GB。然后分别统计这16个文件的最大出现次数的值,再将他们进行比较即可。即“分而治之”。

案例五

直通BAT-大数据_第10张图片

思路:
如果采用哈希散列,那么最坏的情况:40亿个数字均不同,所以共有40亿个记录,每一条记录占据4字节,需要16GB内存。

如果采用bitmap位图法,申请长度为2^32的bit数组,大约需要500MB的空间。

但是bitmap是个不错的思路。因为题目要求任意一个没出现的数字,因此可以考虑把整个整数空间分为几个区间,然后计数,如果某个区间的长度大于该区间的计数个数,那么该区间一定有数据不存在。在该区间进行bitmap即可。

那么如何确定区间的个数呢?

题目要求不超过10M,而10M(8M)可以表达2^26bit,因此可以划分为2^32/2^26=64个区间,每个区间的位图大小为8M

直通BAT-大数据_第11张图片

案例六

某搜索公司一天的用户搜索词汇是海量的,假如有百亿数据量,请设计一种求出每天最热100词的可行方法。

哈希分流的思路,如果一次哈希分流还不行,可以多次分流。

直通BAT-大数据_第12张图片

案例七

直通BAT-大数据_第13张图片

直通BAT-大数据_第14张图片

一致性哈希算法:

首先把数据id通过哈希计算得到哈希值,其范围是0-2^32,然后把数字首尾相连得到一个闭环。

直通BAT-大数据_第15张图片

数据id通过哈希函数得到的哈希值对应到环中的一个位置,之后假设有3台机器也处在这个环中,然后根据机器id计算出其在环中对应的位置。一条数据如何确定归属于哪一个机器,我们这样规定,把数据位置顺时针走,碰到的第一个机器就是它所属的机器。

直通BAT-大数据_第16张图片

如果新加机器,这时data1划分在m3上,其余不变。如下图所示。删除情况也很好理解。这样,调整的次数最小,代价最少。

直通BAT-大数据_第17张图片

 

你可能感兴趣的:(海量数据)