本文是个人从牛客网中的大数据的面试的面经中筛选出来与大数据的的相关的面试的问题:包括以下的技术栈:

Flume Zookeeper Hbase Hive Hadoop  Spark Flink  HDFS Yarn Sqoop Kafka Scala……

下面将分成这些部分分别整理好相关的问题供大家学习:

Flume

Zookeeper

Hbase

Hive

Hadoop 

Spark Flink 

HDFS

Yarn

Sqoop

Kafka

Scala


Flume

 

Zookeeper

 

Hbase

 

Hive

Hive是基于Hadoop的一个数据仓库系统,在各大公司都有广泛的应用。美团数据仓库也是基于Hive搭建,每天执行近万次的Hive ETL计算流程,负责每天数百GB的数据存储和分析。Hive的稳定性和性能对我们的数据分析非常关键。

MapReduce实现基本SQL操作的原理

MapReduce框架实现SQL基本操作的原理

Join的实现原理
select u.name, o.orderid from order o join user u on o.uid = u.uid;

在map的输出value中为不同表的数据打上tag标记,在reduce阶段根据tag判断数据来源。MapReduce的过程如下(这里只是说明最基本的Join的实现,还有其他的实现方式)

大数据与云计算——牛客网大数据面试问题总结_大数据

Distinct的实现原理

select dealid, count(distinct uid) num from order group by dealid;

当只有一个distinct字段时,如果不考虑Map阶段的Hash GroupBy,只需要将GroupBy字段和Distinct字段组合为map输出key,利用mapreduce的排序,同时将GroupBy字段作 为reduce的key,在reduce阶段保存LastKey即可完成去重。

大数据与云计算——牛客网大数据面试问题总结_大数据_02

如果有多个distinct字段呢,如下面的SQL
select dealid, count(distinct uid), count(distinct date) from order group by dealid;

实现方式有两种:

(1)如果仍然按照上面一个distinct字段的方法,即下图这种实现方式,无法跟据uid和date分别排序,也就无法通过LastKey去重,仍然需要在reduce阶段在内存中通过Hash去重。

大数据与云计算——牛客网大数据面试问题总结_数据_03

 

2)第二种实现方式,可以对所有的distinct字段编号,每行数据生成n行数据,那么相同字段就会分别排序,这时只需要在reduce阶段记录LastKey即可去重。

这种实现方式很好的利用了MapReduce的排序,节省了reduce阶段去重的内存消耗,但是缺点是增加了shuffle的数据量。

需要注意的是,在生成reduce value时,除第一个distinct字段所在行需要保留value值,其余distinct数据行value字段均可为空。

大数据与云计算——牛客网大数据面试问题总结_大数据_04

SQL转化为MapReduce的过程

了解了MapReduce实现SQL基本操作之后,我们来看看Hive是如何将SQL转化为MapReduce任务的,整个编译过程分为六个阶段:

  • Antlr定义SQL的语法规则,完成SQL词法,语法解析,将SQL转化为抽象语法树AST Tree
  • 遍历AST Tree,抽象出查询的基本组成单元QueryBlock
  • 遍历QueryBlock,翻译为执行操作树OperatorTree
  • 逻辑层优化器进行OperatorTree变换,合并不必要的ReduceSinkOperator,减少shuffle数据量
  • 遍历OperatorTree,翻译为MapReduce任务
  • 物理层优化器进行MapReduce任务的变换,生成最终的执行计划

数据仓库与数据库的区别:

 

数据库

数据仓库

对比区别:

1数据库是面向事务的设计

2数据库一般存储业务数据

3数据库设计是尽量避免冗余,一般针对某一业务应用进行设计,比如一张简单的 User 表,记录用户名、密码等简单数据即可,符合业务应用,但是不符合分析

4数据库是为捕获数据而设计

1数据仓库是面向主题设计的

2数据仓库存储的一般是历史数据

3数据仓库在设计是有意引入冗余,依照分析需求,分析维度、分析指标进行设计。

4数据仓库是为分析数据而设计。

 

为什么要对数据仓库分层?

用空间换时间,通过大量的预处理来提升应用系统的用户体验(效率),因此数据仓库会存在大量冗余的数据;不分层的话,如果源业务系统的业务规则发生变化将会影响整个数据清洗过程,工作量巨大。

