1灾杰、hadoop的各種進(jìn)程及其作用
NameNode:是hdfs的主服務(wù)器,管理文件系統(tǒng)的目錄樹以及對(duì)集群中存儲(chǔ)文件的訪問熙参,保存有metadate艳吠,不斷讀取記錄集群中dataNode主機(jī)狀況和工作狀態(tài)。
SecondaryNameNode:NameNode的冷備孽椰,負(fù)責(zé)周期性的合并esimage以及editslog昭娩,將少NameNode的工作量。
DataNode:負(fù)責(zé)管理各個(gè)存儲(chǔ)節(jié)點(diǎn)黍匾,每個(gè)存儲(chǔ)數(shù)據(jù)的節(jié)點(diǎn)都有一個(gè)datanode守護(hù)進(jìn)程栏渺。
DFSZKFailoverController:負(fù)責(zé)監(jiān)控NameNode的狀態(tài),并及時(shí)把信息狀態(tài)寫入zk锐涯,通過一個(gè)獨(dú)立的線程周期性的調(diào)用Namenode上的一個(gè)特定接口來(lái)獲取NameNode的健康狀態(tài)磕诊,也有選擇誰(shuí)為Active的權(quán)利,但是最多只能有兩個(gè)namenode纹腌,所以選擇策略為先到先得霎终。
QuorumPeerMain:zookeeper主進(jìn)程
JournalNode:高可用情況下用于存放namenode的editlog文件(元數(shù)據(jù)),也是多節(jié)點(diǎn)高可用升薯。
Fsimage:元數(shù)據(jù)鏡像文件(文件系統(tǒng)的目錄樹)莱褒。Edits:元數(shù)據(jù)的操作日志(針對(duì)文件系統(tǒng)做的修改操作記錄。
editsLog:修改日志涎劈,當(dāng)文件系統(tǒng)客戶端client進(jìn)行寫操作的時(shí)候保礼,我們就要把著條記錄放在修改日志中,之后namenode修改內(nèi)存中的數(shù)據(jù)結(jié)構(gòu)责语,每次寫操作執(zhí)行之前,editsLog都會(huì)同步到文件系統(tǒng)中
2目派、mapreduce
Combiner:是一個(gè)特殊的reduce坤候,是一個(gè)在map端執(zhí)行的reducer,能夠減少I/O操作企蹭,降低reducer端的負(fù)荷白筹,也就是map端的聚合操作。
3谅摄、yarn
ResourceManager(JobTracker):負(fù)責(zé)調(diào)度DataManager上的資源徒河,每個(gè)DataNode都有一個(gè)NodeManager(TaskTracker)來(lái)執(zhí)行實(shí)際工作
NodeManager:管理slave節(jié)點(diǎn)的資源
ApplicationMaster:用于調(diào)度任務(wù),任何要在yarn上啟動(dòng)的作業(yè)類型送漠,必須有一個(gè)顽照。
工作流程:客戶端發(fā)送請(qǐng)求到資源管理器ResourceManager,所有的NodeManager向資源管理器進(jìn)行反饋節(jié)點(diǎn)狀態(tài),ResourceManager向資源比較空閑的NodeManager發(fā)送任務(wù)代兵,NodeManager創(chuàng)建appMaster(ApplicationMaster)尼酿,任務(wù)節(jié)點(diǎn)的appMaster向ResourceManager申請(qǐng)資源,ResourceManager會(huì)在其他的節(jié)點(diǎn)開辟新的資源環(huán)境(spark中是executor)植影。計(jì)算的結(jié)果反饋給AppMaster然后由appMaster向ResourceManager反饋處理的數(shù)據(jù)結(jié)果裳擎,就明確哪些節(jié)點(diǎn)有資源可用了,接下里就可以派發(fā)任務(wù)了思币。
hadoop調(diào)度機(jī)制
默認(rèn)的調(diào)度起FIFO:先進(jìn)先出
計(jì)算能力調(diào)度器Capacity Scheduler:支持多個(gè)隊(duì)列鹿响,每個(gè)隊(duì)列可以配置一定的資源,每個(gè)隊(duì)列采用FIFO調(diào)度策略谷饿,會(huì)對(duì)同意用戶提交的作業(yè)所占資源進(jìn)行限定以防止一個(gè)用戶作業(yè)獨(dú)占隊(duì)列的資源惶我。計(jì)算每個(gè)隊(duì)列中正在運(yùn)行的任務(wù)數(shù)與其應(yīng)該分配得到的計(jì)算資源之間的比值,選擇一個(gè)比值最小的隊(duì)列各墨,然后按照作業(yè)優(yōu)先級(jí)和提交時(shí)間順序選擇指孤,同時(shí)考慮用戶資源量限制和內(nèi)存的限制。
公平調(diào)度起FairScheuler:支持多個(gè)隊(duì)列多個(gè)用戶贬堵,每個(gè)隊(duì)列資源可配置恃轩,每個(gè)隊(duì)列中的作業(yè)公平共享隊(duì)列中的所有資源。
4黎做、hadoop操作命令
hadoop dfsadmin -report 查看hdfs集群的存儲(chǔ)空間使用情況叉跛。
hadoop fs -du?-h 目錄 ? 查看當(dāng)前目錄下各個(gè)文件占得內(nèi)存 ? ?詳細(xì)說(shuō)明
Hadoop fs –rmr /tmp/aaa刪除一個(gè)目錄
Hadoop fs –put文件hdfs文件目錄上傳一個(gè)文件
Hadoop fs –get hdfs文件下載地址目錄下載一個(gè)文件
Hadoop fs –moveFromLocal文件hdfs文件目錄上傳一個(gè)文件同時(shí)刪除本地文件
Haddop fs –text hdfs目錄查看文件內(nèi)容
Haddopfs –cat hdfs目錄查看文件內(nèi)容
Hadoop job –list獲取任務(wù)列表
Hadoop job –kill job-id殺死一個(gè)job
Hadoop-daemon.sh start datanoe加入一個(gè)新的節(jié)點(diǎn)
Hadoop mradmin/dfsadmin –refreshnones刪除一個(gè)節(jié)點(diǎn)
yarn application -kill application_任務(wù)id:停止在yarn上運(yùn)行的spark任務(wù),在resourcemanager上執(zhí)行
5蒸殿、Hbase存儲(chǔ)流程
一個(gè)region由多個(gè)store組成筷厘,每個(gè)store中包含一個(gè)列蔟的所有數(shù)據(jù)。Store包括位于內(nèi)存中的memstore和位于硬盤的storefile宏所。
寫數(shù)據(jù)的時(shí)候酥艳,先寫入memstore,當(dāng)memstore中的數(shù)據(jù)達(dá)到某個(gè)閥值的時(shí)候爬骤,HRegionServer會(huì)啟動(dòng)flushCache進(jìn)程將數(shù)據(jù)寫入到一個(gè)新的storefile充石,而當(dāng)storefile文件的數(shù)量增長(zhǎng)到一定程度的時(shí)候,系統(tǒng)會(huì)將storefile進(jìn)行合并霞玄,進(jìn)行版本合并以及刪除操作骤铃,形成更大的storefile。而當(dāng)storefile文件不斷合并坷剧,數(shù)據(jù)量再次超過一定閥值的時(shí)候惰爬,就會(huì)將region分割為兩個(gè)region,并有HMaster分配到響應(yīng)的region服務(wù)器惫企,實(shí)現(xiàn)了負(fù)載均衡撕瞧。
客戶端在檢索數(shù)據(jù)的時(shí)候,現(xiàn)在memstore中找數(shù)據(jù)莫辨,沒有的話再尋找storefile萎羔。
Hbase適用于比較成熟的數(shù)據(jù)分析主題溶弟,查詢模式已經(jīng)確立肠骆,并且不會(huì)輕易改變键耕,傳統(tǒng)的關(guān)系型數(shù)據(jù)庫(kù)已經(jīng)無(wú)法承受負(fù)荷携御,高速插入和大量的讀取搂抒。適合海量的同時(shí)也是簡(jiǎn)單的查詢操作姑宽,比如keyvalue形式寇漫。
Family數(shù)量選擇:如果是離線應(yīng)用刊殉,寫操作比較多,那么盡量使用一個(gè)family州胳,因?yàn)楫?dāng)一個(gè)family達(dá)到flush條件的時(shí)候记焊,該region會(huì)出發(fā)所有family所屬的memstore進(jìn)行flush,即使其他memstore數(shù)據(jù)很少也會(huì)flush而聲稱小文件栓撞,容易增加compaction發(fā)生的幾率遍膜,而compaction是一region為單位的,很容易導(dǎo)致降低系統(tǒng)的整體吞吐率瓤湘。但是如果使在線應(yīng)用則可以根據(jù)實(shí)際情況多設(shè)置family瓢颅,每次讀取數(shù)據(jù)不用加載多有family,io更少弛说,并且多個(gè)family導(dǎo)致數(shù)據(jù)被分配到多個(gè)hfile中挽懦,減少了split發(fā)生的幾率,會(huì)讓系統(tǒng)提供更加穩(wěn)定的在線服務(wù)木人。
6信柿、Spark各個(gè)進(jìn)程以及作用
Master進(jìn)程:管理整個(gè)集群資源,Yarn中為ResouceManager
Worker進(jìn)程:負(fù)責(zé)管理本節(jié)點(diǎn)的資源醒第,定期向Master匯報(bào)心跳渔嚷,接收Master的命令,啟動(dòng)Executor稠曼。Yarn中為NodeManager
client:客戶端進(jìn)程形病,負(fù)責(zé)提交作業(yè)到Master。在yarn-cluster模式中蒲列,在Resource Manager端提交應(yīng)用程序,會(huì)生成SparkSubmit進(jìn)程搀罢,該進(jìn)程只用來(lái)做Client端蝗岖,應(yīng)用程序提交給集群后,就會(huì)刪除該進(jìn)程榔至。
Application:基于spark的用戶程序抵赢,包含了driver程序和集群上的executor
Driver:一個(gè)Spark作業(yè)運(yùn)行時(shí)包括一個(gè)Driver進(jìn)程,也是作業(yè)的主進(jìn)程,負(fù)責(zé)作業(yè)代碼的解析铅鲤、生成Stage并調(diào)度Task到Executor上划提。包括DAGScheduler,TaskScheduler邢享。在yarn-cluster模式中鹏往,resourcemanager會(huì)選取一個(gè)nonemanager上運(yùn)行applicationManager,該AM會(huì)同時(shí)運(yùn)行著Driver骇塘。
ClusterManager:在集群上獲取資源的外部服務(wù)(如standalone伊履、yarn)
Executor:在worker上為某個(gè)應(yīng)用啟動(dòng)的一個(gè)進(jìn)程,負(fù)責(zé)接收taskSet款违,運(yùn)行任務(wù)唐瀑,以及將數(shù)據(jù)存儲(chǔ)到內(nèi)存或者是磁盤上,每個(gè)應(yīng)用都有自己獨(dú)立的executors插爹。
Task:被送到某個(gè)executor上的工作節(jié)點(diǎn)
Job:和spark的action對(duì)應(yīng)哄辣,包含很多任務(wù)的并行計(jì)算
Stage:一個(gè)job被拆分為多組任務(wù),每組任務(wù)被稱為stage
DAGScheduler:基于stage構(gòu)建DAG赠尾,決定每個(gè)任務(wù)的最佳位置力穗;記錄哪個(gè)RDD或者stage需要物化;將taskset(一組task)傳給底層調(diào)度起TaskScheduler萍虽;重新提交shuffle輸出丟失的stage
TaskScheduler:提交taskset到集群運(yùn)行并匯報(bào)結(jié)果睛廊;出現(xiàn)shuffle輸出lost要報(bào)告fetch
sparkContext:整個(gè)應(yīng)用的上下文,控制應(yīng)用的生命周期
SparkConf:負(fù)責(zé)存儲(chǔ)配置信息
failed錯(cuò)誤杉编;碰到straggle任務(wù)需要放到別的節(jié)點(diǎn)上重試超全;為每一個(gè)taskset維護(hù)一個(gè)taskSetmanager(追蹤本地性及錯(cuò)誤信息)
7、Flume進(jìn)程以及作用
Agent:是一個(gè)java進(jìn)程邓馒,運(yùn)行在日志收集節(jié)點(diǎn)嘶朱,包括sorce、channle光酣、sink組件
Source:用于收集日志疏遏,可以處理各種格式的日志數(shù)據(jù),包括:avro/thrigt/exec/jms/spooling/directory/netcat/sequence
generator/syslog/http/legacy/自定義救军,收集之后存放在channel中
Channel:用于臨時(shí)存儲(chǔ)數(shù)據(jù)财异,可以放在memory/jdbc/file/自定義中,channel中的數(shù)據(jù)只有sink發(fā)送成功之后才會(huì)被刪除
Sink:用于將數(shù)據(jù)發(fā)送到目的地唱遭,目的地包括hdfs/logger/avro/thrigt/ipc/file/null/hbase/solr/自定義
在整個(gè)數(shù)據(jù)傳輸過程中流動(dòng)的是event戳寸,事務(wù)保證是在event級(jí)別。
8拷泽、Hbase進(jìn)程以及作用
Client:包含訪問hbase的接口并維護(hù)cache來(lái)加快對(duì)hbase的訪問
Zookeeper:保證Master的唯一性疫鹊,存儲(chǔ)Region的尋址入口袖瞻,實(shí)時(shí)監(jiān)控RegionServer的上線和下線信息,并實(shí)時(shí)通知Master拆吆、存儲(chǔ)Hbase的schema和table的元數(shù)據(jù)
HMaster:為RegionServer分配region聋迎、負(fù)責(zé)RegionServer的負(fù)載均衡、發(fā)現(xiàn)實(shí)效的RegionServer并重新分配其上的region枣耀、管理永輝對(duì)table的增刪改查霉晕。
HRegionServer:維護(hù)region并處理對(duì)這些region的IO請(qǐng)求,負(fù)責(zé)切分在運(yùn)行過程中變大的region奕枢。
9娄昆、kafka進(jìn)程機(jī)器作用
Producer:生產(chǎn)者
Consumer:消費(fèi)者
Broker:kafka集群的server,負(fù)責(zé)處理消息讀寫請(qǐng)求缝彬,存儲(chǔ)消息
Topic:消息隊(duì)列萌焰、分類
Queue:里邊有生產(chǎn)者消費(fèi)者模型
10、spark中client和cluster的區(qū)別和作用
(1)client
Driver運(yùn)行在客戶端(啟動(dòng)在本地機(jī)器上)谷浅。
這里Driver會(huì)負(fù)責(zé)所有任務(wù)的調(diào)度扒俯,頻繁與集群上的多個(gè)executor通信(task啟動(dòng)消息、執(zhí)行統(tǒng)計(jì)消息一疯、運(yùn)行狀態(tài)撼玄、shuffle輸出結(jié)果等),頻繁大量的通信(一般情況本地機(jī)器與集群不在一個(gè)機(jī)房)墩邀,會(huì)導(dǎo)致本地通信負(fù)載高掌猛。但是所有的日志都會(huì)在本地機(jī)器上看到,適合做測(cè)試時(shí)候使用眉睹。
Spark-Standlone-Client
客戶端啟動(dòng)后直接運(yùn)行程序啟動(dòng)Driver相關(guān)工作:DAGScheduler和BlockManagerMaster等荔茬。客戶端的Driver向Master注冊(cè)竹海。Master會(huì)讓W(xué)orker啟動(dòng)Executor慕蔚,Worker創(chuàng)建一個(gè)ExecutorRunner線程,executorRunner會(huì)啟動(dòng)ExecutorBackend進(jìn)程斋配。ExecutorBackend啟動(dòng)后向Driver的ExecutorBackend注冊(cè)孔飒,Driver的DAGScheduler解析作業(yè)并生成相應(yīng)的Stage,每個(gè)Stage包含的task通過taskScheduler分配給executor執(zhí)行艰争。最后所有的stage執(zhí)行完之后作業(yè)結(jié)束
Spark-Yarn-Client
本地機(jī)器提交Application到ResourceManager坏瞄,會(huì)直接在本地機(jī)器啟動(dòng)Driver程序,RM在資源充足的一臺(tái)NodeManager啟動(dòng)ApplicationMaster甩卓,之后AM向RM申請(qǐng)executor鸠匀,RM根據(jù)各個(gè)節(jié)點(diǎn)的資源情況分配container,并告知AM猛频,各個(gè)NodeManager啟動(dòng)executor狮崩,啟動(dòng)之后各個(gè)NodeManager向Driver反向注冊(cè),這時(shí)候Driver就知道自己有哪些資源可以使用了鹿寻,然后就可以執(zhí)行job睦柴、拆分stage等的計(jì)算任務(wù)了。
感覺ApplicationMaster除了申請(qǐng)executor沒有其他作用了毡熏。
(2)cluster
Driver執(zhí)行在任務(wù)節(jié)點(diǎn)(在其中一臺(tái)NodeManager坦敌,和ApplicationMaster運(yùn)行在一起)
Spark-Standlone-Cluster
作業(yè)提交給Master,Master讓一個(gè)worker啟動(dòng)Driver(SchedulerBackend)痢法,創(chuàng)建一個(gè)DriverRunner線程狱窘,啟動(dòng)SchedulerBackend進(jìn)程。Master會(huì)讓其他worker啟動(dòng)Executor(ExecutorBackend)創(chuàng)建一個(gè)ExecutorRunner線程财搁,啟動(dòng)ExecutorBackend進(jìn)程蘸炸。ExecutorBackend啟動(dòng)之后向Driver的SchedulerBackend注冊(cè),SchedulerBackend進(jìn)程中包含DAGScheduler尖奔,它會(huì)根據(jù)用戶程序生成執(zhí)行計(jì)劃并調(diào)度執(zhí)行搭儒。對(duì)每個(gè)stage的task都會(huì)存放到taskScheduler中,當(dāng)executorScheduler向SchedulerBackend匯報(bào)的時(shí)候吧taskScheduler中的task調(diào)度到executorBackend執(zhí)行提茁。最后所有的stage運(yùn)行完之后作業(yè)結(jié)束淹禾。
Spark-Yarn-Cluster
本地機(jī)器提交Application到ResourceManager,RM在資源充足的一臺(tái)NodeManager啟動(dòng)ApplicationMaster茴扁,Driver與其一同啟動(dòng)铃岔,之后向RM申請(qǐng)executor,RM根據(jù)各個(gè)節(jié)點(diǎn)的資源情況分配container峭火,并告知AM毁习,ApplicationManager向各個(gè)NodeManager啟動(dòng)executor,啟動(dòng)之后各個(gè)NodeManager向AM反向注冊(cè)躲胳,這時(shí)候ApplicationManager(Driver)就知道自己有哪些資源可以使用了蜓洪,然后就可以執(zhí)行job、拆分stage等的計(jì)算任務(wù)了坯苹。
(3)注意點(diǎn)
Standlone模式下隆檀,application的注冊(cè)(executor的申請(qǐng))以及任務(wù)調(diào)度都是由driver來(lái)的。
spark on yarn模式下粹湃,application的注冊(cè)(executor的申請(qǐng))由AM進(jìn)行恐仑,任務(wù)調(diào)度由Driver,是分離開來(lái)的
11为鳄、HDFS讀寫流程
(1)HDFS讀流程:
第一步:客戶端通過Distributed file system的api的open方法裳仆;
第二步:open方法發(fā)送請(qǐng)求到namenode,獲得Block的位置信息(位置信息只有元數(shù)據(jù)才知道)孤钦,將block的全部位置信息返還給客戶端歧斟;
第三步:客戶端收到block位置后開始讀取纯丸,通過FSDataInputStream著api中的read方法讀取静袖;
第四步:通過FSDataInputStream著api進(jìn)行并發(fā)的讀取各個(gè)block觉鼻,也就是一起讀,在讀的過程中只讀其中的一個(gè)副本就可以類队橙,優(yōu)先讀取離同一個(gè)機(jī)架坠陈;
第五步:關(guān)閉,并在客戶端形成一個(gè)統(tǒng)一的文件捐康。
(2)HDFS寫流程
第一步:客戶端通過調(diào)用Distributed File System的api的create方法可以取創(chuàng)建一個(gè)文件仇矾;
第二步:Nameode可以接受到你的文件名是什么,文件大小用戶是誰(shuí)解总,namenode確定block的數(shù)量以及需要存放的datenode贮匕;
第三步:客戶端開始讀數(shù)據(jù),通過FSDataInputStream的write方法進(jìn)行寫花枫;
第四步:著方法只將一個(gè)block寫到databode上粗合,由當(dāng)前的datanode去創(chuàng)建一個(gè)線程,往其他的datanode上按照當(dāng)前的副本規(guī)則取復(fù)制其他副本乌昔;
第五步:返回一個(gè)回饋信息隙疚,表示上傳完成
第六步:關(guān)閉,并匯報(bào)給namenode一個(gè)上傳完畢的信息
12磕道、spark on yarn和mapreduce on?yarn區(qū)別
(1)mapreduce使用多進(jìn)程來(lái)運(yùn)行多個(gè)獨(dú)立task供屉,方便細(xì)粒度空值每個(gè)任務(wù)占用的資源,但會(huì)消耗更多啟動(dòng)時(shí)間溺蕉,不適合運(yùn)行低延遲類型作業(yè)伶丐;spark使用多個(gè)executor進(jìn)程,每個(gè)中用多個(gè)task線程運(yùn)行疯特,適合低延遲類型作業(yè)哗魂。
(2)spark有利于內(nèi)存共享,所有任務(wù)運(yùn)行在一個(gè)進(jìn)程中漓雅,適合內(nèi)存密集型任務(wù)(如需要加載大量詞典的應(yīng)用程序)录别,executor申請(qǐng)的資源可被多批任務(wù)重復(fù)使用。Mapreduce每個(gè)task單獨(dú)申請(qǐng)資源用完后釋放邻吞,2.0沒有支持jvm重用功能组题。
(3)spark會(huì)導(dǎo)致嚴(yán)重的資源爭(zhēng)用,難以細(xì)粒度控制每個(gè)任務(wù)的資源量抱冷,而mapreduce控制資源占用量有利于大作業(yè)平穩(wěn)運(yùn)行崔列。
(4)mapreduce:每個(gè)task運(yùn)行在一個(gè)獨(dú)立jvm進(jìn)程中;支持內(nèi)存旺遮、cpu兩種資源的調(diào)配赵讯;task運(yùn)行完就釋放資源
(5)spark:每個(gè)節(jié)點(diǎn)運(yùn)行一個(gè)或多個(gè)executor服務(wù)盈咳,每個(gè)executor配有一定數(shù)量的slot,表示該executor可以同時(shí)運(yùn)行多少個(gè)shufflemaptask或者reduceTask边翼。每個(gè)executor運(yùn)行在一個(gè)jvm進(jìn)程中猪贪,每個(gè)task是運(yùn)行在executor中的一個(gè)子進(jìn)程;同一個(gè)executor內(nèi)部的task共享內(nèi)存(比如廣播變量)讯私,executor一旦啟動(dòng)將一直運(yùn)行,資源一直被task復(fù)用西傀,知道spark程序運(yùn)行完成才釋放退出斤寇。