一些大数据的面经

[TOC]

Spark相关

1. 阶段划分

Spark通过分析各个RDD的依赖关系生成了DAG,再通过分析各个RDD中的分区之间的依赖关系来决定如何划分阶段,具体划分方法是:在DAG中进行反向解析,遇到宽依赖就断开,遇到窄依赖就把当前的RDD加入到当前的阶段中;将窄依赖尽量划分在同一个阶段中,可以实现流水线计算(具体的阶段划分算法请参见AMP实验室发表的论文《Resilient Distributed Datasets: A Fault-Tolerant Abstraction for In-Memory Cluster Computing》)。例如,下图所示,假设从HDFS中读入数据生成3个不同的RDD(即A、C和E),通过一系列转换操作后再将计算结果保存回HDFS。对DAG进行解析时,在依赖图中进行反向解析,由于从RDD A到RDD B的转换以及从RDD B和F到RDD G的转换,都属于宽依赖,因此,在宽依赖处断开后可以得到三个阶段,即阶段1、阶段2和阶段3。可以看出,在阶段2中,从map到union都是窄依赖,这两步操作可以形成一个流水线操作,比如,分区7通过map操作生成的分区9,可以不用等待分区8到分区9这个转换操作的计算结束,而是继续进行union操作,转换得到分区13,这样流水线执行大大提高了计算的效率。

对于窄依赖,partition的转换处理在Stage中完成计算。对于宽依赖,由于有Shuffle的存在,只能在parent RDD处理完成后,才能开始接下来的计算,因此宽依赖是划分Stage的依据。 img

由上述论述可知,把一个DAG图划分成多个“阶段”以后,每个阶段都代表了一组关联的、相互之间没有Shuffle依赖关系的任务组成的任务集合。每个任务集合会被提交给任务调度器(TaskScheduler)进行处理,由任务调度器将任务分发给Executor运行。

参考文章-厦门大学大数据实验室

2. 缓存

cache persist

RDD通过persist方法或cache方法可以将前面的计算结果缓存,默认情况下 persist() 会把数据以序列化的形式缓存在 JVM 的堆空间中。

但是并不是这两个方法被调用时立即缓存,而是触发后面的action时,该RDD将会被缓存在计算节点的内存中,并供后面重用。

通过查看源码发现cache最终也是调用了persist方法,默认的存储级别都是仅在内存存储一份,Spark的存储级别还有好多种,存储级别在object StorageLevel中定义的。

img

在存储级别的末尾加上“_2”来把持久化数据存为两份

img

checkPoint

Spark中对于数据的保存除了持久化操作之外,还提供了一种检查点的机制,检查点(本质是通过将RDD写入Disk做检查点)是为了通过lineage做容错的辅助,lineage过长会造成容错成本过高,这样就不如在中间阶段做检查点容错,如果之后有节点出现问题而丢失分区,从做检查点的RDD开始重做Lineage,就会减少开销。检查点通过将数据写入到HDFS文件系统实现了RDD的检查点功能。

为当前RDD设置检查点。该函数将会创建一个二进制的文件,并存储到checkpoint目录中,该目录是用SparkContext.setCheckpointDir()设置的。在checkpoint的过程中,该RDD的所有依赖于父RDD中的信息将全部被移除。对RDD进行checkpoint操作并不会马上被执行,必须执行Action操作才能触发。

3. RDD 运行过程

RDDSpark架构中的运行过程:

创建RDD对象; SparkContext负责计算RDD之间的依赖关系,构建DAG; DGAScheduler负责把DAG分解成多个阶段,每个阶段中包含了多个任务,每个任务都会被任务调度器分发给各个工作节点(Worker Node)上的Executor去执行。

img

4. 任务划分

RDD任务切分中间分为:Application、Job、Stage和Task

1)Application:初始化一个SparkContext即生成一个Application 2)Job:一个Action算子就会生成一个Job 3)Stage:根据RDD之间的依赖关系的不同将Job划分成不同的Stage,遇到一个宽依赖则划分一个Stage。 4)Task:Stage是一个TaskSet,将Stage划分的结果发送到不同的Executor执行即为一个Task。 注意:Application->Job->Stage-> Task每一层都是1对n的关系。 ![](vimages/20200118105455064_11119.png =686x)

5. 数据倾斜

解决方案 解决方案2-CSDN***

原理

