天天看點

大資料面試題大雜燴大資料面試題大雜燴

大資料面試題大雜燴

什麼是zookeeper

ZooKeeper是一個經典的分布式資料一緻性解決方案,緻力于為分布式應用提供一個高性能、高可用,且具有嚴格順序通路控制能力的分布式協調服務。

分布式應用程式可以基于ZooKeeper實作資料釋出與訂閱、負載均衡、命名服務、分布式協調與通知、叢集管理、Leader選舉、分布式鎖、分布式隊列等功能。

zookeeper特性

  1. 順序一緻性

    從同一個用戶端發起的請求,最終将會嚴格按照其發送順序進入ZooKeeper中

  2. 原子性

    有請求的響應結果在整個分布式叢集環境中具備原子性,即要麼整個叢集中所有機器都成功的處理了某個請求,要麼就都沒有處理

  3. 單一性

    無論用戶端連接配接到ZooKeeper叢集中哪個伺服器,每個用戶端所看到的服務端模型都是一緻的,不可能出現兩種不同的資料狀态,因為ZooKeeper叢集中每台伺服器之間會進行資料同步

  4. 可靠性

    一旦服務端資料的狀态發送了變化,就會立即存儲起來,除非此時有另一個請求對其進行了變更,否則資料一定是可靠的

  5. 實時性

    當某個請求被成功處理後,ZooKeeper僅僅保證在一定的時間段内,用戶端最終一定能從服務端上讀取到最新的資料狀态

zookeeper當機怎麼處理

Zookeeper本身也是叢集,推薦配置不少于3個伺服器。Zookeeper自身也要保證當一個節點當機時,其他節點會繼續提供服務。

如果是一個Follower當機,還有2台伺服器提供通路,因為Zookeeper上的資料是有多個副本的,資料并不會丢失;

如果是一個Leader當機,Zookeeper會選舉出新的Leader。

ZK叢集的機制是隻要超過半數的節點正常,叢集就能正常提供服務。隻有在ZK節點挂得太多,隻剩一半或不到一半節點能工作,叢集才失效。

是以

3個節點的cluster可以挂掉1個節點(leader可以得到2票>1.5)

2個節點的cluster就不能挂掉任何1個節點了(leader可以得到1票<=1)

一般zk使用單數節點,因為單數雙數節點效果一樣,單數節省資源。

zookeeper的監控工具taokeeper

基于zookeeper的監控管理工具taokeeper,由淘寶團隊開源的zk管理中間件

hadoop版本

一般用CDH的,版本選擇在5.6.0以後的

hadoop-2.6.0-cdh5.6.0,下載下傳位址https://archive.cloudera.com/cdh5/cdh/5/hadoop-2.6.0-cdh5.6.0.tar.gz

hadoop2.x,與1.x的差別

Hadoop2相比較于Hadoop1.x來說,HDFS的架構與MapReduce的都有較大的變化,且速度上和可用性上都有了很大的提高,Hadoop2中有兩個重要的變更:

  1. HDFS的NameNodes可以以叢集的方式布署,增強了NameNodes的水準擴充能力和可用性;
  2. MapReduce将JobTracker中的資源管理及任務生命周期管理(包括定時觸發及監控),拆分成兩個獨立的元件,并更名為YARN(Yet Another Resource Negotiator)。

yarn的作用以及排程政策

Hadoop YARN :這是作業排程和叢集資源管理的架構。

排程政策:

  1. FIFO Scheduler,先進先出隊列,先給隊列最頭上的配置設定資源,以此類推。是最容易了解的排程器,不需要任何配置,但是他不适用共享叢集,大的應用可能會造成阻塞,在共享叢集中更适合用另外兩種排程政策。
  2. Capacity Scheduler,容量排程器,類似多個隊列的先進先出,有一個專門的隊列用來運作小任務,但是這個隊列會先占用一定的叢集資源,這就導緻打任務執行時間會比FIFO的慢一些。
  3. Fair Scheduler,公平排程器,不需要預先占用一定的資源,排程器會為所有運作的job動态的調整資源,當第一個任務進來時,使用系統的所有資源,當第二個任務進來時,公平的将資源分為兩部分,兩個任務同時進行,需要注意的是,第二個任務進來後資源的配置設定有一定的延遲,因為需要等待第一個任務将部分資源釋放出來。
  • 三者對比:
  • FIFO:耗時長的任務會一直占用隊列,後邊的任務一直會處于等待狀态,資源使用率不高,不适用與共享叢集。
  • 容量排程器:資料多使用者可共享的FIFO
  • 公平排程器:試圖為每個任務均勻配置設定資源

namenode高可用如何實作

在hadoop2.x中,HDFS的namenode和Yarn的rm的單點問題都得到了解決,都可以應用到叢集環境上,nn比rm的高可用實作更複雜,因為nn對資料存儲和資料一緻性的要求比較高。