通过数据分层管理可以简化数据清洗的过程,因为把原来一步的工作分到了多个步骤去完成,相当于把一个复杂的工作拆成了多个简单的工作,把一个大的黑盒变成了一个白盒,每一层的处理逻辑都相对简单和容易理解,这样我们比较容易保证每一个步骤的正确性,当数据发生错误的时候,往往我们只需要局部调整某个步骤即可。

数仓分层

数仓分层是数据仓库设计中十分重要的一个环节,优秀的分层设计能够让整个数据体系更容易理解和使用。

数据分层的作用:

我们需要一套行之有效的数据组织和管理方法来让我们的数据体系更有序,这就是数据分层。数据分层的好处有:

1清晰数据结构:每一个数据分层都有它的作用域和职责,在使用表的时候能更方便地定位和理解。

2减少重复开发:规范数据分层,开发一些通用的中间层数据,能减少极大的重复计算。

3统一数据口径:通过数据分层提供统一的数据出口,同意对外输出的数据口径。

4复杂问题简单化:将一个复杂的任务分解成多个步骤来完成,每一层解决特定的问题.

分层设计的原则以及介绍一种通用的数据分层设计

一般情况下,将数据模型分为3层

1 数据运营层ODS:存放的是接入的原始数据。经过ETL之后装入本层,大多是按照源头业务系统的分类方式而分类的。为了考虑后续可能追溯数据为题,因此对这一层不建议做过多的数据清洗工作,原封不动接入源数据即可,至于数据的去噪,去重,异常值处理等过程可以放在后面的DW层

2 数据仓库层DW:重点设计的数据仓库中间层数据,在这里ODS层获得的数据按照主题建立各种数据模型,DW又细分

Ⅰ,数据明细层:DWD(Data WareHouse Detail)

该层一般保持和ODS层一样的数据粒度,并且提供给一定的数据质量保证。同时为了提高数据明细层的易用性,该层会采用一些维度退化手法,将维度退化到事实表中,减少事实表和维度表的关联。另外,在该层也会做一部分的数据聚合,将相同主题的数据汇集到一张表中,提高数据的可用性

Ⅱ,数据中间层:DWM(Data WareHouse Middle)

在DWD层的数据基础上,对数据做轻度的聚合操作,生成一系列的中间表提升公共指标的复用性,减少重复加工,就是对通用的核心维度进行聚合操作,算出相应的统计指标

Ⅲ,数据服务层:DWS(Data WareHouse Service)

又称为数据集市或者宽表,按照业务划分,例如流量,订单,用户等,生成字段比较多的宽表,用于后续的业务查询,OLAP分析,数据分析等。

 

Hadoop 

MapperReduce的工程流程:

大数据与云计算——牛客网大数据面试问题总结_大数据_05

MapperReduce的分区:

大数据与云计算——牛客网大数据面试问题总结_数据倾斜_06

大数据与云计算——牛客网大数据面试问题总结_字段_07

MapperReduce的排序

实现字典排序的采用的是快速排序的原理。

大数据与云计算——牛客网大数据面试问题总结_数据_08

大数据与云计算——牛客网大数据面试问题总结_大数据_09

大数据与云计算——牛客网大数据面试问题总结_数据倾斜_10

MapperReduce的优化操作:

大数据与云计算——牛客网大数据面试问题总结_数据倾斜_11

Mapper Task的工作机制

大数据与云计算——牛客网大数据面试问题总结_数据_12

大数据与云计算——牛客网大数据面试问题总结_数据倾斜_13

Reduce Task的工作机制

大数据与云计算——牛客网大数据面试问题总结_数据_14

MapperTask并行度

大数据与云计算——牛客网大数据面试问题总结_大数据_15

大数据与云计算——牛客网大数据面试问题总结_数据_16

Hadoop的数据压缩:

 

MapperReduce shuffle机制

在Hadoop中数据从Map阶段传递给Reduce阶段的过程就叫Shuffle,Shuffle机制是整个MapReduce框架中最核心的部分。Shuffle(核心机制:数据分区、排序、缓存)。

Shuffle的执行阶段流程

大数据与云计算——牛客网大数据面试问题总结_大数据_17

流程详解

上面的流程是整个mapreduce最全工作流程,但是shuffle过程只是从第7步开始到第16步结束,具体shuffle过程详解,如下:

1)maptask收集我们的map()方法输出的kv对,放到内存缓冲区中

2)从内存缓冲区不断溢出本地磁盘文件,可能会溢出多个文件

3)多个溢出文件会被合并成大的溢出文件

4)在溢出过程中,及合并的过程中,都要调用partitoner进行分组和针对key进行排序

