Spark与mapreduce的区别?
spark on yarn client模式与cluster的区别?
spark 的三种shuffle ?
spark sql三种join方式?
RDD有什么缺陷?
Checkpoint 和持久化机制的区别?
groupByKey和reduceByKey区别?
为什么Spark Application在没有获得足够的资源,job就开始执行了,可能会导致什么什么问题发生?
RDD的弹性表现在哪几点?
RDD通过Linage(记录数据更新)的方式为何很高效?
updateStateByKey与mapWithState 使用区别?
1:Spark为什么比mapreduce快?
1:MR基于磁盘的分布式计算引擎,spark基于内存进行计算,DAG计算模型 2:spark多线程运行,MR多进程运行 3:spark粗粒度资源申请,MR细粒度资源申请 4:spark支持多种部署模式,MR只支持yarn上部署 5:shuffle与排序;MR有reducer必排序,一般会经过3次排序,Spark Shuffle数据的排序操作不是必须的。 spark有多种shuffle类型,spark不一定会发生shuffle,MR一定会发生shuffle 6:spark具有灵活的内存管理策略
2:spark on yarn client模式与cluster的区别?
1:driver所在位置不同。 client模式下driver线程只在spark-submit命令提交的机器上。 cluster模式下,driver线程只在applicationMaster所在的节点。 2:启动的任务进程名字不一样。 client模式下:ExecutorLanucher 只负责向yarn申请容器来启动executor cluster模式下,applicationMaster既要负责申请运行executor的资源,又要调Driver线程来做task调度
3:spark 的两种shuffle ?
1: Sort-Based Shuffle 分三种:
BypassMergeSortShuffleWriter 触发机制:
Reducer的数目 < spark.shuffle.sort.bypassMergeThrshold (默认200)
不是排序类的shuffle算子(比如reduceByKey)
SortShuffleWriter
溢写到磁盘文件之前,会先根据key对内存数据结构中已有的数据进行排序。排序过后,会分批将数据写入磁盘文件。首先会将数据缓冲在内存中,当内存缓冲满溢之后再一次写入磁盘文件中,这样可以减少磁盘IO次数,提升性能。
一个task将所有数据写入内存数据结构的过程中,会发生多次磁盘溢写操作,也就会产生多个临时文件。最后会将之前所有的临时磁盘文件都进行合并,这就是merge过程,此时会将之前所有临时磁盘文件中的数据读取出来,然后依次写入最终的磁盘文件之中。此外,由于一个task就只对应一个磁盘文件,也就意味着该task为下游stage的task准备的数据都在这一个文件中,因此还会单独写一份索引文件,其中标识了下游各个task的数据在文件中的start offset与end offset。
SortShuffleManager由于有一个磁盘文件merge的过程,因此大大减少了文件数量。
UnasfeSortShuffleWriter
UnsafeShuffleWriter中内存管理(申请、释放)工作,由ShuffleExternalSorter来完成。ShuffleExternalSorter还有一个作用就是当内存中数据太多的时候,会先spill到磁盘,防止内存溢出。
BypassMergeSortShuffleWriter 与 SortShuffleWriter 对比
第一,磁盘写机制不同;
第二,不会进行排序。也就是说,启用该机制的最大好处在于,shuffle write过程中,不需要进行数据的排序操作,也就节省掉了这部分的性能开销。
另外这个Sort-Based Shuffle跟Executor核数没有关系,即跟并发度没有关系,它是每一个ShuffleMapTask都会产生一个data文件和index文件,所谓合并也只是将该ShuffleMapTask的各个partition对应的分区文件合并到data文件而已。所以这个就需要个Hash-BasedShuffle的consolidation机制区别开来。
2:hash shuffle(已弃用)
4: spark sql 的三种join?
1.Broadcast Hash Join:适合一张很小的表和一张大表进行Join; 2.Shuffle Hash Join:适合一张小表(比上一个大一点)和一张大表进行Join; 3.Sort Merge Join:适合两张大表进行Join; shuffle Hash Join策略必须满足以下条件: 1.仅支持等值 Join,不要求参与 Join 的 Keys 可排序(这点是和sort-merge join相对应) 2.spark.sql.join.preferSortMergeJoin 参数必须设置为 false,参数是从 Spark 2.0.0 版本引入的,默认值为true,也就是默认情况下选择 Sort Merge Join; 3.小表的大小(plan.stats.sizeInBytes)必须小于 spark.sql.autoBroadcastJoinThreshold *spark.sql.shuffle.partitions(默认值200)其实就是让每一个小表的分区都类似于广播变量的小表; 4.而且小表大小(stats.sizeInBytes)的三倍必须小于等于大表的大小(stats.sizeInBytes),也就是a.stats.sizeInBytes * 3 < = b.stats.sizeInBytes Broadcast Hash Join 策略必须满足以下条件: 1、小表的数据必须很小,可以通过 spark.sql.autoBroadcastJoinThreshold 参数来配置,默认是 10MB; 2、如果内存比较大,可以将阈值适当加大; 3、将 spark.sql.autoBroadcastJoinThreshold 参数设置为 -1,可以关闭这种连接方式; 4、只能用于等值 Join,不要求参与 Join 的 keys 可排序 。 要启用 Shuffle Sort Merge Join 必须满足的条件是仅支持等值 Join,并且要求参与 Join 的 Keys 可排序。
5、RDD有什么缺陷?
1)不支持细粒度的写和更新操作(如网络爬虫),spark写数据是粗粒度的 所谓粗粒度,就是批量写入数据,为了提高效率。但是读数据是细粒度的也就是 说可以一条条的读 2)不支持增量迭代计算,Flink支持
6、Checkpoint 和持久化机制的区别?
最主要的区别在于持久化只是将数据保存在 BlockManager 中,但是 RDD 的 lineage(血缘关系,依赖关系)是不变的。但是 checkpoint 执行完之后,rdd 已经没有之前所谓的依赖 rdd 了,而只有一个强行为其设置的 checkpointRDD,checkpoint 之后 rdd 的 lineage 就改变了。
持久化的数据丢失的可能性更大,因为节点的故障会导致磁盘、内存的数据丢失。但是 checkpoint 的数据通常是保存在高可用的文件系统中,比如 HDFS 中,所以数据丢失可能性比较低。
7、groupByKey和reduceByKey区别?
reduceByKey 和 groupByKey 都存在 shuffle 的操作,但是 reduceByKey 可以在 shuffle 前对分区内相同 key 的数据进行预聚合(combine)功能,这样会减少落盘的 数据量,而 groupByKey 只是进行分组,不存在数据量减少的问题,reduceByKey 性能比较 高。 从功能的角度:reduceByKey 其实包含分组和聚合的功能。GroupByKey 只能分组,不能聚 合,所以在分组聚合的场合下,推荐使用 reduceByKey,如果仅仅是分组而不需要聚合。那 么还是只能使用 groupByKey
8、为什么Spark Application在没有获得足够的资源,job就开始执行了,可能会导致什么什么问题发生?
会导致执行该job时候集群资源不足,导致执行job结束也没有分配足够的资源,分配了部分Executor,该job就开始执行task,应该是task的调度线程和Executor资源申请是异步的;如果想等待申请完所有的资源再执行job的:
需要将spark.scheduler.maxRegisteredResourcesWaitingTime设置的很大;
spark.scheduler.minRegisteredResourcesRatio 设置为1,但是应该结合实际考虑,否则很容易出现长时间分配不到资源,job一直不能运行的情况。
9、RDD的弹性表现在哪几点?
1)自动的进行内存和磁盘的存储切换; 2)基于Lineage的高效容错; 3)task如果失败会自动进行特定次数的重试; 4)stage如果失败会自动进行特定次数的重试,而且只会计算失败的分片; 5)checkpoint和persist,数据计算之后持久化缓存; 6)数据调度弹性,DAG task调度和资源无关; 7)数据分片的高度弹性。
10、RDD通过Linage(记录数据更新)的方式为何很高效?
1)lazy记录了数据的来源,RDD是不可变的,且是lazy级别的,且RDD之间构成了链条,lazy是弹性的基石。由于RDD不可变,所以每次操作就产生新的rdd, 不存在全局修改的问题,控制难度下降,所有有计算链条将复杂计算链条存储下来,计算的时候从后往前回溯 900步是上一个stage的结束,要么就checkpoint。 2)记录原数据,是每次修改都记录,代价很大如果修改一个集合,代价就很小,官方说rdd是粗粒度的操作,是为了效率,为了简化,每次都是操作数据集合, 写或者修改操作,都是基于集合的rdd的写操作是粗粒度的,rdd的读操作既可以是粗粒度的也可以是细粒度,读可以读其中的一条条的记录。 3)简化复杂度,是高效率的一方面,写的粗粒度限制了使用场景如网络爬虫,现实世界中,大多数写是粗粒度的场景。
11、updateStateByKey与mapWithState 使用区别?
updateStateByKey :统计全局的key的状态,就算没有数据输入,它也会在每一个批次的时候返回之前的key的状态。 缺点:若数据量太大的话,需要checkpoint的数据会占用较大的存储,效率低下。 mapWithState:也是用于全局统计key的状态,但是它如果没有数据输入,便不会返回之前的key的状态,有一点增量的感觉。效率更高,生产中建议使用 优点:我们可以只是关心那些已经发生的变化的key,对于没有数据输入,则不会返回那些没有变化的key的数据。这样的话,即使数据量很大,checkpoint也不会像updateStateByKey那样,占用太多的存储