千鋒大數(shù)據(jù)培訓(xùn)老師整理的純干貨總結(jié):2018常見大數(shù)據(jù)面試題,助正在找工作的小伙伴一臂之力!
1、RDD中reduceBykey與groupByKey哪個(gè)性能好,為什么
reduceByKey:reduceByKey會(huì)在結(jié)果發(fā)送至reducer之前會(huì)對(duì)每個(gè)mapper在本地進(jìn)行merge,有點(diǎn)類似于在MapReduce中的combiner。這樣做的好處在于,在map端進(jìn)行一次reduce之后,數(shù)據(jù)量會(huì)大幅度減小,從而減小傳輸,保證reduce端能夠更快的進(jìn)行結(jié)果計(jì)算。
groupByKey:groupByKey會(huì)對(duì)每一個(gè)RDD中的value值進(jìn)行聚合形成一個(gè)序列(Iterator),此操作發(fā)生在reduce端,所以勢(shì)必會(huì)將所有的數(shù)據(jù)通過網(wǎng)絡(luò)進(jìn)行傳輸,造成不必要的浪費(fèi)。同時(shí)如果數(shù)據(jù)量十分大,可能還會(huì)造成OutOfMemoryError。
通過以上對(duì)比可以發(fā)現(xiàn)在進(jìn)行大量數(shù)據(jù)的reduce操作時(shí)候建議使用reduceByKey。不僅可以提高速度,還是可以防止使用groupByKey造成的內(nèi)存溢出問題。
2、講述一下hdfs上傳文件的流程。
答:這里描述的 是一個(gè)256M的文件上傳過程
① 由客戶端 向 NameNode節(jié)點(diǎn)節(jié)點(diǎn) 發(fā)出請(qǐng)求;
②NameNode 向Client返回可以可以存數(shù)據(jù)的 DataNode 這里遵循機(jī)架感應(yīng)原則;
③客戶端 首先 根據(jù)返回的信息 先將 文件分塊(Hadoop2.X版本 每一個(gè)block為 128M 而之前的版本為 64M;
④然后通過那么Node返回的DataNode信息 直接發(fā)送給DataNode 并且是 流式寫入同時(shí)會(huì)復(fù)制到其他兩臺(tái)機(jī)器;
⑤dataNode 向 Client通信 表示已經(jīng)傳完 數(shù)據(jù)塊 同時(shí)向NameNode報(bào)告 ⑥依照上面(④到⑤)的原理將 所有的數(shù)據(jù)塊都上傳結(jié)束 向 NameNode 報(bào)告 表明 已經(jīng)傳完所有的數(shù)據(jù)塊 。
3、了解zookeeper嗎?介紹一下它,它的選舉機(jī)制和集群的搭建。
答:那當(dāng)然是熟悉啦,ZooKeeper 是一個(gè)開源的分布式協(xié)調(diào)服務(wù),是 Google Chubby 的開源實(shí)現(xiàn)。分布式應(yīng)用程序可以基于 ZooKeeper 實(shí)現(xiàn)諸如數(shù)據(jù)發(fā)布/訂閱、負(fù)載均衡、命名服務(wù)、分布式協(xié)調(diào)/通知、集群管理、Master 選舉、分布式鎖和分布式隊(duì)列等功能。我們公司使用的flume集群,Kafka集群等等,都離不開ZooKeeper呀。每個(gè)節(jié)點(diǎn)上我們都要搭建ZooKeeper服務(wù)。首先我們要在每臺(tái)pc上配置zookeeper環(huán)境變量,在cd到zookeeper下的conf文件夾下在zoo_simjle.cfg文件中添加datadir路徑,再到zookeeper下新建data文件夾,創(chuàng)建myid,在文件里添加上server的ip地址。在啟動(dòng)zkserver.sh start便ok了。
4、spark streming在實(shí)時(shí)處理時(shí)會(huì)發(fā)生什么故障,如何停止,解決
答:和Kafka整合時(shí)消息無(wú)序:
修改Kafka的ack參數(shù),當(dāng)ack=1時(shí),master確認(rèn)收到消息就算投遞成功。ack=0時(shí),不需要收到消息便算成功,高效不準(zhǔn)確。sck=all,master和server都要受到消息才算成功,準(zhǔn)確不高效。
StreamingContext.stop會(huì)把關(guān)聯(lián)的SparkContext對(duì)象也停止,如果不想把SparkContext對(duì)象也停止的話可以把StremingContext.stop的可選參數(shù)stopSparkContext設(shè)為flase。一個(gè)SparkContext對(duì)象可以和多個(gè)streamingcontext對(duì)象關(guān)聯(lián)。只要對(duì)前一個(gè)stremingcontext.stop(stopsparkcontext=false),然后再創(chuàng)建新的stremingcontext對(duì)象就可以了。