【大數據面試題】(一)Hadoop 相關面試題總結

1.MapTask並行機度是由什麼決定的?

由切片數量決定的。

2.MR是幹什麼的?

MR將用戶編寫的業務邏輯代碼和自帶的默認組件結合起來組成一個完整的分佈式應用程序放到hadoop集羣上運行。

3.combiner和partition的作用:

combiner的意義就是對每一個maptask的輸出進行局部彙總,以減小網絡傳輸量  partition的默認實現是hashpartition,是map端將數據按照reduce個數取餘,進行分區,不同的reduce來copy自己的數據。 partition的作用是將數據分到不同的reduce進行計算,加快計算效果。

4.什麼是shuffle

map階段處理的數據如何傳遞給reduce階段,是mapreduce框架中最關鍵的一個流程,這個流程就叫shuffle; shuffle: 洗牌、發牌——(核心機制:數據分區,排序,緩存,分組)。

具體來說:就是將maptask輸出的處理結果數據,分發給reducetask,並在分發的過程中,對數據按key進行了分區和排序,分組。

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

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

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

  3. Hbase:是一個分佈式的、面向列的開源數據庫, 利用Hadoop HDFS 作爲其存儲系統。

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

6.什麼是yarn?

Yarn是一個資源調度平臺,負責爲運算程序提供服務器運算資源,相當於一個分佈式的操作系統平臺,而mapreduce等運算程序則相當於運行於操作系統之上的應用程序。

7.namenode的safemode是怎麼回事?如何才能退出safemode?

namenode在剛啓動的時候元數據只有文件塊信息,沒有文件所在datanode的信息,需要datanode自己向namenode彙報。如果namenode發現datanode彙報的文件塊信息沒有達到namenode內存中所有文件塊的總閾值的一個百分比,namenode就會處於safemode。 只有達到這個閾值,namenode纔會推出safemode。也可手動強制退出。

8.secondarynamenode的主要職責是什麼?簡述其工作機制

sn的主要職責是執行checkpoint操作 每隔一段時間,會由secondary namenode將namenode上積累的所有edits和一個最新的fsimage下載到本地,並加載到內存進行merge(這個過程稱爲checkpoint)

9.一個datanode 宕機,怎麼一個流程恢復?

Datanode宕機了後,如果是短暫的宕機,可以實現寫好腳本監控,將它啓動起來。如果是長時間宕機了,那麼datanode上的數據應該已經被備份到其他機器了, 那這臺datanode就是一臺新的datanode了,刪除他的所有數據文件和狀態文件,重新啓動 。

10.hadoop 的 namenode 宕機,怎麼解決?

先分析宕機後的損失,宕機後直接導致client無法訪問,內存中的元數據丟失,但是硬盤中的元數據應該還存在,如果只是節點掛了, 重啓即可,如果是機器掛了,重啓機器後看節點是否能重啓,不能重啓就要找到原因修復了。 但是最終的解決方案應該是在設計集羣的初期就考慮到這個問題,做namenode的HA。

11.簡述hadoop安裝?

1)使用 root 賬戶登錄
2)修改 IP
3)修改 host 主機名
4)配置 SSH 免密碼登錄
5)關閉防火牆
6)安裝 JDK
7)解壓 hadoop 安裝包
8)配置 hadoop 的核心文件 hadoop-env.sh,core-site.xml , mapred-site.xml ,
hdfs-site.xml
9)配置 hadoop 環境變量
10)格式化 hadoop namenode-format
11)啓動節點 start-all.sh

11.Hadoop 中需要哪些配置文件,其作用是什麼?

1) core-site.xml:

fs.defaultFS:hdfs://cluster1(域名),這裏的值指的是默認的HDFS 路徑。
hadoop.tmp.dir:/export/data/hadoop_tmp,這裏的路徑默認是NameNode、DataNode、
secondaryNamenode 等存放數據的公共目錄。用戶也可以自己單獨指定這三類節點的目錄。
ha.zookeeper.quorum:hadoop101:2181,hadoop102:2181,hadoop103:2181,這裏是
ZooKeeper 集羣的地址和端口。注意,數量一定是奇數,且不少於三個節點。

2)hadoop-env.sh:

只需設置jdk 的安裝路徑,如:export JAVA_HOME=/usr/local/jdk。