数据倾斜的原理很简单:在进行shuffle的时候,必须将各个节点上相同的key拉取到某个节点上的一个task来进行处理,比如按照key进行聚合或join等操作。此时如果某个key对应的数据量特别大的话,就会发生数据倾斜。比如大部分key对应10条数据,但是个别key却对应了100万条数据,那么大部分task可能就只会分配到10条数据,然后1秒钟就运行完了;但是个别task可能分配到了100万数据,要运行一两个小时。因此,整个Spark作业的运行进度是由运行时间最长的那个task决定的。

  因此出现数据倾斜的时候,Spark作业看起来会运行得非常缓慢,甚至可能因为某个task处理的数据量过大导致内存溢出。

  下图就是一个很清晰的例子:hello这个key,在三个节点上对应了总共7条数据,这些数据都会被拉取到同一个task中进行处理;而world和you这两个key分别才对应1条数据,所以另外两个task只要分别处理1条数据即可。此时第一个task的运行时间可能是另外两个task的7倍,而整个stage的运行速度也由运行最慢的那个task所决定。

img

预聚合处理

如: groupByKeyreduceByKey img

  1. reduceByKey:按照key进行聚合,在shuffle之前有combine(预聚合)操作,返回结果是RDD[k,v].
  2. groupByKey:按照key进行分组,直接进行shuffle。
  3. 开发指导:reduceByKey比groupByKey,建议使用。但是需要注意是否会影响业务逻辑。

6. Spark Pipeline

Spark Pipeline初探–腾讯云社区

ML管道提供了一组构建在DataFrames之上的统一的高级api,帮助用户创建和优化实际的机器学习管道。

7. Spark列式存储,Spark中Join连接

列式存储-CSDN 1)作用:在类型为(K,V)和(K,W)的RDD上调用,返回一个相同key对应的所有元素对在一起的(K,(V,W))的RDD 2)需求:创建两个pairRDD,并将key相同的数据聚合到一个元组。

8. 共享变量

  • 累加器
  • 广播变量

Spark运行模式(任务执行流程)

./大数据学习/Spark编程

Hive

HiveSQL底层是怎么实现的?比如两张表Join的时候会有哪些操作?需要shuffle这一步吗?

hiveSql-Join操作

HDFS

hdfs小文件过多会怎么样

参考文章–CSDN 参考文章–腾讯云社区 因为在hdfs 中,数据的元数据信息是保存在NameNode上的,hdfs本身的作用就是用来存储海量文件的,首先小文件过多的话,会增加NameNode 的压力,,因为NameNode是要接收集群中所有的DataNode的心跳信息,来确定元数据的信息变化的,另外,文件中可使用的block块的个数是有限制的,hadoop用来处理数据的话,小文件的延迟,和数据量虽然很小,但是有些地方和大文件所耗的时间相同,所以最好做优化,避免这种情况的发生。

小文件除了可能会撑爆NameNode。另一个是hive或者spark计算的时候会影响它的速度,因为spark计算时会将数据从硬盘读到内存,零碎的文件将产生较多的寻道过程。

namenode 损坏,如何恢复

如果运行 namenode服务的机器毁坏,文件系统上所有文件将会丢失,因为不知道如何根据 datanode 的块重建文件。因此,对namenode实现容错很重要,hadoop实现了两种容错机制。

  1. 备份那些组成文件系统元数据持久状态的文件;
  2. 运行一个辅助的namenode。但它不能被用作namenode。这个辅助 namenode 的重要作用是定期合并编辑日志与命名空间镜像,以防止编辑日志过大

HDFS上传流程以及操作命令

客户端请求上传,dfs底层与服务端建立通信,服务端(NameNode)创建元数据信息,其中包括文件名,文件路径,数据块; 接着客户端创建一个输出流把文件切块,上传第一个数据块,通过水平复制,达到冗余度的要求,这里会通过循环,直至上传完所有的数据块。 ![](vimages/20200826130726740_7501.png =1144x)

HDFS上传流程以及操作命令-掘金


一些面经

熟悉的

