主頁 > 資料庫 > 大資料面試題集錦-Hadoop面試題(三)-MapReduce

大資料面試題集錦-Hadoop面試題(三)-MapReduce

2023-07-01 08:48:31 資料庫

你準備好面試了嗎?這里有一些面試中可能會問到的問題以及相對應的答案,如果你需要更多的面試經驗和面試題,關注一下"張飛的豬大資料分享"吧,公眾號會不定時的分享相關的知識和資料,

目錄
  • 1、談談Hadoop序列化和反序列化及自定義bean物件實作序列化?
  • 2、FileInputFormat切片機制
  • 3、在一個Hadoop 任務中,什么是InputSplit(切片),以及切片是用來做什么的,切片與block有什么區別?
  • 4、如何判定一個job的map和reduce的數量?
  • 5、 Maptask的個數由什么決定?
  • 6、MapTask和ReduceTask作業機制或作業原理
  • 7、描述mapReduce有幾種排序及排序發生的階段
  • 8、描述mapReduce中shuffle階段的作業流程,如何優化shuffle階段
  • 9、描述mapReduce中combiner的作用是什么,一般使用情景,以及和reduce的區別?
  • 10、如果沒有定義partitioner,那資料在被送達reducer前是如何被磁區的?
  • 11、MapReduce 出現單點負載多大,怎么負載平衡?
  • 12、MapReduce 怎么實作 TopN?
  • 13、Hadoop的快取機制(Distributedcache)是怎么樣的?
  • 14、mapReduce如何實作兩個表的join?
  • 15、什么樣的計算不適用mr來提速?
  • 16、更多大資料面試集錦

1、談談Hadoop序列化和反序列化及自定義bean物件實作序列化?

1)序列化和反序列化
? (1)序列化就是把記憶體中的物件,轉換成位元組序列(或其他資料傳輸協議)以便于存盤(持久化)和網路傳輸,
? (2)反序列化就是將收到位元組序列(或其他資料傳輸協議)或者是硬碟的持久化資料,轉換成記憶體中的物件,
? (3)Java的序列化是一個重量級序列化框架(Serializable),一個物件被序列化后,會附帶很多額外的資訊(各種校驗資訊,header,繼承體系等),不便于在網路中高效傳輸,所以,hadoop自己開發了一套序列化機制(Writable),精簡、高效,

2)自定義bean物件要想序列化傳輸步驟及注意事項:

(1)必須實作Writable介面
? (2)反序列化時,需要反射呼叫空參建構式,所以必須有空參構造
? (3)重寫序列化方法
? (4)重寫反序列化方法
? (5)注意反序列化的順序和序列化的順序完全一致
? (6)要想把結果顯示在檔案中,需要重寫toString(),且用"\t"分開,方便后續用
? (7)如果需要將自定義的bean放在key中傳輸,則還需要實作comparable介面,因為mapreduce框中的shuffle程序一定會對key進行排序

2、FileInputFormat切片機制

job提交流程原始碼詳解

 waitForCompletion()
? submit();
? // 1、建立連接
? ? connect();
? ? ? // 1)創建提交job的代理
? ? ? new Cluster(getConfiguration());
? ? ? ? // (1)判斷是本地yarn還是遠程
? ? ? ? initialize(jobTrackAddr, conf);
? // 2、提交job
? submitter.submitJobInternal(Job.this, cluster)
? ? // 1)創建給集群提交資料的Stag路徑
? ? Path jobStagingArea = JobSubmissionFiles.getStagingDir(cluster, conf);
? ? // 2)獲取jobid ,并創建job路徑
? ? JobID jobId = submitClient.getNewJobID();
? ? // 3)拷貝jar包到集群
? ? copyAndConfigureFiles(job, submitJobDir);
? ? rUploader.uploadFiles(job, jobSubmitDir);
? ? // 4)計算切片,生成切片規劃檔案
? ? writeSplits(job, submitJobDir);
? ? maps = writeNewSplits(job, jobSubmitDir);
? ? input.getSplits(job);
? ? // 5)向Stag路徑寫xml組態檔
? ? writeConf(conf, submitJobFile);
? ? conf.writeXml(out);
? ? // 6)提交job,回傳提交狀態
? ? status = submitClient.submitJob(jobId, submitJobDir.toString(), job.getCredentials());