3)hdfs-site.xml:

dfs.replication:他決定着系統裏面的文件塊的數據備份個數,默認爲3 個。
dfs.data.dir:datanode 節點存儲在文件系統的目錄。
dfs.name.dir:是namenode 節點存儲hadoop 文件系統信息的本地系統路徑。

4)mapred-site.xml:

mapreduce.framework.name: yarn 指定mr 運行在yarn 上。

12.請列出hadoop正常工作時要啓動那些進程,並寫出各自的作用。

namenode:管理集羣並記錄datanode的元數據,相應客戶端的請求。

seconder namenode:對namenode一定範圍內的數據做一份快照性備份。它不是namenode 的冗餘守護進程,而是提供週期檢查點和清理任務。幫 助NN 合併editslog,減少NN 啓動時間。

datanode:存儲數據。它負責管理連接到節點的存儲(一個集羣中可以有多個節點)。每個存儲數據的節點運 行一個datanode 守護進程。

jobTracker:管理客戶端提交的任務,並將任務分配給TaskTracker。 

ResourceManager(JobTracker)JobTracker 負責調度DataNode 上的工作。每個DataNode 有一
個TaskTracker,它們執行實際工作。

TaskTracker:執行各個Task。

DFSZKFailoverController 高可用時它負責監控NN 的狀態,並及時的把狀態信息寫入ZK 。它
通過一個獨立線程週期性的調用NN 上的一個特定接口來獲取NN 的健康狀態。FC 也有選擇誰作
爲Active NN 的權利,因爲最多隻有兩個節點,目前選擇策略還比較簡單(先到先得,輪換)。

JournalNode 高可用情況下存放namenode 的editlog 文件。

13.1用mapreduce怎麼處理數據傾斜問題?

數據傾斜:map /reduce程序執行時,reduce節點大部分執行完畢,但是有一個或者幾個reduce節點運行很慢,導致整個程序的處理時間很長, 這是因爲某一個key的條數比其他key多很多(有時是百倍或者千倍之多),這條key所在的reduce節點所處理的數據量比其他節點就大很多, 從而導致某幾個節點遲遲運行不完,此稱之爲數據傾斜。

解決:自己實現partition類,用key和value相加取hash值。

數據的傾斜主要是兩個的數據相差的數量不在一個級別上,在只想任務時就造成了數據的傾斜,可以通過分區的方法減少reduce數據傾斜性能的方法,例如;抽樣和範圍的分區、自定義分區、數據大小傾斜的自定義側咯

13.2簡述Hadoop 的幾個默認端口及其含義

  • dfs.namenode.http-address:50070
  • SecondaryNameNode 輔助名稱節點端口號:50090
  • dfs.datanode.address:50010
  • fs.defaultFS:8020 或者9000
  • yarn.resourcemanager.webapp.address:8088

13.3Mapreduce 的 map 數量 和 reduce 數量 怎麼確定 ,怎麼配置?

map數量由處理數據分成的block數量決定。default_num = total_size / split_size;

reduce的數量由job.setNumReduceTasks(x),x爲設定的reduce數量。不設置的話默認爲1

14.hdfs的體系結構

hdfs有namenode、secondraynamenode、datanode組成。

namenode負責管理datanode和記錄元數據

secondraynamenode:幫助 NameNode 合併編輯日誌,減少 NameNode 啓動時間

datanode負責存儲數據

15.說下對hadoop 的一些理解,包括哪些組件:

詳談hadoop的應用,包括的組件分爲三類,分別說明hdfs,yarn,mapreduce。

16.一些傳統的hadoop 問題,mapreduce 他就問shuffle 階段,你怎麼理解的 ?

Shuffle意義在於將不同map處理後的數據進行合理分配,讓reduce處理,從而產生了排序、分區、分組。

17.NameNode 負責管理 metadata,client 端每次讀寫請求,它都會從磁盤中讀取或則會寫入 metadata信息並反饋client 端。(錯誤)

解析:NameNode 不需要從磁盤讀取 metadata,所有數據都在內存中,硬盤上的只是序列化的結果,只有每次 namenode 啓動的時候纔會讀取。

18. Hadoop 中需要哪些配置文件,其作用是什麼?

