你準備好面試了嗎?這里有一些面試中可能會問到的問題以及相對應(yīng)的答案。如果你需要更多的面試經(jīng)驗和面試題,關(guān)注一下"張飛的豬大數(shù)據(jù)分享"吧,公眾號會不定時的分享相關(guān)的知識和資料。
- 1、談?wù)凥adoop序列化和反序列化及自定義bean對象實現(xiàn)序列化?
- 2、FileInputFormat切片機制
- 3、在一個Hadoop 任務(wù)中,什么是InputSplit(切片),以及切片是用來做什么的,切片與block有什么區(qū)別?
- 4、如何判定一個job的map和reduce的數(shù)量?
- 5、 Maptask的個數(shù)由什么決定?
- 6、MapTask和ReduceTask工作機制或工作原理
- 7、描述mapReduce有幾種排序及排序發(fā)生的階段
- 8、描述mapReduce中shuffle階段的工作流程,如何優(yōu)化shuffle階段
- 9、描述mapReduce中combiner的作用是什么,一般使用情景,以及和reduce的區(qū)別?
- 10、如果沒有定義partitioner,那數(shù)據(jù)在被送達reducer前是如何被分區(qū)的?
- 11、MapReduce 出現(xiàn)單點負載多大,怎么負載平衡?
- 12、MapReduce 怎么實現(xiàn) TopN?
- 13、Hadoop的緩存機制(Distributedcache)是怎么樣的?
- 14、mapReduce如何實現(xiàn)兩個表的join?
- 15、什么樣的計算不適用mr來提速?
- 16、更多大數(shù)據(jù)面試集錦
1、談?wù)凥adoop序列化和反序列化及自定義bean對象實現(xiàn)序列化?
1)序列化和反序列化
? (1)序列化就是把內(nèi)存中的對象,轉(zhuǎn)換成字節(jié)序列(或其他數(shù)據(jù)傳輸協(xié)議)以便于存儲(持久化)和網(wǎng)絡(luò)傳輸。
? (2)反序列化就是將收到字節(jié)序列(或其他數(shù)據(jù)傳輸協(xié)議)或者是硬盤的持久化數(shù)據(jù),轉(zhuǎn)換成內(nèi)存中的對象。
? (3)Java的序列化是一個重量級序列化框架(Serializable),一個對象被序列化后,會附帶很多額外的信息(各種校驗信息,header,繼承體系等),不便于在網(wǎng)絡(luò)中高效傳輸。所以,hadoop自己開發(fā)了一套序列化機制(Writable),精簡、高效。
2)自定義bean對象要想序列化傳輸步驟及注意事項:
(1)必須實現(xiàn)Writable接口
? (2)反序列化時,需要反射調(diào)用空參構(gòu)造函數(shù),所以必須有空參構(gòu)造
? (3)重寫序列化方法
? (4)重寫反序列化方法
? (5)注意反序列化的順序和序列化的順序完全一致
? (6)要想把結(jié)果顯示在文件中,需要重寫toString(),且用"\t"分開,方便后續(xù)用
? (7)如果需要將自定義的bean放在key中傳輸,則還需要實現(xiàn)comparable接口,因為mapreduce框中的shuffle過程一定會對key進行排序
2、FileInputFormat切片機制
job提交流程源碼詳解
waitForCompletion()
? submit();
? // 1、建立連接
? ? connect();
? ? ? // 1)創(chuàng)建提交job的代理
? ? ? new Cluster(getConfiguration());
? ? ? ? // (1)判斷是本地yarn還是遠程
? ? ? ? initialize(jobTrackAddr, conf);
? // 2、提交job
? submitter.submitJobInternal(Job.this, cluster)
? ? // 1)創(chuàng)建給集群提交數(shù)據(jù)的Stag路徑
? ? Path jobStagingArea = JobSubmissionFiles.getStagingDir(cluster, conf);
? ? // 2)獲取jobid ,并創(chuàng)建job路徑
? ? JobID jobId = submitClient.getNewJobID();
? ? // 3)拷貝jar包到集群
? ? copyAndConfigureFiles(job, submitJobDir);
? ? rUploader.uploadFiles(job, jobSubmitDir);
? ? // 4)計算切片,生成切片規(guī)劃文件
? ? writeSplits(job, submitJobDir);
? ? maps = writeNewSplits(job, jobSubmitDir);
? ? input.getSplits(job);
? ? // 5)向Stag路徑寫xml配置文件
? ? writeConf(conf, submitJobFile);
? ? conf.writeXml(out);
? ? // 6)提交job,返回提交狀態(tài)
? ? status = submitClient.submitJob(jobId, submitJobDir.toString(), job.getCredentials());
3、在一個Hadoop 任務(wù)中,什么是InputSplit(切片),以及切片是用來做什么的,切片與block有什么區(qū)別?
FileInputFormat源碼解析(input.getSplits(job))
(1)找到你數(shù)據(jù)存儲的目錄。
(2)開始遍歷處理(規(guī)劃切片)目錄下的每一個文件。
(3)遍歷第一個文件xx.txt。
? a)獲取文件大小fs.sizeOf(xx.txt);。
? b)計算切片大小
computeSliteSize(Math.max(minSize,Math.min(maxSize,blocksize)))。
? c)默認情況下,切片大小=blocksize。
? d)開始切,形成第1個切片:xx.txt—0:128M 第2個切片xx.txt—128:256M 第3個切片xx.txt—256M:300M(每次切片時,都要判斷切完剩下的部分是否大于塊的1.1倍,不大于1.1倍就劃分一塊切片)。
? e)將切片信息寫到一個切片規(guī)劃文件中。
? f)整個切片的核心過程在getSplit()方法中完成。
? g)數(shù)據(jù)切片只是在邏輯上對輸入數(shù)據(jù)進行分片,并不會再磁盤上將其切分成分片進行存儲。InputSplit只記錄了分片的元數(shù)據(jù)信息,比如起始位置、長度以及所在的節(jié)點列表等。
? h)注意:block是HDFS上物理上存儲的存儲的數(shù)據(jù),切片是對數(shù)據(jù)邏輯上的劃分。
(4)提交切片規(guī)劃文件到y(tǒng)arn上,yarn上的MrAppMaster就可以根據(jù)切片規(guī)劃文件計算開啟maptask個數(shù)。
4、如何判定一個job的map和reduce的數(shù)量?
1)map數(shù)量
? splitSize=max{minSize,min{maxSize,blockSize}}
? map數(shù)量由處理的數(shù)據(jù)分成的block數(shù)量決定default_num = total_size / split_size;
2)reduce數(shù)量
? reduce的數(shù)量job.setNumReduceTasks(x);x 為reduce的數(shù)量。不設(shè)置的話默認為 1。
5、 Maptask的個數(shù)由什么決定?
一個job的map階段MapTask并行度(個數(shù)),由客戶端提交job時的切片個數(shù)決定。
6、MapTask和ReduceTask工作機制或工作原理
MapTask工作機制
(1)Read階段:Map Task通過用戶編寫的RecordReader,從輸入InputSplit中解析出一個個key/value。
(2)Map階段:該節(jié)點主要是將解析出的key/value交給用戶編寫map()函數(shù)處理,并產(chǎn)生一系列新的key/value。
(3)Collect收集階段:在用戶編寫map()函數(shù)中,當數(shù)據(jù)處理完成后,一般會調(diào)用OutputCollector.collect()輸出結(jié)果。在該函數(shù)內(nèi)部,它會將生成的key/value分區(qū)(調(diào)用Partitioner),并寫入一個環(huán)形內(nèi)存緩沖區(qū)中。
(4)Spill階段:即“溢寫”,當環(huán)形緩沖區(qū)滿后,MapReduce會將數(shù)據(jù)寫到本地磁盤上,生成一個臨時文件。需要注意的是,將數(shù)據(jù)寫入本地磁盤之前,先要對數(shù)據(jù)進行一次本地排序,并在必要時對數(shù)據(jù)進行合并、壓縮等操作。
(5)Combine階段:當所有數(shù)據(jù)處理完成后,MapTask對所有臨時文件進行一次合并,以確保最終只會生成一個數(shù)據(jù)文件。
ReduceTask工作機制
(1)Copy階段:ReduceTask從各個MapTask上遠程拷貝一片數(shù)據(jù),并針對某一片數(shù)據(jù),如果其大小超過一定閾值,則寫到磁盤上,否則直接放到內(nèi)存中。
(2)Merge階段:在遠程拷貝數(shù)據(jù)的同時,ReduceTask啟動了兩個后臺線程對內(nèi)存和磁盤上的文件進行合并,以防止內(nèi)存使用過多或磁盤上文件過多。
(3)Sort階段:按照MapReduce語義,用戶編寫reduce()函數(shù)輸入數(shù)據(jù)是按key進行聚集的一組數(shù)據(jù)。為了將key相同的數(shù)據(jù)聚在一起,Hadoop采用了基于排序的策略。 由于各個MapTask已經(jīng)實現(xiàn)對自己的處理結(jié)果進行了局部排序,因此,ReduceTask只需對所有數(shù)據(jù)進行一次歸并排序即可。
(4)Reduce階段:reduce()函數(shù)將計算結(jié)果寫到HDFS上。
7、描述mapReduce有幾種排序及排序發(fā)生的階段
1)排序的分類:
? (1)部分排序:
? ? MapReduce根據(jù)輸入記錄的鍵對數(shù)據(jù)集排序。保證輸出的每個文件內(nèi)部排序。
? (2)全排序:
? ? 如何用Hadoop產(chǎn)生一個全局排序的文件?最簡單的方法是使用一個分區(qū)。但該方法在處理大型文件時效率極低,因為一臺機器必須處理所有輸出文件,從而完全喪失了MapReduce所提供的并行架構(gòu)。
? ? 替代方案:首先創(chuàng)建一系列排好序的文件;其次,串聯(lián)這些文件;最后,生成一個全局排序的文件。主要思路是使用一個分區(qū)來描述輸出的全局排序。例如:可以為待分析文件創(chuàng)建3個分區(qū),在第一分區(qū)中,記錄的單詞首字母a-g,第二分區(qū)記錄單詞首字母h-n, 第三分區(qū)記錄單詞首字母o-z。
? (3)輔助排序:(GroupingComparator分組)
? ? Mapreduce框架在記錄到達reducer之前按鍵對記錄排序,但鍵所對應(yīng)的值并沒有被排序。甚至在不同的執(zhí)行輪次中,這些值的排序也不固定,因為它們來自不同的map任務(wù)且這些map任務(wù)在不同輪次中完成時間各不相同。一般來說,大多數(shù)MapReduce程序會避免讓reduce函數(shù)依賴于值的排序。但是,有時也需要通過特定的方法對鍵進行排序和分組等以實現(xiàn)對值的排序。
? (4)二次排序:
? ? 在自定義排序過程中,如果compareTo中的判斷條件為兩個即為二次排序。
2)自定義排序WritableComparable
? bean對象實現(xiàn)WritableComparable接口重寫compareTo方法,就可以實現(xiàn)排序
? ? @Override
? ? public int compareTo(FlowBean o) {
? ? ? // 倒序排列,從大到小
? ? ? return this.sumFlow > o.getSumFlow() ? -1 : 1;
? ? }
3)排序發(fā)生的階段:
? (1)一個是在map side發(fā)生在spill后partition前。
? (2)一個是在reduce side發(fā)生在copy后 reduce前。
8、描述mapReduce中shuffle階段的工作流程,如何優(yōu)化shuffle階段
分區(qū),排序,溢寫,拷貝到對應(yīng)reduce機器上,增加combiner,壓縮溢寫的文件。
9、描述mapReduce中combiner的作用是什么,一般使用情景,以及和reduce的區(qū)別?
1)Combiner的意義就是對每一個maptask的輸出進行局部匯總,以減小網(wǎng)絡(luò)傳輸量。
2)Combiner能夠應(yīng)用的前提是不能影響最終的業(yè)務(wù)邏輯,而且,Combiner的輸出kv應(yīng)該跟reducer的輸入kv類型要對應(yīng)起來。
3)Combiner和reducer的區(qū)別在于運行的位置。
? Combiner是在每一個maptask所在的節(jié)點運行;
? Reducer是接收全局所有Mapper的輸出結(jié)果。
10、如果沒有定義partitioner,那數(shù)據(jù)在被送達reducer前是如何被分區(qū)的?
如果沒有自定義的 partitioning,則默認的 partition 算法,即根據(jù)每一條數(shù)據(jù)的 key 的 hashcode 值摸運算(%)reduce 的數(shù)量,得到的數(shù)字就是“分區(qū)號“。
11、MapReduce 出現(xiàn)單點負載多大,怎么負載平衡?
通過Partitioner實現(xiàn)
12、MapReduce 怎么實現(xiàn) TopN?
可以自定義groupingcomparator,對結(jié)果進行最大值排序,然后再reduce輸出時,控制只輸出前n個數(shù)。就達到了topn輸出的目的。
13、Hadoop的緩存機制(Distributedcache)是怎么樣的?
分布式緩存一個最重要的應(yīng)用就是在進行join操作的時候,如果一個表很大,另一個表很小,我們就可以將這個小表進行廣播處理,即每個計算節(jié)點上都存一份,然后進行map端的連接操作,經(jīng)過我的實驗驗證,這種情況下處理效率大大高于一般的reduce端join,廣播處理就運用到了分布式緩存的技術(shù)。
? DistributedCache將拷貝緩存的文件到Slave節(jié)點在任何Job在節(jié)點上執(zhí)行之前,文件在每個Job中只會被拷貝一次,緩存的歸檔文件會被在Slave節(jié)點中解壓縮。將本地文件復(fù)制到HDFS中去,接著Client會通過addCacheFile() 和addCacheArchive()方法告訴DistributedCache在HDFS中的位置。當文件存放到文地時,JobClient同樣獲得DistributedCache來創(chuàng)建符號鏈接,其形式為文件的URI加fragment標識。當用戶需要獲得緩存中所有有效文件的列表時,JobConf 的方法 getLocalCacheFiles() 和getLocalArchives()都返回一個指向本地文件路徑對象數(shù)組。
14、mapReduce如何實現(xiàn)兩個表的join?
1)reduce side join : 在map階段,map函數(shù)同時讀取兩個文件File1和File2,為了區(qū)分兩種來源的key/value數(shù)據(jù)對,對每條數(shù)據(jù)打一個標簽(tag),比如:tag=0 表示來自文件File1,tag=2 表示來自文件File2。
? 2)map side join : Map side join 是針對以下場景進行的優(yōu)化:兩個待連接表中,有一個表非常大,而另一個表非常小,以至于小表可以直接存放到內(nèi)存中。這樣,我們可以將小表復(fù)制多份,讓每個map task 內(nèi)存中存在一份(比如存放到hash table 中),然后只掃描大表:對于大表中的每一條記錄key/value,在hash table 中查找是否有相同的key 的記錄,如果有,則連接后輸出即可。文章來源:http://www.zghlxwxcb.cn/news/detail-511578.html
15、什么樣的計算不適用mr來提速?
1)數(shù)據(jù)量很小
2)特別多的小文件
3)特別頻繁的讀的時候,索引是更好的存取機制的時候
4)需要使用事務(wù)的時候
5)只有一臺機器的時候文章來源地址http://www.zghlxwxcb.cn/news/detail-511578.html
16、更多大數(shù)據(jù)面試集錦
- 大數(shù)據(jù)書籍資料分享
- 大數(shù)據(jù)面試題集錦
到了這里,關(guān)于大數(shù)據(jù)面試題集錦-Hadoop面試題(三)-MapReduce的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!