一、大数据相关概念
1.1 哈希函数
散列函数,输入域可以是很大的范围, 输出域是固定范围
性质:
- 典型的哈希函数拥有无限的输入值域
- 输入值相同时,返回值一样
- 输出值不同时,返回可能一样
- 不同输入值的得到的哈希值,整体均匀的分布在输出入s上。
第四点是评价哈希函数优劣的关键
经典的哈希算法:MD5和SHA1算法
1.2 Map-Reduce
- Map阶段:把大任务分成小任务
- Reduce阶段:子任务并发处理,然后合并结果
难点:工程上的处理 - 备份的考虑
- 系统对用户的透明,即用户在终端使用感觉是在一台电脑上操作
- 任务分配策略与任务进度的跟踪的细节设计,节点状态的呈现
- 多用户权限的控制
二、经典例题
2.1 用Map-Reduce方法统计一篇文章内个单词出现的个数
预处理
- 去掉文章的标点符号
- 对连字符的处理
- 对于缩写的处理
- 大小写的处理
- 预处理的结果是得到只包含单词之后的文本
思路:
- Map阶段:
每个单词生成词频为1的记录,一个单词可能有多个词频为1的记录,此时还未合并
通过哈希函数得到每个单词的哈希值,并根据该值分成若干组任务
每个子任务中包含若干种单词,但同一种单词不会分配进不同的子任务中
- Reduce阶段
对同一组任务的相同种类的单词进行合并,最后将所有记录统一合并。
2.2 常见海量处理题目解题关键
- 1.分而治之,大任务分成小任务
- 2.常用的hashmap和bitmap
2.3 对10亿个IPV4的ip地址进行排序,每个ip只会出现一次
IPV4大概与32亿个:
思路:
- ip地址转换为对应的整数,每个整数4字节,需要4G的内存进行排序
优化的思路:
申请长度为2的32次方的bit位的数组,空间约为512mb,数组的下标代表一个IP地址,将10亿个IP对应的数组中的位置由0变成1,便利时,输出数据为1的下标+1就是排序后的结果。
2.4 对10亿人的年龄进行排序
年龄的范围在0~200,需要长度为200的数组,结合桶排的思路
2.5 有一个包含20个亿个全是32位整数的大文件,在其中找到出现次数最多的数,内存限制2G
- 哈希表疏统计内存不够
思路:
- 使用哈希函数进行分流,分成许多小文件
- 对每个小文件用哈希表进行统计
- 对每个小文件出现最多次数进行比较,得出次数最多的数
2.6 40亿个无符号整数,求找出没出现过的任意一个整数,最多使用10mb内存
划分空间,在用bitmap进行统计
2.7 某搜索公司每天的数据百亿词汇,求找到最热的词汇
- 哈希分流,分成几个文件到n个机器
- 内存不够再进行哈希分流。分成n个小文件,对每个小文件进行词频统计
- 建立记录后,利用小根堆进行Top100的筛选
- 小根堆筛选的过程:
取100个数建立小堆,最小的数在最上面,然后依次遍历剩下的数,比根大的话,替换掉根,再调整小根堆,直到遍历结束。
2.8 工程师常使用服务器集群来设计和实现数据缓存,其中一种策略是: 无论是添加、查询还是删除数据,都先将数据的id通过哈希函数转换成一个哈希值,即为key; 如果目前机器有N台,则计算key%N的值,这个值就是该数据所属的机器编号,无论是添加、删除还是查询操作,都只在这台机器上进行。请分析这种策略可能出现的问题,以及提出改进的方案。
问题:增加和删除数据,数据迁移的代价很大,需要重新对数据进行取余运算
- 一致性哈希算法
数据和机器形成一个环,数据由顺时针顺序最近的机器来处理。