1)core-site.xml:
    (1)fs.defaultFS:hdfs://cluster1(域名),這裏的值指的是默認的 HDFS 路徑 。
    (2)hadoop.tmp.dir:/export/data/hadoop_tmp,這裏的路徑默認是 NameNode、DataNode、secondaryNamenode 等存放數據的公共目錄。用戶也可以自己單獨指定這三類節點的目錄。
 (3)ha.zookeeper.quorum:hadoop101:2181,hadoop102:2181,hadoop103:2181, 這 裏 是
ZooKeeper 集羣的地址和端口。注意,數量一定是奇數,且不少於三個節點 。
2)hadoop-env.sh: 只需設置 jdk 的安裝路徑,如:export JAVA_HOME=/usr/local/jdk。

3)hdfs-site.xml:
   (1) dfs.replication:他決定着系統裏面的文件塊的數據備份個數,默認爲 3 個。
   (2) dfs.data.dir:datanode 節點存儲在文件系統的目錄 。
   (3) dfs.name.dir:是 namenode 節點存儲 hadoop 文件系統信息的本地系統路徑 。
4)mapred-site.xml:
mapreduce.framework.name: yarn 指定 mr 運行在 yarn 上

19.hdfs中的block默認保存幾份?

不管是hadoop1.x 還是hadoop2.x 都是默認的保存三份,可以通過參數dfs.replication就行修改,副本的數目要根據機器的個數來確定。

20.NameNode 與SecondaryNameNode 的區別與聯繫?

1)機制流程同上;
2)區別
(1)NameNode 負責管理整個文件系統的元數據,以及每一個路徑(文件)所對應的
數據塊信息。
(2)SecondaryNameNode 主要用於定期合併命名空間鏡像和命名空間鏡像的編輯日誌。
3)聯繫:
(1)SecondaryNameNode 中保存了一份和 namenode 一致的鏡像文件(fsimage)和編
輯日誌(edits)。
(2)在主 namenode 發生故障時(假設沒有及時備份數據),可以從 SecondaryNameNode
恢復數據。

21。怎樣快速的殺死一個job?

1、執行hadoop  job -list  拿到job-id

2、Hadoop job kill hadoop-id

22。 HAnamenode 是如何工作的?

那麼下面我再詳細介紹一下:

hdfs 是一個分佈式文件系統,有namenode和datanode,我們都知道,一旦namenode蕩機,整個集羣就會癱瘓,那麼這個問題怎麼處理:

 

一般我們都會有兩個namenode,我們知道有一個secondary namenode,但是我們知道這個namenode並不能執行namenode的功能,他只是幫namenode做操作日誌的合併,所以我們需要另一種部署模式,即HA部署模式

 

HA部署模式,是一種高可用部署模式,也就是一天24小時都在工作,他有兩個namenode。namenode記錄的是元數據,這個元數據放在內存中, 在磁盤上有一個鏡像文件,這個鏡像文件是fsimage+編號,還有大量的操作日誌叫做edits+編號,兩個編號都是對應起來的,而且內存裏面的元數據都是齊全的,兩個namenode只有一個是對客戶端服務的,另外一個用來備份,對外服務的狀態成爲active,備份的是standby,如果有一天active namenode蕩機了,standby要接管對外服務,但是它還沒有元數據,那麼這個問題怎麼解決的。

 

如果active namenode蕩機,standby要立馬接管,意味着這兩個的元數據必須要時刻同步,如果是standby namenode經常性的去active拷貝元數據信息,那麼這樣對active namenode的壓力是很大的,所以首先,一開始格式化的時候,生成一個最初的元數據,先給standby拷貝一份,在運行的過程中,日誌不僅在自己的磁盤上,還放在一個 日誌存儲 系統中,standby定期的去從日誌存儲系統中拿取日誌文件,並且和最初的元數據fsimage進行合併,生成一個新的鏡像,如果差下那麼一點日誌沒有合併到,就在這一瞬間,active namenode蕩機了,然後standby namenode會從日誌存儲系統拿取缺少的那一塊日誌,與原來的元數據進行合併,進行更新,這樣狀態就和active namenode的狀態是一致的,這樣就可以很快的接手對外服務。

 

日誌存儲系統:

這是個很重要的,這個系統是不能掛掉的,這個系統不是一個單節點,這個系統也是一個集羣,裏面有很多臺機器,這個集羣也是基數臺,而且每臺之間會同步日誌,這樣一來,日誌存儲系統的可用性就會很高了,數據同步的算法和zookeeper是一樣的,即數據在多個節點之間同步,採用的是paxos算法,多數成立則成立,所以這個日誌存儲系統最多可以掛掉半數以下的機器,這個系統叫做QJournal,底層的功能依賴zookeeper集羣,這兩個集羣在業務上沒關係,只是利用zookeeper,就像hbase依賴zookeeper一樣。

 

但是現在有一個問題,就是active namenode這臺機器掛掉之後,standby namenode這臺機器是怎麼知道的,active namenode 可以在zookeeper上記載東西,然後standby去監聽,一旦這個active namenode不見了,那麼就說明掛了,這是一種方法。

 

官方是這麼做的,提供了一個額外的程序,叫做zkfc,就是基於zookeeper實現的failover controller,故障控制器,運行在namenode機器上監控namenode的進程並且把監控信息記錄在zookeeper中,standby 機器也會運行zkfc,監控自己機器上的進程,也會監聽zookeeper裏面的另一個zkfc寫的東西,一旦發生變化,得到zookeeper的通知,就可以調用方法,將自己的狀態從standby切換成active狀態,然後開始對外服務,但是問題沒有那麼簡單,有時候JVM會凍結這個namenode,zkfc以爲namenode掛掉了,其實只是清理以及維護,但是這樣的話,zkfc將將狀態提交給zookeeper,然後standby namenode會收到zookeeper的通知,那就切換狀態了,這就完了,就將存在兩個active namenode,這樣系統會錯亂。

 

這裏還有一個機制,就是當standby namenode收到通知切換狀態的時候,先不着急切換,而是先採取措施確保防止這種系統的紊亂,首先會做兩件事。

1.通過SSH遠程指令,殺掉active namenode 的進程,但是如果不僅僅是namenode掛了,而是整個機器掛了,那發送的指令

就不會有反應,也不會有反饋信息,

2.那麼如果SSH沒有響應,則幫用戶調用一個用戶所指定的腳本,腳本運行成功,則切換狀態

做完這兩件事,狀態就切換成功了,這就是HA高可用集羣運行機制。
 

23.hdfs 的數據壓縮算法?

(1) Gzip 壓縮

優點:壓縮率比較高,而且壓縮/解壓速度也比較快; hadoop 本身支持,在應用中處理gzip 格式的文件就和直接處理文本一樣;大部分 linux 系統都自帶 gzip 命令,使用方便.

缺點:不支持 split。

應用場景: 當每個文件壓縮之後在 130M 以內的(1 個塊大小內),都可以考慮用 gzip壓縮格式。 例如說一天或者一個小時的日誌壓縮成一個 gzip 文件,運行 mapreduce 程序的時候通過多個 gzip 文件達到併發。 hive 程序, streaming 程序,和 java 寫的 mapreduce 程序完全和文本處理一樣,壓縮之後原來的程序不需要做任何修改。

 

(2) Bzip2 壓縮

優點:支持 split;具有很高的壓縮率,比 gzip 壓縮率都高; hadoop 本身支持,但不支持 native;在 linux 系統下自帶 bzip2 命令,使用方便。

缺點:壓縮/解壓速度慢;不支持 native。

應用場景: 適合對速度要求不高,但需要較高的壓縮率的時候,可以作爲 mapreduce 作業的輸出格式; 或者輸出之後的數據比較大,處理之後的數據需要壓縮存檔減少磁盤空間並且以後數據用得比較少的情況;或者對單個很大的文本文件想壓縮減少存儲空間,同時又需要支持 split,而且兼容之前的應用程序(即應用程序不需要修改)的情況。

 

(3) Lzo 壓縮

優點:壓縮/解壓速度也比較快,合理的壓縮率;支持 split,是 hadoop 中最流行的壓縮格式;可以在 linux 系統下安裝 lzop 命令,使用方便。

缺點:壓縮率比 gzip 要低一些; hadoop 本身不支持,需要安裝;在應用中對 lzo 格式的文件需要做一些特殊處理(爲了支持 split 需要建索引,還需要指定 inputformat 爲 lzo 格式)。

