大数据考试题

  • kafka中消费者和消费组有什么区别?他们的作用分别是什么?

Kafka消费者是消费组的一部分,当多个消费者形成一个消费组来消费主题时,每个消费者会收到不同分区的消息。

  • map、mapPartitions、mapValues、flatMap、flatMapValues这几个算子的区别是?

map(function)
map是对RDD中的每个元素都执行一个指定的函数来产生一个新的RDD。任何原RDD中的元素在新RDD中都有且只有一个元素与之对应。

mapPartitions(function)
map()的输入函数是应用于RDD中每个元素,而mapPartitions()的输入函数是应用于每个分区
mapPartitions是map的一个变种。map的输入函数是应用于RDD中每个元素,而mapPartitions的输入函数是应用于每个分区,也就是把每个分区中的内容作为整体来处理的。

mapValues(function)
原RDD中的Key保持不变,与新的Value一起组成新的RDD中的元素。因此,该函数只适用于元素为KV对的RDD。

flatMap(function)
与map类似,区别是原RDD中的元素经map处理后只能生成一个元素,而原RDD中的元素经flatmap处理后可生成多个元素

flatMapValues(function)
flatMapValues类似于mapValues,不同的在于flatMapValues应用于元素为KV对的RDD中Value。每个一元素的Value被输入函数映射为一系列的值,然后这些值再与原RDD中的Key组成一系列新的KV对。

  • sparkSpark部署三种方式有哪些?
    YARN模式、Standalone模式、HA模式

  • 写出使用standlone模式时提交任务的命令

  • - [ ] rdd,dataframe,dataset,dstream的联系或区别是
    RDD虽然以Person为类型参数,但是Spark框架并不了解Person类的内部结构;右侧的DataFrame却提供了详细的结构信息,使得Spark Sql可以清楚地知道数据集中有哪些列,每列的名称和类型分别是什么。
    DataFrame中多了数据集的结构信息即Schema,所以我们在获取到DataFrame结果集之后可以通过printSchema方法来查看当前数据文件的结构信息。所以我们可以这样理解,RDD是分布式的Java对象集合(这也就是为什么RDD会有Broadcast广播变量的方法),DataFrame是分布式的Row对象的集合。
    DataFrame除了提供比RDD更丰富的算子之外,更重要的特点是提升执行效率、减少数据读取以及执行计划的优化。
    DataSet和DataFrame的对比
    DataSet可以理解成DataFrame的一种特例,主要区别是DataSet每一个record存储的是一个强类型值而不是一个Row。
    DataFrame和DataSet可以相互转化,df.as[ElementType]这样可以把DataFrame转化为DataSet,ds.toDF()这样可以把DataSet转化为DataFrame。
    .区别
    ✎.RDD:
    不支持SparkSql操作
    RDD一般和spark mlib同时使用
    ✎.DataFrame:
    与RDD和Dataset不同,DataFrame每一行的类型固定为Row,只有通过解析才能获取各个字段的值,无法直接获取每一列的
    DataFrame和DataSet均支持SparkSql的操作,比如select,groupby之类的,还能注册临时表、进行sql语句操作
    dataDF.createOrReplaceTempView(“tmp”
    spark.sql(“select ROW,DATE from tmp where DATE is not null order by DATE”).show(100,false)
    DataFrame和DataSet支持一些方便的保存方式,比如保存成csv,可以带上表头,这样每一列的字段名一目了然:
    ✎.DataSet与DataFrame
    DataFrame也可以叫做DataSet[Row],每一行的类型都是Row,不解析我们就无法知晓其中有哪些字段,每个字段又是什么类型。我们只能通过getAs[类型]或者row(i)的方式来获取特定的字段内容
    而在Dataset中,每一行的类型是不一定的,在自定义了case class之后就可以很自由的获取每一行的信息

  • sparkstreaming读取kafka有几种方式?对他们进行描述

spark streaming提供了两种获取方式,一种是同storm一样,实时读取缓存到内存中;另一种是定时批量读取。

这两种方式分别是:

Receiver-base

Direct

Receiver-base:
Spark官方最先提供了基于Receiver的Kafka数据消费模式。不过这种方式是先把数据从kafka中读取出来,然后缓存在内存,再定时处理。如果这时候集群退出,而偏移量又没处理好的话,数据就丢掉了,存在程序失败丢失数据的可能,后在Spark 1.2时引入一个配置参数spark.streaming.receiver.writeAheadLog.enable以规避此风险。
Receiver-based的Kafka读取方式是基于Kafka高阶(high-level) api来实现对Kafka数据的消费。在提交Spark Streaming任务后,Spark集群会划出指定的Receivers来专门、持续不断、异步读取Kafka的数据,读取时间间隔以及每次读取offsets范围可以由参数来配置。读取的数据保存在Receiver中,具体StorageLevel方式由用户指定,诸如MEMORY_ONLY等。当driver 触发batch任务的时候,Receivers中的数据会转移到剩余的Executors中去执行。在执行完之后,Receivers会相应更新ZooKeeper的offsets。如要确保at least once的读取方式,可以设置spark.streaming.receiver.writeAheadLog.enable为true.

Direct:
这种方式是延迟的。也就是说当action真正触发时才会去kafka里接数据。因此不存在currentbuffer的概念。它把kafka每个分区里的数据,映射为KafkaRdd的概念。题外话,在structured streaming中,也已经向DataFrame和DataSet统一了,弱化了RDD的概念。
真正与kafka打交道的是KafkaCluster,全限定名: org.apache.spark.streaming.kafka.KafkaCluster。包括设备kafka各种参数,连接,获取分区,以及偏移量,设置偏移量范围等。
Direct方式采用Kafka简单的consumer api方式来读取数据,无需经由ZooKeeper,此种方式不再需要专门Receiver来持续不断读取数据。当batch任务触发时,由Executor读取数据,并参与到其他Executor的数据计算过程中去。driver来决定读取多少offsets,并将offsets交由checkpoints来维护。将触发下次batch任务,再由Executor读取Kafka数据并计算。从此过程我们可以发现Direct方式无需Receiver读取数据,而是需要计算时再读取数据,所以Direct方式的数据消费对内存的要求不高,只需要考虑批量计算所需要的内存即可;另外batch任务堆积时,也不会影响数据堆积。

  • 宽依赖和窄依赖的区别是?我们应该尽量使用哪种?为什么?
    窄依赖(narrow dependencies)
    子RDD的每个分区依赖于常数个父分区(与数据规模无关)
    输入输出一对一的算子,且结果RDD的分区结构不变。主要是map/flatmap
    输入输出一对一的算子,但结果RDD的分区结构发生了变化,如union/coalesce
    从输入中选择部分元素的算子,如filter、distinct、substract、sample
    宽依赖(wide dependencies)
    子RDD的每个分区依赖于所有的父RDD分区
    对单个RDD基于key进行重组和reduce,如groupByKey,reduceByKey
    对两个RDD基于key进行join和重组,如join
    经过大量shuffle生成的RDD,建议进行缓存。这样避免失败后重新计算带来的开销。

    窄依赖与窄依赖比较
    宽依赖往往对应着shuffle操作,需要在运行的过程中将同一个RDD分区传入到不同的RDD分区中,中间可能涉及到多个节点之间数据的传输,而窄依赖的每个父RDD分区通常只会传入到另一个子RDD分区,通常在一个节点内完成。
    当RDD分区丢失时,对于窄依赖来说,由于父RDD的一个分区只对应一个子RDD分区,这样只需要重新计算与子RDD分区对应的父RDD分区就行。这个计算对数据的利用是100%的
    当RDD分区丢失时,对于宽依赖来说,重算的父RDD分区只有一部分数据是对应丢失的子RDD分区的,另一部分就造成了多余的计算。宽依赖中的子RDD分区通常来自多个父RDD分区,极端情况下,所有父RDD都有可能重新计算

  • Spark运行原理
    (1)sparkContext向资源管理器注册并申请资源
    (2)资源管理器根据预先设定的算法,在资源池里分配合适的Executor运行资源
    (3)应用(Main函数里的算子)构建有向无环图
    (4)DAGScheduler将图转换成TaskSet
    (5)TaskScheduler负责TaskSet的任务分发。

在这里插入图片描述
**

- [ ] Spark任务提交执行流程

**
Spark任务的本质是对我们编写的RDD的依赖关系切分成一个个Stage,将Stage按照分区分批次的生成TaskSet发送到Executor进行任务的执行

Spark任务分两种:

1、shuffleMapTask:shuffle之后的task
2、resultTask:shuffle之前的task

Spark任务分配有两种方式:
1,尽量打撒方式(系统默认)
2,尽量集中方式

首先把App打包上传到集群上,并开始分配资源及调用包中的主类
然后
1.在Driver端,调用SparkSubmit类,内部执行submit–>doRunMain–>通过反射获取应用程序的主类对象(远程代理对象)–>执行主类的main方法,这是提交,

2.Driver端构建SparkConf和SparkContext对象,在SparkContext入口类做了三件事,创建了SparkEnv对象(创建了ActorSystem对象)、TaskScheduler(用来生成并发送task给Executor)、DAGScheduler(用来划分Stage)

3.ClientActor将任务信息封装到ApplicationDescription对象里并且提交给Master

4.Master收到ClientActor提交的任务信息后,把任务信息存到内存中,然后又将任务信息放到队列中(waitingApps)

5.当开始执行这个任务信息时,调用scheduler方法,进行资源调度。

6.将调度好的资源封装到LaunchExecutor并发送给对应的Worker

7.Worker接收到Master发送过来的调度信息(LaunchExecutor)后,将信息封装成一个ExecutorRunner对象

8.封装成ExecutorRunner后,调用ExecutorRunner的Start方法,开始启动CoarseGrainedExecutorBackend对象(启动Executor)

9.Executor启动后向DriverActor进行反向注册

10.与DriverActor注册成功后,创建一个线程池(ThreadPool),用来执行任务

11.当所有Executor注册完成后,意味着作业环境准备好了,Driver端会结束与SparkContext对象的初始化

12.当Driver初始化完成后(创建了一个sc示例),会持续执行我们自己提交的App的代码,当触发了Action的RDD算子时,就触发了一个job,这时会调用DAGScheduler对象进行Stage划分

13.DAGScheduler开始进行Stage划分

14.将划分好的Stage按照分区生成一个一个的task,并且封装到TaskSet对象,然后TaskSet提交到TaskScheduler

15.TaskScheduler接收到提交过来的TaskSet,拿到一个序列化器对TaskSet序列化,将序列化好的TaskSet封装到LaunchExecutor并提交到DriverActor

16.DriverActor把LaunchExecutor发送到Executor上

17.Executor接收到DriverActor发送过来的任务(LaunchExecutor),会将其封装成TaskRunner,然后从线程池中获取线程来执行TaskRunner

18.TaskRunner拿到反序列化器,反序列化TaskSet,然后执行App代码,也就是对RDD分区上执行的算子和自定义函数

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值