Hadoop面試題之MapReduce

banq發表於2021-12-23

什麼是MapReduce?

它是一種框架或程式設計模型,用於使用分散式程式設計在計算機叢集上處理大型資料集。

什麼是“Map”和“Reduce”?

“Maps”和“Reduces”是在 HDFS 中解決查詢的兩個階段。'Map'負責從輸入位置讀取資料,並根據輸入型別生成一個鍵值對,即本地機器的中間輸出。'Reducer'負責處理從輸入位置接收到的中間輸出對映器並生成最終輸出。

Map對映器的四個基本引數是什麼?

對映器的四個基本引數是 LongWritable、text、text 和 IntWritable。前兩個代表輸入引數,後兩個代表中間輸出引數。

 

Reducer的四個基本引數是什麼?

一個reducer的四個基本引數是Text、IntWritable、Text、IntWritable,前兩個代表中間輸出引數,後兩個代表最終輸出引數。

 

Master和輸出類是做什麼的?

Master 被定義為更新 Master 或作業跟蹤器,輸出類被定義為將資料寫入輸出位置。

 

預設情況下 MapReduce 中的輸入型別/格式是什麼?

預設情況下,MapReduce 中的型別輸入型別是“文字”。

 

是否必須在 MapReduce 中設定輸入和輸出型別/格式?

不,在 MapReduce 中設定輸入和輸出型別/格式不是強制性的。預設情況下,叢集將輸入和輸出型別作為“文字”。

 

文字輸入格式有什麼作用?

在文字輸入格式中,每一行都會建立一個行物件,即一個十六進位制數。鍵被認為是一個行物件,值被認為是一個整行文字。這就是對映器處理資料的方式。對映器將接收作為“LongWritable”引數的“鍵”和作為“文字”引數的值。

 

工作 conf 類有什麼作用?

MapReduce 需要在邏輯上分離執行在同一叢集上的不同作業。“Job conf class”有助於進行工作級別設定,例如在真實環境中宣告工作。建議作業名稱應具有描述性並代表正在執行的作業型別。

 

conf.setMapper 類有什麼作用?

Conf.setMapperclass 設定對映器類和所有與對映作業相關的東西,例如讀取資料並從對映器中生成鍵值對。

 

排序和洗牌有什麼作用?

排序和改組負責建立唯一鍵和值列表。在一個位置製作相似鍵稱為排序。對映器的中間輸出被排序併傳送到reducer的過程稱為混洗。

 

 拆分有什麼作用?

在將資料從硬碟位置傳輸到對映方法之前,有一個稱為“拆分方法”的階段或方法。Split 方法將一塊資料從 HDFS 拉到框架中。Split 類不寫任何東西,而是從塊中讀取資料並將其傳遞給對映器。預設情況下,Split 由框架處理。拆分方法等於塊大小,用於將塊劃分為一堆拆分。

 

如果我們的商品硬體儲存空間較少,我們如何更改拆分大小?

如果我們的商品硬體儲存空間較少,我們可以通過編寫“自定義拆分器”來更改拆分大小。Hadoop 中有一個自定義特性,可以從 main 方法中呼叫。

 

MapReduce 分割槽器有什麼作用?

MapReduce 分割槽器確保單個鍵的所有值都進入同一個reducer,從而允許在reducer上均勻分佈地圖輸出。它通過確定哪個reducer負責特定鍵來將對映器輸出重定向到reducer。

 

如何為Hadoop的其他資料處理工具有什麼不同?

在 Hadoop 中,您可以根據需要增加或減少對映器的數量,而不必擔心要處理的資料量。與可用的其他資料處理工具相比,這是並行處理的美妙之處。

 

我們可以重新命名輸出檔案嗎?

是的,我們可以通過實現多格式輸出類來重新命名輸出檔案。

 

為什麼我們不能在對映器中進行聚合(加法)?為什麼我們需要reducer

我們不能在對映器中進行聚合(加法),因為排序不是在對映器中完成的。排序只發生在reducer端。Mapper 方法初始化取決於每個輸入拆分。在進行聚合時,我們將丟失前一個例項的值。對於每一行,一個新的對映器將被初始化。對於每一行, inputsplit 再次被劃分到對映器中,因此我們沒有對前一行值的跟蹤。

 