應用場景: 一個很大的文本文件,壓縮之後還大於 200M 以上的可以考慮,而且單個文件越大, lzo 優點越越明顯。

 

(4) Snappy 壓縮

優點:高速壓縮速度和合理的壓縮率。

缺點:不支持 split;壓縮率比 gzip 要低; hadoop 本身不支持,需要安裝;

應用場景: 當 Mapreduce 作業的 Map 輸出的數據比較大的時候,作爲 Map 到 Reduce的中間數據的壓縮格式;或者作爲一個 Mapreduce 作業的輸出和另外一個Mapreduce 作業的輸入。
 

24.hadoop的調度?

Hadoop 的調度有三種其中fifo的調度hadoop的默認的,這種方式是按照作業的優先級的高低與到達時間的先後執行的。

公平調度器:名字見起意就是分配用戶的公平獲取共享集羣唄!

容量調度器:讓程序都能貨到執行的能力,在隊列中獲得資源。

25.datanode 在什麼情況下不會備份?

Hadoop保存的三個副本如果不算備份的話,那就是在正常運行的情況下不會備份,也是就是在設置副本爲1的時候不會備份,說白了就是單臺機器唄!!還有datanode 在強制關閉或者非正常斷電不會備份。

26.hadoop flush 的過程?

Flush 就是把數據落到磁盤,把數據保存起來唄!

27.三個 datanode,當有一個 datanode 出現錯誤會怎樣?

第一不會給儲存帶來影響,因爲有其他的副本保存着,不過建議儘快修復,第二會影響運算的效率,機器少了,reduce在保存數據時選擇就少了,一個數據的塊就大了所以就會慢。

28.文件大小默認爲 64M,改爲 128M 有啥影響?

增加文件塊大小,需要增加磁盤的傳輸速率

29.datanode 首次加入 cluster 的時候,如果 log 報告不兼容文件版本,那需要namenode 執行格式化操作,這樣處理的原因是?

 這樣處理是不合理的,因爲 namenode 格式化操作,是對文件系統進行格式

化,namenode 格式化時清空 dfs/name 下空兩個目錄下的所有文件,之後,會在目

錄 dfs.name.dir 下創建文件。

文本不兼容,有可能時 namenode 與 datanode 的 數據裏的 namespaceID、

clusterID 不一致,找到兩個 ID 位置,修改爲一樣即可解決。

30.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 方法,就可以實現排序。

31.簡單概述一下hadoop1與hadoop2的區別?

Hadoop2與hadoop1最大的區別在於HDFS的架構與mapreduce的很大的區別,而且速度上有很大的提升,hadoop2最主要的兩個變化是:namenode可以集羣的部署了,hadoop2中的mapreduce中的jobTracker中的資源調度器與生命週期管理拆分成兩個獨立的組件,並命名爲YARN 。

32.YARN的新特性?

YARN是hadoop2.x之後纔出的,主要是hadoop的HA(也就是集羣),磁盤的容錯,資源調度器 。

33.hadoop join的原理?

實現兩個表的join首先在map端需要把表標示一下,把其中的一個表打標籤,到reduce端再進行笛卡爾積的運算,就是reduce進行的實際的鏈接操作。

33.hadoop的二次排序?

Hadoop默認的是HashPartitioner排序,當map端一個文件非常大另外一個文件非常小時就會產生資源的分配不均勻,既可以使用setPartitionerClass來設置分區,即形成了二次分區。

34.hadoop的mapreduce的排序發生在幾個階段?

發生在兩個階段即使map與reduce階段

35.使用mr,spark ,spark sql編寫word count程序?

37.Hadoop中job和Tasks之間的區別是什麼?

job是工作的入口,負責控制、追蹤、管理任務,也是一個進程 包含map task和reduce task

Tasks是map和reduce裏面的步驟,主要用於完成任務,也是線程.

38.Hadoop中的RecordReader的作用是什麼?

屬於split和mapper之間的一個過程 將inputsplit輸出的行爲一個轉換記錄,成爲key-value的記錄形式提供給mapper 。

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

MR一共有四個階段,split map shuff reduce 在執行完map之後,可以對map的輸出結果進行分區, 分區:這塊分片確定到哪個reduce去計算(彙總) 排序:在每個分區中進行排序,默認是按照字典順序。 Group:在排序之後進行分組 。

