Hadoop/Spark面试问题(下)

2 篇文章 0 订阅
1 篇文章 0 订阅

spark有哪些组件:
master:管理集群和节点,不参与计算。
worker:计算节点,进程本身不参与计算,和master汇报。
Driver:运行程序的main方法,创建spark context对象。
spark context:控制整个application的生命周期,包括dagsheduler和task scheduler等组件。
client:用户提交程序的入口。
spark工作机制:
用户在client端提交作业后,会由Driver运行main方法并创建spark context上下文。执行add算子,形成dag图输入dagscheduler,
按照add之间的依赖关系划分stage输入task scheduler。task scheduler会将stage划分为task set分发到各个节点的executor中执行。
spark的优化怎么做:
计算量大,形成的lineage过大应该给已经缓存了的rdd添加checkpoint,以减少容错带来的开销。
会重复用到的数据要错cache,避免产生过多中间数据导致OOM。
小分区合并,过小的分区造成过多的切换任务开销,使用repartition。
Spark Streaming和Storm有何区别?
storm是实时的流式处理框架,支持到毫秒级别,实时处理很好。
Spark Streaming是spark生态圈扩展出来的实时处理框架,但spark是做批处理任务的,Streaming只支持到秒级别,所以会有一定的延迟,严格意义上
来说Streaming说不上实时流式处理框架,本质是一个支持到秒级别的小的批处理。
driver的功能是什么?
功能:负责向集群申请资源,向master注册信息,负责了作业的调度,负责作业的解析、生成Stage并调度Task到Executor上。包括DAGScheduler,TaskScheduler。
Spark为什么比mapreduce快?
基于内存的计算,数据都在内存中做了缓存,减少磁盘交互。
基于管道式的处理引擎。

Spark是基于内存的技术?
错。Spark不是基于内存的技术,Spark是一个基于管道式的处理引擎,一些数据是在内存中进行计算,但是在shuffle过程会写入磁盘,而且在内存不够
的情况下也会把数据持久化到磁盘。Spark比MR快是因为管道式的处理引擎,并不完全因为基于内存。

RDD宽依赖和窄依赖:
RDD和它依赖的parent RDD(s)的关系有两种不同的类型,即宽依赖和窄依赖。
窄依赖指的是每一个parent RDD的Partition最多被子RDD的一个Partition使用。宽依赖指的是多个子RDD的Partition会依赖同一个parent RDD的Partition

cache和pesist的区别 :
cache和persist都是用于将一个RDD进行缓存的,这样在之后使用的过程中就不需要重新计算了,可以大大节省程序运行时间;
cache只有一个默认的缓存级别MEMORY_ONLY ,cache调用了persist,而persist可以根据情况设置其它的缓存级别;
executor执行的时候,默认60%做cache,40%做task操作,persist最根本的函数,最底层的函数。cache调用的就是persist。

spark中的RDD是什么,有哪些特性?
RDD(Resilient Distributed Dataset)叫做弹性分布式数据集,是Spark中最基本的数据抽象,它代表一个不可变、可分区、里面的元素可并行计算的集合。
Resilient:表示弹性的;Distributed:分布式,可以并行在集群计算;Dataset:就是一个集合,用于存放数据的。
弹性表示RDD中的数据可以存在内存中也可以存在磁盘上。RDD中的分区是可以改变的。
五大特性:
一个分区列表,RDD中的数据都存在一个分区列表里面。
由一个函数计算每一个分片,这里指的是下面会提到的compute函数。
一个RDD依赖于其他多个RDD,但并不是所有的RDD都有依赖。这个点很重要,RDD的容错机制就是依据这个特性而来的
可选:key-value型的RDD是根据哈希来分区的,类似于mapreduce当中的paritioner接口,控制Key分到哪个reduce。
可选:每一分片的优先计算位置,比如HDFS的block的所在位置应该是优先计算的位置。
它是在集群节点上的不可变的、已分区的集合对象。可以控制存储级别,既可以存在内存中也可以存在磁盘上。
通过转化的方式可以创建很多rdd,因为一个rdd可能会依赖很多rdd。但不是一定的。
RDD可以失败后自动重建,必须是序列化的,是今天类型。

RDD有哪些缺陷?
不支持增量迭代计算,Flink支持
不支持细粒度的写和更新操作(如网络爬虫),spark写数据是粗粒度的所谓粗粒度,就是批量写入数据,为了提高效率。但是读数据是细粒度的也就是说可以一条条的读。

概述一下spark中的常用算子区别?
Spark中算子分为落地算子和非落地算子。每一个落地算子都是一个action。
map:用于遍历RDD,将函数f应用于每一个元素,返回新的RDD(transformation算子)。
foreach:用于遍历RDD,将函数f应用于每一个元素,无返回值(action算子)。
mapPartitions:用于遍历操作RDD中的每一个分区,返回生成一个新的RDD(transformation算子)。
foreachPartition: 用于遍历操作RDD中的每一个分区。无返回值(action算子)。
filter:过滤操作,满足filter内function函数为true的RDD内所有元素组成一个新的数据集。如:filter(a == 1)
flatMap:map是对RDD中元素逐一进行函数操作映射为另外一个RDD,而flatMap操作是将函数应用于RDD之中的每一个元素,将返回的迭代器的所有内容构成新的RDD。
groupByKey,reduceByKey,aggregateByKey,sortByKey,join等等。。。
Action算子:collect,count,take,reduce,aggregate,saveAsTextFile(path),countByKey(),foreach(func)
每一个Action算子执行完成,代表向SparkContext提交作业完成。

spark 如何防止内存溢出?
driver端的内存溢出:
可以增大driver的内存参数:spark.driver.memory (default 1g)
map过程产生大量对象导致内存溢出 :
这种溢出的原因是在单个map中产生了大量的对象导致的,针对这种问题,在不增加内存的情况下,可以通过减少每个Task的大小,以便达到每个Task即使
产生大量的对象Executor的内存也能够装得下。具体做法可以在会产生大量对象的map操作之前调用repartition方法,分区成更小的块传入map。
例如:rdd.repartition(10000).map(x=>for(i <- 1 to 10000) yield i.toString)。
数据不平衡导致内存溢出 :
数据不平衡除了有可能导致内存溢出外,也有可能导致性能的问题,解决方法和上面说的类似,就是调用repartition重新分区。
使用rdd.persist(StorageLevel.MEMORY_AND_DISK_SER)代替rdd.cache()

spark中cache和persist的区别?
cache只是persist中的一种而已。其本质还是调用persist。
cache:缓存数据,默认是缓存在内存中,其本质还是调用persist。
persist:缓存数据,有丰富的数据缓存策略。数据可以保存在内存也可以保存在磁盘中,使用的时候指定对应的缓存级别就可以了。

为什么Spark Application在没有获得足够的资源,job就开始执行了,可能会导致什么什么问题发生?
很容易出现长时间分配不到资源,job一直不能运行的情况。
会导致执行该job时候集群资源不足,导致执行job结束也没有分配足够的资源,分配了部分Executor,该job就开始执行task,应该是task的调度
线程和Executor资源申请是异步的;如果想等待申请完所有的资源再执行job的:需要将spark.scheduler.maxRegisteredResourcesWaitingTime设置
的很大;spark.scheduler.minRegisteredResourcesRatio 设置为1,但是应该结合实际考虑否则很容易出现长时间分配不到资源,job一直不能运行的情况。

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值