阿里 菜鸟网络
一、介绍下MapReduce的原理。
1、 Map过程:数据从hdfs中传入一个maptask,数据经过partition之后存入map的内存缓冲区(每个map task都会有一个内容缓冲区),当缓冲区满了之后就会将缓冲区的内容存到磁盘上,然后再用缓冲区来接受新的数据,这个往磁盘存数据的过程就是spill。当整个map task结束后再对磁盘中所有的临时文件做合并。
2、 在MapReduce中reduce的用法规定在从map中取数之后到合并计算的过程中,其实在数据传入reduce之前也有“reduce”过程,称作combine。Combiner等同于reducer,combiner将有相同的key/value对的value加起来,减少写到磁盘的数量。
3、 Map端的所用工作结束后,最终生成的merge后的文件存放在tasktracker能够检测到的某个本地目录中,每个reduce task不断的通过RPC从jobtracker哪里获取maptask是否完成的信息,如果reduce task得到通知已经完成,再启动shuffle的后半段过程。
4、 Reduce task 执行之前,就是从不同的map task的最终结果,将他们merge到一起,形成reduce task的输入文件。
5、 Reduce端的shuffle过程:(1)copy过程:不停的从本地磁盘通过对tasktracker的访问来拉取map的输出文件。(2)merge过程:copy过来的数据将先存放在缓冲区,这里和map的缓冲区原理一样(这个过程如果设置了combiner,也会启动),然后知道没有了map端的数据才停止merge(这里的merge有三种形式:内存到内存,内存到磁盘,磁盘到磁盘)。
6、 不断的merge后,reducer获得了最终的输入文件。整个shuffle过程结束!然后就是reducer执行,把结果放到hdfs上了。
combiner function可以减少需要在map和reduce之间传输的数据。
shuffle:后台线程根据reduce个数将输出结果进行分组。
二、MapReduce如何解决数据倾斜问题?
在map端解决,或对key操作从而缓解reduce的压力:
1、参数调优:(1)hive.map.aggr=true,
(2)hive.groupby.skewindata=true:为了让结果是相同的groupby key有可能被分到不同的reduce中,从而达到负载均衡的目的。
2、在key上做文章,在map阶段将造成倾斜的key先分成多组,在为计算之前将多的key后边加上例如1,2,3,4这些字符,先进行一个运算,之后再恢复key进行最终的运算。
3、先进行group操作,把key先进行一次reduce,之后再进行count或者distinct count操作。
4、join操作中,使用map join在map端就进行join,免得reduce是卡住。
三、会不会数据库?知不知道索引?
会使用一些数据库的指令(show 、use、 create等 )
索引:是指对数据库中的一行或者一列的数值进行排序的一种结构,可以不用遍历整个数据库,方便的访问数据表中的特定信息。例如:select * from table 1 where id = 10000。
四、sql中内连接和左连接的区别是什么?
1、内连接:只有两个表都有的key才会保留。
2、左连接:以左边的表为主,左表有的才会保存。
3、右连接:以右边的表为主,右表有的才会保存。
4、完全连接
5、union:在进行表的连接后,会筛选掉重复的记录,并且进行排序。
6、union all:只是简单的将两个表合并后返回。
五、where和having的区别:
六、决策树和逻辑回归的区别?什么时候用决策树,什么时候用逻辑回归?
美团
一、MySQL第一范式,第二范式,第三范式
1、第一范式:指的是数据库表的每一列是不可分割的基本数据项,同一列中不能有多个值。
2、第二范式:在第一范式的基础上简历起来,即首先需要先满足第一范式,同时要求数据库表中的每个行必须是被唯一地区分。
3、第三范式:如果关系模式R是第二范式,且每个非主属性都不传递依赖于R的候选键,则称R是第三范式的模式。(例如学生表:学号、姓名、课程号、成绩)
二、MapReduce的执行过程
1、 Map过程:数据从hdfs中传入一个maptask,数据经过partition之后存入map的内存缓冲区(每个map task都会有一个内容缓冲区),当缓冲区满了之后就会将缓冲区的内容存到磁盘上,然后再用缓冲区来接受新的数据,这个往磁盘存数据的过程就是spill。当整个map task结束后再对磁盘中所有的临时文件做合并。
2、 在MapReduce中reduce的用法规定在从map中取数之后到合并计算的过程中,其实在数据传入reduce之前也有“reduce”过程,称作combine。Combiner等同于reducer,combiner将有相同的key/value对的value加起来,减少写到磁盘的数量。
3、 Map端的所用工作结束后,最终生成的merge后的文件存放在tasktracker能够检测到的某个本地目录中,每个reduce task不断的通过RPC从jobtracker哪里获取maptask是否完成的信息,如果reduce task得到通知已经完成,再启动shuffle的后半段过程。
4、 Reduce task 执行之前,就是从不同的map task的最终结果,将他们merge到一起,形成reduce task的输入文件。
5、 Reduce端的shuffle过程:(1)copy过程:不停的从本地磁盘通过对tasktracker的访问来拉取map的输出文件。(2)merge过程:copy过来的数据将先存放在缓冲区,这里和map的缓冲区原理一样(这个过程如果设置了combiner,也会启动),然后知道没有了map端的数据才停止merge(这里的merge有三种形式:内存到内存,内存到磁盘,磁盘到磁盘)。
6、 不断的merge后,reducer获得了最终的输入文件。整个shuffle过程结束!然后就是reducer执行,把结果放到hdfs上了。
三、MapReduce数据倾斜问题。
四、用过哪些机器学习模型,结合项目。
五、MapReduce和spark的区别?
通俗的讲:Hadoop主要是HDFS和MapReduce,其中HDFS用于存储数据,MapReduce用于分布式处理,而MapReduce阶段又分为map和reduce,然而spark在map和reduce阶段分别有对应的算法:map, flatMap, filter, keyBy,以及reduceByKey, sortByKey, mean, gourpBy, sort等,所以说非常方便。
Mapreduce是Hadoop1.0的核心,Spark出现慢慢替代Mapreduce。那么为什么Mapreduce还在被使用呢?因为有很多现有的应用还依赖于它,它不是一个独立的存在,已经成为其他生态不可替代的部分,比如pig,hive等。
尽管MapReduce极大的简化了大数据分析,但是随着大数据需求和使用模式的扩大,用户的需求也越来越多:
1. 更复杂的多重处理需求(比如迭代计算, ML, Graph);
2. 低延迟的交互式查询需求(比如ad-hoc query)
而MapReduce计算模型的架构导致上述两类应用先天缓慢,用户迫切需要一种更快的计算模型,来补充MapReduce的先天不足。
Spark的出现就弥补了这些不足,我们来了解一些Spark的优势:
1.每一个作业独立调度,可以把所有的作业做一个图进行调度,各个作业之间相互依赖,在调度过程中一起调度,速度快。
2.所有过程都基于内存,所以通常也将Spark称作是基于内存的迭代式运算框架。
3.spark提供了更丰富的算子,让操作更方便。
4.更容易的API:支持Python,Scala和Java
其实spark里面也可以实现Mapreduce,但是这里它并不是算法,只是提供了map阶段和reduce阶段,但是在两个阶段提供了很多算法。如Map阶段的map, flatMap, filter, keyBy,Reduce阶段的reduceByKey, sortByKey, mean, gourpBy, sort等。六、osi 七层模型,tcp协议和IP协议在哪一层?
物理层、数据链路层、网络层、传输层、会话层、表示层、应用层
tcp在传输层,IP协议在网络层。
七、知道哪些排序算法?冒泡排序的时间复杂度和快速排序的时间复杂度?快速排序最差时间复杂度?
1、 冒泡排序:比较相邻元素,成对比较。
2、 快速排序:每一趟排序后都分成独立的两部分,保证其中一部分比另一部分小。再分别对两部分进行相同操作。(将第0个看做中轴)
3、 堆排序:树形选择排序,对直接选择排序有效改进。
4、 选择排序:在一组数中选出最小的一个数与第一个位置的数交换(这个最小的数不参与之后的计算),以此类推(与第二,第三等等后边的位置交换)
5、 插入排序:先比较前两个数,按大小排序再比较第三个,然后插入前边的合适位置,以此类推。
6、 归并排序:将两个有序表合并成一个有序表的过程。
7、 希尔算法:将整个序列分成若干个子序列,依次进行直接插入排序,然后再对全体序列进行插入排序。