什麼是流媒體Streaming?

Streaming 是 Hadoop 框架的一個特性,它允許我們使用 MapReduce 以任何可以接受標準輸入並可以產生標準輸出的程式語言進行程式設計。它可以是 Perl、Python、Ruby,不一定是 Java。但是,MapReduce 中的自定義只能使用 Java 完成,而不能使用任何其他程式語言。

 

什麼是合路器?

'Combiner' 是一個執行本地 reduce 任務的小型 reducer。它從特定節點上的對映器接收輸入,並將輸出傳送到reducer。組合器通過減少需要傳送到化簡器的資料量來幫助提高 MapReduce 的效率。

 

HDFS 塊和輸入拆分有什麼區別?

HDFS Block 是資料的物理分割,Input Split 是資料的邏輯分割。

 

在 TextInputFormat 中會發生什麼?

在 TextInputFormat 中,文字檔案中的每一行都是一條記錄。鍵是行的位元組偏移量,值是行的內容。

例如,鍵:LongWritable,值:文字。

 

您對 KeyValueTextInputFormat 瞭解多少?

在 KeyValueTextInputFormat 中,文字檔案中的每一行都是一個“記錄”。第一個分隔符分隔每一行。分隔符之前的所有內容都是鍵,分隔符之後的所有內容都是值。

例如,鍵:文字,值:文字。

 

你對 SequenceFileInputFormat 瞭解多少?

SequenceFileInputFormat 是一種用於讀取序列檔案的輸入格式。鍵和值是使用者定義的。它是一種特定的壓縮二進位制檔案格式,經過優化,可將資料在一個 MapReduce 作業的輸出和其他 MapReduce 作業的輸入之間傳遞。

 

您對 NLineOutputFormat 瞭解多少?

NLineOutputFormat 將 'n' 行輸入拆分為一個拆分。

 

Hadoop 中的 JobTracker 是什麼?在 Hadoop 叢集上執行多少個 JobTracker 例項?

JobTracker 是用於在 Hadoop 中提交和跟蹤 MapReduce 作業的守護程式服務。在任何 hadoop 叢集上只執行一個作業跟蹤器程式。作業跟蹤器在其自己的 JVM 程式上執行。在典型的生產叢集中,它在單獨的機器上執行。每個從節點都配置有作業跟蹤器節點位置。JobTracker 是 Hadoop MapReduce 服務的單點故障。如果它出現故障,則所有正在執行的作業都將停止。Hadoop 中的 JobTracker 執行以下操作(來自 Hadoop Wiki:)

客戶端應用程式將作業提交給作業跟蹤器。

JobTracker 與 NameNode 對話以確定資料的位置

JobTracker 定位具有可用插槽的 TaskTracker 節點在資料處或附近

JobTracker 將工作提交給選定的 TaskTracker 節點。

TaskTracker 節點受到監控。如果他們沒有足夠頻繁地提交心跳訊號,他們將被視為失敗並且工作被安排在不同的 TaskTracker 上。

TaskTracker 會在任務失敗時通知 JobTracker。JobTracker 然後決定做什麼:它可能會在別處重新提交作業,可能會將特定記錄標記為要避免的內容,甚至可能會將 TaskTracker 列入不可靠的黑名單。

當工作完成時,JobTracker 更新其狀態。

客戶端應用程式可以輪詢 JobTracker 以獲取資訊。

 

JobTracker 如何安排任務?

TaskTracker 通常每隔幾分鐘向 JobTracker 傳送心跳訊息,以確保 JobTracker 仍然活著。這些訊息還通知 JobTracker 可用槽的數量,因此 JobTracker 可以隨時瞭解叢集中可以委派工作的位置。當 JobTracker 試圖在 MapReduce 操作中尋找某個地方來安排任務時,它首先在託管包含資料的 DataNode 的同一臺伺服器上尋找一個空槽,如果沒有,它在機器上尋找一個空槽同一個機架。

 

什麼是 Hadoop 中的任務跟蹤器?有多少 TaskTracker 例項在 Hadoop 叢集上執行

