鎖屏面試題百日百刷-Spark篇(十八)
鎖屏面試題百日百刷,每個(gè)工作日?qǐng)?jiān)持更新面試題。鎖屏面試題app、小程序現(xiàn)已上線,官網(wǎng)地址:https://www.demosoftware.cn。已收錄了每日更新的面試題的所有內(nèi)容,還包含特色的解鎖屏幕復(fù)習(xí)面試題、每日編程題目郵件推送等功能。讓你在面試中先人一步!接下來的是今日的面試題:
1.為什么要進(jìn)行序列化
序列化可以減少數(shù)據(jù)的體積,減少存儲(chǔ)空間,高效存儲(chǔ)和傳輸數(shù)據(jù),不好的是使用的時(shí)候要反序列化,非常消耗CPU。
2.下面這段代碼輸出結(jié)果是什么?
def joinRdd(sc:SparkContext) {
val name= Array(
Tuple2(1,"spark"), Tuple2(2,"tachyon"), Tuple2(3,"hadoop")
)
val score= Array(
Tuple2(1,100), Tuple2(2,90), Tuple2(3,80)
)
val namerdd=sc.parallelize(name);
val scorerdd=sc.parallelize(score);
val result = namerdd.join(scorerdd);
result .collect.foreach(println);
}
答案:
(1,(Spark,100))
(2,(tachyon,90))
(3,(hadoop,80))
3.Spark累加器有哪些特點(diǎn)?
1)累加器在全局唯一的,只增不減,記錄全局集群的唯一狀態(tài);
2)在exe中修改它,在driver讀??;
3)executor級(jí)別共享的,廣播變量是task級(jí)別的共享兩個(gè)application不可以共享累加器,但是同一個(gè)app不同的job可以共享。
4.spark hashParitioner的弊端是什么?
HashPartitioner分區(qū)的原理很簡單,對(duì)于給定的key,計(jì)算其hashCode,并除于分區(qū)的個(gè)數(shù)取余,如果余數(shù)小于0,則用余數(shù)+分區(qū)的個(gè)數(shù),最后返回的值就是這個(gè)key所屬的分區(qū)ID;弊端是數(shù)據(jù)不均勻,容易導(dǎo)致數(shù)據(jù)傾斜,極端情況下某幾個(gè)分區(qū)會(huì)擁有rdd的所有數(shù)據(jù)。
5.RangePartitioner分區(qū)的原理?
RangePartitioner分區(qū)則盡量保證每個(gè)分區(qū)中數(shù)據(jù)量的均勻,而且分區(qū)與分區(qū)之間是有序的,也就是說一個(gè)分區(qū)中的元素肯定都是比另一個(gè)分區(qū)內(nèi)的元素小或者大;但是分區(qū)內(nèi)的元素是不能保證順序的。簡單的說就是將一定范圍內(nèi)的數(shù)映射到某一個(gè)分區(qū)內(nèi)。其原理是水塘抽樣。
6.介紹parition和block有什么關(guān)聯(lián)關(guān)系?
1)hdfs中的block是分布式存儲(chǔ)的最小單元,等分,可設(shè)置冗余,這樣設(shè)計(jì)有一部分磁盤空間的浪費(fèi),但是整齊的block大小,便于快速找到、讀取對(duì)應(yīng)的內(nèi)容;
2)Spark中的partion是彈性分布式數(shù)據(jù)集RDD的最小單元,RDD是由分布在各個(gè)節(jié)點(diǎn)上的partion組成的。partion是指的spark在計(jì)算過程中,生成的數(shù)據(jù)在計(jì)算空間內(nèi)最小單元,同一份數(shù)據(jù)(RDD)的partion大小不一,數(shù)量不定,是根據(jù)application里的算子和最初讀入的數(shù)據(jù)分塊數(shù)量決定;
3)block位于存儲(chǔ)空間、partion位于計(jì)算空間,block的大小是固定的、partion大小是不固定的,是從2個(gè)不同的角度去看數(shù)據(jù)。
7.hbase預(yù)分區(qū)個(gè)數(shù)和spark過程中的reduce個(gè)數(shù)相同么
預(yù)分區(qū)數(shù)和spark的map個(gè)數(shù)相同,reduce個(gè)數(shù)如果沒有設(shè)置和reduce前的map數(shù)相同。
8.Spark如何自定義partitioner分區(qū)器?
1)spark默認(rèn)實(shí)現(xiàn)了HashPartitioner和RangePartitioner兩種分區(qū)策略,我們也可以自己擴(kuò)展分區(qū)策略,自定義分區(qū)器的時(shí)候繼承org.apache.spark.Partitioner類,實(shí)現(xiàn)類中的三個(gè)方法:
def numPartitions: Int:這個(gè)方法需要返回你想要?jiǎng)?chuàng)建分區(qū)的個(gè)數(shù);
def getPartition(key: Any): Int:這個(gè)函數(shù)需要對(duì)輸入的key做計(jì)算,然后返回該key的分區(qū)ID,范圍一定是0到numPartitions-1;
equals():這個(gè)是Java標(biāo)準(zhǔn)的判斷相等的函數(shù),之所以要求用戶實(shí)現(xiàn)這個(gè)函數(shù)是因?yàn)镾park內(nèi)部會(huì)比較兩個(gè)RDD的分區(qū)是否一樣。
2)使用,調(diào)用parttionBy方法中傳入自定義分區(qū)對(duì)象。