文章目录
- 问题1、spark-submit几种提交模式的 区别是什么?
- 问题2、spark streming在实时处理时会发生什么故障,如何停止,解决
- 问题3、spark工作机制
- 问题4、Kafka和sparkStreaming的整合,手动提交的offset调用了什么方法?
- 问题5、spark-yarn程序的的调度流程
- 问题6、Scala中协变逆变的应用场景。
- 问题7、Spark中隐式转化的应用场景
- 问题8、谈谈你对SparkRDD的理解
- 问题9、Spark与flink和storm的区别
- 问题10、Shuffle是一个挺消耗资源的操作,对shuffle有什么优化措施?
- 问题11、DStream是一个什么样的结构?里面有哪些对象?
- 问题12、SparkStreaming怎么做到流式计算?
- 问题13、如果数据达到一个阈值,在sparkstreaming中你是怎么处理的? sparkstreaming参数是怎么设定的?
- 问题14、sparkstreaming多长时间设置一个批次?
- 问题15、spark技术栈有哪些组件,每个组件都有什么功能,适合什么应用场景?
- 问题16、sparkstreaming写了多少的任务?
- 问题17、spark中如何划分stage
- 问题18、spark 如何防止内存溢出,你出现内存溢出是什么场景
- 问题19、spark中cache和persist的区别
- 问题20、spark-submit的时候如何引入外部jar包
- 问题21、简要描述Spark分布式集群搭建的步骤
- 问题22、用过哪些算子,哪些会产生shuffer
- 问题23、DAG怎么形成的?
- 问题24、SparkStreaming如何保证数据的防丢失
- 问题25、spark的checkpoint机制
- 问题26、checkpoint与persist和cache的区别
- 问题27、reduceByKey和groupByKey的区别
- 问题28、sparkSql, hSql 有什么区别
- 问题29、Spark内存溢出怎么解决
问题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模式下资源分配不均匀导致内存溢出