TaskTracker 是叢集中的一個從節點守護程式,它接受來自 JobTracker 的任務(Map、Reduce 和 Shuffle 操作)。在任何 hadoop 從節點上只執行一個 Task Tracker 程式。任務跟蹤器在其自己的 JVM 程式上執行。每個 TaskTracker 都配置了一組槽,這些槽表示它可以接受的任務數量。TaskTracker 啟動一個單獨的 JVM 程式來執行實際工作(稱為 Task Instance),這是為了確保程式失敗不會關閉任務跟蹤器。TaskTracker 監視這些任務例項,捕獲輸出和退出程式碼。當 Task 例項完成時,無論成功與否,任務跟蹤器都會通知 JobTracker。TaskTracker 還會向 JobTracker 傳送心跳訊息,通常每隔幾分鐘,以向 JobTracker 保證它仍然活著。

 

什麼是 Hadoop 中的 Task 例項?它在哪裡執行?

任務例項是在每個從節點上執行的實際 MapReduce 作業。TaskTracker 啟動一個單獨的 JVM 程式來執行實際工作(稱為 Task Instance),這是為了確保程式失敗不會關閉任務跟蹤器。每個任務例項都在自己的 JVM 程式上執行。一個從節點上可以執行多個任務例項程式。這是基於任務跟蹤器上配置的槽數。預設情況下,會為任務生成一個新的任務例項 JVM 程式。

 

一個 Hadoop 系統上執行多少個守護程式?

Hadoop 由五個獨立的守護程式組成。這些守護程式中的每一個都在自己的 JVM 中執行。以下 3 個守護程式在主節點 NameNode 上執行——該守護程式儲存和維護 HDFS 的後設資料。輔助 NameNode – 為 NameNode 執行內務管理功能。JobTracker – 管理 MapReduce 作業,將單個任務分發到執行 Task Tracker 的機器。以下 2 個守護程式在每個 Slave 節點上執行 DataNode – 儲存實際的 HDFS 資料塊。TaskTracker – 負責例項化和監控單個 Map 和 Reduce 任務。

 

Hadoop叢集上典型的slave節點的配置是什麼?一個從節點上執行了多少個 JVM?

Task Tracker 的單個例項在每個 Slave 節點上執行。任務跟蹤器作為單獨的 JVM 程式執行。

DataNode 守護程式的單個例項在每個從節點上執行。DataNode 守護程式作為單獨的 JVM 程式執行。

在每個從節點上執行一個或多個 Task Instance 例項。每個任務例項都作為單獨的 JVM 程式執行。可以通過配置控制 Task 例項的數量。通常,高階機器被配置為執行更多的任務例項。 

 

HDFS 和 NAS 有什麼區別?

Hadoop 分散式檔案系統 (HDFS) 是一種分散式檔案系統,旨在執行在商品硬體上。它與現有的分散式檔案系統有很多相似之處。但是,與其他分散式檔案系統的區別是顯著的。以下是 HDFS 和 NAS 之間的差異

在 HDFS 中,資料塊分佈在叢集中所有機器的本地驅動器上。而在 NAS 中,資料儲存在專用硬體上。

HDFS 旨在與 MapReduce 系統一起使用,因為計算已轉移到資料上。NAS 不適合 MapReduce,因為資料與計算分開儲存。

HDFS 在一組機器上執行,並使用複製協議提供冗餘。而 NAS 由單臺機器提供,因此不提供資料冗餘。

 

NameNode 如何處理資料節點故障?

NameNode 會定期從叢集中的每個 DataNode 接收 Heartbeat 和 Blockreport。收到心跳意味著 DataNode 執行正常。Blockreport 包含 DataNode 上所有塊的列表。當 NameNode 注意到在一定時間後沒有收到資料節點的心跳訊息時,該資料節點被標記為死亡。由於塊將被複制不足,系統開始複製儲存在死資料節點上的塊。NameNode 協調資料塊從一個資料節點到另一個資料節點的複製。複製資料傳輸直接發生在資料節點之間,並且資料永遠不會通過名稱節點。