3、在一個Hadoop 任務中,什么是InputSplit(切片),以及切片是用來做什么的,切片與block有什么區別?

FileInputFormat原始碼決議(input.getSplits(job))
(1)找到你資料存盤的目錄,
(2)開始遍歷處理(規劃切片)目錄下的每一個檔案,
(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)將切片資訊寫到一個切片規劃檔案中,
? f)整個切片的核心程序在getSplit()方法中完成,
? g)資料切片只是在邏輯上對輸入資料進行分片,并不會再磁盤上將其切分成分片進行存盤,InputSplit只記錄了分片的元資料資訊,比如起始位置、長度以及所在的節點串列等,
? h)注意:block是HDFS上物理上存盤的存盤的資料,切片是對資料邏輯上的劃分,
(4)提交切片規劃檔案到yarn上,yarn上的MrAppMaster就可以根據切片規劃檔案計算開啟maptask個數,

4、如何判定一個job的map和reduce的數量?

1)map數量
? splitSize=max{minSize,min{maxSize,blockSize}}
? map數量由處理的資料分成的block數量決定default_num = total_size / split_size;
2)reduce數量
? reduce的數量job.setNumReduceTasks(x);x 為reduce的數量,不設定的話默認為 1,

5、 Maptask的個數由什么決定?

一個job的map階段MapTask并行度(個數),由客戶端提交job時的切片個數決定,

6、MapTask和ReduceTask作業機制或作業原理

MapTask作業機制

(1)Read階段:Map Task通過用戶撰寫的RecordReader,從輸入InputSplit中決議出一個個key/value,
(2)Map階段:該節點主要是將決議出的key/value交給用戶撰寫map()函式處理,并產生一系列新的key/value,
(3)Collect收集階段:在用戶撰寫map()函式中,當資料處理完成后,一般會呼叫OutputCollector.collect()輸出結果,在該函式內部,它會將生成的key/value磁區(呼叫Partitioner),并寫入一個環形記憶體緩沖區中,
(4)Spill階段:即“溢寫”,當環形緩沖區滿后,MapReduce會將資料寫到本地磁盤上,生成一個臨時檔案,需要注意的是,將資料寫入本地磁盤之前,先要對資料進行一次本地排序,并在必要時對資料進行合并、壓縮等操作,
(5)Combine階段:當所有資料處理完成后,MapTask對所有臨時檔案進行一次合并,以確保最終只會生成一個資料檔案,

ReduceTask作業機制
(1)Copy階段:ReduceTask從各個MapTask上遠程拷貝一片資料,并針對某一片資料,如果其大小超過一定閾值,則寫到磁盤上,否則直接放到記憶體中,
(2)Merge階段:在遠程拷貝資料的同時,ReduceTask啟動了兩個后臺執行緒對記憶體和磁盤上的檔案進行合并,以防止記憶體使用過多或磁盤上檔案過多,
(3)Sort階段:按照MapReduce語意,用戶撰寫reduce()函式輸入資料是按key進行聚集的一組資料,為了將key相同的資料聚在一起,Hadoop采用了基于排序的策略, 由于各個MapTask已經實作對自己的處理結果進行了區域排序,因此,ReduceTask只需對所有資料進行一次歸并排序即可,
(4)Reduce階段:reduce()函式將計算結果寫到HDFS上,

7、描述mapReduce有幾種排序及排序發生的階段

