面试题集锦--SPARK01

1. SPARK面试题 1. Kafka和SparkStreaing如何集成?   sparkstreaming提供了两种获取方式,  Receiver-base spark streaming启动过后,会选择一台excetor作为ReceiverSupervior 1:Reci...

1. SPARK面试题

1. KafkaSparkStreaing如何集成?

 

sparkstreaming提供了两种获取方式,

 Receiver-base

spark streaming启动过后,会选择一台excetor作为ReceiverSupervior

1:Reciver的父级ReciverTracker分发多个job(task)到不同的executor,并启动ReciverSupervisor.

2:ReceiverSupervior会启动对应的实例reciver(kafkareciver,TwitterReceiver),并调用onstart()

3:kafkareciver在通过onstart()启动后就开启线程源源不断的接收数据,并交给ReceiverSupervior,通过ReceiverSupervior.store函数一条一条接收

4:ReceiverSupervior会调用BlockGenertor.adddata填充数据。

所有的中间数据都缓存在BlockGenertor

1:首先BlockGenertor维护了一个缓冲区,currentbuffer,一个无限长度的arraybuffer。为了防止内存撑爆,这个currentbuffer的大小可以被限制,通过设置参数spark.streaming.reciver.maxRate,以秒为单位。currentbuffer所使用的内存不是storage(负责spark计算过程中的所有存储,包括磁盘和内存),而是珍贵的计算内存。所以currentbuffer应该被限制,防止占用过多计算内存,拖慢任务计算效率,甚至有可能拖垮Executor甚至集群。

2:维护blockforpushing队列,它是等待被拉到到BlockManager的中转站。它是currentbufferBlockManager的中间环节。它里面的每一个元素其实就是一个currentbuffer

3:维护两个定时器,其实就是一个生产-消费模式。blockintervaltimer定时器,负责生产端,定时将currentbuffer放进blockforpushing队列。blockforpushingthread负责消费端,定时将blockforpushing里的数据转移到BlockManager

Direct

首先这种方式是延迟的。也就是说当action真正触发时才会去kafka里接数据。因此不存在currentbuffer的概念。它把kafka每个分区里的数据,映射为KafkaRdd的概念。题外话,在structured streaming中,也已经向DataFrameDataSet统一了,弱化了RDD的概念。

真正与kafka打交道的是KafkaCluster,全限定名: org.apache.spark.streaming.kafka.KafkaCluster。包括设备kafka各种参数,连接,获取分区,以及偏移量,设置偏移量范围等。

 

 

 

 

2. 什么是DStream?

 DStream是实时计算模型。

Spark Streaming 提供了一个高层次的抽象叫做离散流(discretized stream)或者 DStream,它代表一个连续的数据流。DStream 可以通过来自数据源的输入数据流创建,例如 KafkaFlume 以及 Kinesis,或者在其他 DStream 上进行高层次的操作创建。在内部,一个 DStream 是通过一系列的 RDD 来表示。

 

 

3. 描述一下RDDDataFrameDataSet的区别?

RDD、DataFrame、Dataset全都是spark平台下的分布式弹性数据集,为处理超大型数据提供便利

RDD是spark最底层的抽象数据集,是一个不可变,只读的,被分区的数据集,dataframe是基于rdd之上的抽象数据集,专门用于处理结构化数据,不仅有数据,还有相应的schema信息,dataframe就相当于rdd  +  schema。从API易用性的角度上 看,DataFrame API提供的是一套高层的关系操作,比函数式的RDD API要更加友好,门槛更低。

Dataset 也是一个分布式的数据集合,Dataset 是在 Spark 1.6 中被添加的新接口, 它提供了 RDD 的优点(强类型化, 能够使用强大的函数)与Spark SQL执行引擎的优点.一个 Dataset 可以从 JVM 对象来 构造 并且使用转换功能(map, flatMap, filter, 等等).

spark2.x后,dataset和DataFrame合并,一个 DataFrame 是一个 Dataset 组成的指定列.

DataFrame = Dataset[Row]

 

 

 

 

 

4. 简单介绍下Yarn or standalone

