Spark篇

本文深入探讨了Spark的工作机制,包括Spark-submit的提交模式、Spark Streaming故障处理、Spark Shuffle的优化措施,以及Spark与其他流处理框架的区别。还讨论了SparkRDD的理解、DStream结构、SparkSQL与HSQL的差异,以及如何解决Spark内存溢出问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

文章目录

问题1、spark-submit几种提交模式的 区别是什么?

常用的spark-submit提交方式有两种:standalone、yarn

  • 其中standalone的参数:
spark-submit	--class #指明运行的主类,即main方法
				--master #指明资料管理器;local用local[*]或local[数字];standalone用saprk://host:7077,host:7077,即spark的集群部署的主机名加端口
				--deploy-mode	#有两种cluster和client;是否发布你的驱动到worker节点(cluster) 或者作为一个本地客户端 (client) (default: client)
				--executor-memory #指每个executor的调用内存
				--total-executor-cores #指所有的executor的总核数
				--driver-memory #指定driver的内存,推荐5G
				jar包路径
				[参数]
  • yarn的提交方式
spark-submit	--class #指明运行的主类,即main方法
				--master #指明资料管理器;yarn用yarn
				--deploy-mode	#有两种cluster和client;是否发布你的驱动到worker节点(cluster) 或者作为一个本地客户端 (client) (default: client)
				--executor-memory #指每个executor的调用内存
				--executor-cores   #指每一个executor的CPU核数
				--num-executor  #指executor的个数
				--driver-memory #指定driver的内存,推荐5G
				--queue #指定队列
				jar包路径
				[参数]

问题2、spark streming在实时处理时会发生什么故障,如何停止,解决

和Kafka整合时消息无序:

修改Kafka的ack参数,当ack=1时,master确认收到消息就算投递成功。ack=0时,不需要收到消息便算成功,高效不准确。ack=all,master和server都要受到消息才算成功,准确不高效。

StreamingContext.stop会把关联的SparkContext对象也停止,如果不想把SparkContext对象也停止的话可以把StremingContext.stop的可选参数stopSparkContext设为flase。一个SparkContext对象可以和多个streamingcontext对象关联。只要对前一个stremingcontext.stop(stopsparkcontext=false),然后再创建新的stremingcontext对象就可以了。

问题3、spark工作机制

  • Driver向资源管理器master注册任务,申请资源,
  • master筛选出资源充足的worker
  • master通知worker启动executor
  • executor向Driver反向注册,申请计算任务
  • executor任务执行后,Driver向Master注销任务

  • Driver做了哪些事呢
  • 首先运行主类的main方法
  • 创建SparkContext,SparkContext是spark程序的入口
    • 在sparkContext中创建了两个非常重要的对象:DAGScheducler、TaskScheduler
  • 根据main方法中算子的先后顺序[数据的处理过程]创建DAG有向无环图
  • DAGScheduler拿到DAG有向无环图之后,根据宽依赖对job镜像stage的切分,stage中有很多的task[一个分区对应一个task],会将每个stage中所有的task进行封装,封装成taskset,然后将taskset交给底层任务调度器TaskScheduler中执行
  • TaskScheduler拿到tasetset之后,会根据stage的依赖关系[从左往右依次执行stage],依次遍历stage对应的taskset,然后将taskset中的task取出来后提交到executor中执行。
    在这里插入图片描述

问题4、Kafka和sparkStreaming的整合,手动提交的offset调用了什么方法?

以kafka数据源0.10版本为了类,手动提交offset

  • 设置“enable.auto.commint”设置为false,关闭自动提交
  • 使用rdd调用asInstanceOf[HasOffsetRanges].offsetRange方法获取offset,假设为rangs
  • Dstream调用asInstanceOf[CanCommitOffsets].commitAsync(rangs)提交offset