40.mapreduce的優化方法?

數據輸入

map階段

reduce階段

IO傳輸

數據傾斜問題

常用的調優參數

41.如果沒有定義的partitioner,那麼數據在被送達reducer前是如何被分區?

如果沒有自定義的 partitioning,則默認的 partition 算法,即根據每一條數據的 key

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

42. MapReduce 怎麼實現 TopN?

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

43.HDFS的存儲機制?

HDFS存儲機制,包括HDFS的寫入過程和讀取過程兩個部分

寫數據過程:

1)客戶端namenode請求上傳文件,namenode檢查目標文件是否已存在,父目錄是否存在。

2)namenode返回是否可以上傳。

3)客戶端請求第一個 block上傳到哪幾個datanode服務器上。

4)namenode返回3個datanode節點,分別爲dn1dn2dn3

5)客戶端請求dn1上傳數據,dn1收到請求會繼續調用dn2,然後dn2調用dn3,將這個通信管道建立完成

6)dn1dn2dn3逐級應答客戶端

7)客戶端開始往dn1上傳第一個block(先從磁盤讀取數據放到一個本地內存緩存),以packet爲單位,dn1收到一個packet就會傳給dn2dn2傳給dn3dn1每傳一個packet會放入一個應答隊列等待應答

8)當一個block傳輸完成之後,客戶端再次請求namenode上傳第二個block的服務器。(重複執行3-7步)

讀數據過程:

1)客戶端向namenode請求下載文件,namenode通過查詢元數據,找到文件塊所在的datanode地址。

2)挑選一臺datanode(就近原則,然後隨機)服務器,請求讀取數據

3)datanode開始傳輸數據給客戶端(從磁盤裏面讀取數據放入流,以packet爲單位來做校驗)。

4)客戶端以packet爲單位接收,先在本地緩存,然後寫入目標文件。

44.列出的Hadoop 1和Hadoop 2之間的差異?

在Hadoop的1.x中,「Namenode」有單點問題。在Hadoop的2.x中,我們有主動和被動「Namenodes」。如果主動「的Namenode」失敗,則被動「的Namenode」負責。正因爲如此,高可用性可以Hadoop中2.x中來實現

此外,在Hadoop的2.X,YARN提供了一箇中央資源管理器。通過YARN,你現在可以在Hadoop中運行多個應用程序,共享公共資源。 MR2是一種特殊類型的運行於YARN MapReduce框架之上的分佈式應用。其他工具也可以通過YARN執行數據處理。

45.簡答說一下hadoop的map-reduce編程模型?

首先map task會從本地文件系統讀取數據,轉換成key-value形式的鍵值對集合。
將鍵值對集合輸入mapper進行業務處理過程,將其轉換成需要的key-value在輸出。
之後會進行一個partition分區操作,默認使用的是hashpartitioner,可以通過重寫hashpartitioner的getpartition方法來自定義分區規則。
之後會對key進行進行sort排序,grouping分組操作將相同key的value合併分組輸出。
在這裏可以使用自定義的數據類型,重寫WritableComparator的Comparator方法來自定義排序規則,重寫RawComparator的compara方法來自定義分組規則。
之後進行一個combiner歸約操作,其實就是一個本地段的reduce預處理,以減小後面shufle和reducer的工作量。
reduce task會通過網絡將各個數據收集進行reduce處理,最後將數據保存或者顯示,結束整個job。

46.hadoop的TextInputFormat作用是什麼,如何自定義實現?

InputFormat會在map操作之前對數據進行兩方面的預處理。
1是getSplits,返回的是InputSplit數組,對數據進行split分片,每片交給map操作一次 。
2是getRecordReader,返回的是RecordReader對象,對每個split分片進行轉換爲key-value鍵值對格式傳遞給map。
常用的InputFormat是TextInputFormat,使用的是LineRecordReader對每個分片進行鍵值對的轉換,以行偏移量作爲鍵,行內容作爲值。
自定義類繼承InputFormat接口,重寫createRecordReader和isSplitable方法 。
在createRecordReader中可以自定義分隔符。

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

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

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