stanalone是spark自带的一种集群方式,集群中有一个Master节点,和多个worker节点,worker节点启动后会向master节点进行注册,并定时发送心跳信息。当有spark任务提交时,会向master发送运行请求,master接收到请求后,会找到相应资源的worker,然后再worker中启动executor,之后executor会向driver端建立连接请求,driver端的任务经过切分stage之后,以task形式提交给executor执行。

 

 

 

 

5. 描述一下Sparkstage是如何划分的?描述一下shuffle的概念。

spark会根据dag有向无环图,从final rdd 开始向后追溯,一旦遇到窄依赖就加入到当前的stage中,如果遇到宽依赖,就结束当前stage,再创建一个新的stage,并继续往前追溯,一旦遇到某一个rdd没有依赖关系了,切分stage结束。

shuffle,就是数据洗牌,根据某些条件重新分发数据,在spark中,一旦rdd之间有宽依赖,就会发生shuffle,shuffle是切分stage的标准。

 

6. 描述用机器学习的方法解决分类问题的过程,AUC是什么?

收集数据,然后进行数据清洗和转换,然后进行模型训练,分类问题,首选逻辑回归,或者朴素贝叶斯,或者决策树随机森林算法,  基于该模型,然后进行模式测试,测试效果通过之后,可以上线。

auc(area under curve)是曲线下面积,这个曲线就是roc曲线,auc是验证二分类问题的一个标准,auc的意义就是衡量正样本排在负样本前面的能力,与阈值无关。如果一个二分类模型的auc越高,意味着该模型越好。

 

 

 

 

7. 简单解释一下逻辑回归

Logistic Regression也叫Logit Regression,在机器学习中属于参数估计的模型。逻辑回归与普通线性回归(Linear Regression)有很大的关系。在应用上,它们有所区别:

普通线性回归主要用于连续变量的预测,即,线性回归的输出yy的取值范围是整个实数区间(yRyR)

逻辑回归用于离散变量的分类,即,它的输出yy的取值范围是一个离散的集合,主要用于类的判别,而且其输出值yy表示属于某一类的概率

一个单独的逻辑回归函数只能判别两个类,这里用0和1表示. 逻辑回归的结果会给出一个概率pp,表示属于类别1的概率。既然是两类问题,那么属于类别0的概率自然就是1p。

 

 

 

 

8. Spark yarn上运行需要做哪些关键的配置工作?如何kill -Sparkyarn运行中Application

修改所有yarn节点的yarn-site.xml,在该文件中添加如下配置

<property>

    <name>yarn.nodemanager.pmem-check-enabled</name>

    <value>false</value>

</property>

<property>

    <name>yarn.nodemanager.vmem-check-enabled</name>

    <value>false</value>

</property>

 

spark-env.sh中或者在/etc/profile中,配置 HADOOP_CONF_DIR,或者配置YARN_CONF_DIR,指向hadoop的配置文件目录。

yarn application -kill  appId  杀死一个任务

 

 

 

9. 分别用RDDDataFrame两种实现方式写两个Spark程序,统计文件A.txtschool字段不同值的个数,以及不同school各自score字段的平均值

该题无数据,题意不明确

 

10. 列举Kafka的优点,简述Kafka为什么可以做到每秒数十万甚至上百万消息的高效分发?

分布式,高吞吐,数据有备份

 

Kafka每个主题下可以有多个分区,每个分区有一个leader,负责对外读写服务,分区越多读写能力越强,Kafka在检索数据的时候,是通过分段文件+稀疏索引的方式,检索效率更高。

 

11. Spark算子中做连接操作时,joincogroup的区别

JOIN 相当于SQL中的内关联join,只返回两个RDD根据K可以关联上的结果

在类型为(K,V)和(K,W)类型的数据集上调用时,返回一个相同key对应的所有元素对在一起的(K, (V, W))数据集

cogroup 在类型为(K,V)和(K,W)的数据集上调用,返回一个(K, (Iterable[V], Iterable[W]))元组的数据集。这个操作也可以称之为groupwith

相当于SQL中的全外关联full outer join,返回左右RDD中的记录,关联不上的为空。

 

12. 通常来说,SparkMapReduce相比,Spark运行效率更高。请说明效率更高来源于Spark内置的哪些机制?并请列举常见spark的运行模式?

