面試題總結:
- 分布式文件系統(Distributed File System)是指文件系統管理的物理存儲資源不一定直接連接在本地節點上,而是通過計算機網絡與節點相連。分布式文件系統的設計基於客戶機/服務器模式。
[優點]
支持超大文件 超大文件在這里指的是幾百M,幾百GB,甚至幾TB大小的文件。
檢測和快速應對硬件故障在集群的環境中,硬件故障是常見的問題。因為有上千台服務器連接在一起,這樣會導致高故障率。因此故障檢測和自動恢復是hdfs文件系統的一個設計目標
流式數據訪問應用程序能以流的形式訪問數據集。主要的是數據的吞吐量,而不是訪問速度。
簡化的一致性模型 大部分hdfs操作文件時,需要一次寫入,多次讀取。在hdfs中,一個文件一旦經過創建、寫入、關閉后,一般就不需要修改了。這樣簡單的一致性模型,有利於提高吞吐量。
[缺點]
低延遲數據訪問如和用戶進行交互的應用,需要數據在毫秒或秒的范圍內得到響應。由於hadoop針對高數據吞吐量做了優化,犧牲了獲取數據的延遲,所以對於低延遲來說,不適合用hadoop來做。
大量的小文件Hdfs支持超大的文件,是通過數據分布在數據節點,數據的元數據保存在名字節點上。名字節點的內存大小,決定了hdfs文件系統可保存的文件數量。雖然現在的系統內存都比較大,但大量的小文件還是會影響名字節點的性能。
多用戶寫入文件、修改文件Hdfs的文件只能有一次寫入,不支持寫入,也不支持修改。只有這樣數據的吞吐量才能大。
不支持超強的事務沒有像關系型數據庫那樣,對事務有強有力的支持。
詳情查看:https://www.cnblogs.com/sxt-zkys/archive/2017/07/24/7229857.html - Gangila不僅可以進行監控,也可以進行告警。(正確)
Ganglia是UC Berkeley發起的一個開源集群監視項目,設計用於測量數以千計的節點。Ganglia的核心包含gmond、gmetad以及一個Web前端。主要是用來監控系統性能,如:cpu 、mem、硬盤利用率, I/O負載、網絡流量情況等,通過曲線很容易見到每個節點的工作狀態,對合理調整、分配系統資源,提高系統整體性能起到重要作用。ganglia 作為一款最常用的 Linux 環境中的監控軟件,它擅長的的是從節點中按照用戶的需求以較低的代價采集數據。但是 ganglia 在預警以及發生事件后通知用戶上並不擅長。最新的 ganglia 已經有了部分這方面的功能。
Nagios是一款開源的免費網絡監視工具,能有效監控Windows、Linux和Unix的主機狀態,交換機路由器等網絡設備,打印機等。在系統或服務狀態異常時發出郵件或短信報警第一時間通知網站運維人員,在狀態恢復后發出正常的郵件或短信通知。
通過將 Ganglia 和 Nagios 組合起來,把 Ganglia 采集的數據作為 Nagios 的數據源,然后利用 Nagios 來發送預警通知,可以 完美的實現一整套監控管理的系統。 具體可以查看 完美集群監控組合 ganglia 和 nagios。
ps.雲計算管理三大利器:Nagios、Ganglia和Splunk - Block Size是不可以修改的。(錯誤)-----它是可以被修改的
Hadoop的基礎配置問件事hadoop-default.xml,默認建立一個job的時候會建立job的configuration,首先讀入的是hadoop-default.xml的配置,然后再讀hadoop-site.xml的配置(這個文件初始的時候配置為空),hadoop-site.xml中主要配置需要覆蓋的hadoop-default.xml的系統級配置。具體配置可以參考下
<property> <name>dfs.block.size</name>//block的大小,單位字節,后面會提到用處,必須是512的倍數,因為采用crc做文件完整性校驗,默認配置512是checksum的最小單元 <value>5120000</value> </property>
ps.循環冗余校驗(Cyclic Redundancy Check, CRC)是一種根據網絡數據包或電腦文件等數據產生簡短固定位數校驗碼的一種散列函數,主要用來檢測或校驗數據傳輸或者保存后可能出現的錯誤。它是利用除法及余數的原理來作錯誤偵測的。
- Nagios不可以監控hadoop集群,因為它不提供hadoop支持。(錯誤)
nagios是集群監控工具,而且是雲計算三大利器之一 - 如果namenode意外終止,secondarynamenode會接替他是集群繼續工作。(錯誤)
secondarynamenode是幫助恢復,而不是替代,如何恢復,可以查看hadoop根據secondarynamenode恢復namenode。在高可用集群中,一個namenode(active)死亡后,ZKFC(zookeeper控制器)仲裁將另一個standby-namenode啟動,轉換成active狀態,集群繼續正常工作。 - Cloudera CDH是需要付費使用的。(錯誤)
第一套付費產品是 Cloudera Enterpris
- Hadoop是Java開發的,所以MapReduce只支持Java語言編寫。(錯誤)
rhadoop是用R語言開發的,MapReduce是一個框架,可以理解是一種思想,可以使用其他語言開發。 - 什么是Map/Reduce:
MapReduce是一種編程模型,用於大規模數據集(大於1TB)的並行運算。概念"Map(映射)"和"Reduce(歸約)",是它們的主要思想,都是從函數式編程語言里借來的,還有從矢量編程語言里借來的特性。它極大地方便了編程人員在不會分布式並行編程的情況下,將自己的程序運行在分布式系統上。 當前的軟件實現是指定一個Map(映射)函數,用來把一組鍵值對映射成一組新的鍵值對,指定並發的Reduce(歸約)函數,用來保證所有映射的鍵值對中的每一個共享相同的鍵組。
概述:
1)MapReduce是一個 基於集群的高性能並行計算平台(Cluster Infrastructure)。它允許用市場上普通的商用服務器構成一個包含數十、數百至數千個節點的分布和並行計算集群。2)MapReduce是一個 並行計算與運行軟件框架(Software Framework)。它提供了一個龐大但設計精良的並行計算軟件框架,能自動完成計算任務的並行化處理,自動划分計算數據和計算任務,在集群節點上自動分配和執行任務以及收集計算結果,將數據分布存儲、數據通信、容錯處理等並行計算涉及到的很多系統底層的復雜細節交由系統負責處理,大大減少了軟件開發人員的負擔。3)MapReduce是一個 並行程序設計模型與方法(Programming Model & Methodology)。它借助於函數式程序設計語言Lisp的設計思想,提供了一種簡便的並行程序設計方法,用Map和Reduce兩個函數編程實現基本的並行計算任務,提供了抽象的操作和並行編程接口,以簡單方便地完成大規模數據的編程和計算處理。實現:
把一堆雜亂無章的數據按照某種特征歸納起來,然后處理並得到最后的結果。Map面對的是雜亂無章的互不相關的數據,它解析每個數據,從中提取出key和value,也就是提取了數據的特征。經過MapReduce的Shuffle階段之后,在Reduce階段看到的都是已經歸納好的數據了,在此基礎上我們可以做進一步的處理以便得到結果。 - Hadoop支持數據的隨機讀寫。(錯誤)
lucene是支持隨機讀寫的,而hdfs只支持隨機讀。但是Hbase可以來補救。Hbase提供隨機讀寫,來解決Hadoop不能處理的問題。HBase 自底層設計開始即聚焦於各種可伸縮性問題:表可以很―高‖,有數十億個數據行;也可以很―寬‖,有數百萬個列;水平分區並在上千個普通商用機節 點上自動復制。表的模式是物理存儲的直接反映,使系統有可能提高高效的數據結構的序列化、存儲和檢索。
ps.Lucene是一套用於全文檢索和搜尋的開源程式庫,由Apache軟件基金會支持和提供。Lucene提供了一個簡單卻強大的應用程式接口,能夠做全文索引和搜尋。在Java開發環境里Lucene是一個成熟的免費開源工具。就其本身而言,Lucene是當前以及最近幾年最受歡迎的免費Java信息檢索程序庫。人們經常提到信息檢索程序庫,雖然與搜索引擎有關,但不應該將信息檢索程序庫與搜索引擎相混淆。 - namenode負責管理metadata,client端每次讀寫請求,都會從磁盤中讀取或則會寫入 metadata 信息並反饋client 端。(錯誤)
NameNode 不需要從磁盤讀取 metadata,所有數據都在內存中,硬盤上的只是序列化的結果,只有每次namenode 啟動的時候才會讀取。1)文件寫入Client 向 NameNode 發起文件寫入的請求。NameNode 根據文件大小和文件塊配置情況,返回給 Client 它所管理部分 DataNode 的信息。Client 將文件划分為多個 Block,根據 DataNode 的地址信息,按順序寫入到每一個 DataNode 塊中。
2)文件讀取Client 向 NameNode 發起文件讀取的請求。NameNode 返回文件存儲的 DataNode 的信息。Client 讀取文件信息。
ps.http://www.makaidong.com/%E5%8D%9A%E5%AE%A2%E5%9B%AD%E6%8E%92%E8%A1%8C/9053.shtml -
datanode通過長連接與namenode保持通信。(正確)【答案有分歧,根據自己理解回答即可】
長連接:Client 方與Server 方先建立通訊連接,連接建立后不斷開,然后再進行報文發送和接收。這種方式下由於通訊連接一直存在,此種方式常用於點對點通訊。
短連接:Client 方與Server 每進行一次報文收發交易時才進行通訊連接,交易完畢后立即斷開連接。此種方式常用於一點對多點通訊,比如多個Client 連接一個Server。
-
Hadoop自身具有嚴格的權限管理和安全措施保障集群正常運行。(錯誤)
-
slave節點要存儲數據,所以它的磁盤越大越好。(錯誤)
一旦slave節點宕機,數據恢復是一個難題。 - hadoop dfsadmin -report用於檢測HDFS損壞塊。(錯誤)
hadoop dfsadmin -report可以用來查詢集群的狀況,可以快速定位出各個節點,HDFS的容量和使用量,以及每個節點的硬盤使用情況。當然這個也可以通過50070端口進行查看,但是這個命令更有利於我們利用腳本來監控dfs的使用狀況 - Hadoop默認調度器策略為FIFO。(正確)【first input first output】
FIFO是先入先出隊列,是一種傳統的按序執行的方法。 -
Hadoop集群三種作業調度算法介紹
Hadoop集群中有三種作業調度算法,分別為FIFO,公平調度算法和計算能力調度算法。
先來先服務算法FIFO:FIFO比較簡單,hadoop中只有一個作業隊列,被提交的作業按照先后順序在作業隊列中排隊,新來的作業插入到隊尾。一個作業運行完后,總是從隊首取下一個作業運行。這種調度策略的優點是簡單、易於實現,同時也減輕了jobtracker的負擔。但是它的缺點也是顯然的,它對所有的作業都一視同仁,沒有考慮到作業的緊迫程度,另外對小作業的運行不利。
公平調度算法:
這種策略在系統中配置了任務槽,一個任務槽可以運行一個task任務,這些任務就是一個大的作業被切分后的小作業。當一個用戶提交多個作業時,每個作業可以分配到一定的任務槽以執行task任務(這里的任務槽可以理解為可以運行一個map任務或reduce任務)。如果把整個hadoop集群作業調度跟操作系統的作業調度相比,第一種FIFO就相當於操作系統中早期的單道批處理系統,系統中每個時刻只有一道作業在運行,而公平調度相當於多道批處理系統,它實現了同一個時刻多道作業同時運行。由於linux是多用戶的,若有多個用戶同時提交多個作業會怎樣?在這種策略中給每個用戶分配一個作業池,然后給每個作業池設置一個最小共享槽個數,什么是最小共享槽個數呢?先要理解一個最小什么意思,最小是指只要這個作業池需要,調度器應該確保能夠滿足這個作業池的最小任務槽數的需求,但是如何才能確保在它需要的時候就有空的任務槽,一種方法是固定分配一定數量的槽給作業池不動,這個數量至少是最小任務槽值,這樣只要在作業池需要的時候就分配給它就行了,但是這樣在這個作業池沒有用到這么多任務槽的時候會造成浪費,這種策略實際上是這樣做的,當作業池的需求沒有達到最小任務槽數時,名義上是自己的剩余的任務槽會被分給其他有需要的作業池,當一個作業池需要申請任務槽的時候若系統中沒有了,這時候不會去搶占別人的(也不知道搶誰的啊),只要當前一個空的任務槽釋放會被立即分配給這個作業池。在一個用戶的作業池內,多個作業如何分配槽這個可以自行選擇了,如FIFO。所以這種調度策略分為兩級:
第一級,在池間分配槽,在多用戶的情況下,每個用戶分配一個作業池。
第二級,在作業池內,每個用戶可以使用不同的調度策略。計算能力調度:計算能力調度和公平調度有點類似,公平調度策略是以作業池為單位分配任務槽,而計算能力調度是以隊列為單位分配tasktracker(集群中一個節點),這種調度策略配置了多個隊列,每個隊列配置了最小額度的tasktracker數量,同公平調度策略類似,當一個隊列有空閑的tasktracker時,調度器會將空閑的分配給其他的隊列,當有空閑的tasktracker時,由於這時候可能有多個隊列沒有得到最小額度的tasktracker而又在申請新的,空閑的tasktracker會被優先分配到最飢餓的隊列中去,如何衡量飢餓程度呢?可以通過計算隊列中正在運行的任務數與其分得的計算資源之間的比值是否最低來判斷的,越低說明飢餓程度越高。
計算能力調度策略是以隊列的方式組織作業的,所以一個用戶的作業可能在多個隊列中,如果不對用戶做一定的限制,很可能出現在多個用戶之間出現嚴重不公平的現象。所以在選中新作業運行時候,還需要考慮作業所屬的用戶是否超過了資源的限制,如果超過,作業不會被選中。
對於在同一個隊列中,這種策略使用的是基於優先級的FIFO策略,但是不會搶占。
-
集群內每個節點都應該配 RAID,這樣避免單磁盤損壞,影響整個節點運行。(錯誤 )
hadoop 本身就具有冗余能力,所以如果不是很嚴格不需要都配備 RAID。
磁盤陣列(Redundant Arrays of Independent Disks,RAID),有“獨立磁盤構成的具有冗余能力的陣列”之意。磁盤陣列是由很多價格較便宜的磁盤,組合成一個容量巨大的磁盤組,利用個別磁盤提供數據所產生加成效果提升整個磁盤系統效能。利用這項技術,將數據切割成許多區段,分別存放在各個硬盤上。磁盤陣列還能利用同位檢查(Parity Check)的觀念,在數組中任意一個硬盤故障時,仍可讀出數據,在數據重構時,將數據經計算后重新置入新硬盤中。
-
因為HDFS有多個副本,所以namenode不存在單點問題。(錯誤)
查看1 -
每個 map 槽就是一個線程。(錯誤)
map 槽---->map slot。(org.apache.hadoop.mapred.TaskTracker.TaskLaucher.numFreeSlots)是一個邏輯值,而不是對應着一個縣城或者進程。
-
Mapreduce 的 input split 就是一個 block。(錯誤)
InputFormat的數據划分、split調度、數據讀取三個問題的淺析www.aboutyun.com/thread-6803-1-1.html -
Hadoop 環境變量中的 HADOOP_HEAPSIZE 用於設置所有 Hadoop 守護線程的內存。它默認是 200 GB。(錯誤)
hadoop 為各個守護進程(namenode,secondarynamenode,resourcemanager,datanode,nodemanager)統一分配的內存在 hadoop-env.sh 中設置,參數為 HADOOP_HEAPSIZE,默認為 1000M。
-
DataNode 首次加入cluster 的時候,如果log 中報告不兼容文件版本,那需要NameNode執行hdfs namenode -format操作格式化磁盤。(錯誤)
添加了一個新的標識符 ClusterID 用於標識集群中所有的節點。當格式化一個 Namenode,需要提供這個標識符或者自動生成。這個 ID 可以被用來格式化加入集群的其他 Namenode。
持續更新~~~~