龙图游戏

笔试题
一. 简介mapreduce 整个shuffle 流程。
1)Map方法之后Reduce方法之前这段处理过程叫Shuffle
2)Map方法之后,数据首先进入到分区方法,把数据标记好分区,然后把数据发送到环形缓冲区;环形缓冲区默认大小100m,环形缓冲区达到80%时,进行溢写;溢写前 对数据进行排序,排序按照对key的索引进行字典顺序排序,排序的手段快排;溢写产生大量溢写文件,需要对溢写文件进行归并排序;对溢写的文件也可以进行Com biner操作,前提是汇总操作,求平均值不行。最后将文件按照分区存储到磁盘,等待Reduce端拉取。
3)每个Reduce拉取Map端对应分区的数据。拉取数据后先存储到内存中,内存不够了,再存储到磁盘。拉取完所有数据后,采用归并排序将内存和磁盘中的数据都进行 排序。在进入Reduce方法前,可以对数据进行分组操作。
二. mapreduce 代码编写
userlogin 文件 中有两列数据,如下:
userid IP
111 61.133.128.5
222 61.133.128.7
333 202.113.216.3
111 61.133.128.5
111 61.133.128.5
111 61.133.128.5
222 61.133.128.7
222 61.133.128.7
222 61.133.128.7
222 61.133.128.7
222 61.133.128.7
333 202.113.216.3
333 202.113.216.3
333 202.113.216.3
写mapreduce实现:登陆次数相同的IP有哪些以及这些IP的个数?如:202.113.216.3 和 61.133.128.5 都登陆过4次,登陆过4次的总IP个数为2.
ps:先写的理论题,最后才写这个导致时间不太够用还没有写完,我只能简述一下思路,根据倒排索引的一个思路可以求出来.
三. hive 中什么样的 查询语句,只走map,不走reduce,举例说明。
当设置hive.fetch.task.conversion = more时
如下查询语句不会走mapReduce
select * from test;
select id from test;
select * from test limit 1;
四. hbase ,简介日志结构合并树(LSM树)
1) LSM主要用于为那些长期具有很高记录更新(插入和删除)频率的文件提供低成本的索引机制。
2) LSM树实现了所有的索引值对于所有的查询来说都可以通过内存组件或某个磁盘组件进行访问。
3) LSM减少了磁盘磁壁的移动次数降低了进行数据插入时磁盘磁壁的开销。
4) LSM在进行需要即时响应的操作时会损失I/O效率,最适用于索引插入比查询操作多的情况
五. spark 中 parquet 存储 格式 和普通文件存储格式的区别。并详细介绍parquet存储格式。
区别
1) parquet存储可以跳过不符合条件的数据,只读取需要的数据,降低 IO 数据量
2) parquet存储可以压缩编码可以降低磁盘存储空间
3) parquet存储可以只读取需要的列,支持向量运算,能够获取更好的扫描性能
介绍
1) parquet是语言无关的,而且不与任何一种数据处理框架绑定在一起,适配多种语言和组件
2) parquet可以按照列进行存储数据,把某一列的数据连续的存储,每一行中的不同列的值离散分布
六. ES, 介绍什么是倒排索引。什么是跳表。
倒排索引介绍
1) 倒排索引也可以成为反向索引,通俗讲它其实就是通过value找key
2)为了更好的理解我下面举个例子,假设下面有四个字段
id name gender age address
1 zs 1 22 bj
2 ls 2 21 hb
3 ww 1 23 hb
那么es会给如上字段建立索引,索引如下
name:
| Term | Posting List |
| -- |:----:|
| zs | 1 |
| ls | 2 |
| ww | 3 |
gender:
| Term | Posting List |
| -- |:----:|
| 1 | [1,3] |
| 2 | [2] |
age:
| Term | Posting List |
| -- |:----:|
| 22 | [1] |
| 21 | [2] |
| 23 | [3] |
address:
| Term | Posting List |
| -- |:----:|
| bj | [1] |
| hb | [2,3] |
es分别为每个field都建立了一个倒排索引,name, gender, age, address这些叫term,而[1,3]就是Posting List。Posting list就是一个int的数组,存储了所有符合某个term的文档id
通过posting list这种索引方式似乎可以很快进行查找,比如要找gender=1的同学,可以看到符合条件的有id为1和3的
(ps:由于时间有限先介绍到这里)
跳表介绍
1) 跳表的思想是每一个节点不单单只包含指向下一个节点的指针,可能会包含很多指向后续节点的指针,这样以来就可以跳过一些不必要的节点,从而加快查找、
删除等操作
2) 对于一个链表内每一个结点包含多少个指向后续元素的指针,这个过程可以一个随机函数生成器得到,这样子就构成了一个跳跃表
七. ES, 如果ES中有个content字段,进行了分词。请写出 查询 content 包含 “中国” 的所有的数据的查询语句。
GET content/_search
{
"query": {
"match_phrase": {
"name": "中国"
}
}
}
八. redis,RDB 和 AOF 区别。
1) 这两个是redis的持久化方式
2) RDB是在不同的时间点,将redis存储的数据生成快照并存储到磁盘等介质上
3) AOF是将redis执行过的所有写指令记录下来,在下次redis重新启动时,只要把这些写指令从前到后再重复执行一遍,就可以实现数据恢复了
九. mysql 从索引原理出发,详解 为什么主键字段一般都设计的不会太长。
如果主键字段过长,每个索引都存储这个值,在数据量大,内存珍贵的情况下,MySQL有限的缓冲区,存储的索引与数据会减少,磁盘IO的概率会增加
面试总结
(1)算法问题,分析快排的时间复杂度,归并排序的时间复杂度,以及算法本身的实现
(2)linux命令
a) 查看磁盘命令
b) 查看端口
c) 如何查找某个文件里的重复性
(3)Hadoop
a) Hadoop-ha
b) mapreduce中的map干什么用的,reduce干什么用的
c) 怎样在hdfs上的某个文件内的第四行和第五行之间插入一条数据
(4)kafka的速度为什么快(从生产数据和消费数据两方面来讲)
龙图游戏面试补充:
笔试统计个数题用hive写
hiveSQL插入数据,字段某一列有个 “,”怎么办
shell:统计每个ip个数
hiveSQL列换行行转列