中间结果输出:基于MapReduce的计算引擎通常会将中间结果输出到磁盘上,进行存储和容错。出于任务管道承接的考虑,当一些查询翻译到MapReduce任务时,往往会产生多个Stage,而这些串联的Stage又依赖于底层文件系统(如HDFS)来存储每一个Stage的输出结果

Spark是在借鉴了MapReduce之上发展而来的,继承了其分布式并行计算的优点并改进了MapReduce明显的缺陷,spark与hadoop的差异)

首先,Spark把中间数据放到内存中,迭代运算效率高。MapReduce中计算结果需要落地,保存到磁盘上,这样势必会影响整体速度,而Spark支持DAG图的分布式并行计算的编程框架,减少了迭代过程中数据的落地,提高了处理效率。(延迟加载)

其次,Spark容错性高。Spark引进了弹性分布式数据集RDD (Resilient Distributed Dataset) 的抽象,

最后,Spark更加通用。不像Hadoop只提供了Map和Reduce两种操作,Spark提供的数据集操作类型有很多种

4种运行模式:local  standalone   yarn  mesos

 

 

 

13. Streaming优化的方法有哪些

 

正确设置Batch时间间隔

为了一个Spark Streaming应用能在集群上稳定运行,需要保证应用在接收到数据时能够及时处理。如果处理速率不匹配,随着时间的积累,等待处理的数据将会越来越多,最终导致应用无法正常运行。最好的情况是Batch的处理时间小于Batch的间隔时间。所以,正确合理的设置Batch时间间隔是很重要的。

接收数据进程的并行度

对于Kafka数据源,如果使用的是一个DStream接收来自两个Topic中的数据的话,就可以将这两个Topic拆开,由两个数据接收进程分开接收。当用两个Receiver接收到DStream后,可以在应用中将这两个DStream再进行合并。

SparkStreaming+Kafka的使用中,我们采用了Direct连接方式,这种模式下 Spark中的Partition和Kafka中的Partition是一一对应的,一般可以设置Spark中的Partition数量与Kafka中Partition的数量相等。

合理的Kafka拉取量

对于Spark Streaming消费Kafka中数据的应用场景,这个配置是非常关键的,配置参数为:spark.streaming.kafka.maxRatePerPartition。这个参数默认是没有上限的,即Kafka当中有多少数据它就会直接全部拉出。而根据生产者写入Kafka的速率以及消费者本身处理数据的速度,同时结合上面所说的batchDuration,使得每个Partition拉取在每个batchDuration期间拉取的数据能够顺利的处理完毕,做到尽可能高的吞吐量,而这个参数的调整可以参考可视化监控界面中的Input Rate和Processing Time。

缓存反复使用的Dstream(RDD)

Spark中的RDD和SparkStreaming中的Dstream,如果被反复的使用,最好利用cache(),将该数据流缓存起来,防止过度的调度资源造成的网络开销。

 

 

 

14. 请说明Kafka相对传统技术有什么有事?并说明kafka持久化到hdfs的方案。

分布式可高可用可扩展。Kafka 集群可以透明的扩展,增加新的服务器进集群。

高性能。Kafka 的性能大大超过传统的ActiveMQ、RabbitMQ等MQ 实现,尤其是Kafka 还支持batch 操作。

Kafka每个Partition的数据都会复制到几台服务器上。当某个Broker故障失效时,ZooKeeper服务将通知生产者和消费者,生产者和消费者转而使用其它Broker。

通过配置flume,可实现读取kafka中数据并存储到hdfs中,另外还有一些工具框架,kafka-connect-hdfs是一个JAVA写的开源的kafka工具。用于负责从kafka抽取消息写入到hdfs,原理上使用了avro来做序列化。来自Confluent公司。安装了conflunt platform可以实现kafka消息持久化到JDBC或者HDFS。

0 条评论

请先 登录 后评论
不写代码的码农
majia

8 篇文章

作家榜 »

  1. majia 8 文章
  2. 刘娜娜 6 文章
  3. 在下选择隐性埋名 4 文章
  4. 上神白浅 3 文章
  5. 李家兴 2 文章
  6. 小马甲 2 文章
  7. 刘东鑫 1 文章
  8. 崔楷文 1 文章