MapReduce 程式設計模型是否為 reducer 提供了一種相互通訊的方式?在 MapReduce 作業中,reducer 可以與另一個 reducer 通訊嗎?

不,MapReduce 程式設計模型不允許reducer相互通訊。reducer是孤立執行的。

 

我可以將reducer的數量設定為零嗎?

是的,將reducer的數量設定為零是 Hadoop 中的有效配置。當您將 reducer 設定為零時,將不會執行任何 reducer,並且每個對映器的輸出將儲存到 HDFS 上的一個單獨檔案中。[這與reducer設定為大於零的數字並且Mappers輸出(中間資料)寫入每個mappter從節點的本地檔案系統(不是HDFS)的情況不同。]

 

對映器輸出(中間值資料)儲存在哪裡?

對映器輸出(中間資料)儲存在每個單獨對映器節點的本地檔案系統(非 HDFS)上。這通常是一個臨時目錄位置,可以由 hadoop 管理員在配置中設定。Hadoop 作業完成後會清理中間資料。

 

什麼是合路器?我什麼時候應該在我的 MapReduce 作業中使用組合器?

組合器用於提高 MapReduce 程式的效率。它們用於在單個對映器輸出上本地聚合中間對映輸出。組合器可以幫助您減少需要傳輸到reducer的資料量。如果執行的操作是可交換和關聯的,您可以將您的 reducer 程式碼用作組合器。不保證組合器的執行,Hadoop 可能會也可能不會執行組合器。此外,如果需要,它可以執行超過 1 次。因此,您的 MapReduce 作業不應依賴於組合器的執行。

 

什麼是 Writable & WritableComparable 介面?

org.apache.hadoop.io.Writable 是一個 Java 介面。Hadoop Map-Reduce 框架中的任何鍵或值型別都實現了這個介面。實現通常實現一個靜態 read(DataInput) 方法,該方法構造一個新例項,呼叫 readFields(DataInput) 並返回該例項。

org.apache.hadoop.io.WritableComparable 是一個 Java 介面。任何在 Hadoop Map-Reduce 框架中用作鍵的型別都應該實現這個介面。WritableComparable 物件可以使用 Comparator 相互比較。

 

什麼是鍵和值類的 Hadoop MapReduce API 契約?

Key 必須實現 org.apache.hadoop.io.WritableComparable 介面。

該值必須實現 org.apache.hadoop.io.Writable 介面。

 

MapReduce 中的 IdentityMapper 和 IdentityReducer 是什麼?

org.apache.hadoop.mapred.lib.IdentityMapper 實現身份函式,將輸入直接對映到輸出。如果 MapReduce 程式設計師沒有使用 JobConf.setMapperClass 設定 Mapper 類,則使用 IdentityMapper.class 作為預設值。

org.apache.hadoop.mapred.lib.IdentityReducer 不執行歸約,將所有輸入值直接寫入輸出。如果 MapReduce 程式設計師沒有使用 JobConf.setReducerClass 設定 Reducer 類,則使用 IdentityReducer.class 作為預設值。

 

Hadoop中推測執行的含義是什麼?它為什麼如此重要?

推測執行是一種應對單個機器效能的方式。在涉及數百或數千臺機器的大型叢集中,可能有些機器的效能不如其他機器快。由於只有一臺機器效能不佳,這可能會導致整個作業的延遲。為了避免這種情況,hadoop 中的推測執行可以在不同的從節點上執行相同 map 或 reduce 任務的多個副本。使用從第一個節點到完成的結果。

 

什麼時候在 MapReduce 作業中啟動reducer

在 MapReduce 作業中,reducers 在所有 Map 作業完成之前不會開始執行 reduce 方法。一旦對映器可用,Reducer 就開始從對映器複製中間鍵值對。程式設計師定義的 reduce 方法只有在所有對映器都完成後才會被呼叫。

如果在所有對映器完成之前reducer沒有啟動,那麼為什麼 MapReduce 作業的進度會顯示類似於 Map(50%) Reduce(10%) 的內容?為什麼在對映器尚未完成時顯示減速器進度百分比?

