大数据入门(Hadoop生态系统)
Hadoop生態(tài)系統(tǒng)為大數(shù)據(jù)領(lǐng)域提供了開源的分布式存儲(chǔ)和分布式計(jì)算的平臺(tái),這一章我們進(jìn)行Hadoop生態(tài)系統(tǒng)的入門學(xué)習(xí),介紹其中分布式文件系統(tǒng)HDFS、分布式資源調(diào)度YARN、分布式計(jì)算框架MapReduce(包含Spark的入門以及和MapReduce的比較),最后通過Spring Boot集成Hadoop來訪問文件系統(tǒng)。
大數(shù)據(jù)的應(yīng)用
本人喜歡體育運(yùn)動(dòng),以體育中來舉列子。
足球點(diǎn)球大戰(zhàn)
2006年世界杯中德國隊(duì)和阿根廷隊(duì)的點(diǎn)球大戰(zhàn)中,德國隊(duì)守門員教練科普克,給了門將萊曼一張紙條,萊曼看過紙條將計(jì)就計(jì)。阿根廷隊(duì)的每個(gè)點(diǎn)球,幾乎都被萊曼判斷對(duì)了方向,并成功撲出坎比亞索和阿亞拉的點(diǎn)球,幫助德國隊(duì)打進(jìn)四強(qiáng)。而這張紙條就是根據(jù)數(shù)據(jù)分析記錄了阿根廷隊(duì)員點(diǎn)球的習(xí)慣方向。
對(duì)大數(shù)據(jù)以及人工智能概念都是模糊不清的,該按照什么線路去學(xué)習(xí),學(xué)完往哪方面發(fā)展,想深入了解,想學(xué)習(xí)的同學(xué)歡迎加入大數(shù)據(jù)學(xué)習(xí)qq群:458345782,有大量干貨(零基礎(chǔ)以及進(jìn)階的經(jīng)典實(shí)戰(zhàn))分享給大家,并且有清華大學(xué)畢業(yè)的資深大數(shù)據(jù)講師給大家免費(fèi)授課,給大家分享目前國內(nèi)最完整的大數(shù)據(jù)高端實(shí)戰(zhàn)實(shí)用學(xué)習(xí)流程體系 。從java和linux入手,其后逐步的深入到HADOOP-hive-oozie-web-flume-python-hbase-kafka-scala-SPARK等相關(guān)知識(shí)一一分享!
金州勇士的崛起
如今越來越多的籃球隊(duì)開始重視和應(yīng)用籃球大數(shù)據(jù),比如NBA中的金州勇士隊(duì)。勇士隊(duì)曾長期以來一直是NBA里最爛的球隊(duì)之一,2009年它的成績排名倒數(shù)第二。沒有任何執(zhí)教N(yùn)BA經(jīng)驗(yàn)的史蒂夫·科爾,因突出的投籃優(yōu)勢被委任為教練。科爾在執(zhí)掌勇士隊(duì)之后,堅(jiān)持用數(shù)據(jù)說話而不是憑經(jīng)驗(yàn)。他根據(jù)數(shù)據(jù)工程師對(duì)歷年來NBA比賽的統(tǒng)計(jì),發(fā)現(xiàn)最有效的進(jìn)攻是眼花繚亂的傳球和準(zhǔn)確的投籃,而不是彰顯個(gè)人能力的突破和扣籃。在這個(gè)思想的指導(dǎo)下,勇士隊(duì)隊(duì)員苦練神投技。這其中最亮眼的新打法是盡可能地從24英尺(大約7.3米)外的三分線投籃,這樣可以得3分。于是開發(fā)了小球時(shí)代,在2015-2018摘下三枚總冠軍,成功成為NBA的霸主。
大數(shù)據(jù)的基本概率
有人說大數(shù)據(jù)的特點(diǎn)就是數(shù)據(jù)量大,這個(gè)不是非常的正確,數(shù)據(jù)量大不是關(guān)鍵,通過數(shù)據(jù)分析在數(shù)據(jù)中提取出價(jià)值,最終帶來商業(yè)上的利益,這才是大數(shù)據(jù)分析的最終目標(biāo)。大數(shù)據(jù)有4個(gè)特點(diǎn),一般我們稱之為4V,分別為:
- Volume(大量):隨著信息技術(shù)的高速發(fā)展,數(shù)據(jù)開始爆發(fā)性增長。社交網(wǎng)絡(luò)(微博、推特、臉書)、移動(dòng)網(wǎng)絡(luò)、各種智能工具,服務(wù)工具等,都成為數(shù)據(jù)的來源。數(shù)據(jù)的存儲(chǔ)也從過去的GB到TB,乃至現(xiàn)在的PB、EB級(jí)別。
- Variety(多樣):廣泛的數(shù)據(jù)來源,決定了大數(shù)據(jù)形式的多樣性。任何形式的數(shù)據(jù)都可以產(chǎn)生作用。
- Velocity(高速):大數(shù)據(jù)的產(chǎn)生非常迅速,主要通過互聯(lián)網(wǎng)傳輸。大數(shù)據(jù)對(duì)處理速度有非常嚴(yán)格的要求,服務(wù)器中大量的資源都用于處理和計(jì)算數(shù)據(jù),很多平臺(tái)都需要做到實(shí)時(shí)分析。數(shù)據(jù)無時(shí)無刻不在產(chǎn)生,誰的速度更快,誰就有優(yōu)勢。
- Value(價(jià)值):這也是大數(shù)據(jù)的核心特征。通過從大量不相關(guān)的各種類型的數(shù)據(jù)中,挖掘出對(duì)未來趨勢與模式預(yù)測分析有價(jià)值的數(shù)據(jù),并通過機(jī)器學(xué)習(xí)方法、人工智能方法或數(shù)據(jù)挖掘方法深度分析,發(fā)現(xiàn)新規(guī)律和新知識(shí),并運(yùn)用于農(nóng)業(yè)、金融、醫(yī)療等各個(gè)領(lǐng)域,從而最終達(dá)到改善社會(huì)治理、提高生產(chǎn)效率、推進(jìn)科學(xué)研究的效果。
大數(shù)據(jù)涉及到的技術(shù)
- 數(shù)據(jù)采集:把海量數(shù)據(jù)收集到數(shù)據(jù)平臺(tái)上來,才能做后續(xù)的數(shù)據(jù)分析。
- 數(shù)據(jù)存儲(chǔ):數(shù)據(jù)的存儲(chǔ)位置。由于數(shù)據(jù)量巨大,一般為分布式存儲(chǔ)系統(tǒng),較通用用的為。
- 數(shù)據(jù)分析:對(duì)數(shù)據(jù)進(jìn)行有效性分析(數(shù)據(jù)分析框架MapReduce,spark等)。
- 可視化:把分析結(jié)果可視化展示。
分布式文件系統(tǒng)HDFS
HDFS概述及設(shè)計(jì)目標(biāo)
HDFS源于Google的GFS論文,設(shè)計(jì)目標(biāo)為
- 非常巨大的分布式文件系統(tǒng)。
- 運(yùn)行在普通廉價(jià)的硬件上。
- 易擴(kuò)展、為用戶提供性能不錯(cuò)的文件存儲(chǔ)服務(wù)。
HDFS架構(gòu)
HDFS是一種master/slave的架構(gòu)。一個(gè)HDFS集群包含一個(gè)唯一的NameNode(NN),這個(gè)master server管理著整個(gè)文件系統(tǒng)的命名空間并且調(diào)節(jié)客戶端對(duì)文件的訪問。同時(shí),還擁有一系列的DataNode(DN),每個(gè)都管理著他們運(yùn)行的對(duì)應(yīng)節(jié)點(diǎn)的數(shù)據(jù)存儲(chǔ)。HDFS提供了一個(gè)文件系統(tǒng)的命名空間同時(shí)允許用戶將數(shù)據(jù)存在這些文件上。通常,一個(gè)文件被拆分成一個(gè)或多個(gè)數(shù)據(jù)塊,并且這些數(shù)據(jù)塊被保存在一系列的DataNode上。NameNode執(zhí)行文件系統(tǒng)的命名空間的相關(guān)操作比如打開、關(guān)閉、重命名目錄或者文件。同時(shí)決定了數(shù)據(jù)塊到DataNode的映射。DataNode為客戶端的讀取寫入需求提供服務(wù),同時(shí)處理NameNode發(fā)來的數(shù)據(jù)塊的創(chuàng)建、刪除、復(fù)制等需求。
?
image.png
HDFS副本機(jī)制
在前面說過HDFS使用相對(duì)廉價(jià)的計(jì)算機(jī),那么宕機(jī)就是一種必然事件,我們需要讓數(shù)據(jù)避免丟失,就只有采取冗余數(shù)據(jù)存儲(chǔ),而具體的實(shí)現(xiàn)就是副本機(jī)制。具體為把一個(gè)文件分為很多的塊,一個(gè)塊默認(rèn)為128M,而這些塊是以多副本的形式存儲(chǔ)。比如存儲(chǔ)三個(gè)副本:
- 第一副本:如果上傳節(jié)點(diǎn)是DataNode(DN),則上傳該節(jié)點(diǎn);如果上傳節(jié)點(diǎn)是NameNode(NN),則隨機(jī)選擇DataNode(DN) 。
- 第二副本:放置在不同機(jī)架的DataNode(DN)上 。
-
第三副本:放置在與第二副本相同機(jī)架的不同DataNode(DN)上。
?
這種方式可以極大程度上避免了宕機(jī)所造成的數(shù)據(jù)丟失。而數(shù)據(jù)庫的存儲(chǔ)的元數(shù)據(jù)是存儲(chǔ)在NameNode(NN)中,在數(shù)據(jù)讀取是可以知道在那些節(jié)點(diǎn)上讀取文件。下面是官方架構(gòu)圖。image.png
HDFS環(huán)境搭建
Apache Hadoop 有版本管理混亂,部署過程繁瑣、升級(jí)過程復(fù)雜,兼容性差等缺點(diǎn),而CDH是Hadoop眾多分支中的一種,由Cloudera維護(hù),基于穩(wěn)定版本的Apache Hadoop構(gòu)建。使用CDH可以避免在使用過程中的依賴包沖突問題,對(duì)版本的升級(jí)也很方便,所以我們使用Hadoop-2.6.0-cdh5.7.0版本進(jìn)行安裝。本人是使用虛擬機(jī)進(jìn)行偽分布式模式的搭建,即在一臺(tái)機(jī)器上安裝,集群模式其實(shí)和偽分布式模式差不太多。
- 第一步安裝JDK
- 第二步安裝SSH
- 安裝hadoop
HDFS shell
HDFS shell的命令有很多,輸入hadoop fs回車,會(huì)有有多命令的提示。
Usage: hadoop fs [generic options][-appendToFile <localsrc> ... <dst>][-cat [-ignoreCrc] <src> ...][-checksum <src> ...][-chgrp [-R] GROUP PATH...][-chmod [-R] <MODE[,MODE]... | OCTALMODE> PATH...][-chown [-R] [OWNER][:[GROUP]] PATH...][-copyFromLocal [-f] [-p] [-l] <localsrc> ... <dst>][-copyToLocal [-p] [-ignoreCrc] [-crc] <src> ... <localdst>][-count [-q] [-h] [-v] <path> ...][-cp [-f] [-p | -p[topax]] <src> ... <dst>][-createSnapshot <snapshotDir> [<snapshotName>]][-deleteSnapshot <snapshotDir> <snapshotName>][-df [-h] [<path> ...]][-du [-s] [-h] <path> ...][-expunge][-find <path> ... <expression> ...][-get [-p] [-ignoreCrc] [-crc] <src> ... <localdst>][-getfacl [-R] <path>][-getfattr [-R] {-n name | -d} [-e en] <path>][-getmerge [-nl] <src> <localdst>]這里介紹HDFS shell常用命令的使用(其實(shí)和Linux命令相似)
//查看文件目錄ls hadoop fs -ls / 查看根目錄 //建立目錄mkdir hadoop fs -mkdir 文件目錄 //上傳文件 put hadoop fs -put 本地文件路徑 hdfs文件路徑 //get 下載文件到本地 hadoop fs -get hdfs文件路徑 //刪除文件/文件夾rm hadoop fs -rm 文件 hadoop fs -rm -R 文件夾 //級(jí)聯(lián)刪除Java API操作HDFS
IDEA+Maven創(chuàng)建Java工程
添加HDFS相關(guān)依賴
開發(fā)Java Api操作HDFS文件使用Junit測試的方式,代碼如下
public class JunitTest {FileSystem fileSystem = null;Configuration configuration = null;public static final String URL = "hdfs://192.168.30.130:8092";@Beforepublic void setUp() throws IOException, InterruptedException {//初始化配置configuration = new Configuration();//初始化FileSystem,其中包含了文件操作的函數(shù),其中root為虛擬機(jī)用戶名fileSystem = FileSystem.get(URI.create(URL),configuration,"root");}@Testpublic void mkdir() throws IOException {//創(chuàng)建目錄fileSystem.mkdirs(new Path("/test"));}@Testpublic void create() throws IOException {//創(chuàng)建文件,得到輸出流對(duì)象FSDataOutputStream fsDataOutputStream = fileSystem.create(new Path("/test/test.txt"));//寫入文件內(nèi)容fsDataOutputStream.write("hello dzy".getBytes());//關(guān)閉流fsDataOutputStream.close();}@Afterpublic void setDown() throws IOException {configuration.clear();fileSystem.close();} }在以上只是實(shí)驗(yàn)了幾個(gè)API還有很多其它的API,感興趣的可以繼續(xù)學(xué)習(xí)。
HDFS文件讀寫流程
三個(gè)角色的交互 客戶端/NameNode/DataNode
HDFS寫流程
- 客戶端向NameNode發(fā)出寫文件請(qǐng)求。
- 檢查是否已存在文件、檢查權(quán)限。若通過檢查,直接先將操作寫入EditLog,并返回輸出流對(duì)象。
(注:先寫Log,再寫內(nèi)存,因?yàn)镋ditLog記錄的是最新的HDFS客戶端執(zhí)行所有的寫操作。如果后續(xù)真實(shí)寫操作失敗了,由于在真實(shí)寫操作之前,操作就被寫入EditLog中了,故EditLog中仍會(huì)有記錄,我們不用擔(dān)心后續(xù)client讀不到相應(yīng)的數(shù)據(jù)塊,因?yàn)樵诘?步中DataNode收到塊后會(huì)有一返回確認(rèn)信息,若沒寫成功,發(fā)送端沒收到確認(rèn)信息,會(huì)一直重試,直到成功) - client端按128MB的塊切分文件。
- client將NameNode返回的分配的可寫的DataNode列表和Data數(shù)據(jù)一同發(fā)送給最近的第一個(gè)DataNode節(jié)點(diǎn),此后client端和NameNode分配的多個(gè)DataNode構(gòu)成pipeline管道,client端向輸出流對(duì)象中寫數(shù)據(jù)。client每向第一個(gè)DataNode寫入一個(gè)packet,這個(gè)packet便會(huì)直接在pipeline里傳給第二個(gè)、第三個(gè)…DataNode。
(注:并不是寫好一個(gè)塊或一整個(gè)文件后才向后分發(fā)) - 每個(gè)DataNode寫完一個(gè)塊后,會(huì)返回確認(rèn)信息。
- 寫完數(shù)據(jù),關(guān)閉輸輸出流。
- 發(fā)送完成信號(hào)給NameNode。
(注:發(fā)送完成信號(hào)的時(shí)機(jī)取決于集群是強(qiáng)一致性還是最終一致性,強(qiáng)一致性則需要所有DataNode寫完后才向NameNode匯報(bào)。最終一致性則其中任意一個(gè)DataNode寫完后就能單獨(dú)向NameNode匯報(bào),HDFS一般情況下都是強(qiáng)調(diào)強(qiáng)一致性)
HDFS讀流程
- client訪問NameNode,查詢元數(shù)據(jù)信息,獲得這個(gè)文件的數(shù)據(jù)塊位置列表,返回輸入流對(duì)象。
- 就近挑選一臺(tái)datanode服務(wù)器,請(qǐng)求建立輸入流 。
- DataNode向輸入流中中寫數(shù)據(jù),以packet為單位來校驗(yàn)。
- 關(guān)閉輸入流
HDFS優(yōu)缺點(diǎn)
優(yōu)點(diǎn)
- 支持超大文件。
- 檢測和快速應(yīng)對(duì)硬件故障:在集群的環(huán)境中,硬件故障是常見的問題。因?yàn)橛猩锨_(tái)服務(wù)器連接在一起,這樣會(huì)導(dǎo)致高故障率。因此故障檢測和自動(dòng)恢復(fù)是hdfs文件系統(tǒng)的一個(gè)設(shè)計(jì)目標(biāo)。
- 流式數(shù)據(jù)訪問:Hdfs的數(shù)據(jù)處理規(guī)模比較大,應(yīng)用一次需要訪問大量的數(shù)據(jù),同時(shí)這些應(yīng)用一般都是批量處理,而不是用戶交互式處理。應(yīng)用程序能以流的形式訪問數(shù)據(jù)集。主要的是數(shù)據(jù)的吞吐量,而不是訪問速度。
- 簡化的一致性模型:在hdfs中,一個(gè)文件一旦經(jīng)過創(chuàng)建、寫入、關(guān)閉后,一般就不需要修改了。這樣簡單的一致性模型,有利于提高吞吐量。
缺點(diǎn)
- 低延遲數(shù)據(jù)訪問:如和用戶進(jìn)行交互的應(yīng)用,需要數(shù)據(jù)在毫秒或秒的范圍內(nèi)得到響應(yīng)。由于hadoop針對(duì)高數(shù)據(jù)吞吐量做了優(yōu)化,犧牲了獲取數(shù)據(jù)的延遲,所以對(duì)于低延遲來說,不適合用hadoop來做。
- 大量的小文件:Hdfs的NameNode中存儲(chǔ)了文件分塊的元數(shù)據(jù)信息,如果有大量的小文件,導(dǎo)致元數(shù)據(jù)信息增加,增加NameNode負(fù)荷。
- 不支持超強(qiáng)的事務(wù):沒有像關(guān)系型數(shù)據(jù)庫那樣,對(duì)事務(wù)有強(qiáng)有力的支持。
資源調(diào)度框架YARN
YARN概述
YARN是Hadoop 2.0中的資源管理系統(tǒng),可以讓不同計(jì)算框架(MapReduce\Spark等)可以共享同一個(gè)HDFS集群上的數(shù)據(jù),享受整體的資源調(diào)度。
YARN架構(gòu)
YARN主要由ResourceManager、NodeManager、ApplicationMaster和Container等幾個(gè)組件構(gòu)成。
- ResourceManager是Master上一個(gè)獨(dú)立運(yùn)行的進(jìn)程,負(fù)責(zé)集群統(tǒng)一的資源管理、調(diào)度、分配等等。
- NodeManager是Slave上一個(gè)獨(dú)立運(yùn)行的進(jìn)程,負(fù)責(zé)上報(bào)節(jié)點(diǎn)的狀態(tài),處理單個(gè)節(jié)點(diǎn)的資源管理 、處理來自ResouceManager的命令 、處理來自ApplicationMaster的命令。
- ApplicationMaster和Container是運(yùn)行在Slave上的組件,為應(yīng)用程序申請(qǐng)資源,并分配給內(nèi)部任務(wù) ,任務(wù)的監(jiān)控和容錯(cuò)等。
- Container是yarn中分配資源的一個(gè)單位,包涵內(nèi)存、CPU等等資源,yarn以Container為單位分配資源。
YARN執(zhí)行流程
YARN總體上仍然是master/slave結(jié)構(gòu),在整個(gè)資源管理框架中,resourcemanager為master,nodemanager是slave。Resourcemanager負(fù)責(zé)對(duì)各個(gè)nademanger上資源進(jìn)行統(tǒng)一管理和調(diào)度。當(dāng)用戶提交一個(gè)應(yīng)用程序時(shí),需要提供一個(gè)用以跟蹤和管理這個(gè)程序的ApplicationMaster,它負(fù)責(zé)向ResourceManager申請(qǐng)資源,并要求NodeManger啟動(dòng)可以占用一定資源的任務(wù)。由于不同的ApplicationMaster被分布到不同的節(jié)點(diǎn)上,因此它們之間不會(huì)相互影響。
流程:
- 客戶端向RM中提交程序
- RM向NM中分配一個(gè)container,并在該container中啟動(dòng)AM
- AM向RM注冊,這樣用戶可以直接通過RM査看應(yīng)用程序的運(yùn)行狀態(tài)(然后它將為各個(gè)任務(wù)申請(qǐng)資源,并監(jiān)控它的運(yùn)行狀態(tài),直到運(yùn)行結(jié)束)
- AM采用輪詢的方式通過RPC協(xié)議向RM申請(qǐng)和領(lǐng)取資源,資源的協(xié)調(diào)通過異步完成
- AM申請(qǐng)到資源后,便與對(duì)應(yīng)的NM通信,要求它啟動(dòng)任務(wù)
- NM為任務(wù)設(shè)置好運(yùn)行環(huán)境(包括環(huán)境變量、JAR包、二進(jìn)制程序等)后,將任務(wù)啟動(dòng)命令寫到一個(gè)腳本中,并通過運(yùn)行該腳本啟動(dòng)任務(wù)
- 各個(gè)任務(wù)通過某個(gè)RPC協(xié)議向AM匯報(bào)自己的狀態(tài)和進(jìn)度,以讓AM隨時(shí)掌握各個(gè)任務(wù)的運(yùn)行狀態(tài),從而可以在任務(wù)失敗時(shí)重新啟動(dòng)任務(wù)
-
應(yīng)用程序運(yùn)行完成后,AM向RM注銷并關(guān)閉自己
?image.png
YARN環(huán)境搭建
使用的版本為hadoop-2.6.0-cdh5.7.0
//修改配置文件,配置如下(配置文件在/etc/hadoop下) mapred-site.xml,在默認(rèn)情況下是沒有mapred-site.xml文件的,只有mapred-site.xml.template文件,所以在修改配置之前需要復(fù)制一份 cp mapred-site.xml.template mapred-site.xml vi mapred-site.xml //添加配置 <property> <name>mapreduce.framework.name</name> <value>yarn</value>//配置計(jì)算框架運(yùn)行在yarn之上,為固定配置 </property>yarn-site.xml: vi yarn-site.xml //添加配置 <property><name>yarn.nodemanager.aux-services</name> <value>mapreduce_shuffle</value>//nodemanager的services,目前為固定配置,當(dāng)學(xué)習(xí)Spark時(shí),其中有動(dòng)態(tài)資源調(diào)度,這里才需要修改 </property> //啟動(dòng)YARN相關(guān)的進(jìn)程 sbin/start-yarn.sh//驗(yàn)證 jps ResourceManager NodeManager 可訪問http://虛擬機(jī)IP:8088可以看到Y(jié)ARN的主界面。//停止YARN相關(guān)的進(jìn)程sbin/stop-yarn.sh提交作業(yè)到Y(jié)ARN上執(zhí)行
在 share目錄為我們提供了MapReduce作業(yè)的案例,我們可以使用其中的作業(yè)在YARN上執(zhí)行。
提交mr作業(yè)到Y(jié)ARN上運(yùn)行,我的作業(yè)jar包路徑為: /root/apps/hadoop-2.6.0-cdh5.7.0/share/hadoop/mapreduce/hadoop-mapreduce-examples-2.6.0-cdh5.7.0.jar //使用hadoop jar命令可提交作業(yè)到Y(jié)ARN,具體命令為 hadoop jar jar包路徑 有效的程序名字 有效程序的參數(shù)// 選用其中PI程序進(jìn)行運(yùn)行,在執(zhí)行之前要記到啟動(dòng)hdfs和yarn hadoop jar hadoop-mapreduce-examples-2.6.0-cdh5.7.0.jar pi 2 3//訪問yarn主界面可看到作業(yè)的執(zhí)行情況
?
image.png
分布式處理框架MapReduce/Spark
MapReduce概述
源于Google的MapReduce論文,Hadoop MapReduce是Google MapReduce的一個(gè)克隆版。MapReduce用于大規(guī)模數(shù)據(jù)集(通常大于1TB)的并行運(yùn)算,實(shí)現(xiàn)了Map和Reduce兩個(gè)功能。MapReduce的思想是“分而治之”。“分”是把復(fù)雜的任務(wù)分解為若干個(gè)“簡單的任務(wù)”執(zhí)行,由map負(fù)責(zé)。“簡單的任務(wù)”指數(shù)據(jù)或計(jì)算規(guī)模相對(duì)于原任務(wù)要大大縮小;就近計(jì)算,即會(huì)被分配到存放了所需數(shù)據(jù)的節(jié)點(diǎn)進(jìn)行計(jì)算;這些小任務(wù)可以并行計(jì)算,彼此間幾乎沒有依賴關(guān)系。Reducer負(fù)責(zé)對(duì)map階段的結(jié)果進(jìn)行匯總。
特點(diǎn):
- 海量數(shù)據(jù)離線處理
- 橫向擴(kuò)展,而非縱向擴(kuò)展,平滑無縫的可擴(kuò)展性。
- 易開發(fā):用戶不用考慮進(jìn)程間的通信和套接字編程,已經(jīng)為我們封裝好框架。這一點(diǎn)只是相對(duì)于傳統(tǒng)來講,現(xiàn)在主流的Spark框架更為簡單(Spark為本人知識(shí)盲區(qū),后續(xù)學(xué)習(xí))。
- 易運(yùn)行:可運(yùn)行在廉價(jià)的硬件之上。
MapReduce編程模型
MapReduce編程模型給出了分布式編程方法的5個(gè)步驟:
- 迭代,遍歷輸入數(shù)據(jù),將其解析成key/value對(duì);
- 將輸入key/value對(duì)映射map成另外一些key/value對(duì);
- 根據(jù)key對(duì)中間結(jié)果進(jìn)行分組(grouping);
- 以組為單位對(duì)數(shù)據(jù)進(jìn)行歸約;
- 迭代,將最終產(chǎn)生的key/value對(duì)保存到輸出文件中。
MapReduce架構(gòu)
和HDFS一樣,MapReduce也是采用Master/Slave的架構(gòu)
MapReduce包含四個(gè)組成部分,分別為Client、JobTracker、TaskTracker和Task
- Client 客戶端
每一個(gè) Job 都會(huì)在用戶端通過 Client 類將應(yīng)用程序以及配置參數(shù) Configuration 打包成 JAR 文件存儲(chǔ)在 HDFS,并把路徑提交到 JobTracker 的 master 服務(wù),然后由 master 創(chuàng)建每一個(gè) Task(即 MapTask 和 ReduceTask) 將它們分發(fā)到各個(gè) TaskTracker 服務(wù)中去執(zhí)行。 - JobTracker
JobTracke負(fù)責(zé)資源監(jiān)控和作業(yè)調(diào)度。JobTracker 監(jiān)控所有TaskTracker 與job的健康狀況,一旦發(fā)現(xiàn)失敗,就將相應(yīng)的任務(wù)轉(zhuǎn)移到其他節(jié)點(diǎn);同時(shí),JobTracker 會(huì)跟蹤任務(wù)的執(zhí)行進(jìn)度、資源使用量等信息,并將這些信息告訴任務(wù)調(diào)度器,而調(diào)度器會(huì)在資源出現(xiàn)空閑時(shí),選擇合適的任務(wù)使用這些資源。在Hadoop中,任務(wù)調(diào)度器是一個(gè)可插拔的模塊,用戶可以根據(jù)自己的需要設(shè)計(jì)相應(yīng)的調(diào)度器。 -
TaskTracker
?
TaskTracker 會(huì)周期性地通過Heartbeat 將本節(jié)點(diǎn)上資源的使用情況和任務(wù)的運(yùn)行進(jìn)度匯報(bào)給JobTracker,同時(shí)接收J(rèn)obTracker 發(fā)送過來的命令并執(zhí)行相應(yīng)的操作(如啟動(dòng)新任務(wù)、殺死任務(wù)等)。TaskTracker 使用"slot"等量劃分本節(jié)點(diǎn)上的資源量。"slot"代表計(jì)算資源(CPU、內(nèi)存等)。一個(gè)Task 獲取到一個(gè)slot 后才有機(jī)會(huì)運(yùn)行,而Hadoop 調(diào)度器的作用就是將各個(gè)TaskTracker 上的空閑slot分配給Task 使用。slot分為Map slot 和Reduce slot 兩種,分別供Map Task 和Reduce Task 使用。TaskTracker 通過slot 數(shù)目(可配置參數(shù))限定Task 的并發(fā)度。
-Task
Task 分為Map Task 和Reduce Task 兩種,均由TaskTracker 啟動(dòng)。HDFS 以固定大小的block 為基本單位存儲(chǔ)數(shù)據(jù),而對(duì)于MapReduce 而言,其處理單位是split。split 是一個(gè)邏輯概念,它只包含一些元數(shù)據(jù)信息,比如數(shù)據(jù)起始位置、數(shù)據(jù)長度、數(shù)據(jù)所在節(jié)點(diǎn)等。它的劃分方法完全由用戶自己決定。但需要注意的是,split 的多少?zèng)Q定了Map Task 的數(shù)目,因?yàn)槊總€(gè)split 只會(huì)交給一個(gè)Map Task 處理。image.png
MapReduce編程
通過wordcount詞頻統(tǒng)計(jì)分析案例入門。
這個(gè)程序能夠計(jì)算一個(gè)文本中相同單詞出現(xiàn)的次數(shù)。
我們在之前演示用Java API操作HDFS的項(xiàng)目上編寫代碼。具體代碼及解釋如下
開發(fā)完成后
編譯:mvn clean package -DskipTests上傳到服務(wù)器然后運(yùn)行(根據(jù)自己上傳的路徑進(jìn)行命令參數(shù)的調(diào)整)
hadoop jar /root/hadoop/lib/hadoop-train-1.0.jar WordCountApp hdfs://192.168.30.130:9020/hello.txt hdfs://192.168.30.130:9020/output/wc運(yùn)行完畢后可在輸出文件中查看統(tǒng)計(jì)的結(jié)果(親測可以成功)
注意:
相同的代碼和腳本再次執(zhí)行,會(huì)報(bào)錯(cuò)
在MR中,輸出文件是不能事先存在的。有兩種解決方式
1)先手工通過shell的方式將輸出文件夾先刪除hadoop fs -rm -r /output/wc 2) 在代碼中完成自動(dòng)刪除功能: 推薦大家使用這種方式Path outputPath = new Path(args[1]);FileSystem fileSystem = FileSystem.get(configuration);if(fileSystem.exists(outputPath)){fileSystem.delete(outputPath, true);System.out.println("output file exists, but is has deleted");}Spark簡單入門
Spark概述
MapReduce框架局限性
- 僅支持Map和Reduce兩種操作,提供給用戶的只有這兩種操作
- 處理效率低效:Map中間結(jié)果寫磁盤,Reduce寫HDFS,多個(gè)MR之間通過HDFS交換數(shù)據(jù)
- 任務(wù)調(diào)度和啟動(dòng)開銷大:mr的啟動(dòng)開銷一,客戶端需要把應(yīng)用程序提交給resourcesManager,resourcesManager去選擇節(jié)點(diǎn)去運(yùn)行,快的話幾秒鐘,慢的話1分鐘左右,開銷二,maptask和reducetask的啟動(dòng),當(dāng)他倆被resourcesManager調(diào)度的時(shí)候,會(huì)先啟動(dòng)一個(gè)container進(jìn)程,然后讓他倆運(yùn)行起來,每一個(gè)task都要經(jīng)歷jvm的啟動(dòng),銷毀等,這兩點(diǎn)就是mr啟動(dòng)開銷
- 無法充分利用內(nèi)存
- Map端和Reduce端均需要排序:map和Reduce是都需要進(jìn)行排序的,但是有的程序完全不需要排序(比如求最大值求最小值,聚合等),所以就造成了性能的低效
- 不適合迭代計(jì)算(如機(jī)器學(xué)習(xí)、圖計(jì)算等),交互式處理(數(shù)據(jù)挖掘)和流式處理(點(diǎn)擊日志分析):因?yàn)槿蝿?wù)調(diào)度和啟動(dòng)開銷大,所以不適合交互式處理,比如你啟動(dòng)要一分鐘,任務(wù)調(diào)度要幾分鐘,我得等半天,這不適合
- MapReduce編程不夠靈活:map和reduce輸入輸出類型格式限制死了,可嘗試scala函數(shù)式編程語言
- MapReduce采用了多進(jìn)程模型,而Spark采用了多線程模型:運(yùn)行更快,更加節(jié)約資源。
Spark特點(diǎn)
- 高效(比MapReduce快10~100倍)
- 內(nèi)存計(jì)算引擎,提供Cache機(jī)制來支持需要反復(fù)迭代計(jì)算或者多次數(shù)據(jù)共享,減少數(shù)據(jù)讀取的IO開銷;DAG引擎,這種引擎的特點(diǎn)是,不同任務(wù)之間互相依賴,減少多次計(jì)算之間中間結(jié)果寫到HDFS的開銷;使用多線程池模型來減少task啟動(dòng)開稍(特指MR中每個(gè)task都要經(jīng)歷JVM啟動(dòng)運(yùn)行銷毀操作,Spark的做法是,啟動(dòng)一些常駐的進(jìn)程,在進(jìn)程內(nèi)部會(huì)有多個(gè)線程去計(jì)算task,來一個(gè)task,計(jì)算task,并回收線程,以此循環(huán),這樣就沒有JVM的開銷),shuffle過程中避免不必要的sort操作以及減少磁盤IO操作
- 易用:提供了豐富的API,支持Java,Scala,Python和R四種語言
代碼量比MapReduce少2~5倍 - 與Hadoop集成:讀寫HDFS/Hbase與YARN集成
環(huán)境搭建
//在安裝之前先要安裝maven和scala環(huán)境。由于在之前本人虛擬機(jī)上已經(jīng)安裝了maven所以跳過maven的安裝。 // 解壓scala安裝包 tar -zxvf scala-2.11.8.tgz -C ../apps/ //配置環(huán)境變量 pwd //查看路徑/root/apps/scala-2.11.8 vi ~/.bash.profile //添加配置 export SCALA_HOME=/root/apps/scala-2.11.8 export PATH=$SCALA_HOME/bin:$PATH //使配置生效 source ~/.bash.profile //檢驗(yàn)是否安裝成功 scala -version //出現(xiàn)以下信息,說明安裝成功 Scala code runner version 2.11.8 -- Copyright 2002-2016, LAMP/EPFL//解壓spark tar -zxvf spark-2.1.0-bin-2.6.0-cdh5.7.0.tgz -C ../apps //進(jìn)入安裝目錄的bin目錄,通過spark-shell可運(yùn)行spark //若不熟悉命令,可用以下方式 ./spark-shell --help --master MASTER_URL spark://host:port, mesos://host:port, yarn, or local. //表示在本地以兩個(gè)線程啟動(dòng) ./spark-shell --master local[2] local:默認(rèn)一個(gè)線程 local[n]:n個(gè)線程 local[*]:全部線程Spark編程
這里重新實(shí)現(xiàn)在上文實(shí)現(xiàn)的wordcount程序,代碼如下
sc.textFile("file://root/data/hello.txt").flatMap(line => line.split(" ")).map(word => (word,1)).reduceByKey(_ + _).collect沒有看錯(cuò),只是一行代碼。因?yàn)镾park封裝了很多方便的函數(shù),相比于MapReduce開發(fā)更為方便。這也是它成為主流的原因。
Hadoop整合Spring-boot的使用
Spring Hadoop概述
Spring for hadoop提供了統(tǒng)一的配置模式以簡化Apache Hadoop的開發(fā),并也易于調(diào)用HDFS、Mapreduce、Pig和Hive的API。它還提供了與Spring生態(tài)圈的其他項(xiàng)目集成的能力,例如Spring Intergration 和Spring Batch,讓你可以優(yōu)雅地開發(fā)大數(shù)據(jù)的提取/導(dǎo)出和Hadoop工作流項(xiàng)目。
Spring Hadoop開發(fā)環(huán)境搭建及訪問HDFS
第一步加入依賴
<properties><java.version>1.8</java.version><hadoop.version>2.6.0-cdh5.7.0</hadoop.version></properties><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId></dependency><dependency><groupId>org.apache.hadoop</groupId><artifactId>hadoop-client</artifactId><version>${hadoop.version}</version></dependency><dependency><groupId>org.springframework.data</groupId><artifactId>spring-data-hadoop-boot</artifactId><version>2.5.0.RELEASE</version></dependency></dependencies><!--配置下載的倉庫--><repositories><repository><id>cloudera</id><url>http://repository.cloudera.com/artifactory/cloudera-repos/</url></repository></repositories>在配置文件中配置HDFS地址
spring:hadoop:fs-uri: hdfs://192.168.30.130:8092在代碼中訪問HDFS
import org.apache.hadoop.fs.FileStatus; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.CommandLineRunner; import org.springframework.data.hadoop.fs.FsShell; import org.springframework.stereotype.Component;/*** Spring Boot操作HDFS* @author zhiying.dong 2019/04/13 16:32*/ @Component public class SpringBootHadoopTest implements CommandLineRunner {//自動(dòng)注入FsShell,其中封裝了HDFS的訪問函數(shù)@Autowiredprivate FsShell fsShell;@Overridepublic void run(String... strings) throws Exception {System.out.println("=========run start============");//獲取根目錄下的文件列表for (FileStatus fileStatus : fsShell.lsr("/")) {System.out.println(">" + fileStatus.getPath());}System.out.println("===========run end===========");} }執(zhí)行代碼后發(fā)現(xiàn)沒有權(quán)限訪問HDFS,本人解決的方式為在項(xiàng)目啟動(dòng)時(shí)模擬用戶,網(wǎng)上有多種解決方式,可自行選擇
VM options: -DHADOOP_USER_NAME=虛擬機(jī)用戶名總結(jié)
大數(shù)據(jù)已經(jīng)涉及到生活的方方面面,所以學(xué)習(xí)和了解大數(shù)據(jù)知識(shí)是很有必要的。Hadoop生態(tài)系統(tǒng)為大數(shù)據(jù)提供了開源的分布式存儲(chǔ)和分布式計(jì)算的平臺(tái),而這一章只是對(duì)其中基礎(chǔ)的知識(shí)進(jìn)行了入門,后續(xù)還需要深入的學(xué)習(xí)。
作者:董二彎
鏈接:https://www.jianshu.com/p/10700514e3e0
來源:簡書
簡書著作權(quán)歸作者所有,任何形式的轉(zhuǎn)載都請(qǐng)聯(lián)系作者獲得授權(quán)并注明出處。
總結(jié)
以上是生活随笔為你收集整理的大数据入门(Hadoop生态系统)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: nucleus学习
- 下一篇: 全球定位系统GPS简介