5)reducetask根据自己的分区号,去各个maptask机器上取相应的结果分区数据

6)reducetask会取到同一个分区的来自不同maptask的结果文件,reducetask会将这些文件再进行合并(归并排序)

7)合并成大文件后,shuffle的过程也就结束了,后面进入reducetask的逻辑运算过程(从文件中取出一个一个的键值对group,调用用户自定义的reduce()方法)

3)注意

Shuffle中的缓冲区大小会影响到mapreduce程序的执行效率,原则上说,缓冲区越大,磁盘io的次数越少,执行速度就越快。

缓冲区的大小可以通过参数调整,参数:io.sort.mb 默认100M

Combiner合并

1)combiner是MR程序中Mapper和Reducer之外的一种组件

2)combiner组件的父类就是Reducer

3)combiner和reducer的区别在于运行的位置:

Combiner是在每一个maptask所在的节点运行

Reducer是接收全局所有Mapper的输出结果;

4)combiner的意义就是对每一个maptask的输出进行局部汇总,以减小网络传输量

6)combiner能够应用的前提是不能影响最终的业务逻辑,而且,combiner的输出kv应该跟reducer的输入kv类型要对应起来。

Spark

 

数据倾斜原理及解决方案

不同的数据字段可能的数据倾斜一般有两种情况:

一种是唯一值非常少,极少数值有非常多的记录值(唯一值少于几千)

一种是唯一值比较多,这个字段的某些值有远远多于其他值的记录数,但是它的占比也小于百分之一或千分之一。

数据倾斜:用最通俗易懂的话来说,数据倾斜无非就是大量的相同key被partition分配到一个分区里,造成了'一个人累死,其他人闲死'的情况。

数据倾斜发生时的现象: 

1、绝大多数task执行得都非常快,但个别task执行的极慢。 

2、原本能正常执行的Spark作业,某天突然爆出OOM(内存溢出)异常。观察异常栈,是我们写的业务代码造成的。

数据倾斜发生的原理 :

在进行shuffle的时候,必须将各个节点上相同的Key拉取到某个节点上的一个task来进行处理,比如按照key进行聚合或者join操作。如果某个key对应的数据量特别大的话,会发生数据倾斜。比如大部分key对应的10条数据,但个别key却对应了100万条数据,那么大部分task会只分配到10条数据,而个别task可能会分配了100万数据。整个spark作业的运行进度是由运行时间最长的那个task决定的。 

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

解决方案:

1、增加jvm内存,这适用于第一种情况(唯一值非常少,极少数值有非常多的记录值(唯一值少于几千)),这种情况下,往往只能通过硬件的手段来进行调优,增加jvm内存可以显著的提高运行效率。

2、增加reduce的个数,这适用于第二种情况(唯一值比较多,这个字段的某些值有远远多于其他值的记录数,但是它的占比也小于百分之一或千分之一),我们知道,这种情况下,最容易造成的结果就是大量相同key被partition到一个分区,从而一个reduce执行了大量的工作,而如果我们增加了reduce的个数,这种情况相对来说会减轻很多,毕竟计算的节点多了,就算工作量还是不均匀的,那也要小很多。

3、自定义分区,这需要用户自己继承partition类,指定分区策略,这种方式效果比较显著。

4、重新设计key,有一种方案是在map阶段时给key加上一个随机数,有了随机数的key就不会被大量的分配到同一节点(小几率),待到reduce后再把随机数去掉即可。

5、使用combinner合并,combinner是在map阶段,reduce之前的一个中间阶段,在这个阶段可以选择性的把大量的相同key数据先进行一个合并,可以看做是local reduce,然后再交给reduce来处理,这样做的好处很多,即减轻了map端向reduce端发送的数据量(减轻了网络带宽),也减轻了map端和reduce端中间的shuffle阶段的数据拉取数量(本地化磁盘IO速率),推荐使用这种方法。

如何定位发生数据倾斜

数据倾斜只会发生在shuffle中,下面是常用的可能会触发shuffle操作的算子:distinct、groupByKey、reduceByKey、aggregateByKey、join、cogroup、repartition等。出现数据倾斜时,可能就是代码中使用了这些算子的原因。

通过观察spark UI的界面数据来实现,定位数据倾斜发生在第几个stage中。

Flink 

 

HDFS

 

Yarn

 

Sqoop

 

Kafka

kafka副本机制