一旦對映器可用,Reducer 就開始從對映器複製中間鍵值對。進度計算還考慮了由reduce 程式完成的資料傳輸處理,因此只要對映器的任何中間鍵值對可用於傳輸到reducer,reduce 進度就會開始顯示。儘管reducer 進度仍然更新,但程式設計師定義的reduce 方法僅在所有對映器完成後才被呼叫。

 

什麼是 HDFS?它與傳統檔案系統有何不同?

HDFS,即Hadoop分散式檔案系統,負責在叢集上儲存海量資料。這是一個分散式檔案系統,旨在在商品硬體上執行。它與現有的分散式檔案系統有很多相似之處。但是,與其他分散式檔案系統的區別是顯著的。

HDFS 具有高度容錯性,旨在部署在低成本硬體上。

HDFS 提供對應用程式資料的高吞吐量訪問,適用於具有大量資料集的應用程式。

HDFS 旨在支援非常大的檔案。與 HDFS 相容的應用程式是那些處理大型資料集的應用程式。這些應用程式只寫入一次資料,但讀取一次或多次,並要求以流速度滿足這些讀取。HDFS 支援檔案的一次寫入多次讀取語義。

 

什麼是 HDFS 塊大小?它與傳統檔案系統塊大小有何不同?

在 HDFS 中,資料被分成塊並分佈在叢集中的多個節點上。每個塊的大小通常為 64Mb 或 128Mb。每個塊都被複制多次。預設是將每個塊複製 3 次。副本儲存在不同的節點上。HDFS 利用本地檔案系統將每個 HDFS 塊儲存為單獨的檔案。HDFS 塊大小無法與傳統檔案系統塊大小相比。

 

什麼是 NameNode?一個 Hadoop 叢集上執行了多少 NameNode 例項?

NameNode 是 HDFS 檔案系統的核心。它儲存檔案系統中所有檔案的目錄樹,並跟蹤檔案資料在叢集中的儲存位置。它本身不儲存這些檔案的資料。在任何 hadoop 叢集上只執行一個 NameNode 程式。NameNode 執行在它自己的 JVM 程式上。在典型的生產叢集中,它在單獨的機器上執行。NameNode 是 HDFS 叢集的單點故障。當 NameNode 當機時,檔案系統會離線。每當客戶端應用程式希望定位檔案,或者希望新增/複製/移動/刪除檔案時,它們都會與 NameNode 通訊。NameNode 通過返回資料所在的相關 DataNode 伺服器列表來響應成功的請求。

 

什麼是資料節點?一個 Hadoop 叢集上執行了多少個 DataNode 例項?

DataNode 將資料儲存在 Hadoop 檔案系統 HDFS 中。在任何 hadoop 從節點上只執行一個 DataNode 程式。DataNode 執行在它自己的 JVM 程式上。啟動時,DataNode 連線到 NameNode。DataNode 例項可以相互通訊,這主要是在複製資料期間。

 

客戶端如何與 HDFS 通訊?

客戶端與 HDFS 的通訊使用 Hadoop HDFS API。每當客戶端應用程式希望定位檔案,或者當他們想要在 HDFS 上新增/複製/移動/刪除檔案時,它們都會與 NameNode 通訊。NameNode 通過返回資料所在的相關 DataNode 伺服器列表來響應成功的請求。一旦 NameNode 提供了資料的位置,客戶端應用程式就可以直接與 DataNode 對話。

 

如何複製 HDFS 塊?

HDFS 旨在可靠地跨大型叢集中的機器儲存非常大的檔案。它將每個檔案儲存為一個塊序列;檔案中除最後一個塊外的所有塊的大小都相同。複製檔案的塊以實現容錯。每個檔案的塊大小和複製因子是可配置的。應用程式可以指定檔案的副本數。複製因子可以在檔案建立時指定,以後可以更改。HDFS 中的檔案是一次寫入的,並且在任何時候都只有一個寫入器。NameNode 做出有關塊複製的所有決定。HDFS 使用機架感知副本放置策略。在預設配置中,HDFS 上的資料塊共有 3 個副本,2 個副本儲存在同一機架上的資料節點上,第三個副本儲存在不同機架上。

相關文章