与Spark相关

  1. spark rdd介绍一下 RDD(Resilient Distributed Dataset)叫做弹性分布式数据集,是Spark中最基本的数据(计算)抽象。代码中是一个抽象类,它代表一个不可变、可分区、里面的元素可并行计算的集合。
  2. spark的宽依赖和窄依赖
  3. Spark任务执行流程
  4. 谈谈MapReduce和Spark处理数据的区别 MapReduce和Spark处理数据的区别
  5. Spark的Stage是怎么划分的,如何优化。宽窄依赖。
  6. Spark生态体系.和优化
  7. 说对hadoop的理解,都有哪些组件,分别是干什么的
  8. 说下spark中的transform和action
  9. 为什么spark要把操作分为transform和action
  10. spark中有了RDD,为什么还要有Dataframe和DataSet? DataFrame也是懒执行的。性能上比RDD要高,主要原因:优化的执行计划,查询计划通过Spark catalyst optimiser进行filter过滤掉无用的数据量后在进行join操作。 比如:进行人口分析,可以先进行 Dataset有用户友好的API风格,既具有类型安全检查也具有Dataframe的查询优化特性。DataframeDataset的特列,DataFrame=Dataset[Row]
  11. spark - 自由发挥 能说多少说多少
  12. Spark执行任务流程 容错机制 结构 RDD算子 宽窄依赖(具体举例) shuffle细节
  13. sparkSql Spark SQL是Spark用来处理结构化数据的一个模块,它提供了2个编程抽象:DataFrame和DataSet,并且作为分布式SQL查询引擎的作用。 我们已经学习了Hive,它是将Hive SQL转换成MapReduce然后提交到集群上执行,大大简化了编写MapReduc的程序的复杂性,由于MapReduce这种计算模型执行效率比较慢。所有Spark SQL的应运而生,它是将Spark SQL转换成RDD,然后提交到集群执行,执行效率非常快!

Hive

  1. Hive的作用

HDFS

其他

  1. Yarn
  2. 编程说思路:1G文件,每行是一个词,内存1M,求词频最大的前100个词
  3. HDFS的NameNode怎么知道它手下有多少DataNode的。容错机制。副本存放策略。
  4. Yarn的架构
  5. Yarn的Resource Manager, Node Manager,AppMaster等怎么工作的,有任务来的时候的工作流程
  6. Spark的2种运行模式,standalone和cluster模式的区别,内部工作流程。
  7. 了解函数式编程吗?说下c/c++和scala这种函数式编程语言的区别
  8. Hadoop生态圈
  9. 对Hive Hbase的了解 (简历项目里面用了什么)
  10. Hadoop vs Spark (自由发挥 说到你说不出来)

模糊的

与Spark相关

  1. Spark列式存储,SparkJoin连接 列式存储-CSDN 列式存储一定快吗?–知乎 用图文解释列式存储–CSDN 数据库中的 “行式存储”和“列式存储”—腾讯云社区 1)作用:在类型为(K,V)和(K,W)的RDD上调用,返回一个相同key对应的所有元素对在一起的(K,(V,W))的RDD 2)需求:创建两个pairRDD,并将key相同的数据聚合到一个元组。
  2. stage划分的依据是什么
  3. 数据倾斜
  4. Spark哪些部分可以优化
  5. 解决Spark性能瓶颈问题
    • 基础调优 提交参数设置;并行度设置;设置缓存/检查点;使用广播变量;Kryo序列化(重要)
    • Rdd算子优化 RDD复用;尽早filter;读取大量小 文件用wholeTextFiles;mapPartition和foreachPartition;repartition调节并行度,也可以通过conf参数配置;本地预聚合,能用reduceBykey,就不用了groupBykey;
    • shuflle优化 当数据量更多的时候,把map和reduce端的缓冲区大小调大,reduce端重试和等待时间间隔调大;bypass机制开启阈值
    • 数据倾斜优化
    • JVM 调优

与HDFS相关

  1. hdfs小文件过多会怎么样 参考文章–CSDN 参考文章–腾讯云社区 因为在hdfs 中,数据的元数据信息是保存在NameNode上的,hdfs本身的作用就是用来存储海量文件的,首先小文件过多的话,会增加NameNode 的压力,,因为NameNode是要接收集群中所有的DataNode的心跳信息,来确定元数据的信息变化的,另外,文件中可使用的block块的个数是有限制的,hadoop用来处理数据的话,小文件的延迟和数据量虽然很小,但是有些地方和大文件所耗的时间相同,所以最好做优化,避免这种情况的发生。

太多的小文件除了可能会撑爆NameNode,还会影响hive和spark计算速度。由于spark计算时会将数据从磁盘读取到内存,零碎的文件将产生较多的寻址过程。

  1. spark的job,stage,task
  2. DAGscheduler干了什么活 DGAScheduler负责把DAG分解成多个阶段,每个阶段中包含了多个任务,每个任务都会被任务调度器分发给各个工作节点(Worker Node)上的Executor去执行。