问题5、spark-yarn程序的的调度流程

  • client向resourcemanager注册并提交任务, 在resourcemanager生成任务信息
  • resourcemanager和datamanager进行通信, 寻找一个资源较多的节点启动一个APPmaster, 用来负责当前任务的调度
  • APPmaster启动后向resourcemanager申请资源
  • applicationManager开始资源调度, 开始通知nodeManager启动一个yarnchild进程
  • yarnChild开始和APPmaster进行通信, APPmaster对所有yarnChild进行监控
  • MR执行完以后, yarnChild被APPmaster回收, APPmaster把自己回收掉

问题6、Scala中协变逆变的应用场景。

问题7、Spark中隐式转化的应用场景

1、调用某个函数,但是给函数传入的参数类型,与函数定义的签名不匹配。

2、使用某个类型对象,调用某个方法,而这个方法并不存在于该类型时。

3、使用某个类型对象,调用某个方法,虽然该类型有这个方法,但是给方法传入的参数类型与签名并不一致的时候。

问题8、谈谈你对SparkRDD的理解

RDD,叫做弹性分布式数据集,是spark中最基本的数据抽象,它代表一个不可变,可分区,里面的元素可并行计算的集合
RDD的特点:是一个数据集,也是一个编程模型,RDD之间有依赖关系、RDD是可分区的、RDD是只读的、RDD可以容错

问题9、Spark与flink和storm的区别

问题10、Shuffle是一个挺消耗资源的操作,对shuffle有什么优化措施?

还需要对数据进行排序.常见的 Transformation 操作如:repartition,join,以及任何 * By 或者 * ByKey 的 Transformation 都需要 shuffle 数据9,合理的选用操作将降低 shuffle 操作的成本,提高运算速度.具体如下:

  • 当进行联合的规约操作时,避免使用 groupByKey。比如groupByKey和reduceByKey的区别,即减少shuffle时数据的网络传输量
  • 当输入和输出类型不一致是,避免使用reduceByKey。比如aggregateByKey和map+reduceByKey的区别,
  • 当需要对两个RDD使用join时候,如果其中一个数据集特别小,可以使用broadcast操作把小数据集广播到每一个executor内存中。

问题11、DStream是一个什么样的结构?里面有哪些对象?

问题12、SparkStreaming怎么做到流式计算?

SparkStreaming 是基于spark的流式批处理引擎,其基本原理是把输入数据以某一时间间隔批量的处理,当批处理间隔缩短到秒级时,便可以用于处理实时数据流。

问题13、如果数据达到一个阈值,在sparkstreaming中你是怎么处理的? sparkstreaming参数是怎么设定的?

问题14、sparkstreaming多长时间设置一个批次?

  • 其最小的Batch Size的选取在0.5~2秒钟之间

问题15、spark技术栈有哪些组件,每个组件都有什么功能,适合什么应用场景?

  • Spark-Core:提供了批处理(RDDS)
    • spark-core 的 RDDs 是整个 Spark 的基础
  • Spark SQL:结构化查询(DataFrame)
  • Spark Streaming:流计算
  • MLlib:机器学习
  • Graphx:图计算

问题16、sparkstreaming写了多少的任务?

问题17、spark中如何划分stage

spark中TaskDAGScheduler拿到TaskSet后,根据是否shuffle去划分stage

问题18、spark 如何防止内存溢出,你出现内存溢出是什么场景

  • driver端的内存溢出
    可以增大driver的内存参数:spark.driver.memory (default 1g)
  • map过程产生大量对象导致内存溢出
    具体做法可以在会产生大量对象的map操作之前调用repartition方法,分区成更小的块传入map
  • 数据不平衡导致内存溢出(数据倾斜)
    数据不平衡除了有可能导致内存溢出外,也有可能导致性能的问题,解决方法和上面说的类似,就是调用repartition重新分区。这里就不再累赘了。
  • shuffle后内存溢出
    partitioner的代码增加partitions的数量。
  • 使用rdd.persist(StorageLevel.MEMORY_AND_DISK_SER)代替rdd.cache()

