大数据开发工程师面试题

2019-04-17  本文已影响0人  王龙江_3c83

1. mapreduce

(1) mapreduce 流程

(2) 如何实现

(3) mapreduce shuffle

MapReduce 确保每个 reducer 的输入都按键排序。系统执行排序的过程——将 map 输出作为输入传给 reducer——称为 shuffle。

map 端

mapper 一般执行输入格式的解析、投影和过滤。map -> partition -> sort->spill(combine)->merge

缓存

map 产生输出时,利用缓存的方式写到内存,并出于效率的考虑进行预排序。默认情况下,缓冲区大小为 100 MB,此值可以通过改变 io.sort.mb 属性来调整。一旦缓冲内容达到阈值(io.sort.spill.percent,默认为 80%),一个后台线程便开始把内容写(spill)到磁盘中。在写磁盘的过程中,map 输出将继续被写到缓冲区,但如果在此期间缓冲区被填满,map 任务会阻塞知道写磁盘的过程完成。写入路径: mapred.local.dir

分区

在写磁盘之前,线程首先根据数据最终要传送到的 reducer 把数据划分到相应的分区,在每个分区中,后台线程按键进行内排序,如果有一个 combiner,它会在排序后的输出上运行。

合并

一旦内存缓冲区达到溢出写对阈值,就会新建一个溢出写文件,因此在 map 任务完成最后一个记录输出之后,会有几个溢出写文件。在任务完成之前,溢出写文件被合并成一个已分区且已排序对输出文件。配置 io.sort.factor 控制一次合并多少个流,默认值为 10。

压缩

写磁盘压缩 map 输出,会让写磁盘的速度更快,节省磁盘空间,并且减少传给 reducer 的数据量。默认情况下,输出是不压缩的,但只要将mapred.compress.map.output 设置为 true,并使用 mapred.map.output.compression.codec 来指定压缩库。

数据传输

map 输出文件位于 map 任务的 tasktracker 的本地磁盘,reducer 通过 HTTP 方式得到 map 输出文件的分区。

reduce 端

reducer 一般执行数据的汇总和写出。copy ->merge

复制

reduce 任务需要集群上若干个 map 任务的输出作为其分区文件。每个 map 任务的完成时间不同,因此只要有一个 map 任务完成,reduce 任务就开始复制其输出,这就是 reduce 任务的复制阶段,reduce 任务有少量复制线程,默认值是 5 个线程,可以通过 mapred.reduce.paraller.copies 属性来指定,因此能并行得到 map 输出。如果 map 输出足够情况下,则会被复制到 reduce tasktracker 到内存(缓冲区大小mapred.job.shuffle.input.buffer.percent )

reducer 如何知道从那个 tasktarcker 取得文件输出

map 任务完成后,它们会通知其父 tasktracker 状态已更新,tasktracker 通知 jobtracker 进程,通知通过心跳机制传输。reducer 中的一个线程定期询问 jobtracker,以便获得 map 的输出位置,知道它获得所有输出位置。

合并

每台机器上有个 TaskTracker 进程,管理机器上的资源,当资源空闲时,通知 JobTracker 根据分布 在该节点上启动 Map 进程或 Reduce 进程。

(3) 作业调优

调优项 调优方法
map 数 Map 数由 splitsize 决定,首先按 splitsize 切分数据,若剩余数据大小 < 1.1*splitsize ,则将剩余数据作为一个 split,splitsize 的取值方法:取 minSplit , maxSplit , blocksize 的中间值。
reduce 数 大部分场景下可由用户指定。
combiner 对于取最大值、词频统计场景,可以使用 combiner 对数据在 map 端进行 reduce 计算。
中间值的压缩
自定义序列
调整 shuffle

2. Spark

(1) spark运行流程

Yarn-Cluster 模式

Yarn-Client 模式

StandAlone Cluster 模式

StandAlone Client 模式

(2) Sparkshuffle

Spark的Shuffle总体而言就包含两个基本的过程:Shuffle write和Shuffle read。shuffle write 有:sort,bypass,unsafe。

sort

步骤

使用场景

bypass

使用步骤

使用场景

unsafe

步骤

使用场景

Shuffle read 指的是 reducer 对属于自己的 FileSegment 文件进行fetch操作,这里采用的 netty 框架,效率明显好于 Mapreduce 的 http 传输。fetch操作会等到所有的Shuffle Write过程结束后再进行,这也是因为ShuffleMapTask可能并不在一个stage里面,需要在父stage执行之后提交才会进行子stage的执行。reducer通过fetch得到的FileSegment先放在缓冲区softBuffer中,默认大小48MB。Spark不要求Shuffle后的数据是全局有序的,所以没有必要等到shuffle read全部结束后再进行reduce,是可以并行处理的。

(3) spark的内存管理机制

Spark中的内存管理(一)

(4) spark里面有哪些参数可以设置,有什么用

参数 功能
num-executors Spark作业总共要用多少个Executor进程来执行。
executor-memory 设置每个Executor进程的内存。
executor-cores 设置每个Executor进程的CPU core数量。
driver-memory 设置Driver进程的内存。
spark.default.parallelism 该参数用于设置每个stage的默认task数量。
spark.shuffle.memoryFraction 设置shuffle过程中一个task拉取到上个stage的task的输出后,进行聚合操作时能够使用的Executor内存的比例。
spark.storage.memoryFraction 设置RDD持久化数据在Executor内存中能占的比例。

Spark学习之路 (十二)SparkCore的调优之资源调优
spark submit参数及调优

(5) Spark 存储管理