3)Hbase:是一個分佈式的、面向列的開源數據庫, 利用 Hadoop HDFS 作爲其存儲系統

4)Hive:基於 Hadoop 的一個數據倉庫工具,可以將結構化的數據檔映射爲一張數據庫表,
並提供簡單的 sql 查詢功能,可以將 sql 語句轉換爲 MapReduce 任務進行運行。
5)Sqoop:將一個關係型數據庫中的數據導進到 Hadoop 的 HDFS 中,也可以將 HDFS 的數
據導進到關係型數據庫中。

50.談談 Hadoop 序列化和反序列化及自定義 bean 對象實現序列化?

1)序列化和反序列化
序列化就是把內存中的對象,轉換成字節序列(或其他數據傳輸協議)以便於存儲(持久化)和網絡傳輸。
反序列化就是將收到字節序列(或其他數據傳輸協議)或者是硬盤的持久化數據,轉換成內存中的對象。


Java 的序列化是一個重量級序列化框架(Serializable),一個對象被序列化後,會附帶很多額外的信息(各種校驗信息,header,繼承體系等),不便於在網絡中高效傳輸。所以,hadoop 自己開發了一套序列化機制(Writable),精簡、高效。

51.在Hadoop 中定義的 InputFormat 中,默認是哪一個?

TextInputFormat

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

1)相同點:
TextInputformat 和 KeyValueTextInputFormat 都繼承了 FileInputFormat 類,都是每一行作
爲一個記錄;
2)區別:
TextInputformat 將每一行在文件中的起始偏移量作爲 key,每一行的內容作爲 value。
默認以\n 或回車鍵作爲一行記錄。
KeyValueTextInputFormat 適合處理輸入數據的每一行是兩列,並用 tab 分離的形式

53.請描述 mapReduce 中 shuffle 階段的工作流程?

1)maptask 收集我們的 map()方法輸出的 kv 對,放到內存緩衝區中
2)從內存緩衝區不斷溢出本地磁盤文件,可能會溢出多個文件
3)多個溢出文件會被合併成大的溢出文件
4)在溢出過程中,及合併的過程中,都要調用 partitioner 進行分區和針對 key 進行排

5)reducetask 根據自己的分區號,去各個 maptask 機器上取相應的結果分區數據
6)reducetask 會取到同一個分區的來自不同 maptask 的結果文件,reducetask 會將這些
文件再進行合併(歸併排序)
7)合併成大文件後,shuffle 的過程也就結束了,後面進入 reducetask 的邏輯運算過程
(從文件中取出一個一個的鍵值對 group,調用用戶自定義的 reduce()方法)

54.請描述 mapReduce 中 combiner 的作用是什麼,一般使用情景,哪些情況不需要,及和 reduce 的區別?

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

55.如何使用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 的記錄,如果有,則連接後輸出即可。

56.有可能使 Hadoop 任務輸出到多個目錄中麼?如果可以,怎麼做?

 1)可以輸出到多個目錄中,採用自定義 OutputFormat。 
2)實現步驟:
(1)自定義 outputformat,
(2)改寫 recordwriter,具體改寫輸出數據的方法 write()

 57.爲什麼會產生 yarn,它解決了什麼問題,有什麼優勢?

Yarn 最主要的功能就是解決運行的用戶程序與 yarn 框架完全解耦。Yarn 上可以運行各種類型的分佈式運算程序(mapreduce 只是其中的一種),比如 mapreduce、storm 程序,spark 程序……

58.yarn工作流程?

 運行流程
    1、客戶端向RM中提交程序 
    2、RM向NM中分配一個container,並在該container中啓動AM 
    3、AM向RM註冊,這樣用戶可以直接通過RM査看應用程序的運行狀態(然後它將爲各個任務申請資源,並監控它的運行狀態,直到運行結束) 
    4、AM採用輪詢的方式通過RPC協議向RM申請和領取資源,資源的協調通過異步完成 
    5、AM申請到資源後,便與對應的NM通信,要求它啓動任務 
    6、NM爲任務設置好運行環境(包括環境變量、JAR包、二進制程序等)後,將任務啓動命令寫到一個腳本中,並通過運行該腳本啓動任務 
    7、各個任務通過某個RPC協議向AM彙報自己的狀態和進度,以讓AM隨時掌握各個任務的運行狀態,從而可以在任務失敗時重新啓動任務 
    8、應用程序運行完成後,AM向RM註銷並關閉自己

