许愿offer!希望有机会到美团实习!
经过了笔试+一面+二面,目前在等二面结果,两个面试官真的人都很好,很和善,会引导你回答
下面进入正题,放一下准备面试时做的笔记,希望对大家有帮助:
部分问题:
1. 有哪些mysql优化经验?
explain sql语句,可以看到MySQL是如何处理SQL语句的。这可以帮助分析性能瓶颈
当只要一行数据时使用 LIMIT 1,这样一样,MySQL数据库引擎会在找到一条数据后停止搜索,而不是继续往后查少下一条符合记录的数据
为搜索字段建索引,如果在表中,有某个字段你总要会经常用来做搜索,那么为其建立索引
避免 SELECT *,需要什么就取什么
使用 ENUM 而不是 VARCHAR,ENUM 类型是非常快和紧凑
尽可能的使用 NOT NULL,如果存在null,进行比较的时候会更复杂
固定长度的表会更快,固定长度的表中通过偏移量搜寻得会更快一些,也更容易被缓存和重建
选择正确的存储引擎,MyISAM 适合于一些需要大量查询的应用,但其对于有大量写操作并不是很好
InnoDB在写操作比较多的时候,会更优秀。并且他还支持事务,但是比较复杂,对于一些小的应用,它会比 MyISAM 还慢
切分大查询
2. acid
Atomicity:原子性 不可分割,事务的所有操作要么全部成功,要么全部失败回滚
Consistency:一致性 数据库在事务执行前后都保持一致性状态
Isolation:隔离性 一个事务所做的修改在最终提交以前,对其他事务是不可见的
Durability:持久性 一旦事务提交,则其所做的修改将会永远保存到数据库中。即使系统发生崩溃,事务执行的结果也不能丢。
3. 锁
s锁(共享锁)能读 x锁(互斥锁)能写 2PL IS IX SIX 多粒度锁协议
4. 范式
第一范式 属性不可分
第二范式 每个非主属性完全函数依赖于候选键
第三范式 每个非主属性不传递函数依赖于候选键
BCNF 任意主属性都完全函数依赖于候选键
mapReduce工作流程:
创建jobClient-分配资源-jobTracker-作业调度-mapper(从HDFS提取数据,创建Taskrunner,执行mapper,中间结果写入缓存,缓存写入磁盘)
shuffle(Map端保存、Partition、Sort、Combine、Reduce端拉取)
Partition:将map的结果发送到reduce,默认HashPartitioner,要求负载均衡、效率
sort: Map后的第1次排序:文件内部快速排序, Map后的第2次排序:多个文件归并排序
Combine: 合并Map输出的中间数据,减少数据传输、提高处理效率
reducer(创建TaskRunner,执行ReduceTask,从mapper下载中间结果,输出)
计算容错: 心跳监测:默认10分钟,未完成的任务则重新分配TaskTracker节点执行
黑名单机制:当TaskTracker被较多Job加入黑名单(满足三个条件),则将该TaskTracker加入集群黑名单,以后将不在该TaskTracker上调度任何task
恢复方法:重启TaskTracker
作业/任务调度:Input分片,分片分给各mapper,先进先出调度器(FIFO)(默认),先按优先级,再按先到先执行
公平(Fair)调度器,每个用户公平享有资源池中的资源
能力调度器,分层次多队列,计算每个队列中正在运行的任务数与其应该分得的计算资源之间的比值,计算一个比值最小的队列,然后按FIFO从队列中选择一个作业执行
HDFS(NameNode dataNode secondaryNamenode DFSClient)(数据复制,机架感知,Editlog,集群均衡,空间的回收)
HDFS读文件流程:HDFS Client向远程的Namenode发起请求,Namenode会视情况返回文件的部分或者全部block列表(包含对应datanode地址),
HDFS Client 选取离客户端最接近的datanode来读取block,读取完当前block的数据后,关闭与当前的datanode连接,并为读取下一个block寻找最佳的datanode
注:读取完一个block都会进行checksum验证,如果读取datanode时出现错误,客户端会通知Namenode,然后再从下一个拥有该block拷贝的datanode继续读。
HDFS写入文件流程:HDFS Client向远程的Namenode发起请求,Namenode会检查要创建的文件是否已经存在,创建者是否有权限进行操作,
成功则会为文件创建一个记录,否则会让客户端抛出异常。当客户端开始写入文件的时候,开发库会将文件切分成多个packets,并向Namenode申请备份。
以流水线的形式,将packets写入所有datanode, 全部成功存储之后会返回一个ack packet
主节点失效:主节点中会周期性地设置检查点(checkpoint),一旦某个任务失效,可以从最近有效的检查点开始重新执行
工作节点失效:主节点会周期性地给工作节点发送检测命令,如果工作节点没有回应,这认为该工作节点失效,
主节点将终止该工作节点的任务并把失效的任务重新调度到其它工作节点上重新执行
YARN(ResourceManager NodeManager ApplicationMaster)
ResourceManager:调度、启动、监控每一个Job所属的ApplicationMaster,监控NodeManager
NodeManager:单个节点上的资源管理
ApplicationMaster:负责一个Job生命周期内的所有工作,类似老的框架中JobTracker
spark:
RDD: 分布式内存抽象,(MapReduce把中间结果写入磁盘)将具体的应用逻辑表达为一系列转换处理,可以实现数据流水处理,避免中间数据存储
(本质上是一个只读的分区记录集合)(map、filter、groupBy、join等粗粒度的数据转换操作)
RDD高效的原因:高效的容错性(从出错前一个RDD重新开始) 中间结果持久化到内存,避免了读写磁盘开销
阶段划分(窄依赖 流水线优化) 具体步骤(贪心法): 在DAG中进行反向解析,遇到宽依赖就断开,遇到窄依赖就把当前的RDD加入到Stage中,窄依赖可流水
(Cluster Manager Driver Program Worker Node)
可能的题:
随机生成100个数,放在10个数组中,每个数组至少有2个数字,要求这十个数组的和尽量均衡。
//智力测试:假设一共2千万人口,问每天大概有多少新生儿出生?
了解哪些排序算法,时间复杂度和空间复杂度都怎样?
//智力测试:3L5L桶各一个,最少接几次水能装4L水?
计算机网络:TCP与UDP 三次握手 http与https ssl连接等基础知识
两道算法题 一道字符串索引什么的吧没太懂题目 一道链表存在环(双指针)
幻读,快排
你用哈希表来实现的,那如果数据量过大哈希放不下怎么办?用大数据的思想来解决一下
sql查询慢怎么优化
数据倾斜怎么处理:1. 加并行度,设置shuffle的并行度 2. 利用小trick打散key,在key上加随机前缀或后缀再还原
mysql索引什么时候无作用,或者说什么情况不适合建索引
写一个SQL吧。student(id, name, sex, age), book(id, name, stu_id(借阅学生id)),输出一下前十个18周岁男孩中借书最多的名字以及书本数量。
select name,count(*) from student S join book B on S.id = B.stu_id
where S.age = 18 and S.sex = 'F'
group by S.id
order by count(*) desc
limit 10
SQL题,两个表,表order是city,amount,表location是city, province,得出省份总交易额在[0,600],[400,1100],[1000,+infinite] 这三个区间的省份的数量
select elt(interval(P.sum_amount, 0, 400, 600, 1000, 1100), '1/less400', '2/400-600', '3/600-1000', '4/1000-1100', '5/more1100') yb, count(province) as cnt
from
(select province, sum(amount) as sum_amount
from order join location on order.city = location.city
group by province ) P
group by elt(interval(d.yb, 0, 400, 600, 1000, 1100), '1/less400', '2/400-600', '3/600-1000', '4/1000-1100', '5/more1100')
1. 有哪些mysql优化经验?
explain sql语句,可以看到MySQL是如何处理SQL语句的。这可以帮助分析性能瓶颈
当只要一行数据时使用 LIMIT 1,这样一样,MySQL数据库引擎会在找到一条数据后停止搜索,而不是继续往后查少下一条符合记录的数据
为搜索字段建索引,如果在表中,有某个字段你总要会经常用来做搜索,那么为其建立索引
避免 SELECT *,需要什么就取什么
使用 ENUM 而不是 VARCHAR,ENUM 类型是非常快和紧凑
尽可能的使用 NOT NULL,如果存在null,进行比较的时候会更复杂
固定长度的表会更快,固定长度的表中通过偏移量搜寻得会更快一些,也更容易被缓存和重建
选择正确的存储引擎,MyISAM 适合于一些需要大量查询的应用,但其对于有大量写操作并不是很好
InnoDB在写操作比较多的时候,会更优秀。并且他还支持事务,但是比较复杂,对于一些小的应用,它会比 MyISAM 还慢
切分大查询
2. acid
Atomicity:原子性 不可分割,事务的所有操作要么全部成功,要么全部失败回滚
Consistency:一致性 数据库在事务执行前后都保持一致性状态
Isolation:隔离性 一个事务所做的修改在最终提交以前,对其他事务是不可见的
Durability:持久性 一旦事务提交,则其所做的修改将会永远保存到数据库中。即使系统发生崩溃,事务执行的结果也不能丢。
3. 锁
s锁(共享锁)能读 x锁(互斥锁)能写 2PL IS IX SIX 多粒度锁协议
4. 范式
第一范式 属性不可分
第二范式 每个非主属性完全函数依赖于候选键
第三范式 每个非主属性不传递函数依赖于候选键
BCNF 任意主属性都完全函数依赖于候选键
mapReduce工作流程:
创建jobClient-分配资源-jobTracker-作业调度-mapper(从HDFS提取数据,创建Taskrunner,执行mapper,中间结果写入缓存,缓存写入磁盘)
shuffle(Map端保存、Partition、Sort、Combine、Reduce端拉取)
Partition:将map的结果发送到reduce,默认HashPartitioner,要求负载均衡、效率
sort: Map后的第1次排序:文件内部快速排序, Map后的第2次排序:多个文件归并排序
Combine: 合并Map输出的中间数据,减少数据传输、提高处理效率
reducer(创建TaskRunner,执行ReduceTask,从mapper下载中间结果,输出)
计算容错: 心跳监测:默认10分钟,未完成的任务则重新分配TaskTracker节点执行
黑名单机制:当TaskTracker被较多Job加入黑名单(满足三个条件),则将该TaskTracker加入集群黑名单,以后将不在该TaskTracker上调度任何task
恢复方法:重启TaskTracker
作业/任务调度:Input分片,分片分给各mapper,先进先出调度器(FIFO)(默认),先按优先级,再按先到先执行
公平(Fair)调度器,每个用户公平享有资源池中的资源
能力调度器,分层次多队列,计算每个队列中正在运行的任务数与其应该分得的计算资源之间的比值,计算一个比值最小的队列,然后按FIFO从队列中选择一个作业执行
HDFS(NameNode dataNode secondaryNamenode DFSClient)(数据复制,机架感知,Editlog,集群均衡,空间的回收)
HDFS读文件流程:HDFS Client向远程的Namenode发起请求,Namenode会视情况返回文件的部分或者全部block列表(包含对应datanode地址),
HDFS Client 选取离客户端最接近的datanode来读取block,读取完当前block的数据后,关闭与当前的datanode连接,并为读取下一个block寻找最佳的datanode
注:读取完一个block都会进行checksum验证,如果读取datanode时出现错误,客户端会通知Namenode,然后再从下一个拥有该block拷贝的datanode继续读。
HDFS写入文件流程:HDFS Client向远程的Namenode发起请求,Namenode会检查要创建的文件是否已经存在,创建者是否有权限进行操作,
成功则会为文件创建一个记录,否则会让客户端抛出异常。当客户端开始写入文件的时候,开发库会将文件切分成多个packets,并向Namenode申请备份。
以流水线的形式,将packets写入所有datanode, 全部成功存储之后会返回一个ack packet
主节点失效:主节点中会周期性地设置检查点(checkpoint),一旦某个任务失效,可以从最近有效的检查点开始重新执行
工作节点失效:主节点会周期性地给工作节点发送检测命令,如果工作节点没有回应,这认为该工作节点失效,
主节点将终止该工作节点的任务并把失效的任务重新调度到其它工作节点上重新执行
YARN(ResourceManager NodeManager ApplicationMaster)
ResourceManager:调度、启动、监控每一个Job所属的ApplicationMaster,监控NodeManager
NodeManager:单个节点上的资源管理
ApplicationMaster:负责一个Job生命周期内的所有工作,类似老的框架中JobTracker
spark:
RDD: 分布式内存抽象,(MapReduce把中间结果写入磁盘)将具体的应用逻辑表达为一系列转换处理,可以实现数据流水处理,避免中间数据存储
(本质上是一个只读的分区记录集合)(map、filter、groupBy、join等粗粒度的数据转换操作)
RDD高效的原因:高效的容错性(从出错前一个RDD重新开始) 中间结果持久化到内存,避免了读写磁盘开销
阶段划分(窄依赖 流水线优化) 具体步骤(贪心法): 在DAG中进行反向解析,遇到宽依赖就断开,遇到窄依赖就把当前的RDD加入到Stage中,窄依赖可流水
(Cluster Manager Driver Program Worker Node)
可能的题:
随机生成100个数,放在10个数组中,每个数组至少有2个数字,要求这十个数组的和尽量均衡。
//智力测试:假设一共2千万人口,问每天大概有多少新生儿出生?
了解哪些排序算法,时间复杂度和空间复杂度都怎样?
//智力测试:3L5L桶各一个,最少接几次水能装4L水?
计算机网络:TCP与UDP 三次握手 http与https ssl连接等基础知识
两道算法题 一道字符串索引什么的吧没太懂题目 一道链表存在环(双指针)
幻读,快排
你用哈希表来实现的,那如果数据量过大哈希放不下怎么办?用大数据的思想来解决一下
sql查询慢怎么优化
数据倾斜怎么处理:1. 加并行度,设置shuffle的并行度 2. 利用小trick打散key,在key上加随机前缀或后缀再还原
mysql索引什么时候无作用,或者说什么情况不适合建索引
写一个SQL吧。student(id, name, sex, age), book(id, name, stu_id(借阅学生id)),输出一下前十个18周岁男孩中借书最多的名字以及书本数量。
select name,count(*) from student S join book B on S.id = B.stu_id
where S.age = 18 and S.sex = 'F'
group by S.id
order by count(*) desc
limit 10
SQL题,两个表,表order是city,amount,表location是city, province,得出省份总交易额在[0,600],[400,1100],[1000,+infinite] 这三个区间的省份的数量
select elt(interval(P.sum_amount, 0, 400, 600, 1000, 1100), '1/less400', '2/400-600', '3/600-1000', '4/1000-1100', '5/more1100') yb, count(province) as cnt
from
(select province, sum(amount) as sum_amount
from order join location on order.city = location.city
group by province ) P
group by elt(interval(d.yb, 0, 400, 600, 1000, 1100), '1/less400', '2/400-600', '3/600-1000', '4/1000-1100', '5/more1100')
有点乱,主要是我对一些知识的总结,还有思考过的一些问题
面试官真的人都很好,就是我自己面试的时候有点紧张😭,
最后,听说牛客网许愿很🐂,我真的求求了,我跪了,让我过吧呜呜呜
全部评论
(3) 回帖