1. 程式人生 > >大資料面試題(每天更新,4月2已更新完畢)

大資料面試題(每天更新,4月2已更新完畢)

面試題圖片較大,載入需要時間,請耐心等待.......

image.png

1521629833622099005.png

image.png

image.png

image.png

image.png

image.png

image.png

image.png

image.png

image.png

image.png

image.png

image.pngimage.png

image.png

image.png

image.png

image.png

image.png

1.在Hadoop中定義的主要公用InputFormat中,預設是哪一個?(A)

A、 TextInputFormat

B、 KeyValueInputFormat

C、 SequenceFileInputFormat

2. 下面哪個程式負責 HDFS 資料儲存?(C) 

A.NameNode

B.JobTracker

C.DataNode

D.SecondaryNameNode

E.tasktracker

3.HDFS 中的 block 預設儲存幾份?(A) 

A.3 份

B.2 份

C.1 份

D.不確定

4.關於 SecondaryNameNode 哪項是正確的?(C) 

A.它是 NameNode 的熱備

B.它是記憶體沒有要求

C.他的目的使幫助 NameNode 合併編輯日誌,減少 NameNode 啟動時間

D. SecondaryNameNode 應與 NameNode 部署到一個節點

5.Hadoop 2.x 中HDFS 預設 BlockSize 是(C) 

A.32MB

B.64MB

C.128MB

6.下列哪項可以作為叢集的管理(ABC) 

A.Puppet

B.Pdsh

C.ClouderaManager

D.Zookeeper

7.Client 端上傳檔案的時候下列哪項正確?(BC) 

A.資料經過 NameNode 傳遞 DataNode

B.Client 端將檔案切分為 Block,依次上傳

C.Client 只上傳資料到一臺 DataNode,然後由 NameNode 負責 Block 複製工作

8.下列哪個是 Hadoop 執行的模式?(ABC) 

A.單機版

B.偽分散式

C.分散式

9.列舉幾個hadoop生態圈的元件並做簡要描述 

Zookeeper:是一個開源的分散式應用程式協調服務,基於zookeeper可以實現同步服務,配置維護,命名服務。

Flume:一個高可用的,高可靠的,分散式的海量日誌採集、聚合和傳輸的系統。

Hbase:是一個分散式的、面向列的開源資料庫, 利用Hadoop HDFS作為其儲存系統.

Hive:基於Hadoop的一個數據倉庫工具,可以將結構化的資料檔對映為一張資料庫表,並提供簡單的sql 查詢功能,可以將sql語句轉換為MapReduce任務進行執行。

Sqoop:將一個關係型資料庫中的資料導進到Hadoop的 HDFS中,也可以將HDFS的資料導進到關係型資料庫中。

10. hadoop 節點動態上線下線怎麼操作? 

節點上線操作:

當要新上線資料節點的時候,需要把資料節點的名字追加在 dfs.hosts 檔案中

一,關閉新增節點的防火牆

二,在 NameNode 節點的 hosts 檔案中加入新增資料節點的 hostname

三,在每個新增資料節點的 hosts 檔案中加入 NameNode 的 hostname

四,在 NameNode 節點上增加新增節點的 SSH 免密碼登入的操作

五,在 NameNode 節點上的 dfs.hosts 中追加上新增節點的 hostname,

六,在其他節點上執行重新整理操作:hdfs dfsadmin -refreshNodes

七,在 NameNode 節點上,更改 slaves 檔案,將要上線的資料節點 hostname 追加到 slaves 檔案中

八,啟動 DataNode 節點

九,檢視 NameNode 的監控頁面看是否有新增加的節點

節點下線操作:

一,修改/conf/hdfs-site.xml 檔案

二,確定需要下線的機器,dfs.osts.exclude 檔案中配置好需要下架的機器,這個是阻止下架的機器去連線 NameNode

三,配置完成之後進行配置的重新整理操作./bin/hadoop dfsadmin -refreshNodes,這個操作的作用是在後臺進行 block 塊的移動

四,當執行三的命令完成之後,需要下架的機器就可以關閉了,可以檢視現在叢集上連線的節點,正在執行 Decommission,會顯示:

Decommission Status : Decommission in progress 執行完畢後,會顯示:

Decommission Status : Decommissioned

五,機器下線完畢,將他們從 excludes 檔案中移除。

11.如何使用mapReduce實現兩個表的join?