Kafka中主题的每个Partition有一个预写式日志文件,每个Partition都由一系列有序的、不可变的消息组成,这些消息被连续的追加到Partition中,Partition中的每个消息都有一个连续的序列号叫做offset, 确定它在分区日志中唯一的位置。

大数据与云计算——牛客网大数据面试问题总结_数据倾斜_18

Kafka每个topic的partition有N个副本,其中N是topic的复制因子。Kafka通过多副本机制实现故障自动转移,当Kafka集群中一个Broker失效情况下仍然保证服务可用。在Kafka中发生复制时确保partition的预写式日志有序地写到其他节点上。N个replicas中。其中一个replica为leader,其他都为follower,leader处理partition的所有读写请求,与此同时,follower会被动定期地去复制leader上的数据。

如下图所示,Kafka集群中有4个broker, 某topic有3个partition,且复制因子即副本个数也为3:

大数据与云计算——牛客网大数据面试问题总结_数据倾斜_19

Kafka提供了数据复制算法保证,如果leader发生故障或挂掉,一个新leader被选举并被接受客户端的消息成功写入。Kafka确保从同步副本列表中选举一个副本为leader,或者说follower追赶leader数据。leader负责维护和跟踪ISR(In-Sync Replicas的缩写,表示副本同步队列,具体可参考下节)中所有follower滞后的状态。当producer发送一条消息到broker后,leader写入消息并复制到所有follower。消息提交之后才被成功复制到所有的同步副本。消息复制延迟受最慢的follower限制,重要的是快速检测慢副本,如果follower“落后”太多或者失效,leader将会把它从ISR中删除。

副本同步队列(ISR):

所谓同步,必须满足如下两个条件:

副本节点必须能与zookeeper保持会话(心跳机制)

副本能复制leader上的所有写操作,并且不能落后太多。(卡住或滞后的副本控制是由 replica.lag.time.max.ms 配置)

副本不同步的异常情况。

慢副本:在一定周期时间内follower不能追赶上leader。最常见的原因之一是I / O瓶颈导致follower追加复制消息速度慢于从leader拉取速度。

卡住副本:在一定周期时间内follower停止从leader拉取请求。follower replica卡住了是由于GC暂停或follower失效或死亡。

新启动副本:当用户给主题增加副本因子时,新的follower不在同步副本列表中,直到他们完全赶上了leader日志。

Scala

 

 

hiveSQL转换成MapReduce的执行计划包括如下几个步骤: HiveSQL ->AST(抽象语法树) -> QB(查询块) ->OperatorTree(操作树)->优化后的操作树->mapreduce任务树->优化后的mapreduce任务树
Hive HDFS HBase区别 列式数据库和行式数据库优劣对比 http://stor.51cto.com/art/201809/583648.htm
维度和度量 是数仓非常重要的概念,简单地记,维度是环境,度量是指标或者是衡量
数仓分层的实现和原理
窗口函数的实现原理 说实话我也不知道,也没查到,是partition的时候实现的吗,当时是这么猜的。

shuffle机制 mr和spark的shuffle

kafka副本机制

线程在哪里?(是不是堆中?)

这里所说的线程指程序执行过程中的一个线程实体。JVM 允许一个应用并发执行多个线程。Hotspot JVM 中的 Java 线程与原生操作系统线程有直接的映射关系。当线程本地存储、缓冲区分配、同步对象、栈、程序计数器等准备好以后,就会创建一个操作系统原生线程。Java 线程结束,原生线程随之被回收。操作系统负责调度所有线程,并把它们分配到任何可用的 CPU 上。当原生线程初始化完毕,就会调用 Java 线程的 run() 方法。当线程结束时,会释放原生线程和 Java 线程的所有资源。

线程私有数据区域生命周期与线程相同,依赖用户线程的启动/结束 而 创建/销毁(在 HotspotVM 内, 每个线程都与操作系统的本地线程直接映射, 因此这部分内存区域的存/否跟随本地线程的生/死对应)。线程共享区域随虚拟机的启动/关闭而创建/销毁。

程序计数器(线程私有)

一块较小的内存空间, 是当前线程所执行的字节码的行号指示器,每条线程都要有一个独立的程序计数器,这类内存也称为“线程私有”的内存。

正在执行 java 方法的话,计数器记录的是虚拟机字节码指令的地址(当前指令的地址)。如果还是 Native 方法,则为空。这个内存区域是唯一一个在虚拟机中没有规定任何 OutOfMemoryError 情况的区域。

虚拟机栈(线程私有)