问题19、spark中cache和persist的区别

  • cache其实是persist方法的一个别名,它的底层用的就是persist(),cache只能缓存到内存
  • persist方法是persist(newLevel:StorageLevel)的一个别名,persist()底层用的就是persist(StorageLevel.MEMORY_ONLY);persist可以指定缓存级别

问题20、spark-submit的时候如何引入外部jar包

spark-submit有一个可选参数

--jars #依赖jar包的位置

问题21、简要描述Spark分布式集群搭建的步骤

以standalone为例:

  • 准备spark安装包,用tar命令解压到指定位置
  • 修改配置文件slaves,指定从节点;修改spark-defaults.conf文件,添加HistoryServer相关配置
  • 修改spark-env.sh文件,添加HistoryServer启动参数
  • 分发到集群主机上
  • 执行start-all.sh启动集群,使用start-history-server.sh命令启动HIstoryServer

问题22、用过哪些算子,哪些会产生shuffer

常用的算子map,flatMap,filter,take,reduceByKey,countByKey,foreach,collect,count等
其中reduceByKey,countByKey,

问题23、DAG怎么形成的?

DAG描述多个RDD的转换过程,任务执行时,可以按照DAG的描述,执行真正的计算;
DAG是有边界的:
开始(通过sparkcontext创建的RDD),
结束(触发action,调用runjob就是一个完整的DAG形成了,一旦触发action,就形成了一个完整的DAG);
一个RDD描述了数据计算过程中的一个环节,而一个DAG包含多个RDD,描述了数据计算过程中的所有环节;一个spark application可以包含多个DAG,取决于具体有多少个action。

问题24、SparkStreaming如何保证数据的防丢失

问题25、spark的checkpoint机制

  • Checkpoint 的主要作用是斩断 RDD 的依赖链, 并且将数据存储在可靠的存储引擎中, 例如支持分布式存储和副本机制的 HDFS.
  • checkpoint就是对于一个RDD chain(链)如果后面需要反复使用某些中间结果RDD,可能因为一些故障导致该中间数据丢失,那么就可以针对该RDD启动checkpoint机制,使用checkpoint首先需要调用sparkContext的setCheckpointDir方法,设置一个容错文件系统目录,比如hdfs,然后对RDD调用checkpoint方法。之后在RDD所处的job运行结束后,会启动一个单独的job来将checkpoint过的数据写入之前设置的文件系统持久化,进行高可用。所以后面的计算在使用该RDD时,如果数据丢失了,但是还是可以从它的checkpoint中读取数据,不需要重新计算。

问题26、checkpoint与persist和cache的区别

​ persist或者cache与checkpoint的区别在于,前者持久化只是将数据保存在BlockManager中但是其lineage是不变的,但是后者checkpoint执行完后,rdd已经没有依赖RDD,只有一个checkpointRDD,checkpoint之后,RDD的lineage就改变了。persist或者cache持久化的数据丢失的可能性更大,因为可能磁盘或内存被清理,但是checkpoint的数据通常保存到hdfs上,放在了高容错文件系统。

问题27、reduceByKey和groupByKey的区别

reduceByKey会再map端提前聚合,减少网络io量,而groupByKey是在reduce端聚合,容易产生数据倾斜

问题28、sparkSql, hSql 有什么区别

问题29、Spark内存溢出怎么解决

  • Driver端内存溢出
    • 增大driver的内存参数
    • spark.driver.memory (default 1g)
  • Map过程产生大量对象导致内存溢出
    • 在不增加内存的前提下,可以通过减小每个task大小
    • 做法:在会产生大量对象的map操作之前调用repartition方法,分区成更小的块传入map
  • 数据不平衡导致内存溢出
    • 调用repartition重新分区
  • Shuffle后内存溢出
    • 如果使用默认的HashPatitioner,可以spark.default.parallelism这个参数来控制shuffle的并发量;否则需要在partition代码中增加partitions的数量
  • Standalone模式下资源分配不均匀导致内存溢出
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值