面试时长 55min 一位很友善、技术水平很高的大哥
面试官自我介绍:来自美的数据库与大数据平台部门。主要做全集团的基础数据平台研发(分大数据平台,数据库平台两个方向)。Spark 部分快忘光了,正好趁这次机会复盘一下!
大数据相关:
面试官问:Hadoop 和 Spark的区别说一下?
- Hadoop的数据处理单位是block,Spark 提供了可供并行处理的数据抽象RDD
- Hadoop 对数据处理只提供了Map和Reduce 两种操作。Spark 提供了两大类算子transformation 和 action,支持的操作更多。
- Hadoop 只支持Map->Reduce 的流程。Spark 则依赖DAG 有向无环图的方式来执行Job。速度更快。
- Spark 提供了Hadoop 所不支持的cache 和 checkpoint 机制。大大的提高了计算速度和程序可靠性。
- Spark 会对Job 划分Stage。同一个Stage 内的task 可以用流水线机制执行,大大提高了速度。
- Shuffle 机制:Hadoop 的MapReduce 不支持在线聚合。Spark 采用了类HashMap的结构(三种数据结构)实现了自动聚合功能。Spark 在对Record进行排序的时候可以通过PartitionId 和 key进行排序的方式,Hadoop 只能通过key进行排序
面试官问:说一下你对RDD 的理解?
- RDD是针对数据的分布式数据集,在RDD上的操作会在所有节点统一进行。RDD对它内部的元素具有容错机制。
面试官问:Map 是类似于桶数组的形式,类比说一下RDD 的内部结构你觉得是怎么样的?
- RDD 就像一个分布式数组,每个子part 含有相同类型的元素,但是元素可以分布在不同的机器上。
面试官问:说一下Spark 中 DAG 是如何形成的?
- DAG 是有向无环图,其实就是RDD执行的流程。原始的RDD通过一系列的转换操作就形成了DAG有向无环图,任务执行时(执行Action算子时),可以按照DAG的描述,执行真正的计算(数据被操作的一个过程)。一个Spark应用中可以有一到多个DAG,取决于触发了多少次Action。
- Spark会根据shuffle/宽依赖使用回溯算法来对DAG进行Stage划分,从后往前,遇到宽依赖就断开,遇到窄依赖就把当前的RDD加入到当前的stage/阶段中。
面试官问:说一下Spark 持久化机制/缓存机制?
- Spark 的缓存机制是一种空间换时间的方法。使用场景为:数据会被多次重复使用。数据量较小可以放在内存空间的情况下可以对RDD 进行缓存。
- Spark提供了不同的缓存级别。因为ci'pan
面试官问:说一下Spark 的checkpoint 机制?
- Checkpoint 是Spark 提供的容错机制。适用场景为:应对job 执行失败的情况,应对软硬件故障造成的数据丢失问题。具体的过程是Spark 将RDD 持久化到了分布式文件系统上。
- Checkpoint 会切断lineage 血缘关系。既然RDD 都被持久化到HDFS上了,该RDD 不需要通过重新计算再次得到,也就没有必要保存其lineage 了。
面试官问:Spark 持久化机制和checkpoint 机制你觉得区别在哪里?
- 目的不同:cache 是为了加速计算,也就是加速后续的job。checkpoint 则是为了在job 运行失败的时候能够快速恢复!
- 存储位置不同:cache 主要使用内存,偶尔使用磁盘存储。checkpoint 为了可靠读写主要采用HDFS 作为存储空间
- 对lineage 影响不同:cache 对lineage无影响。缓存的RDD 丢失后可以通过lineage 重新计算。如果对RDD 进行 checkpoint,HDFS 因为是可靠存储哎,所以不需要再保存lineage了
- 应用场景不同:cache 机制适用于会被多次读取,占用空间不是特别大的RDD。checkpoint 机制则是适用于数据依赖关系特别复杂,重新计算代价高的RDD,比如某RDD关联的数据过多、计算链过长、被多次重复使用。
-
面试官问:说一下Spark 架构。由哪几个部分构成?
- Master 节点、Worker 节点、Executor 执行器、Task 计算任务
- Master 节点上常驻Master 进程,该进程负责管理所有的Worker 节点。(分配任务、收集运行信息、监控worker的存活状态)
- Worker 节点常驻Worker进程,该进程与Master 节点通信,还管理Spark 任务的执行。(启动Executor,监控任务运行状态)
- Executor 执行器。Executor 是一个JVM 进程,是Spark 计算资源的单位。可以运行多个计算任务。
- Task Spark 应用会被拆分为多个计算任务,分配给Executor 执行。Task 以线程的方式运行在Executor 中。
Java 连环问
说一下HashMap 的底层实现原理?
说一下并发和并行的区别?
说一下比如说4个任务,4个内核如何让他们并行执行?
说一下Java 里面提供的线程池类有哪几个?SingleThreadPool、FixedThreadPool
说一下Java 线程池参数有哪些?corePoolsize,maximumPoolSize blockingQueue。按照场景讲了一遍
说一下如果workQueue 设置为无限大的情况下,corePoolSize为2. 这时候会创建第三个临时线程吗?不会
说一下Java 提供了哪些并发机制?答了synchronized修饰类,方法。代码块,wait/notify。
说一下Java Synchronized 如果对static 方法加synchronized 修饰的话,锁住的是类本身还是类的对象?类本身
说一下可重入锁是怎么理解的?retreenLock 重复获取一把锁
说一下信号量你是怎么理解的?semaphore 表示资源
说一下Java 有序性是怎么实现的?volatile 能保证原子性吗?
说一下堆排序,说一说堆排序的过程。
以大顶堆为例子,他的左孩子一定比右孩子小吗?说一下。
MySQL 相关
说一下ACID?
说一下ACID 在Mysql 中通过什么保证的?undo log,可重复读,redo log
说一下 MySQL 主从复制是通过什么实现的?binlog
说一下 binlog 是在什么时候写入的?MySQL 主从复制,MySQL 写入是毫秒级,如何保证高写入情况下binlog 也正常写入?会不会出现刷盘失败的情况?宕机了怎么办?binlog 数据会丢失吗?
反问:
大数据平台的业务场景是什么?
面试官:业务方是美的其他部门。like 数据分析、深度学习部门。提供平台的接口供其他部门调用。
总结
首先,兄弟们能不能告诉我一下MySQL 的最后一个问题,MySQL 是如何保证在毫秒级写入的情况下 binlog也能正常写入?谢谢!
答:
binlog 的写入机制:事务执行过程中会先把日志写到binlog cache,事务提交的时候,再把binlog cache写到 binlog 文件中。步骤一 是 write,步骤二是 fsync。可以通过sync_binlog 控制写入时机。0表示每次提交事务都只write,由系统决定什么时候 fsync。1每次提交事务都会fsync,将cache刷到磁盘上。N每次提交事务都write 到 cache中,累计N个事务才Sync。
在出现IO 瓶颈的时候,可以将sync_binlog 设置为较大的数值,减少刷盘频率,提高性能。但是如果宕机的话,会丢失最近N个事务的binlog 事务。
面试官说总体回答的不错 hh 大数据部分忘得差不多了全凭自由发挥。复习一下子。同时再查漏补缺一下子。许愿一个二面!
#美的##秋招##大数据##面经#