active namenode和standby namenode,兩台namenode形成互備,一台處于active,為主namenode,另一台standby是備用,隻有主節點才能對外提供讀寫服務,主備之間控制交給zookeeper處理,zk會實時監測主節點的健康狀态。

共享存儲系統是nn高可用最為關鍵的部分,共享存儲系統存儲了主節點運作過程中産生的hdfs中繼資料,利用該系統同步到備用節點。

namenode如何實作故障轉移

故障轉移的操作也是利用zookeeper進行的,添加失效備緩螢幕(ZKFC)131和132

  1. 通過配置檔案實作故障轉移
  2. 自動故障轉移服務啟動

namenode中繼資料的管理機制

存儲中繼資料的三種形式:

  1. 記憶體中繼資料(NameSystem)
  2. 磁盤中繼資料鏡像檔案
  3. 資料記錄檔檔案(可以通過日志運算出中繼資料)

namenode高可用相關文檔

https://blog.csdn.net/behandthetime/article/details/53256801

secondarynamenode冷備

  1. 學者會見名思義的認為secondarynamenode是namenode的備份其它的,或者認為它們是一樣的。實質上,它是namenode的一個快照,會根據configuration中設定的值來決定多少時間周期性的去擷取namenode中的metadata及其它資料。
  2. 假使namenode損壞或丢失之後,無法啟動hadoop這時就要人工去幹預恢複到secondarynamenode中所照快照的狀态,這就意味着叢集的資料會或多或少的丢失和一些當機時間,并且将secondarynamenode作為重要的namenode來處理,這就要求,盡量不要将secondarynamede和namenode放在同一台機器上。

如何降低叢集副本數量,降低後如何生效

執行指令将某目錄下資料副本改為2

hadoop dfs -setrep -w 2 -R /user

執行 hdfs balancer 均衡叢集資料

參考資料:

http://hadoop.apache.org/docs/r2.5.2/hadoop-project-dist/hadoop-common/CommandsManual.html

http://hadoop.apache.org/docs/r2.5.2/hadoop-project-dist/hadoop-common/FileSystemShell.html

剛才在hadoop2.6.5版本分布式叢集環境試了一下:

修改hdfs-site.xml檔案的dfs.replication值後,不重新開機hadoop叢集,上傳馬上生效。

不重新開機,對于修改dfs.replication值之前的檔案備份數不會變動。

重新開機後,對于修改dfs.replication值之前的檔案備份數也不會變動。

我有兩個datanode節點,測試的時候,先設定dfs.replication的值為1,後來改為2。

但是如果是由2變為1的話,hadoop也不會幫你将原先兩個備份删掉一份的。

HDFS:機架感覺

告訴 Hadoop 叢集中哪台機器屬于哪個機架。

機架感覺需要考慮的情況:

(1)不同節點之間的通信能夠盡量發生在同一個機架之内,

而不是跨機架

(2)為了提高容錯能力,名稱節點會盡可能把資料塊的副本

放到多個機架上。

Hadoop 對機架的感覺并非是自适應的,亦即,hadoop 叢集分辨

某台 slave 機器是屬于哪個 rack 并非是智能感覺的,而是需要 hadoop

的管理者人為的告知 hadoop 哪台機器屬于哪個 rack,這樣在 hadoop

的 namenode 啟動初始化時,會将這些機器與 rack 的對應資訊儲存

在記憶體中,用來作為對接下來所有的 HDFS 的寫塊操作配置設定 datanode

清單時(比如 3 個 block 對應三台 datanode)的選擇 datanode 政策,

盡量将三個副本分布到不同的 rack。

做過哪些mr調優

  1. 設定combiner,在map端提前進行了一次reduce處理,用于減少mapTask中間輸出結果,進而減少各個reduceTask遠端拷貝資料量
  2. 選擇合适的writable。
  3. 增加輸入檔案的副本數,假設有多個datanode節點,hdfs預設是3個,我們可以設定賀datanode節點數量一緻的副本數,就可以省去網絡傳輸,但是副本數超過5個對叢集的壓力就已經很大了,是以還需要合理的配置設定。
  4. 輸入海量小檔案的時候,使用CombineInputFormat自定義分片政策對小檔案進行合并,減少maptask數量,減少map的時間,另外maptask的數量和下邊的參數也有關系:

mapred.min.split.size:Input Split的最小值 預設值1

mapred.max.split.size:Input Split的最大值

dfs.block.size:HDFS 中一個block大小,預設值128MB

當mapred.min.split.size小于dfs.block.size的時候,一個block會被分為多個分片,也就是對應多個map task

當mapred.min.split.size大于dfs.block.size的時候,一個分片可能對應多個block,也就是一個map task讀取多個block資料

叢集的網絡、IO等性能很好的時候,建議調高dfs.block.size

根據資料源的特性,主要調整mapred.min.split.size來控制map task的數量

https://blog.csdn.net/zengxiaosen/article/details/72792434

https://blog.csdn.net/ewencris/article/details/84945196