(6) Spark算子

算子分类

Spark 算子大致可以分为以下两类:Transformation 算子和 Action 算子。
详细请看:Spark 算子分类

会产生 shuffle 的算子

cogroup、join、leftOutJoin、rightOutJoin、groupbykey和reducebykey 原理

join 流程

combineByKey 流程

def combineByKey[C](
      createCombiner: V => C,
      mergeValue: (C, V) => C,
      mergeCombiners: (C, C) => C,
      partitioner: Partitioner,
      mapSideCombine: Boolean = true,
      serializer: Serializer = null): RDD[(K, C)] = self.withScope {
      combineByKeyWithClassTag(createCombiner, mergeValue, mergeCombiners,
      partitioner, mapSideCombine, serializer)(null)
  }

(7)Spark stage的切分、task资源分配、任务调度、master计算资源分配/(1)Spark Job、Task、Stage 区别与联系。

资源调度

应用程序如何获得资源。

任务调度

是通过 DAGScheduler、TaskScheduler、SchedulerBackend 等进行的作业调度

(15)Spark数据倾斜解决方案

Spark性能优化之道——解决Spark数据倾斜(Data Skew)的N种姿势

3. Yarn

(1) Yarn 资源调度算法

Hadoop和Yarn中的任务调度算法和任务队列

(2) Yarn 组成架构

(3)作业执行流程

YARN基本框架和工作流程

4. SQL

(1) Hivesql/Spark SQL 是怎么转化为 MapReduce 任务的

  1. SQL 语句经过 SqlParser 解析成 Unresolved LogicalPlan
  2. 使用 Analyzer 结合数据数据字典(catalog)进行绑定,生成 resolved LogicalPlan
  3. 使用 optimizer 对 resolved LogicalPlan 进行优化,生成 optimized LogicalPlan
  4. 使用 SparkPlan 将 LogicalPlan 转换成 PhysicalPlan
  5. 使用 prepareForExecution() 将 PhysicalPlan 转换成可执行物理计划
  6. 使用 execute() 执行可执行物理计划
  7. 生成 RDD。

(2) 数据倾斜

(3) Join 实现
ordinary join
hash join
sort merger join

大数据中Hadoop Hive发生数据倾斜的处理方案 绝对是干货

5. 流计算

Spark Streaming 和 Storm 的区别

处理模型,延迟

虽然这两个框架都提供可扩展性和容错性,它们根本的区别在于他们的处理模型。而 Storm 处理的是每次传入的一个事件,而 Spark Streaming 是处理某个时间段窗口内的事件流。因此,Storm 处理一个事件可以达到秒内的延迟,而 Spark Streaming 则有几秒钟的延迟。

容错、数据保证

在容错数据保证方面的权衡是,Spark Streaming 提供了更好的支持容错状态计算。在 Storm 中,每个单独的记录当它通过系统时必须被跟踪,所以 Storm 能够至少保证每个记录将被处理一次,但是在从错误中恢复过来时候允许出现重复记录。这意味着可变状态可能不正确地被更新两次。

另一方面,Spark Streaming 只需要在批级别进行跟踪处理,因此可以有效地保证每个 mini-batch 将完全被处理一次,即便一个节点发生故障。(实际上 Storm 的 Trident library 库也提供了完全一次处理。但是,它依赖于事务更新状态,这比较慢,通常必须由用户实现)。

总结

简而言之,如果你需要秒内的延迟,Storm 是一个不错的选择,而且没有数据丢失。如果你需要有状态的计算,而且要完全保证每个事件只被处理一次,Spark Streaming 则更好。Spark Streaming 编程逻辑也可能更容易,因为它类似于批处理程序(Hadoop),特别是在你使用批次(尽管是很小的)时。

(29)spark streaming是怎么跟kafka交互的,具体代码怎么写的,程序执行流程是怎样的,这个过程中怎么确保数据不丢(直连和receiver方式)

通过 zookeeper 或其他外部存储获取 topic 每个 partition 的偏移量,消费完成后,将偏移量写入外部存储。

Kafka复制机制、分区多副本机制/

7. kafka partition 分区的策略是什么

消息发送到哪个分区上,有两种基本的策略,一是采用 Key Hash 算法,一是采用 Round Robin 算法。另外创建分区时,最好是 broker 数量的整数倍,这样才能是一个 Topic 的分区均匀的分布在整个 Kafka 集群中。

(30) kafka如何保证高吞吐的,kafka零拷贝,具体怎么做的。

Kafka副本同步机制理解
Kafka介绍, kafka主题的副本机制
kafka producer自定义partitioner和consumer多线程

6. Zookeeper

(1)zookeeper怎么保证原子性,怎么实现分布式锁
(2)Zookeeper脑裂问题
(3)Zookeeper首领选取、节点类型、zookeeper实现原理
(4)hbase的ha,zookeeper在其中的作用

7. HDFS

(1) Hdfs读写流程,数据checkpoint流程
(2) hdfs的容错机制

8. Hbase

(1) Hbase 架构


1228818-20180402125236874-140096659.png

(2) Hbase 读写流程,数据 compact 流程

9. ES

(1)ES 插入一条文档的过程。
(2)ES 集群查询一条文档过程。(query and fetch)

10. 其他组件

10.1 Redis

(1) 数据类型、操作和实现

数据类型 操作 实现
String
List
Set
Map
ZSet

10.2 Kylin

使用预结算加速即时查询。

10.3 flume

解耦日志的产生和使用。

上一篇 下一篇

猜你喜欢

热点阅读