大資料面試題大雜燴
什麼是zookeeper
ZooKeeper是一個經典的分布式資料一緻性解決方案,緻力于為分布式應用提供一個高性能、高可用,且具有嚴格順序通路控制能力的分布式協調服務。
分布式應用程式可以基于ZooKeeper實作資料釋出與訂閱、負載均衡、命名服務、分布式協調與通知、叢集管理、Leader選舉、分布式鎖、分布式隊列等功能。
zookeeper特性
-
順序一緻性
從同一個用戶端發起的請求,最終将會嚴格按照其發送順序進入ZooKeeper中
-
原子性
有請求的響應結果在整個分布式叢集環境中具備原子性,即要麼整個叢集中所有機器都成功的處理了某個請求,要麼就都沒有處理
-
單一性
無論用戶端連接配接到ZooKeeper叢集中哪個伺服器,每個用戶端所看到的服務端模型都是一緻的,不可能出現兩種不同的資料狀态,因為ZooKeeper叢集中每台伺服器之間會進行資料同步
-
可靠性
一旦服務端資料的狀态發送了變化,就會立即存儲起來,除非此時有另一個請求對其進行了變更,否則資料一定是可靠的
-
實時性
當某個請求被成功處理後,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中有兩個重要的變更:
- HDFS的NameNodes可以以叢集的方式布署,增強了NameNodes的水準擴充能力和可用性;
- MapReduce将JobTracker中的資源管理及任務生命周期管理(包括定時觸發及監控),拆分成兩個獨立的元件,并更名為YARN(Yet Another Resource Negotiator)。
yarn的作用以及排程政策
Hadoop YARN :這是作業排程和叢集資源管理的架構。
排程政策:
- FIFO Scheduler,先進先出隊列,先給隊列最頭上的配置設定資源,以此類推。是最容易了解的排程器,不需要任何配置,但是他不适用共享叢集,大的應用可能會造成阻塞,在共享叢集中更适合用另外兩種排程政策。
- Capacity Scheduler,容量排程器,類似多個隊列的先進先出,有一個專門的隊列用來運作小任務,但是這個隊列會先占用一定的叢集資源,這就導緻打任務執行時間會比FIFO的慢一些。
- 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
- 通過配置檔案實作故障轉移
- 自動故障轉移服務啟動
namenode中繼資料的管理機制
存儲中繼資料的三種形式:
- 記憶體中繼資料(NameSystem)
- 磁盤中繼資料鏡像檔案
- 資料記錄檔檔案(可以通過日志運算出中繼資料)
namenode高可用相關文檔
https://blog.csdn.net/behandthetime/article/details/53256801
secondarynamenode冷備
- 學者會見名思義的認為secondarynamenode是namenode的備份其它的,或者認為它們是一樣的。實質上,它是namenode的一個快照,會根據configuration中設定的值來決定多少時間周期性的去擷取namenode中的metadata及其它資料。
- 假使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調優
- 設定combiner,在map端提前進行了一次reduce處理,用于減少mapTask中間輸出結果,進而減少各個reduceTask遠端拷貝資料量
- 選擇合适的writable。
- 增加輸入檔案的副本數,假設有多個datanode節點,hdfs預設是3個,我們可以設定賀datanode節點數量一緻的副本數,就可以省去網絡傳輸,但是副本數超過5個對叢集的壓力就已經很大了,是以還需要合理的配置設定。
- 輸入海量小檔案的時候,使用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