reduce side join : 在map 階段,map 函式同時讀取兩個檔案File1 和File2,為了區分

兩種來源的key/value 資料對,對每條資料打一個標籤(tag),比如:tag=0 表示來自檔案File1,

tag=2 表示來自檔案File2。

map side join : Map side join 是針對以下場景進行的優化:兩個待連線表中,有一個表非常大,而另一個表非常小,以至於小表可以直接存放到記憶體中。這樣,我們可以將小表複製多份,讓每個map task 記憶體中存在一份(比如存放到hash table 中),然後只掃描大表:對於大表中的每一條記錄key/value,在hash table 中查詢是否有相同的key 的記錄,如果有,

則連線後輸出即可。

Semi Join : Semi Join,也叫半連線,是從分散式資料庫中借鑑過來的方法。它的產生動機是:對於reduce side join,跨機器的資料傳輸量非常大,這成了join 操作的一個瓶頸,

如果能夠在map 端過濾掉不會參加join 操作的資料,則可以大大節省網路IO。

reduce side join + BloomFilter : BloomFilter 最常見的作用是:判斷某個元素是否在一個集合裡面。它最重要的兩個方法是:add() 和contains()。最大的特點是不會存在 falsenegative,即:如果contains()返回false,則該元素一定不在集合中,但會存在一定的 falsepositive,即:如果contains()返回true,則該元素一定可能在集合中。

12.Hadoop的sequencefile的格式,並說明下什麼是java序列化,如何實現java序列化?

SequenceFile檔案是Hadoop用來儲存二進位制形式的key-value 對而設計的一種平面檔案;

Hadoop 的HDFS 和MapReduce子框架主要是針對大資料檔案來設計的,在小檔案的處理上不但效率低下,而且十分消耗磁碟空間(每一個小檔案佔用一個Block,2.X HDFS 預設block大小為128M)。

解決辦法通常是選擇一個容器,將這些小檔案組織起來統一儲存。HDFS提供了兩種型別的容器,分別是SequenceFile和MapFile。

SequenceFile的每條記錄是可序列化的字元陣列。

序列化是指將結構化的物件轉化為位元組流以便在網路上傳輸或寫入到磁碟進行永久存 儲的過程,反序列化是指將位元組流轉回結構化物件的過程.

13. 請描述mapReduce二次排序原理

二次排序:就是首先按照第一欄位排序,然後再對第一欄位相同的行按照第二欄位排序,注意不能破壞第一次排序的結果。

在Hadoop中,預設情況下是按照key進行排序。對於同一個key,reduce函式接收到的value list是按照value 排序的。

有兩種方法進行二次排序,分別為:buffer and in memory sort和value-to-key conversion。

對於buffer and in memory sort,主要思想是:在reduce()函式中,將某個key對應的所有value儲存下來,然後進行排序。 這種方法最大的缺點是:可能會造成 out of memory。

對於value-to-key conversion,主要思想是:將key和部分value拼接成一個組合key(實現WritableComparable介面或者呼叫setSortComparatorClass函式),這樣reduce獲取的結果便是先按key排序,後按value排序的結果,需要注意的是,使用者需要自己實現Paritioner,以便只按照key進行資料劃分。Hadoop顯式的支援二次排序,在Configuration 類中有個 setGroupingComparatorClass()方法,可用於設定排序 group的 key 值。

14 請描述mapReduce中排序發生的幾個階段

一個是在map side發生在spill後partition前。

一個是在reduce side發生在copy後 reduce前。

mapReduce的四個階段:

Splitting :在進行map 計算之前,mapreduce 會根據輸入檔案計算輸入分片(inputsplit),每個輸入分片(input split)針對一個map 任務。輸入分片(input split)儲存的並非資料本身,而是一個分片長度和一個記錄資料位置的陣列,輸入分片(input split)往往和hdfs 的block(塊)關係很密切,假如我們設定hdfs 的塊的大小是64mb,如果我們輸入有三個檔案,大小分別是3mb、65mb 和127mb,那麼mapreduce 會把3mb 檔案分為一個輸入分片(input split),65mb 則是兩個輸入分片(input split)而127mb 也是兩個輸入分片(input split),換句話說我們如果在map 計算前做輸入分片調整,例如合併小檔案,那麼就會有5 個map 任務將執行,而且每個map 執行的資料大小不均,這個也是mapreduce 優化計算的一個關鍵點。