是描述java方法执行的内存模型,每个方法在执行的同时都会创建一个栈帧(Stack Frame)用于存储局部变量表、操作数栈、动态链接、方法出口等信息。每一个方法从调用直至执行完成的过程,就对应着一个栈帧在虚拟机栈中入栈到出栈的过程。

栈帧( Frame)是用来存储数据和部分过程结果的数据结构,同时也被用来处理动态链接(Dynamic Linking)、 方法返回值和异常分派( Dispatch Exception)。栈帧随着方法调用而创建,随着方法结束而销毁——无论方法是正常完成还是异常完成(抛出了在方法内未被捕获的异常)都算作方法结束。

大数据与云计算——牛客网大数据面试问题总结_字段_20

本地方法区(线程私有)

本地方法区和 Java Stack 作用类似,区别是虚拟机栈为执行Java方法服务,而本地方法栈则为Native方法服务, 如果一个 VM 实现使用 C-linkage 模型来支持 Native 调用, 那么该栈将会是一个C 栈,但 HotSpot VM 直接就把本地方法栈和虚拟机栈合二为一。

堆(Heap-线程共享)-运行时数据区

是被线程共享的一块内存区域,创建的对象和数组都保存在 Java 堆内存中,也是垃圾收集器进行垃圾收集的最重要的内存区域。由于现代 VM 采用分代收集算法, 因此 Java 堆从 GC 的角度还可以细分为: 新生代(Eden 区、From Survivor 区和 To Survivor 区)和老年代。

方法区/永久代(线程共享)

即我们常说的永久代(Permanent Generation), 用于存储被 JVM 加载的类信息、常量、静态变量、即时编译器编译后的代码等数据. HotSpot VM把GC分代收集扩展至方法区, 即使用Java堆的永久代来实现方法区, 这样 HotSpot 的垃圾收集器就可以像管理 Java 堆一样管理这部分内存,而不必为方法区开发专门的内存管理器(永久带的内存回收的主要目标是针对常量池的回收和类型的卸载, 因此收益一般很小)。

运行时常量池(Runtime Constant Pool)是方法区的一部分。Class 文件中除了有类的版本、字段、方法、接口等描述等信息外,还有一项信息是常量池

(Constant Pool Table),用于存放编译期生成的各种字面量和符号引用,这部分内容将在类加载后存放到方法区的运行时常量池中。 Java 虚拟机对 Class 文件的每一部分(自然也包括常量池)的格式都有严格的规定,每一个字节用于存储哪种数据都必须符合规范上的要求,这样才会被虚拟机认可、装载和执行。

数仓分层

算子,四种算子,问了cache()算子;广播变量介绍一下,什么场景下用广播变量;问了广播变量和cache区别(懵逼状态)

Hive的优化策略,分区,分桶(进一步追问了,了解太少)

Kafka干啥,高吞吐的原因

他说了分组情况,(数据平台,数仓,用户画像数据挖掘)

kmean

数据类型:主要问文本非结构化数据(他们小组主要做这个)

用过哪些监督和非监督的算法

还问了一下bert

数据仓库是怎么分层的?

数据任务的执行引擎用的哪些?

什么情况下数据任务需要优化?

数据任务是怎么优化的?(数据倾斜,参数相关调节)

详细说下数据倾斜怎么解决?

介绍下MR过程?

什么是小文件?很多小文件会有什么问题?很多小文件怎么解决?

Sqoop的工作原理?

Hive的优化策略有哪些(列裁剪、谓词下推)?

一般会采用什么文件存储格式(orc)?为什么?说下orc特点(从列式存储到RCFile,再到ORC。说了相关优缺点)?

文件压缩算法有了解吗?

Hive的原理?

Spark有哪些了解?(说了下RDD,宽窄依赖,stage划分,运行机制相关)

MR和Spark的区别有哪些?

说下Sparkshuffle过程?

说下MR过程

数据任务优化工作主要对MR哪个阶段进行优化?

Sparkshuffle于MRshuffle有啥区别?

Spark运行机制?

Hive优化参数

实习工作遇到什么问题(说了一下由orc文件格式引起的错误)?

说下orc文件格式

说下parquet?

说下压缩算法?

说下数据治理?

又问我docker和虚拟机的区别

 hive sql 解析过程

数仓如何建模,整体架构了解吗,DW,ODS了解吗

hadoo执行流程了解吗

一个网址输入之后到页面渲染全过程
Mac地址可以相同么?如果相同会怎么样?
ARP协议

