1、hadoop的各種進程及其作用
NameNode:是hdfs的主服務器,管理文件系統的目錄樹以及對集群中存儲文件的訪問,保存有metadate,不斷讀取記錄集群中dataNode主機狀況和工作狀態。
SecondaryNameNode:NameNode的冷備,負責周期性的合并esimage以及editslog,將少NameNode的工作量。
DataNode:負責管理各個存儲節點,每個存儲數據的節點都有一個datanode守護進程。
DFSZKFailoverController:負責監控NameNode的狀態,并及時把信息狀態寫入zk,通過一個獨立的線程周期性的調用Namenode上的一個特定接口來獲取NameNode的健康狀態,也有選擇誰為Active的權利,但是最多只能有兩個namenode,所以選擇策略為先到先得。
QuorumPeerMain:zookeeper主進程
JournalNode:高可用情況下用于存放namenode的editlog文件(元數據),也是多節點高可用。
Fsimage:元數據鏡像文件(文件系統的目錄樹)。Edits:元數據的操作日志(針對文件系統做的修改操作記錄。
editsLog:修改日志,當文件系統客戶端client進行寫操作的時候,我們就要把著條記錄放在修改日志中,之后namenode修改內存中的數據結構,每次寫操作執行之前,editsLog都會同步到文件系統中
2、mapreduce
Combiner:是一個特殊的reduce,是一個在map端執行的reducer,能夠減少I/O操作,降低reducer端的負荷,也就是map端的聚合操作。
3、yarn
ResourceManager(JobTracker):負責調度DataManager上的資源,每個DataNode都有一個NodeManager(TaskTracker)來執行實際工作
NodeManager:管理slave節點的資源
ApplicationMaster:用于調度任務,任何要在yarn上啟動的作業類型,必須有一個。
工作流程:客戶端發送請求到資源管理器ResourceManager,所有的NodeManager向資源管理器進行反饋節點狀態,ResourceManager向資源比較空閑的NodeManager發送任務,NodeManager創建appMaster(ApplicationMaster),任務節點的appMaster向ResourceManager申請資源,ResourceManager會在其他的節點開辟新的資源環境(spark中是executor)。計算的結果反饋給AppMaster然后由appMaster向ResourceManager反饋處理的數據結果,就明確哪些節點有資源可用了,接下里就可以派發任務了。
hadoop調度機制
默認的調度起FIFO:先進先出
計算能力調度器Capacity Scheduler:支持多個隊列,每個隊列可以配置一定的資源,每個隊列采用FIFO調度策略,會對同意用戶提交的作業所占資源進行限定以防止一個用戶作業獨占隊列的資源。計算每個隊列中正在運行的任務數與其應該分配得到的計算資源之間的比值,選擇一個比值最小的隊列,然后按照作業優先級和提交時間順序選擇,同時考慮用戶資源量限制和內存的限制。
公平調度起FairScheuler:支持多個隊列多個用戶,每個隊列資源可配置,每個隊列中的作業公平共享隊列中的所有資源。
4、hadoop操作命令
hadoop dfsadmin -report 查看hdfs集群的存儲空間使用情況。
hadoop fs -du?-h 目錄 ? 查看當前目錄下各個文件占得內存 ? ?詳細說明
Hadoop fs –rmr /tmp/aaa刪除一個目錄
Hadoop fs –put文件hdfs文件目錄上傳一個文件
Hadoop fs –get hdfs文件下載地址目錄下載一個文件
Hadoop fs –moveFromLocal文件hdfs文件目錄上傳一個文件同時刪除本地文件
Haddop fs –text hdfs目錄查看文件內容
Haddopfs –cat hdfs目錄查看文件內容
Hadoop job –list獲取任務列表
Hadoop job –kill job-id殺死一個job
Hadoop-daemon.sh start datanoe加入一個新的節點
Hadoop mradmin/dfsadmin –refreshnones刪除一個節點
yarn application -kill application_任務id:停止在yarn上運行的spark任務,在resourcemanager上執行
5、Hbase存儲流程
一個region由多個store組成,每個store中包含一個列蔟的所有數據。Store包括位于內存中的memstore和位于硬盤的storefile。
寫數據的時候,先寫入memstore,當memstore中的數據達到某個閥值的時候,HRegionServer會啟動flushCache進程將數據寫入到一個新的storefile,而當storefile文件的數量增長到一定程度的時候,系統會將storefile進行合并,進行版本合并以及刪除操作,形成更大的storefile。而當storefile文件不斷合并,數據量再次超過一定閥值的時候,就會將region分割為兩個region,并有HMaster分配到響應的region服務器,實現了負載均衡。
客戶端在檢索數據的時候,現在memstore中找數據,沒有的話再尋找storefile。
Hbase適用于比較成熟的數據分析主題,查詢模式已經確立,并且不會輕易改變,傳統的關系型數據庫已經無法承受負荷,高速插入和大量的讀取。適合海量的同時也是簡單的查詢操作,比如keyvalue形式。
Family數量選擇:如果是離線應用,寫操作比較多,那么盡量使用一個family,因為當一個family達到flush條件的時候,該region會出發所有family所屬的memstore進行flush,即使其他memstore數據很少也會flush而聲稱小文件,容易增加compaction發生的幾率,而compaction是一region為單位的,很容易導致降低系統的整體吞吐率。但是如果使在線應用則可以根據實際情況多設置family,每次讀取數據不用加載多有family,io更少,并且多個family導致數據被分配到多個hfile中,減少了split發生的幾率,會讓系統提供更加穩定的在線服務。
6、Spark各個進程以及作用
Master進程:管理整個集群資源,Yarn中為ResouceManager
Worker進程:負責管理本節點的資源,定期向Master匯報心跳,接收Master的命令,啟動Executor。Yarn中為NodeManager
client:客戶端進程,負責提交作業到Master。在yarn-cluster模式中,在Resource Manager端提交應用程序,會生成SparkSubmit進程,該進程只用來做Client端,應用程序提交給集群后,就會刪除該進程。
Application:基于spark的用戶程序,包含了driver程序和集群上的executor
Driver:一個Spark作業運行時包括一個Driver進程,也是作業的主進程,負責作業代碼的解析、生成Stage并調度Task到Executor上。包括DAGScheduler,TaskScheduler。在yarn-cluster模式中,resourcemanager會選取一個nonemanager上運行applicationManager,該AM會同時運行著Driver。
ClusterManager:在集群上獲取資源的外部服務(如standalone、yarn)
Executor:在worker上為某個應用啟動的一個進程,負責接收taskSet,運行任務,以及將數據存儲到內存或者是磁盤上,每個應用都有自己獨立的executors。
Task:被送到某個executor上的工作節點
Job:和spark的action對應,包含很多任務的并行計算
Stage:一個job被拆分為多組任務,每組任務被稱為stage
DAGScheduler:基于stage構建DAG,決定每個任務的最佳位置;記錄哪個RDD或者stage需要物化;將taskset(一組task)傳給底層調度起TaskScheduler;重新提交shuffle輸出丟失的stage
TaskScheduler:提交taskset到集群運行并匯報結果;出現shuffle輸出lost要報告fetch
sparkContext:整個應用的上下文,控制應用的生命周期
SparkConf:負責存儲配置信息
failed錯誤;碰到straggle任務需要放到別的節點上重試;為每一個taskset維護一個taskSetmanager(追蹤本地性及錯誤信息)
7、Flume進程以及作用
Agent:是一個java進程,運行在日志收集節點,包括sorce、channle、sink組件
Source:用于收集日志,可以處理各種格式的日志數據,包括:avro/thrigt/exec/jms/spooling/directory/netcat/sequence
generator/syslog/http/legacy/自定義,收集之后存放在channel中
Channel:用于臨時存儲數據,可以放在memory/jdbc/file/自定義中,channel中的數據只有sink發送成功之后才會被刪除
Sink:用于將數據發送到目的地,目的地包括hdfs/logger/avro/thrigt/ipc/file/null/hbase/solr/自定義
在整個數據傳輸過程中流動的是event,事務保證是在event級別。
8、Hbase進程以及作用
Client:包含訪問hbase的接口并維護cache來加快對hbase的訪問
Zookeeper:保證Master的唯一性,存儲Region的尋址入口,實時監控RegionServer的上線和下線信息,并實時通知Master、存儲Hbase的schema和table的元數據
HMaster:為RegionServer分配region、負責RegionServer的負載均衡、發現實效的RegionServer并重新分配其上的region、管理永輝對table的增刪改查。
HRegionServer:維護region并處理對這些region的IO請求,負責切分在運行過程中變大的region。
9、kafka進程機器作用
Producer:生產者
Consumer:消費者
Broker:kafka集群的server,負責處理消息讀寫請求,存儲消息
Topic:消息隊列、分類
Queue:里邊有生產者消費者模型
10、spark中client和cluster的區別和作用
(1)client
Driver運行在客戶端(啟動在本地機器上)。
這里Driver會負責所有任務的調度,頻繁與集群上的多個executor通信(task啟動消息、執行統計消息、運行狀態、shuffle輸出結果等),頻繁大量的通信(一般情況本地機器與集群不在一個機房),會導致本地通信負載高。但是所有的日志都會在本地機器上看到,適合做測試時候使用。
Spark-Standlone-Client
客戶端啟動后直接運行程序啟動Driver相關工作:DAGScheduler和BlockManagerMaster等。客戶端的Driver向Master注冊。Master會讓Worker啟動Executor,Worker創建一個ExecutorRunner線程,executorRunner會啟動ExecutorBackend進程。ExecutorBackend啟動后向Driver的ExecutorBackend注冊,Driver的DAGScheduler解析作業并生成相應的Stage,每個Stage包含的task通過taskScheduler分配給executor執行。最后所有的stage執行完之后作業結束
Spark-Yarn-Client
本地機器提交Application到ResourceManager,會直接在本地機器啟動Driver程序,RM在資源充足的一臺NodeManager啟動ApplicationMaster,之后AM向RM申請executor,RM根據各個節點的資源情況分配container,并告知AM,各個NodeManager啟動executor,啟動之后各個NodeManager向Driver反向注冊,這時候Driver就知道自己有哪些資源可以使用了,然后就可以執行job、拆分stage等的計算任務了。
感覺ApplicationMaster除了申請executor沒有其他作用了。
(2)cluster
Driver執行在任務節點(在其中一臺NodeManager,和ApplicationMaster運行在一起)
Spark-Standlone-Cluster
作業提交給Master,Master讓一個worker啟動Driver(SchedulerBackend),創建一個DriverRunner線程,啟動SchedulerBackend進程。Master會讓其他worker啟動Executor(ExecutorBackend)創建一個ExecutorRunner線程,啟動ExecutorBackend進程。ExecutorBackend啟動之后向Driver的SchedulerBackend注冊,SchedulerBackend進程中包含DAGScheduler,它會根據用戶程序生成執行計劃并調度執行。對每個stage的task都會存放到taskScheduler中,當executorScheduler向SchedulerBackend匯報的時候吧taskScheduler中的task調度到executorBackend執行。最后所有的stage運行完之后作業結束。
Spark-Yarn-Cluster
本地機器提交Application到ResourceManager,RM在資源充足的一臺NodeManager啟動ApplicationMaster,Driver與其一同啟動,之后向RM申請executor,RM根據各個節點的資源情況分配container,并告知AM,ApplicationManager向各個NodeManager啟動executor,啟動之后各個NodeManager向AM反向注冊,這時候ApplicationManager(Driver)就知道自己有哪些資源可以使用了,然后就可以執行job、拆分stage等的計算任務了。
(3)注意點
Standlone模式下,application的注冊(executor的申請)以及任務調度都是由driver來的。
spark on yarn模式下,application的注冊(executor的申請)由AM進行,任務調度由Driver,是分離開來的
11、HDFS讀寫流程
(1)HDFS讀流程:
第一步:客戶端通過Distributed file system的api的open方法;
第二步:open方法發送請求到namenode,獲得Block的位置信息(位置信息只有元數據才知道),將block的全部位置信息返還給客戶端;
第三步:客戶端收到block位置后開始讀取,通過FSDataInputStream著api中的read方法讀取;
第四步:通過FSDataInputStream著api進行并發的讀取各個block,也就是一起讀,在讀的過程中只讀其中的一個副本就可以類,優先讀取離同一個機架;
第五步:關閉,并在客戶端形成一個統一的文件。
(2)HDFS寫流程
第一步:客戶端通過調用Distributed File System的api的create方法可以取創建一個文件;
第二步:Nameode可以接受到你的文件名是什么,文件大小用戶是誰,namenode確定block的數量以及需要存放的datenode;
第三步:客戶端開始讀數據,通過FSDataInputStream的write方法進行寫;
第四步:著方法只將一個block寫到databode上,由當前的datanode去創建一個線程,往其他的datanode上按照當前的副本規則取復制其他副本;
第五步:返回一個回饋信息,表示上傳完成
第六步:關閉,并匯報給namenode一個上傳完畢的信息
12、spark on yarn和mapreduce on?yarn區別
(1)mapreduce使用多進程來運行多個獨立task,方便細粒度空值每個任務占用的資源,但會消耗更多啟動時間,不適合運行低延遲類型作業;spark使用多個executor進程,每個中用多個task線程運行,適合低延遲類型作業。
(2)spark有利于內存共享,所有任務運行在一個進程中,適合內存密集型任務(如需要加載大量詞典的應用程序),executor申請的資源可被多批任務重復使用。Mapreduce每個task單獨申請資源用完后釋放,2.0沒有支持jvm重用功能。
(3)spark會導致嚴重的資源爭用,難以細粒度控制每個任務的資源量,而mapreduce控制資源占用量有利于大作業平穩運行。
(4)mapreduce:每個task運行在一個獨立jvm進程中;支持內存、cpu兩種資源的調配;task運行完就釋放資源
(5)spark:每個節點運行一個或多個executor服務,每個executor配有一定數量的slot,表示該executor可以同時運行多少個shufflemaptask或者reduceTask。每個executor運行在一個jvm進程中,每個task是運行在executor中的一個子進程;同一個executor內部的task共享內存(比如廣播變量),executor一旦啟動將一直運行,資源一直被task復用,知道spark程序運行完成才釋放退出。