Mapping:就是程式設計師編寫好的map 函數了,因此map 函式效率相對好控制,而且一般map 操作都是本地化操作也就是在資料儲存節點上進行;

Shuffle:描述著資料從map task 輸出到reduce task 輸入的這段過程。

Reduce:對Map階段多個檔案的資料進行合併。

15 請描述mapReduce 中combiner 的作用是什麼,一般使用情景,哪些情況不需要? 

在MR作業中的Map階段會輸出結果資料到磁碟中。

Combiner只應該適用於那種Reduce的輸入(key:value與輸出(key:value)型別完全一致,且不影響最終結果的場景。比如累加,最大值等,也可以用於過濾資料,在 map端將無效的資料過濾掉。

在這些需求場景下,輸出的資料是可以根據key值來作合併的,合併的目的是減少輸出的資料量,減少IO的讀寫,減少網路傳輸,以提高MR的作業效率。

1.combiner的作用就是在map端對輸出先做一次合併,以減少傳輸到reducer的資料量.

2.combiner最基本是實現本地key的歸併,具有類似本地reduce,那麼所有的結果都是reduce完成,效率會相對降低。

3.使用combiner,先完成的map會在本地聚合,提升速度.

16. 簡述Hadoop的幾個預設埠及其含義 

dfs.namenode.http-address:50070

dfs.datanode.address:50010

fs.defaultFS:8020

yarn.resourcemanager.webapp.address:8088

17.兩個類TextInputFormat和KeyValueInputFormat的區別是什麼?

相同點:

TextInputformat和KeyValueTextInputFormat都繼承了FileInputFormat類,都是每一行作為一個記錄;

區別:

TextInputformat將每一行在檔案中的起始偏移量作為 key,每一行的內容作為value。預設以\n或回車鍵作為一行記錄。

KeyValueTextInputFormat 適合處理輸入資料的每一行是兩列,並用 tab 分離的形式。

18.在一個執行的 Hadoop 任務中,什麼是 InputSplit? 

在執行 mapreduce 之前,原始資料被分割成若干個 split,每個 split 作為一個 map

任務的輸入,在 map 執行過程中 split 會被分解成一個個記錄(key-value 對)。

19.如果沒有定義 partitioner,那資料在被送達 reducer 前是如何被分割槽的? 

如果沒有自定義的 partitioning,則預設的 partition 演算法,即根據每一條資料的 key

的 hashcode 值摸運算(%)reduce 的數量,得到的數字就是“分割槽號“。

20.Map 階段結束後, Hadoop 框架會處理: Partitioning,Shuffle 和 Sort,在這個階段都發生了什麼? 

map task上的洗牌(shuffle)結束,此時 reducer task 上的洗牌開始,抓取 fetch 所屬於自己分割槽的資料,

同時將這些分割槽的資料進行排序sort(預設的排序是根據每一條資料的鍵的字典排序),進而將資料進行合併merge,

即根據key相同的,將其 value 組成一個集合,最後輸出結果。

21.請列出你所知道的Hadoop排程器,並簡要說明其工作方法。 

(1)預設的排程器 FIFO

Hadoop中預設的排程器,它先按照作業的優先順序高低,再按照到達時間的先後選擇被執行的作業。

(2)計算能力排程器 Capacity Scheduler

支援多個佇列,每個佇列可配置一定的資源量,每個佇列採用FIFO排程策略,為了防止同一個使用者的作業獨佔佇列中的資源,該排程器會對同一使用者提交的作業所佔資源量進行限定。排程時,首先按以下策略選擇一個合適佇列:計算每個佇列中正在執行的任務數與其應該分得的計算資源之間的比值,選擇一個該比值最小的佇列;然後按以下策略選擇該佇列中一個作業:按照作業優先順序和提交時間順序選擇,同時考慮使用者資源量限制和記憶體限制。

(3)公平排程器 Fair Scheduler

同計算能力排程器類似,支援多佇列多使用者,每個佇列中的資源量可以配置,同一佇列中的作業公平共享佇列中所有資源。實際上, Hadoop的排程器遠不止以上三種,最近,出現了很多針對新型應用的Hadoop排程器。

(4)適用於異構叢集的排程器LATE

現有的 Hadoop 排程器都是建立在同構叢集的假設前提下,具體假設如下:

1)叢集中各個節點的效能完全一樣

2)對於 reduce task,它的三個階段:copy、 sort 和 reduce,用時各佔 1/3