59.MapReduce 2.0 容錯性?

1)MRAppMaster 容錯性
一旦運行失敗,由 YARN 的 ResourceManager 負責重新啓動,最多重啓次數可由用戶設
置,默認是 2 次。一旦超過最高重啓次數,則作業運行失敗。
2)Map Task/Reduce Task
Task 週期性向 MRAppMaster 彙報心跳;一旦 Task 掛掉,則 MRAppMaster 將爲之重新申請資源,並運行之。最多重新運行次數可由用戶設置,默認 4 次。

60.優化(☆☆☆☆☆)

 mapreduce 跑的慢的原因?

Mapreduce 程序效率的瓶頸在於兩點:
1)計算機性能
CPU、內存、磁盤健康、網絡
2)I/O 操作優化

(1)數據傾斜
(2)map 和 reduce 數設置不合理
(3)reduce 等待過久
(4)小文件過多
(5)大量的不可分塊的超大文件
(6)spill 次數過多
(7)merge 次數過多等。

 

 mapreduce 優化方法:

1)數據輸入:
(1)合併小文件:在執行 mr 任務前將小文件進行合併,大量的小文件會產生大量的map 任務,增大 map 任務裝載次數,而任務的裝載比較耗時,從而導致 mr 運行較慢。
(2)採用 ConbinFileInputFormat 來作爲輸入,解決輸入端大量小文件場景。
2)map 階段
(1)減少 spill 次數:通過調整 io.sort.mb 及 sort.spill.percent 參數值,增大觸發 spill 的內存上限,減少 spill 次數,從而減少磁盤 IO。
(2)減少 merge 次數:通過調整 io.sort.factor 參數,增大 merge 的文件數目,減少 merge的次數,從而縮短 mr 處理時間。
(3)在 map 之後先進行 combine 處理,減少 I/O。
3)reduce 階段
(1)合理設置 map 和 reduce 數:兩個都不能設置太少,也不能設置太多。太少,會導致 task 等待,延長處理時間;太多,會導致 map、reduce 任務間競爭資源,造成處理超時等錯誤。
(2)設置 map、reduce 共存:調整 slowstart.completedmaps 參數,使 map 運行到一定程度後,reduce 也開始運行,減少 reduce 的等待時間。
(3)規避使用 reduce,因爲 Reduce 在用於連接數據集的時候將會產生大量的網絡消耗。
4)IO 傳輸
(1)採用數據壓縮的方式,減少網絡 IO 的的時間。安裝 Snappy 和 LZOP 壓縮編碼器。
(2)使用 SequenceFile 二進制文件
5)數據傾斜問題
(1)數據傾斜現象
數據頻率傾斜——某一個區域的數據量要遠遠大於其他區域。
數據大小傾斜——部分記錄的大小遠遠大於平均值。
   (2)減少數據傾斜的方法

方法 1:抽樣和範圍分區

可以通過對原始數據進行抽樣得到的結果集來預設分區邊界值。
方法 2:自定義分區
另一個抽樣和範圍分區的替代方案是基於輸出鍵的背景知識進行自定義分區。例如,如map 輸出鍵的單詞來源於一本書。其中大部分必然是省略詞(stopword)。那麼就可以將自定義分區將這部分省略詞發送給固定的一部分 reduce 實例。而將其他的都發送給剩餘的 reduce 實例。
方法 3:Combine
使用 Combine 可以大量地減小數據頻率傾斜和數據大小傾斜。在可能的情況下,combine 的目的就是聚合並精簡數據。

6)常用的調優參數

61.HDFS 小文件優化方法(☆☆☆☆☆)

1)HDFS 小文件弊端:

HDFS 上每個文件都要在 namenode 上建立一個索引,這個索引的大小約爲 150byte,這樣當小文件比較多的時候,就會產生很多的索引文件,一方面會大量佔用 namenode 的內存空間,另一方面就是索引文件過大是的索引速度變慢。 2)解決的方式: (1)Hadoop 本身提供了一些文件壓縮的方案。 (2)從系統層面改變現有 HDFS 存在的問題,其實主要還是小文件的合併,然後建立比較 快速的索引。