1)排序的分類:
? (1)部分排序:
? ? MapReduce根據輸入記錄的鍵對資料集排序,保證輸出的每個檔案內部排序,
? (2)全排序:
? ? 如何用Hadoop產生一個全域排序的檔案?最簡單的方法是使用一個磁區,但該方法在處理大型檔案時效率極低,因為一臺機器必須處理所有輸出檔案,從而完全喪失了MapReduce所提供的并行架構,
? ? 替代方案:首先創建一系列排好序的檔案;其次,串聯這些檔案;最后,生成一個全域排序的檔案,主要思路是使用一個磁區來描述輸出的全域排序,例如:可以為待分析檔案創建3個磁區,在第一磁區中,記錄的單詞首字母a-g,第二磁區記錄單詞首字母h-n, 第三磁區記錄單詞首字母o-z,
? (3)輔助排序:(GroupingComparator分組)
? ? Mapreduce框架在記錄到達reducer之前按鍵對記錄排序,但鍵所對應的值并沒有被排序,甚至在不同的執行輪次中,這些值的排序也不固定,因為它們來自不同的map任務且這些map任務在不同輪次中完成時間各不相同,一般來說,大多數MapReduce程式會避免讓reduce函式依賴于值的排序,但是,有時也需要通過特定的方法對鍵進行排序和分組等以實作對值的排序,
? (4)二次排序:
? ? 在自定義排序程序中,如果compareTo中的判斷條件為兩個即為二次排序,
2)自定義排序WritableComparable
? bean物件實作WritableComparable介面重寫compareTo方法,就可以實作排序
? ? @Override
? ? public int compareTo(FlowBean o) {
? ? ? // 倒序排列,從大到小
? ? ? return this.sumFlow > o.getSumFlow() ? -1 : 1;
? ? }
3)排序發生的階段:
? (1)一個是在map side發生在spill后partition前,
? (2)一個是在reduce side發生在copy后 reduce前,

8、描述mapReduce中shuffle階段的作業流程,如何優化shuffle階段

磁區,排序,溢寫,拷貝到對應reduce機器上,增加combiner,壓縮溢寫的檔案,

9、描述mapReduce中combiner的作用是什么,一般使用情景,以及和reduce的區別?

1)Combiner的意義就是對每一個maptask的輸出進行區域匯總,以減小網路傳輸量,
2)Combiner能夠應用的前提是不能影響最終的業務邏輯,而且,Combiner的輸出kv應該跟reducer的輸入kv型別要對應起來,
3)Combiner和reducer的區別在于運行的位置,
? Combiner是在每一個maptask所在的節點運行;
? Reducer是接收全域所有Mapper的輸出結果,

10、如果沒有定義partitioner,那資料在被送達reducer前是如何被磁區的?

如果沒有自定義的 partitioning,則默認的 partition 演算法,即根據每一條資料的 key 的 hashcode 值摸運算(%)reduce 的數量,得到的數字就是“磁區號“,

11、MapReduce 出現單點負載多大,怎么負載平衡?

通過Partitioner實作

12、MapReduce 怎么實作 TopN?

可以自定義groupingcomparator,對結果進行最大值排序,然后再reduce輸出時,控制只輸出前n個數,就達到了topn輸出的目的,

13、Hadoop的快取機制(Distributedcache)是怎么樣的?

分布式快取一個最重要的應用就是在進行join操作的時候,如果一個表很大,另一個表很小,我們就可以將這個小表進行廣播處理,即每個計算節點上都存一份,然后進行map端的連接操作,經過我的實驗驗證,這種情況下處理效率大大高于一般的reduce端join,廣播處理就運用到了分布式快取的技術,
? DistributedCache將拷貝快取的檔案到Slave節點在任何Job在節點上執行之前,檔案在每個Job中只會被拷貝一次,快取的歸檔檔案會被在Slave節點中解壓縮,將本地檔案復制到HDFS中去,接著Client會通過addCacheFile() 和addCacheArchive()方法告訴DistributedCache在HDFS中的位置,當檔案存放到文地時,JobClient同樣獲得DistributedCache來創建符號鏈接,其形式為檔案的URI加fragment標識,當用戶需要獲得快取中所有有效檔案的串列時,JobConf 的方法 getLocalCacheFiles() 和getLocalArchives()都回傳一個指向本地檔案路徑物件陣列,

14、mapReduce如何實作兩個表的join?

