试题总体概述
面试题包含时下流行的多个大数据工具和概念(spark、sparkStreaming、kafka、hadoop、hive、hbase、redis、flume、sqoop、zk、azkaban、kylin、Elatic Search)的原理介绍、实战总结、调优方式等,我会不间断的更新,维护,希望可以对正在找大数据工作的朋友们有所帮助.
第一章目录
第一章 通用
1.1 数据倾斜
当某个job长时间运行没有结束,可能发生了数据倾斜。
1.1.1 hive
设置map端聚合和二次group by保证reduce数据大概平均,然后再设置reduce数量减少每个reduce的数据量
尽量少用distinct,不仅吃不到map端聚合(distinct原理是全局排序去重),而且多个distinct也吃不到二次group的优化。
如果group by 多个字段,或者其它二次group失效的情况,可以走下方spark的解决方案,将hql分多个hql来做。
1.1.2 Spark
比起hive来说,spark对数据倾斜的优化可以更细一些(也可以说更麻烦些)。
- 先用sample(false,0.x)采样key,找出倾斜的key
- 把数据集拆成倾斜的部分和不倾斜的部分,不倾斜的部分走正常流程
- 倾斜的部分key前面加上一个定长的随机字符串,然后执行重分区
- 重分区后进行一个聚合操作,然后去除定长前缀再聚合一次。
- 如果是大表join大表,其中一个表有数据倾斜,就需要用膨胀法,将倾斜部分的key加上一个0-n的前缀,一条数据膨胀成n条,然后将另一个表的这部分key也加上相应的前缀,然后单独对这部分数据进行一次双重聚合,与不倾斜的数据进行union操作,完成聚合。
- 空值看作是特殊的key,空值多了一样用3的方法去解决。
1.2 海量数据
1.2.1 如何调优
1.抽样检测分组字段,看看是否有倾斜
2.如果没有倾斜,就正常增加reduce数量,设置中间ORC+SNAPPY压缩
3.如果有倾斜,把倾斜的部分过滤出来加前缀打散处理,不倾斜的部分正常处理。
4.如果是大表join小表,大表倾斜,可以使用map端join方法,小表倾斜直接无视。
5.如果是大表join大表,某表倾斜,可以使用膨胀法处理。
1.2.2 实时排序
跳表法快速排序
将值域划分区间建有序链表,原本海量的遍历会被压缩N倍。每个值域对应一个有序链表,因此是双重链表。
前提:除了跳表外还有一张作品表,以作品id为key,value含分数
值变更时,先查询作品表更新原值,通过原值到对应区间的链表中删除该值,新值插入对应区间的链表中。
求排名:1.每个区间链表除了保存作品和分数外,还额外维护一个区间总长
2.每次新值插入时,都将原区间总长-1,新区间总长+1
3.求排名时遍历第一层链表将区间总长累加,然后遍历该值所在的区间求出区间内排名,两者相加。
求TopN:第二层链表一路往下走N个。
缺点:事实上所有针对数据直接排序的方式都存在锁问题,每次更新只能有一个线程做,否则必然会乱。
平衡二叉树排序
假设总分为5 [0,5]
1.将总分一分为二 [0,2],[3,5]
2.将划分的部分继续二分 [0,1],[1,2],[3,4],[4,5]
3.重复2直到划分到底 [0,0],[1,1],[2,2],[3,3]...
采用链表的方式从顶点往下一路关联起来,每个区间key对应一个人数value。
假设有某个值从2变成3。
先从顶点开始往下遍历查找[2,2],遍历过程中经过的节点人数全部-1,终点[2,2]的人数也-1;
然后从顶点开始往下遍历查找[3,3],经过的节点人数全部+1。终点也+1。
求排名