虚拟内存实现原理,虚拟内存的作用?除了提高内存使用效率还有什么作用呢?

Linux的top指令

线程与进程区别,线程的私有内存,线程私有内存的作用?

RDD为什么是不可变?

宽窄依赖

数据倾斜

窄依赖不会有数据倾斜么?(会)展开聊聊

Shuffle的下游如何知道上游的stage完成了(调度机制和底层源码)

spark哪些设计做得好?

实习工作相关

数仓优化举例

开放题:

400G访问日志,16G内存,求top100访问次数的网站。

UDW数仓,基础平台研发(hive,spark,hadoop)

了解yarn吗,大概说一下

A:Resource Manager, Application Master, NodeManager,以及各自都是干啥的,这方面了解确实比较少

讲一下MR的流程,结合word count

A:map shuffle reduce,map直接output,shuffle排序,reduce聚合

Q:讲一下shuffle

A:缓冲 排序 压缩 io 拷贝 归并排序

Q:reduce 里的shuffle 讲一下

比如flink怎么解决延迟,反压原理,仅一次语义怎么实现,我用flink做这个项目用了哪些算子

数仓建模,维度建模讲讲

Spark 中stage如何划分?

宽依赖窄依赖介绍一下

项目中如何解决数据倾斜

kafka的组成部分

说一下消费者组是如何消费数据的

kafka有什么特点?高吞吐量低延迟是怎么实现的,生产者异步提交,顺序写,读写用到零拷贝

从框架的角度说说大数据项目的基本流程(包括离线实时)

一面kafka高吞吐量的原因没说全,让补充说了一下,我说了批提交和消费者组同时进行进行消费,然后还问了一下零拷贝的具体原理

说一说zookeeper中的角色和应用场景(如何进行master选举)

看你简历中说实现了hdfs的ha,具体说说实现的原理

流式数据处理框架的对比(storm,flink,spark-streaming等)

hbase的特点和底层,和mysql有什么区别

10亿个数选最大的K个,用什么方法,复杂度多少。

介绍一下kafka

kafka消息的有序性

场景题:kafka如何保证多次修改一个商品的价格的顺序

介绍一下zookeeper

zookeeper的应用场景

介绍一下Hadoop的架构

namenode和datanode的作用

1.谈谈你对HDFS的了解

2.Hadoop2.0做了哪些改动

3.Spark与MR的区别在哪里

4.知道除了Spark之外的大数据处理框架嘛

5.Spark shuffle,说说

1讲讲你的日志流量分析系统项目

2.讲讲NameNode与DataNode

3.当数据还在跑的时候,我要查这个数据怎么办

4.存储格式的选择 & 行式存储与列式存储的优劣

5.如果我要查一段时间区域的,怎么优化

6.说说数据倾斜,怎么调优的

7.说说你对Hive的理解

8.问Hive怎么转成MR的

9.出现OOM,怎么办

10.shuffle过程中,会将数据写到哪个buffer里去

11.讲讲executor、core、task这些之间的关系

12.平时怎么学习spark的

13.除了大数据,会Spring嘛

简单问了和hdfs副本数,副本怎么存储

hive调优

DAG为什么适合spark(随便说了一通,也不知道对不对)

假设给定你四个字段分别为一个int,一个double,一个日期类型,一个varchar(20)的数据,共100万条,计算数据大小(不会)

讲一下对Hadoop的了解

讲了下HDFS原理、MapReduce的过程,想讲HDFS检查点机制没让讲。

Spark和MapReduce的区别?是不是用了Spark就不需要MapReduce了?(答得不太好)

问对Hive的了解? 自己提了下数据倾斜。

简单介绍下流计算的spark streaming storm flink的优缺点

Spark和Hadoop的区别

MR流程、RDD流程

学过Hadoop,讲一下MR流程。说一下Partition分区的优化是怎么做的(Partition没答出来)

MR会有数据倾斜,讲一下如何解决(说了一些方法,被要求说的更详细一些。比如为什么增加Reduce数量就可以提高效率,如何自定义分区,如何重新设计key)

然后问的是Hadoop Streaming (没听说过,讲了下spark streaming)

Hive会用吧。讲一下内表和外表的区别

Spark会吧。介绍下宽窄依赖。(从action 讲到 shuffle ,讲了Aggregator,讲了下DAG解析的阶段划分)

Spark cache和 persite的区别(讲了下广播机制,没回答好)