1)reduce side join : 在map階段,map函式同時讀取兩個檔案File1和File2,為了區分兩種來源的key/value資料對,對每條資料打一個標簽(tag),比如:tag=0 表示來自檔案File1,tag=2 表示來自檔案File2,
? 2)map side join : Map side join 是針對以下場景進行的優化:兩個待連接表中,有一個表非常大,而另一個表非常小,以至于小表可以直接存放到記憶體中,這樣,我們可以將小表復制多份,讓每個map task 記憶體中存在一份(比如存放到hash table 中),然后只掃描大表:對于大表中的每一條記錄key/value,在hash table 中查找是否有相同的key 的記錄,如果有,則連接后輸出即可,

15、什么樣的計算不適用mr來提速?

1)資料量很小
2)特別多的小檔案
3)特別頻繁的讀的時候,索引是更好的存取機制的時候
4)需要使用事務的時候
5)只有一臺機器的時候

16、更多大資料面試集錦

  1. 大資料書籍資料分享
  2. 大資料面試題集錦

本文來自博客園,作者:張飛的豬,轉載請注明原文鏈接:https://www.cnblogs.com/the-pig-of-zf/p/17517755.html

公眾號:張飛的豬大資料分享,不定期分享大資料學習的總結和相關資料,歡迎關注,

個人網站"張飛的豬編程作業室"鏈接: https://zhangfeidezhu.com

轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/556449.html

標籤:大數據

上一篇:誰在以太坊區塊鏈上回圈交易?TuGraph+Kafka的0元流圖解決方案

下一篇:返回列表

