鎖屏面試題百日百刷-Spark篇(十九)
鎖屏面試題百日百刷,每個(gè)工作日?qǐng)?jiān)持更新面試題。鎖屏面試題app、小程序現(xiàn)已上線,官網(wǎng)地址:https://www.demosoftware.cn。已收錄了每日更新的面試題的所有內(nèi)容,還包含特色的解鎖屏幕復(fù)習(xí)面試題、每日編程題目郵件推送等功能。讓你在面試中先人一步!接下來(lái)的是今日的面試題:
1.spark中task有幾種類(lèi)型?
Spark中的Task有2種類(lèi)型:
1)result task類(lèi)型,最后一個(gè)task;
2)shuffleMapTask類(lèi)型,除了最后一個(gè)task都是此類(lèi)型;
2.rangePartioner分區(qū)器特點(diǎn)?
rangePartioner盡量保證每個(gè)分區(qū)中數(shù)據(jù)量的均勻,而且分區(qū)與分區(qū)之間是有序的,一個(gè)分區(qū)中的元素肯定都是比另一個(gè)分區(qū)內(nèi)的元素小或者大;但是分區(qū)內(nèi)的元素是不能保證順序的。簡(jiǎn)單的說(shuō)就是將一定范圍內(nèi)的數(shù)映射到某一個(gè)分區(qū)內(nèi)。RangePartitioner作用:將一定范圍內(nèi)的數(shù)映射到某一個(gè)分區(qū)內(nèi),在實(shí)現(xiàn)中,分界的算法尤為重要。算法對(duì)應(yīng)的函數(shù)是rangeBounds。
3.手撕代碼-如何使用Spark解決TopN問(wèn)題?
可以做一個(gè)簡(jiǎn)單的wordcount文件
def wordcount(): Unit ={
val conf = new SparkConf().setAppName("wordcount").setMaster("local[*]")
val sc = new SparkContext(conf)
sc.setLogLevel("ERROR")
val rdd1 = sc.textFile("song.txt")
val sortWord = rdd1.flatMap(_.split(" "))
.map(x => (x,1))
.reduceByKey((v1,v2) => v1 + v2)
.filter(x => x._1 != "")
.sortBy(x => x._2,false,1)
.top(2)
.foreach(println)
sc.stop()}
4.窄依賴(lài)父RDD的partition和子RDD的parition是不是都是一對(duì)一的關(guān)系?
不一定,除了一對(duì)一的窄依賴(lài),還包含一對(duì)固定個(gè)數(shù)的窄依賴(lài)(就是對(duì)父RDD的依賴(lài)的Partition的數(shù)量不會(huì)隨著RDD數(shù)量規(guī)模的改變而改變),比如join操作的每個(gè)partiion僅僅和已知的partition進(jìn)行join,這個(gè)join操作是窄依賴(lài),依賴(lài)固定數(shù)量的父rdd,因?yàn)槭谴_定的partition關(guān)系。
5.Spark中的shuffle和Hadoop的Shuffle區(qū)別和聯(lián)系分析?

6.spark.default.parallelism這個(gè)參數(shù)有什么意義,實(shí)際生產(chǎn)中如何設(shè)置?
1)參數(shù)用于設(shè)置每個(gè)stage的默認(rèn)task數(shù)量。這個(gè)參數(shù)極為重要,如果不設(shè)置可能會(huì)直接影響你的Spark作業(yè)性能;
2)很多人都不會(huì)設(shè)置這個(gè)參數(shù),會(huì)使得集群非常低效,你的cpu,內(nèi)存再多,如果task始終為1,那也是浪費(fèi),spark官網(wǎng)建議task個(gè)數(shù)為CPU的核數(shù)*executor的個(gè)數(shù)的2~3倍。
7.spark.storage.memoryFraction參數(shù)的含義,實(shí)際生產(chǎn)中如何調(diào)優(yōu)?
1)用于設(shè)置RDD持久化數(shù)據(jù)在Executor內(nèi)存中能占的比例,默認(rèn)是0.6,,默認(rèn)Executor 60%的內(nèi)存,可以用來(lái)保存持久化的RDD數(shù)據(jù)。根據(jù)你選擇的不同的持久化策略,如果內(nèi)存不夠時(shí),可能數(shù)據(jù)就不會(huì)持久化,或者數(shù)據(jù)會(huì)寫(xiě)入磁盤(pán);
2)如果持久化操作比較多,可以提高spark.storage.memoryFraction參數(shù),使得更多的持久化數(shù)據(jù)保存在內(nèi)存中,提高數(shù)據(jù)的讀取性能,如果shuffle的操作比較多,有很多的數(shù)據(jù)讀寫(xiě)操作到JVM中,那么應(yīng)該調(diào)小一點(diǎn),節(jié)約出更多的內(nèi)存給JVM,避免過(guò)多的JVM gc發(fā)生。在web ui中觀察如果發(fā)現(xiàn)gc時(shí)間很長(zhǎng),可以設(shè)置spark.storage.memoryFraction更小一點(diǎn)。