其他组件

  • Hive Hbase你的了解

不了解的

与Spark相关

  1. 用spark求一下dau
  2. spark统计日活,日志文件每行是日期和user_id spark 统计每天新增用户数
  3. Spark的TaskScheduler是怎么分配task的,源码看过吗

一些其他组件

  1. kafka在什么地方需要用到zookeeper
  2. 了解HBase吗?
  3. 给一个日志文件,有用户ID,时间戳,url,用mapreduce如何给出每天每个站点的访问任务
  4. Kafuka原理
  5. Hadoop MR全部过程
  6. 大表join优化方法

其他

数据仓库与数据库

数据库与数据仓库的本质区别是什么?—知乎

  1. 100亿个数怎么求中位数 参考文章-CSDN 存储够用时用快排;否则用桶排序;

  2. 数组求top k

  3. 求每组top 3

  4. 多核CPU和多CPU区别 多核 CPU 和多个 CPU 有何区别? - 卧闻海棠花的回答 - 知乎 多核CPU和多CPU的区别主要在于性能和成本

    如果我们选择多个单核CPU,那么每一个CPU都需要有较为独立的电路支持,有自己的Cache,而他们之间通过板上的总线进行通信。假如在这样的架构上,我们要跑一个多线程的程序(常见典型情况),不考虑超线程,那么每一个线程就要跑在一个独立的CPU上,线程间的所有协作都要走总线,而共享的数据更是有可能要在好几个Cache里同时存在。这样的话,总线开销相比较而言是很大的,怎么办?那么多Cache,即使我们不心疼存储能力的浪费,一致性怎么保证?如果真正做出来,还要在主板上占多块地盘,给布局布线带来更大的挑战,怎么搞定?

    如果我们选择多核单CPU,那么我们只需要一套芯片组,一套存储,多核之间通过芯片内部总线进行通信,共享使用内存。在这样的架构上,如果我们跑一个多线程的程序,那么线程间通信将比上一种情形更快。如果最终实现出来,对板上空间的占用较小,布局布线的压力也较小。

  5. TCP的三次握手、四次挥手大致流程。Time_wait和close_wait是什么。拥塞控制和流量控制。

  6. 操作系统的页式存储是怎样的。有什么优点和缺点。Linux的进程调度。

  7. 进程和线程的区别。

  8. 怎么对10亿个数字进行排序

  9. 如何把多个Hadoop集群连接起来

  10. 数据库都有哪些引擎

  11. 数据库的锁了解哪些,说说

  12. 应用层协议有哪些

  13. 什么场景用TCP,什么场景用UDP

  14. HTTP状态码都有哪些,具体说一下

  15. HTTP长连接和短连接 长连接与短连接 在HTTP/1.0中,默认使用的是短连接。也就是说,浏览器和服务器每进行一次HTTP操作,就建立一次连接,但任务结束就中断连接。如果客户端浏览器访问的某个HTML或其他类型的 Web页中包含有其他的Web资源,如JavaScript文件、图像文件、CSS文件等;当浏览器每遇到这样一个Web资源,就会建立一个HTTP会话。

    但从 HTTP/1.1起,默认使用长连接,用以保持连接特性。使用长连接的HTTP协议,会在响应头有加入这行代码:Connection:keep-alive

    在使用长连接的情况下,当一个网页打开完成后,客户端和服务器之间用于传输HTTP数据的 TCP连接不会关闭,如果客户端再次访问这个服务器上的网页,会继续使用这一条已经建立的连接。Keep-Alive不会永久保持连接,它有一个保持时间,可以在不同的服务器软件(如Apache)中设定这个时间。实现长连接要客户端和服务端都支持长连接。

    HTTP协议的长连接和短连接,实质上是TCP协议的长连接和短连接。

  16. url和uri的区别 参考文章—简书 URIUniform Resource Identifier,统一资源标识符 URLUniform Resource Location统一资源定位符

  17. 线程和进程的区别

  18. hashmap的实现

  19. hashmap的扩容

  20. 一条直线可以把一个平面分成2个平面,两条直线最多分成4个,问n条直线最多分成几个面 一个直线将一个平面分成 2 部分,两条直线分成 4 部分

  21. TCP(连接 断开) UDP

  22. 进程的用户栈和内核栈

  23. 操作系统 同步IO 异步IO

  24. FIFO的缺点

  25. 同步 异步 谈谈你的理解

  26. 进程通信 线程通信