標籤雲
其他(161957) Python(38266) JavaScript(25519) Java(18286) C(15238) 區塊鏈(8275) C#(7972) AI(7469) 爪哇(7425) MySQL(7278) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5876) 数组(5741) R(5409) Linux(5347) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4609) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2438) ASP.NET(2404) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) .NET技术(1985) HtmlCss(1982) 功能(1967) Web開發(1951) C++(1942) python-3.x(1918) 弹簧靴(1913) xml(1889) PostgreSQL(1881) .NETCore(1863) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • GPU虛擬機創建時間深度優化

    **?桔妹導讀:**GPU虛擬機實體創建速度慢是公有云面臨的普遍問題,由于通常情況下創建虛擬機屬于低頻操作而未引起業界的重視,實際生產中還是存在對GPU實體創建時間有苛刻要求的業務場景。本文將介紹滴滴云在解決該問題時的思路、方法、并展示最終的優化成果。 從公有云服務商那里購買過虛擬主機的資深用戶,一 ......

    uj5u.com 2020-09-10 06:09:13 more
  • 可編程網卡芯片在滴滴云網路的應用實踐

    **?桔妹導讀:**隨著云規模不斷擴大以及業務層面對延遲、帶寬的要求越來越高,采用DPDK 加速網路報文處理的方式在橫向縱向擴展都出現了局限性。可編程芯片成為業界熱點。本文主要講述了可編程網卡芯片在滴滴云網路中的應用實踐,遇到的問題、帶來的收益以及開源社區貢獻。 #1. 資料中心面臨的問題 隨著滴滴 ......

    uj5u.com 2020-09-10 06:10:21 more
  • 滴滴資料通道服務演進之路

    **?桔妹導讀:**滴滴資料通道引擎承載著全公司的資料同步,為下游實時和離線場景提供了必不可少的源資料。隨著任務量的不斷增加,資料通道的整體架構也隨之發生改變。本文介紹了滴滴資料通道的發展歷程,遇到的問題以及今后的規劃。 #1. 背景 資料,對于任何一家互聯網公司來說都是非常重要的資產,公司的大資料 ......

    uj5u.com 2020-09-10 06:11:05 more
  • 滴滴AI Labs斬獲國際機器翻譯大賽中譯英方向世界第三

    **桔妹導讀:**深耕人工智能領域,致力于探索AI讓出行更美好的滴滴AI Labs再次斬獲國際大獎,這次獲獎的專案是什么呢?一起來看看詳細報道吧! 近日,由國際計算語言學協會ACL(The Association for Computational Linguistics)舉辦的世界最具影響力的機器 ......

    uj5u.com 2020-09-10 06:11:29 more
  • MPP (Massively Parallel Processing)大規模并行處理

    1、什么是mpp? MPP (Massively Parallel Processing),即大規模并行處理,在資料庫非共享集群中,每個節點都有獨立的磁盤存盤系統和記憶體系統,業務資料根據資料庫模型和應用特點劃分到各個節點上,每臺資料節點通過專用網路或者商業通用網路互相連接,彼此協同計算,作為整體提供 ......

    uj5u.com 2020-09-10 06:11:41 more
  • 滴滴資料倉庫指標體系建設實踐

    **桔妹導讀:**指標體系是什么?如何使用OSM模型和AARRR模型搭建指標體系?如何統一流程、規范化、工具化管理指標體系?本文會對建設的方法論結合滴滴資料指標體系建設實踐進行解答分析。 #1. 什么是指標體系 ##1.1 指標體系定義 指標體系是將零散單點的具有相互聯系的指標,系統化的組織起來,通 ......

    uj5u.com 2020-09-10 06:12:52 more
  • 單表千萬行資料庫 LIKE 搜索優化手記

    我們經常在資料庫中使用 LIKE 運算子來完成對資料的模糊搜索,LIKE 運算子用于在 WHERE 子句中搜索列中的指定模式。 如果需要查找客戶表中所有姓氏是“張”的資料,可以使用下面的 SQL 陳述句: SELECT * FROM Customer WHERE Name LIKE '張%' 如果需要 ......

    uj5u.com 2020-09-10 06:13:25 more
  • 滴滴Ceph分布式存盤系統優化之鎖優化

    **桔妹導讀:**Ceph是國際知名的開源分布式存盤系統,在工業界和學術界都有著重要的影響。Ceph的架構和演算法設計發表在國際系統領域頂級會議OSDI、SOSP、SC等上。Ceph社區得到Red Hat、SUSE、Intel等大公司的大力支持。Ceph是國際云計算領域應用最廣泛的開源分布式存盤系統, ......

    uj5u.com 2020-09-10 06:14:51 more
  • es~通過ElasticsearchTemplate進行聚合~嵌套聚合

    之前寫過《es~通過ElasticsearchTemplate進行聚合操作》的文章,這一次主要寫一個嵌套的聚合,例如先對sex集合,再對desc聚合,最后再對age求和,共三層嵌套。 Aggregations的部分特性類似于SQL語言中的group by,avg,sum等函式,Aggregation ......

    uj5u.com 2020-09-10 06:14:59 more
  • 爬蟲日志監控 -- Elastc Stack(ELK)部署

    傻瓜式部署,只需替換IP與用戶 導讀: 現ELK四大組件分別為:Elasticsearch(核心)、logstash(處理)、filebeat(采集)、kibana(可視化) 下載均在https://www.elastic.co/cn/downloads/下tar包,各組件版本最好一致,配合fdm會 ......

    uj5u.com 2020-09-10 06:15:05 more
