橙子建站客服電話2020 惠州seo服務(wù)
Hadoop是一個(gè)開(kāi)源的分布式離線數(shù)據(jù)處理框架,底層是用Java語(yǔ)言編寫的,包含了HDFS、MapReduce、Yarn三大部分。
組件 | 配置文件 | 啟動(dòng)進(jìn)程 | 備注 |
---|---|---|---|
Hadoop HDFS | 需修改 | 需啟動(dòng) NameNode(NN)作為主節(jié)點(diǎn) DataNode(DN)作為從節(jié)點(diǎn) SecondaryNameNode(SNN)主節(jié)點(diǎn)輔助 | 分布式文件系統(tǒng) |
Hadoop YARN | 需修改 | 需啟動(dòng) ResourceManager(RM)作為集群資源管理者 NodeManager(NM)作為單機(jī)資源管理者 ProxyServer代理服務(wù)器提供安全性 JobHistoryServer歷史服務(wù)器記錄歷史信息和日志 | 分布式資源調(diào)度 |
Hadoop MapReduce | 需修改 | 無(wú)需啟動(dòng)任何進(jìn)程 MapReduce程序運(yùn)行在YARN容器內(nèi) | 分布式數(shù)據(jù)計(jì)算 |
Hadoop集群 = HDFS集群 + YARN集群
圖中是三臺(tái)服務(wù)器,每個(gè)服務(wù)器上運(yùn)行相應(yīng)的JAVA進(jìn)程
HDFS集群對(duì)應(yīng)的web UI界面:
http://namenode_host:9870
(namenode_host是namenode運(yùn)行所在服務(wù)器的ip地址)
YARN集群對(duì)應(yīng)的web UI界面:http://resourcemanager_host:8088
(resourcemanager_host是resourcemanager運(yùn)行所在服務(wù)器的ip地址)
一、HDFS
1.1 HDFS簡(jiǎn)介
- HDFS的全稱為Hadoop Distributed File System,是用來(lái)解決大數(shù)據(jù)存儲(chǔ)問(wèn)題的,分布式說(shuō)明其是橫跨多臺(tái)服務(wù)器上的存儲(chǔ)系統(tǒng)
- HDFS使用多臺(tái)服務(wù)器存儲(chǔ)文件,提供統(tǒng)一的訪問(wèn)接口,使用戶像訪問(wèn)一個(gè)普通文件系統(tǒng)一樣使用分布式文件系統(tǒng)
- HDFS集群搭建完成后有個(gè)抽象統(tǒng)一的目錄樹(shù),可以向其中放入文件,底層實(shí)際是分塊存儲(chǔ)(物理上真的拆分成多個(gè)文件,默認(rèn)128M拆分成一塊)在HDFS集群的多個(gè)服務(wù)器上,具體位置是在hadoop的配置文件中所指定的
1.2 HDFS shell命令行
- 命令行界面(command-line interface,縮寫:cli),指用戶通過(guò)指令進(jìn)行交互
- Hadoop操作文件系統(tǒng)shell命令行語(yǔ)法:
hadoop fs [generic options]
- 大部分命令與linux相同
hadoop fs -ls file:/// # 操作本地文件系統(tǒng)
hadoop fs -ls hdfs://node1:8020/ # 操作HDFS文件系統(tǒng),node1:8020是NameNode運(yùn)行所在的機(jī)器和端口號(hào)
hadoop fs -ls / #直接根目錄,沒(méi)有指定則默認(rèn)加載讀取環(huán)境變量中fs.defaultFS的值,作為要讀取的文件系統(tǒng)
上傳文件到HDFS指定目錄下
hadoop fs -put [-f] [-p] <localsrc> <dst>
# 將本地文件傳到HDFS文件系統(tǒng)中
# -f 覆蓋目標(biāo)文件
# -p 保留訪問(wèn)和修改時(shí)間,所有權(quán)和權(quán)限
# <localsrc>本地文件系統(tǒng)中的文件(客戶端所在機(jī)器),<dst>HDFS文件系統(tǒng)的目錄
下載HDFS文件
hadoop fs -get [-f] [-p] <src> <localdst>
# 將本地文件傳到HDFS文件系統(tǒng)中
# -f 覆蓋目標(biāo)文件
# -p 保留訪問(wèn)和修改時(shí)間,所有權(quán)和權(quán)限
# <src>HDFS文件系統(tǒng)中的文件,<localdst>本地文件系統(tǒng)的目錄
追加數(shù)據(jù)到HDFS文件中
hadoop fs -appendToFile <localsrc>...<dst>
# <localsrc>本地文件系統(tǒng)中的文件,<dst>HDFS文件系統(tǒng)的文件(沒(méi)有文件則自動(dòng)創(chuàng)建)
# 該命令可以用于小文件合并
1.3 HDFS架構(gòu)
HDFS包含3個(gè)進(jìn)程N(yùn)ameNode、DataNode、SecondaryNameNode
(都是Java進(jìn)程,可以在服務(wù)器上運(yùn)行jps查看正在執(zhí)行的java進(jìn)程)
HDFS是主從模式(Master - Slaves),基礎(chǔ)架構(gòu)如下:
- NameNode: 維護(hù)和管理文件系統(tǒng)元數(shù)據(jù),包括HDFS目錄樹(shù)結(jié)構(gòu),文件和塊的存儲(chǔ)位置、大小、訪問(wèn)權(quán)限等信息。NameNode是訪問(wèn)HDFS的唯一入口
- DataNode: 負(fù)責(zé)具體的數(shù)據(jù)塊存儲(chǔ)
- SecondNameNode: 是NameNode的輔助節(jié)點(diǎn),但不能替代NameNode。主要是幫助NameNode進(jìn)行元數(shù)據(jù)文件的合并。
- NameNode不持久化存儲(chǔ)每個(gè)文件中各個(gè)塊所在的DataNode的位置信息,這些信息在系統(tǒng)啟動(dòng)時(shí)從DataNode重建
- NameNode是Hadoop集群中的單點(diǎn)故障
- NameNode所在機(jī)器通常配置大內(nèi)存(RAM),因?yàn)樵獢?shù)據(jù)都存在內(nèi)存中,定時(shí)進(jìn)行持久化存到磁盤中。
- DataNode所在機(jī)器通常配置大硬盤空間,因?yàn)閿?shù)據(jù)存在DataNode中
HDFS集群部署舉例:
node1、node2、node3表示三臺(tái)服務(wù)器,形成一個(gè)集群:
node1服務(wù)器性能比較高,因此在node1上運(yùn)行三個(gè)進(jìn)程:NameNode、DataNode、SecondaryNameNode
在node2及node3上只運(yùn)行DataNode進(jìn)程
1.4 HDFS寫數(shù)據(jù)流程
- HDFS客戶端創(chuàng)建對(duì)象實(shí)例DistributeFileSystem(Java類的對(duì)象),該對(duì)象中封裝了與HDFS文件系統(tǒng)操作的相關(guān)方法。
- 調(diào)用DistributeFileSystem對(duì)象的create()方法,通過(guò)RPC請(qǐng)求NameNode創(chuàng)建文件,NameNode執(zhí)行各種檢查判斷:目標(biāo)文件是否存在,客戶端是否有權(quán)限等。檢查通過(guò)后返回FSDataOutputStream輸出流對(duì)象給客戶端用于寫數(shù)據(jù)。
- 客戶端用FSDataOutputStream開(kāi)始寫數(shù)據(jù)
- 客戶端寫入數(shù)據(jù)時(shí),將數(shù)據(jù)分成一個(gè)個(gè)數(shù)據(jù)包(packet 默認(rèn)64k),內(nèi)部組件DataStreamer請(qǐng)求NameNode挑選出適合存儲(chǔ)數(shù)據(jù)副本的一組DataNode地址,默認(rèn)是3副本存儲(chǔ)(即3個(gè)DataNode)。DataStreamer將數(shù)據(jù)包流式傳輸(每一個(gè)packet 64k傳輸一次)到pipeline的第一個(gè)DataNode,第一個(gè)DataNode存儲(chǔ)數(shù)據(jù)后傳給第二個(gè)DataNode,第二個(gè)DataNode存儲(chǔ)數(shù)據(jù)后傳給第三個(gè)DataNode。
- 傳輸?shù)姆捶较蛏?#xff0c;會(huì)通過(guò)ACK機(jī)制校驗(yàn)數(shù)據(jù)包傳輸是否成功
- 客戶端完成數(shù)據(jù)寫入后,在FSDataOutputStream輸出流上調(diào)用close()方法關(guān)閉。
- DistributeFileSystem告訴NameNode文件寫入完成。
二、Yarn
2.1 Yarn簡(jiǎn)介
Yarn是一個(gè)通用資源管理系統(tǒng)和調(diào)度平臺(tái),可為上層應(yīng)用提供統(tǒng)一的資源管理和調(diào)度。
通用: 不僅支持MapReduce程序,理論上支持各種計(jì)算程序,YARN只負(fù)責(zé)分配資源,不關(guān)心用資源干什么。
資源管理系統(tǒng): 集群的硬件資源,和程序運(yùn)行相關(guān),比如內(nèi)存、cpu等
調(diào)度平臺(tái): 多個(gè)程序同時(shí)申請(qǐng)計(jì)算資源如何分配,調(diào)度的規(guī)則
2.2 Yarn架構(gòu)
Yarn與HDFS一樣,也是主從模式,包含以下4個(gè)進(jìn)程
- ResourceManager:管理整個(gè)群集的資源,負(fù)責(zé)協(xié)調(diào)調(diào)度各個(gè)程序所需的資源。(申請(qǐng)資源必須找RM)
- NodeManager:管理單個(gè)服務(wù)器的資源,負(fù)責(zé)調(diào)度單個(gè)服務(wù)器上的資源提供給應(yīng)用程序使用。
NodeManager通過(guò)創(chuàng)建Container容器來(lái)分配服務(wù)器上的資源。
應(yīng)用程序運(yùn)行在NodeManager所創(chuàng)建的容器中。
一個(gè)服務(wù)器上可以創(chuàng)建多個(gè)Container容器,各Container容器之間相互獨(dú)立,實(shí)現(xiàn)了一個(gè)服務(wù)器上跑多個(gè)程序。
Container容器是具體運(yùn)行 Task(如 MapTask、ReduceTask)的基本單位。
- ProxyServer代理服務(wù)器: ProxyServer默認(rèn)繼承在ResourceManager中,可以通過(guò)配置分離出來(lái)單獨(dú)啟動(dòng),可以提高YARN在開(kāi)放網(wǎng)絡(luò)中的安全性。
- JobHistoryServer歷史服務(wù)器: 記錄歷史程序運(yùn)行信息和日志,開(kāi)放web ui提供用戶通過(guò)網(wǎng)頁(yè)訪問(wèn)日志。
YARN架構(gòu)圖:
ApplicationMaster(App Mstr): 應(yīng)用程序內(nèi)的“老大”,負(fù)責(zé)程序內(nèi)部各階段的資源申請(qǐng),管理整個(gè)應(yīng)用。(當(dāng)YARN上沒(méi)有程序運(yùn)行,則沒(méi)有這個(gè)組件)
一個(gè)應(yīng)用程序?qū)?yīng)一個(gè)ApplicationMaster。
ApplicationMaster 運(yùn)行在 Container 中,運(yùn)行應(yīng)用的各個(gè)任務(wù)(比如 MapTask、ReduceTask)。
YARN 中運(yùn)行的每個(gè)應(yīng)用程序都有一個(gè)自己獨(dú)立的 ApplicationMaster。(以MapReduce為例,其中的MRAppMaster就是對(duì)應(yīng)的具體實(shí)現(xiàn),管理整個(gè)MapReduce程序)
YARN集群部署舉例:
node1、node2、node3表示三臺(tái)服務(wù)器,形成一個(gè)集群:
node1性能高,因此在node1上運(yùn)行四個(gè)進(jìn)程:ResourceManager、NodeManager、ProxyServer、JobHistoryServer
在node2及node3上只運(yùn)行NodeManager進(jìn)程
三、MapReduce
MapReduce程序在運(yùn)行時(shí)有三類進(jìn)程:
- MRAppMaster:負(fù)責(zé)整個(gè)MR程序的過(guò)程調(diào)度及狀態(tài)協(xié)調(diào)
- MapTask: 負(fù)責(zé)map階段的整個(gè)數(shù)據(jù)處理流程
- ReduceTask: 負(fù)責(zé)reduce階段的整個(gè)數(shù)據(jù)處理流程
- 在一個(gè)MR程序中MRAppMaster只有一個(gè),MapTask和ReduceTask可以有一個(gè)也可以有多個(gè)
- 在一個(gè)MR程序中只能包含一個(gè)Map階段和一個(gè)Reduce階段,或者只有Map階段
- 在整個(gè)MR程序中,數(shù)據(jù)都是以kv鍵值對(duì)的形式流轉(zhuǎn)的
MapReduce整體執(zhí)行流程圖:
左邊是maptask,右邊是reducetask,紅框里是shuffle過(guò)程(shuffle包含了map和reduce)
2.1 map階段執(zhí)行過(guò)程
- 第一階段: 把所要處理的文件進(jìn)行邏輯切片(默認(rèn)是每128M一個(gè)切片),每一個(gè)切片由一個(gè)MapTask處理。
- 第二階段: 按行讀取切片中的數(shù)據(jù),返回<key,value>對(duì),key對(duì)應(yīng)行數(shù),value是本行的文本內(nèi)容
- 第三階段: 調(diào)用Mapper類中的map方法處理數(shù)據(jù),每讀取解析出來(lái)一個(gè)<key,value>,調(diào)用一次map方法
- 第四階段(默認(rèn)不分區(qū)): 對(duì)map輸出的<key,value>對(duì)進(jìn)行分區(qū)partition。默認(rèn)不分區(qū),因?yàn)橹挥幸粋€(gè)reducetask,分區(qū)的數(shù)量就是reducetask運(yùn)行的數(shù)量。
- 第五階段: Map輸出數(shù)據(jù)寫入內(nèi)存緩沖區(qū),達(dá)到比例溢出到磁盤上。溢出spill的時(shí)候根據(jù)key按照字典序(a~z)進(jìn)行排序sort
- 第六階段: 對(duì)所有溢出文件進(jìn)行最終的merge合并,形成一個(gè)文件(即一個(gè)maptask只輸出一個(gè)文件)
2.2 reduce階段執(zhí)行過(guò)程
- 第一階段: ReduceTask會(huì)主動(dòng)從MapTask復(fù)制拉取屬于需要自己處理的數(shù)據(jù)
- 第二階段: 把拉取來(lái)的數(shù)據(jù),全部進(jìn)行合并merge,即把分散的數(shù)據(jù)合并成一個(gè)大的數(shù)據(jù),再對(duì)合并后的數(shù)據(jù)進(jìn)行排序
- 第三階段: 對(duì)排序后的<key,value>調(diào)用reduce方法,key相同<key,value>調(diào)用一次reduce方法。最后把輸出的鍵值對(duì)寫入到HDFS中
2.3 shuffle機(jī)制
- shuffle指的是將map端的無(wú)規(guī)則輸出變成具有一定規(guī)則的數(shù)據(jù),便于reduce端接收處理。
- 一般把從Map產(chǎn)生輸出開(kāi)始到Reduce取得數(shù)據(jù)作為輸入之前的過(guò)程稱為Shuffle
- Shuffle過(guò)程是橫跨map和reduce兩個(gè)階段的,分別稱為Map端的Shuffle和Reduce端的Shuffle
- Shuffle中頻繁涉及到數(shù)據(jù)在內(nèi)存、磁盤之間的多次往復(fù),是導(dǎo)致mapreduce計(jì)算慢的原因