1.MapReduce的整个的执行流程
1.map
- read:InputFormat读取待处理文本,然后进入到mapper中
- map:用户自定义的mapper方法
- collect:mapper方法输出到环形缓冲区,在进去缓冲区之前,先进行了分区,默认是hash分区,一般用户自定义分区,写到80%的时候,开启反向溢写,相当于又开了一个线程,原先的线程继续往缓冲区读,新的线程将缓冲区数据写到磁盘
- 溢写:在写入磁盘之前进入了一次快速排序,保证分区内有序
- merge:所有的文件都溢写完之后,在磁盘上进行了一次归并排序,区内有序
2.mrAPPmaster在观测到map阶段全部完成后,开启reduce task
3.reduce
- copy:主动的从磁盘上拉取对应分区的数据
- sort:进行一次归并排序,
- reduce:相同key的数据进入到同一个reduce,最后,由outformat往出写。
2.yarn执行一个application的流程
首先,jar包main方法里执行了waitforcompletion(),开启yarnrunner,yarnrunner向集群的老大也就是resourcemanager申请运行一个application
resourcemanager返回给yarnrunner一个资源路径,让其提交job资源和application_id
job把split、xml、jar上传到集群资源路径下,并申请开启一个mrappmaster
这时在resourcemanager中形成了一个task,因为不同的客户端提交不同的task,所以在resourcemanager中有一个任务队列
空闲的nodemanager把任务领取,开启了一个容器,启动了mrappmaster进程
mrappmaster去job的资源路径下读取split文件的信息,如果有两个切片的话,向resourcemanager申请开启两个容器运行map task
resourcemanager在监控到map task运行结束后,向集群申请容器运行reduce task
全部执行结束后,申请销毁,释放资源
3.讲一讲多线程
4.查进程
最常用的是:
ps aux|grep xxx:显示当前终端的所有进程信息,以用户的格式显示进程信息,显示后台程序运行的参数
ps ef|grep xxx :以全格式显示所有进程,并过滤
5.讲一下插入排序和快排的时间复杂度和原理
插入排序
- o(n^2)
- 假设第一位数字有序,把未排序的数据,在已排序的序列中从后往前扫描,找到相应位置插入
快速排序
- o(nlogn)
- 分治思想。首先选择一个key,经过一趟排序后,将待排序列分为两部分,一部分比这个key大,一部分比这个key小,然后递归
- 先排序,再递归
6.队列和栈的区别
线性表:是一种线性结构,是n个具有相同特性的数据元素的有限序列
- 存储的数据本身类型一定保持相同
- 除了头尾元素,每个元素都有且只有一个直接前驱,有且只有一个直接后继,而序列头元素没有直接前驱,序列尾元素没有直接后继
- 包括:顺序表(元素的地址是连续的)和链表(节点的地址不是连续的,是通过指针连接起来的)
- 常见的线性结构有:数组、单链表、双链表、循环链表等
- 线性表中的元素为某种相同的抽象数据结构
队列
- 插入和删除是在两端进行的
- 先进先出
- 只允许在表尾一端插入,表头一端删除
栈
- 插入和删除都是在一端进行的
- 后进先出
- 只允许在表尾一端进行插入和删除
7.算法,两个队列实现一个栈
8.给了一棵树,使用前序遍历输出
9.数据库的索引、为什么使用索引快,索引是什么?B树和b+树
- 索引是一种数据结构,查找和排序两个功能,一般使用B+树数据结构作为索引
- 聚簇索引+辅助索引
聚簇索引是一种存储方式,存储的是主键(非叶子节点)和数据(叶子节点);辅助索引存储的是其他字段(非叶子节点)和主键信息(叶子节点),如果where name=www而不是where id = 6的话(这里id是主键),那么就先通过辅助索引找到name =www对应的主键,再去主索引中找到主键对应的数据 innodb引擎的存储方式 - 非聚簇索引+辅助索引,主索引和辅助索引在结构上一致,叶子节点存储的都是真实数据的地址信息 mylsam引擎的存储方式