最新发布
  • 大資料面試題集錦-Hadoop面試題(三)-MapReduce

    > 你準備好面試了嗎?這里有一些面試中可能會問到的問題以及相對應的答案。如果你需要更多的面試經驗和面試題,關注一下"張飛的豬大資料分享"吧,公眾號會不定時的分享相關的知識和資料。 [TOC] ## 1、談談Hadoop序列化和反序列化及自定義bean物件實作序列化? 1)序列化和反序列化 (1)序列 ......

    uj5u.com 2023-07-01 08:48:31 more
  • 誰在以太坊區塊鏈上回圈交易?TuGraph+Kafka的0元流圖解決方案

    都在說資料已經成為新時代的生產資料。 但隨著大資料和人工智能等技術的發展,即便人們都知道資料的價值日益凸顯,卻無法憑借一己之力獲取和分析如此大規模的資料。 要想富,先修路。要想利用新時代的資料致富,也必須要有趁手的工具。只有合適的工具才能完成大規模資料的采集、清洗、存盤、處理和可視化等各個環節。只有 ......

    uj5u.com 2023-07-01 08:48:13 more
  • 干貨|三個維度詳解 Taier 本地除錯原理和實踐

    在平時和開發者們交流的程序中,發現許多開發朋友尤其是新入門 [Taier](https://github.com/DTStack/Taier) 的開發者,對于本地除錯都有著諸多的不理解和問題。本文就大家平時問的最多的三個問題,服務編譯,配置&本地運行,如何在 Taier 運行 [Flink-stan ......

    uj5u.com 2023-07-01 08:47:41 more
  • Spark使用Python開發和RDD

    # 使用PySpark ## 配置python環境 在所有節點上按照python3,版本必須是python3.6及以上版本 ```Shell yum install -y python3 ``` 修改所有節點的環境變數 ```Shell export JAVA_HOME=/usr/local/jdk ......

    uj5u.com 2023-06-30 08:39:37 more
  • MySQL學習2--資料查詢

    一、基礎資料查詢 select陳述句用于從表中選取資料,結果被存盤在一個結果表中(稱為結果集)。 語法:select * from 表名稱 #查詢指定表中的所有資料 *為模糊匹配所有列 例: mysql> select * from person; + + + + + + + | id | name ......

    uj5u.com 2023-06-30 08:39:32 more
  • 拈花云科基于 Apache DolphinScheduler 在文旅業態下的實踐

    ![file](https://img2023.cnblogs.com/other/2685289/202306/2685289-20230629181452343-550852462.png) 作者|云科NearFar X Lab團隊 左益、周志銀、洪守偉、陳超、武超 ## 一、導讀 無錫拈花云科 ......

    uj5u.com 2023-06-30 08:39:16 more
  • 什么是hive的高級分組聚合,它的用法和注意事項以及性能分析

    hive的高級分組聚合是指在聚合時使用GROUPING SETS、CUBE和ROLLUP的分組聚合。 高級分組聚合在很多資料庫類SQL中都有出現,并非hive獨有,這里只說明hive中的情況。 使用高級分組聚合不僅可以簡化SQL陳述句,而且通常情況下會提升SQL陳述句的性能。 ## 1.Grouping ......

    uj5u.com 2023-06-30 08:39:05 more
  • 高可用只讀,讓RDS for MySQL更穩定

    摘要:業務應用對資料庫的資料請求分寫請求(增刪改)和讀請求(查)。當存在大量讀請求時,為避免讀請求阻塞寫請求,資料庫會提供只讀實體方案。通過主實體+N只讀實體的方式,實作讀寫分離,滿足大量的資料庫讀取需求,增加應用的吞吐量。 業務應用對資料庫的資料請求分寫請求(增刪改)和讀請求(查)。當存在大量讀請 ......

    uj5u.com 2023-06-30 08:38:47 more
  • 構建數字工廠丨資料分析與圖表視圖模型的配置用法

    摘要:本期結合示例,詳細介紹華為云數字工廠平臺的資料分析模型和資料圖表視圖模型的配置用法。 本文分享自華為云社區《數字工廠深入淺出系列(六):資料分析與圖表視圖模型的配置用法》,作者:云起MAE 。 華為云數字工廠平臺基于“資料與業務一體化”理念,提供統一的制造全域資料平臺底座,內置輕量級制造資料分 ......

    uj5u.com 2023-06-30 08:38:06 more
  • 券商數字化創新場景資料中臺實踐

    時下,眾多金融機構在積極推行數字化改革,以適應時代高速革新。為回應市場對資訊即時生效的迫切需求,各家[券商機構](https://www.dtstack.com/solution/securities?src=https://www.cnblogs.com/DTinsight/archive/2023/06/29/szsm)都需要更具競爭力的資訊服務。 本次方案結合券商場景與業務實踐,圍繞客戶實際面臨的 ......

    uj5u.com 2023-06-30 08:37:39 more