3)同一 job 的同類型的 task 是一批一批完成的,他們用時基本一樣。

現有的Hadoop排程器存在較大缺陷,主要體現在探測落後任務的演算法上:如果一個task 的進度落後於同類型 task進度的20%,則把該task當做落後任務(這種任務決定了job的完成時間,需儘量縮短它的執行時間),從而為它啟動一個備份任務(speculative task)。

如果叢集異構的,對於同一個task,即使是在相同節點上的執行時間也會有較大差別,因而在異構叢集中很容易產生大量的備份任務。

LATE排程器從某種程度上解決了現有排程器的問題,它定義三個閾值 :

SpeculativeCap,系統中最大同時執行的speculative task 數目(作者推薦值為總slot數的10%); SlowNodeThreshold(作者推薦值為25%):得分(分數計算方法見論文)低於該閾值的node(快節點)上不會啟動 speculative task;SlowTaskThreshold(作者推薦值為 25%):當 task 進度低於同批同類 task 的平均進度的 SlowTaskThreshold 時,會為該 task 啟動 speculative task。它的排程策略是:當一個節點出現空閒資源且系統中總的備份任務數小 於 SpeculativeCap 時, a.如果該節點是慢節點(節點得分高 於SlowNodeThreshold),則忽略這個請求。 b.對當前正在執行的 task 按估算的剩餘完成時間排序 c.選擇剩餘完成時間最大且進度低於 SlowTaskThreshold 的 task,為該 task 啟動備份任務。

(5)適用於實時作業的排程器Deadline Scheduler和Constraint-based Scheduler

這種排程器主要用於有時間限制的作業(Deadline Job),即給作業一個deadline時間,讓它在該時間內完成。實際上,這類排程器分為兩種,軟實時(允許作業有一定的超時)作業排程器和硬實時(作業必須嚴格按時完成)作業排程器。

Deadline Scheduler 主要針對的是軟實時作業,該排程器根據作業的執行進度和剩餘時間動態調整作業獲得的資源量,以便作業儘可能的在 deadline 時間內完成。

Constraint-based Scheduler 主要針對的是硬實時作業,該排程器根據作業的deadline和當前系統中的實時作業執行情況,預測新提交的實時作 業能不能在 deadline時間內完成,如果不能,則將作業反饋給使用者,讓他重調整作業的 deadline。

22.程式設計題MR作業設計: 有兩種格式的海量日誌檔案存放於hdfs上,可以通過檔名字首區分,其中登入日誌格式:

user,ip,time,oper(列舉值:1 為上線, 2 位下線 );

訪問日誌格式:ip,time,url,假設登入日誌中user上下線資訊完整,且同一上下線時間段內使用的ip唯一,要計算訪問日誌中獨立 user 數量最多的前 10個url,請給出MapReduce設計思路,如需要幾個MapReduce,及每個 MapReduce 演算法虛擬碼。

思路:

將 userid ,ip ,url 封裝成一個物件,map 類輸入資料,按照 userid 為 key 輸出,value

為 1(intwritable),按照 reduce 計算寫一個排序類然後按照 value 降序輸出前十個

23.一個 mr 作業跑的比較慢,如何來優化。至少給出 6 個方案。 

mr跑的慢可能有很多原因,如:資料傾斜、map和reduce數設定不合理、reduce等待過久、小檔案過多、spill 次數過多、 merge 次數過多等。

1、解決資料傾斜:資料傾斜可能是partition不合理,導致部分partition中的資料過多,部分過少。可通過分析資料,自定義分割槽器解決。

2、合理設定map和reduce數:兩個都不能設定太少,也不能設定太多。太少,會導致task等待,延長處理時間;太多,會導致 map、 reduce 任務間競爭資源,造成處理超時等錯誤。

3、設定map、reduce共存:調整slowstart.completedmaps引數,使map執行到一定程度後,reduce也開始執行,減少 reduce 的等待時間。

4、合併小檔案:在執行mr任務前將小檔案進行合併,大量的小檔案會產生大量的map任務,增大map任務裝載次數,而任務的裝載比較耗時,從而導致 mr 執行較慢。

5、減少spill次數:通過調整io.sort.mb及sort.spill.percent引數值,增大觸發spill的記憶體上限,減少spill 次數,從而減少磁碟 IO。

6、減少merge次數:通過調整io.sort.factor引數,增大merge的檔案數目,減少merge的次數,從而縮短mr處理時間。