概念:
hadoop是一個(gè)開源的、可靠的、可擴(kuò)展的分布式計(jì)算框架。
hadoop可以使用簡單的編程模型跨集群對大數(shù)據(jù)集進(jìn)行分布式的處理,hadoop被設(shè)計(jì)出來就是為了達(dá)到改變只能使單臺服務(wù)提供計(jì)算和存儲的狀況舍败,讓其能擴(kuò)展到使用成百上千臺服務(wù)器都能提供計(jì)算和存儲的目的,hadoop能夠構(gòu)建數(shù)據(jù)倉庫,能對PB級的數(shù)據(jù)進(jìn)行存儲邻薯、處理裙戏、分析、統(tǒng)計(jì)
hadoop的組成:
Hadoop Common:通用的工具類厕诡,提供對hadoop各個(gè)框架的支持
HDFS:分布式文件系統(tǒng)累榜,使應(yīng)用數(shù)據(jù)的訪問具有高吞吐量
YARN:執(zhí)行hadoop作業(yè)的調(diào)度和提供hadoop集群資源的管理
MapReduce:基于YARN之上的框架,用于并行處理大數(shù)據(jù)集
HDFS
HDFS是hadoop的分布式文件系統(tǒng)灵嫌,是使用java構(gòu)建的壹罚,其特點(diǎn)就是具有高可擴(kuò)展性、高容錯(cuò)性寿羞、高吞吐量猖凛、可存儲海量數(shù)據(jù)的特點(diǎn),可以存儲超大的文件绪穆,HDFS使用了流式的數(shù)據(jù)訪問方式辨泳,適合處理大數(shù)據(jù)集的場景,可以在普通廉價(jià)的硬件上運(yùn)行玖院,并支持水平橫行的擴(kuò)展菠红,數(shù)據(jù)以分布式的方式存儲在HDFS中
1、高可擴(kuò)展性:HDFS可以運(yùn)行在普通的廉價(jià)機(jī)器上难菌,并可以支持簡單的水平橫行擴(kuò)展的方式進(jìn)行擴(kuò)容刽锤,達(dá)到了高可擴(kuò)展性
2硫眨、高容錯(cuò)性:HDFS可以將文件分成數(shù)據(jù)塊扼倘,以多節(jié)點(diǎn)多副本方式存儲在不同的節(jié)點(diǎn)上诡蜓,實(shí)現(xiàn)了HDFS的高容錯(cuò)性
3、高吞吐量:HDFS將文件拆分成多個(gè)大小均勻的數(shù)據(jù)塊存儲在各個(gè)節(jié)點(diǎn)上猎塞,并以多機(jī)并行處理節(jié)點(diǎn)上的數(shù)據(jù)塊,使HDFS擁有高的吞吐量
4杠纵、存儲海量數(shù)據(jù)和超大文件:HDFS可以通過水平橫行擴(kuò)展的方式進(jìn)行擴(kuò)容荠耽,將數(shù)據(jù)分成塊存放在集群的各個(gè)節(jié)點(diǎn)上,相對于單機(jī)存儲比藻,HDFS的存儲數(shù)據(jù)的能力會(huì)大得多铝量,所以HDFS可以支持存儲海量的數(shù)據(jù),并適用于超大文件的存儲
5银亲、流式的數(shù)據(jù)訪問:hdfs以流式數(shù)據(jù)訪問的形式慢叨,達(dá)到一次寫入,多次讀取务蝠,使得hdfs非常適用于大數(shù)據(jù)集的分析任務(wù)
隨之而來的缺點(diǎn)是:
1拍谐、不適用于小的文件存儲
2、不能適用于低延遲場景,hdfs追求的是高的吞吐量
3轩拨、不支持文件的修改操作
HDFS架構(gòu):
官方的圖片可能不是那么好理解
這個(gè)網(wǎng)上隨便找的這個(gè)圖比較好理解點(diǎn)
HDFS工作概述
HDFS采用的是主從(maser/slave)架構(gòu)践瓷,一個(gè)master帶多個(gè)slave,HDFS的master稱為namenode,slave 稱為datanode,namenode作為master管理著整個(gè)hdfs文件系統(tǒng)目錄樹namespace以及控制客戶端對文件的訪問亡蓉,而datanode主要管理數(shù)據(jù)的存儲和讀寫操作晕翠,通常每個(gè)節(jié)點(diǎn)都存放一個(gè)datanode,一個(gè)文件在hdfs中將會(huì)拆分成多個(gè)數(shù)據(jù)塊block,并且block是被標(biāo)記有序號的砍濒,通常一個(gè)block有128M淋肾,這些block將以多副本的方式分散的存儲在各個(gè)datanode中(已經(jīng)存儲的文件不支持修改),這也是hdfs達(dá)到高容錯(cuò)性的方式爸邢。namenode可以對namespace的文件及目錄進(jìn)行打開樊卓,關(guān)閉,重命名的操作以及確認(rèn)客戶端的請求映射到哪個(gè)datanode上,還負(fù)責(zé)管理block副本創(chuàng)建的系數(shù)及位置甲棍,而datanode則可以對文件進(jìn)行讀寫操作以響應(yīng)客戶端的讀寫請求简识。block的創(chuàng)建和刪除也是由datanode進(jìn)行操作。
關(guān)鍵名詞總結(jié):
namenode:作為hdfs的核心主要負(fù)責(zé)接受客戶端的請求感猛,對元數(shù)據(jù)進(jìn)行管理包括了記錄文件的名稱七扰、副本的系數(shù)、block存放在哪個(gè)datanode上陪白【弊撸客戶端進(jìn)行寫操作時(shí)請求首先會(huì)到namenode處,namenode會(huì)讓客戶端把文件拆分成均勻大小的數(shù)據(jù)塊咱士,namenode通過計(jì)算返回給客戶端存儲每一個(gè)數(shù)據(jù)塊對應(yīng)datanode的地址立由,并且是以多副本的方式存儲;當(dāng)客戶端進(jìn)行讀操作時(shí)序厉,請求也是先到達(dá)namenode處锐膜,namenode會(huì)將客戶端需要的文件對應(yīng)的所有block的信息返回給客戶端其中包括了客戶端需要按照什么樣的順序進(jìn)行讀取以及對應(yīng)的block存儲在哪個(gè)datanode上,namenode還會(huì)定期收集datanode上block的信息及datanode的各種信息和健康狀況
datanode:負(fù)責(zé)存儲和讀取用戶文件對應(yīng)的block,定期向namenode發(fā)送心跳信息弛房,并匯報(bào)datanode上的所有信息包括block信息道盏、datanode的健康狀態(tài)
block:文件的數(shù)據(jù)塊,一般為128M,文件被拆分成多個(gè)數(shù)據(jù)塊文捶,被分散存儲在不同的datanode上荷逞,除了最后一個(gè)數(shù)據(jù)塊會(huì)小于等于其他的數(shù)據(jù)塊以外,每一個(gè)數(shù)據(jù)塊的大小都是一樣的粹排,并以多副本的方式存儲
replication:block的副本种远,block通常會(huì)以多副本的方式存儲在不同的datanode上,而副本的系數(shù)顽耳,存放的位置由namenode決定坠敷,同一個(gè)block的多個(gè)副本通常會(huì)放置在不同機(jī)架(多個(gè)節(jié)點(diǎn)組成一個(gè)機(jī)架)的datanode上妙同,這樣使hdfs擁有高容錯(cuò)性
HDFS 高可用
Active NameNode 和 Standby NameNode:兩臺 NameNode 形成互備,一臺處于 Active 狀態(tài)常拓,為主 NameNode渐溶,另外一臺處于 Standby 狀態(tài),為備 NameNode弄抬,只有主 NameNode 才能對外提供讀寫服務(wù)茎辐。
主備切換控制器 ZKFailoverController:ZKFailoverController 作為獨(dú)立的進(jìn)程運(yùn)行,對 NameNode 的主備切換進(jìn)行總體控制掂恕。ZKFailoverController 能及時(shí)檢測到 NameNode 的健康狀況拖陆,在主 NameNode 故障時(shí)借助 Zookeeper 實(shí)現(xiàn)自動(dòng)的主備選舉和切換。
Zookeeper 集群:為主備切換控制器提供主備選舉支持懊亡。共享存儲系統(tǒng):共享存儲系統(tǒng)是實(shí)現(xiàn) NameNode 的高可用最為關(guān)鍵的部分依啰,共享存儲系統(tǒng)保存了 NameNode 在運(yùn)行過程中所產(chǎn)生的 HDFS 的元數(shù)據(jù)。
主 NameNode 和 備 NameNode: 通過共享存儲系統(tǒng)實(shí)現(xiàn)元數(shù)據(jù)同步店枣。在進(jìn)行主備切換的時(shí)候速警,新的主 NameNode 在確認(rèn)元數(shù)據(jù)完全同步之后才能繼續(xù)對外提供服務(wù)。
DataNode:會(huì)同時(shí)向主 NameNode 和備 NameNode 上報(bào)數(shù)據(jù)塊的位置信息鸯两。
hdfs環(huán)境安裝
安裝hdfs的前置條件是要先安裝好jdk和ssh,準(zhǔn)備完成后闷旧,開始安裝:
將hdfs的壓縮包下載并解壓,然后配置配置文件钧唐,先配置安裝目錄下的/etc/hadoop/hadoop-env.sh 配置好jdk的安裝路徑
然后到安裝目錄下的/etc/hadoop/core-site.xml忙灼,配置hadoop的相關(guān)配置,注意這里千萬不要把端口配置成9000,9000是以前版本的配置钝侠,我就是被Apache官網(wǎng)坑了该园,配來配去發(fā)現(xiàn)是9000端口不能配
然后到安裝目錄下的/etc/hadoop/hdfs-site.xml,配置副本數(shù)
然后進(jìn)入安裝目錄下的bin目錄執(zhí)行./hdfs namenode -format對hdfs進(jìn)行初始化帅韧,
然后進(jìn)入安裝目錄下的sbin目錄執(zhí)行./start-dfs.sh啟動(dòng)hdfs里初,然后瀏覽器輸入地址 ip:50070,ip地址是你們配置的那個(gè)忽舟,我本機(jī)配置的是192.168.200.128,所以瀏覽器輸入http://192.168.200.128:50070/
顯示active表示啟動(dòng)完成
hdfs的常用命令:
在操作hdfs之前把hdfs的配置到環(huán)境環(huán)境變量去青瀑,這樣方便后面的操作:
出現(xiàn)輸出hdfs的版本是出現(xiàn)jdk版本就代表配置成功
上傳文件:hadoop fs -put test.txt /
下載文件:hadoop fs -get /test.txt
查看文件:hadoop fs -ls /**
查看文件內(nèi)容:hadoop fs -text /test.txt
創(chuàng)建文件:hadoop fs -mkdir /test
遞歸創(chuàng)建文件夾和遞歸查看文件:hadoop fs -mkdir -p /a/b/c/d,hadoop fs -ls -R /
刪除文件:hadoop fs -rm /test.txt
在hadoop的管理網(wǎng)頁上可以查看hdfs文件的信息
yarn
概念:
yarn是一個(gè)資源調(diào)度器,可以將更多的計(jì)算框架萧诫,運(yùn)行在同一個(gè)集群中,運(yùn)行多個(gè)不同的類型的作業(yè)枝嘶,改變了mapreduce1.X只能運(yùn)行mr作業(yè)的狀況帘饶,并共享HDFS的數(shù)據(jù),多個(gè)不同的計(jì)算框架和作業(yè)可以享受整體資源的調(diào)度群扶,極大的提高了集群的資源利用率及刻,yarn可以說是一個(gè)操作系統(tǒng)級別的資源調(diào)度框架
yarn的工作流程及組件
客戶端向服務(wù)端提交的作業(yè)會(huì)到達(dá)yarn的ResourceManage處镀裤,ResourceManage會(huì)為作業(yè)分配資源,然后讓集群中一個(gè)nodemanager去啟動(dòng)container(運(yùn)行環(huán)境)缴饭,在第一個(gè)啟動(dòng)的container中啟動(dòng)一個(gè)applicationMaster,applicationMaster啟動(dòng)完成后會(huì)將信息注冊到ResourceManager中暑劝,同時(shí)向ResourceManager申請資源,applicationMaster獲取資源后就會(huì)在對應(yīng)的nodeManager上啟動(dòng)container颗搂,然后在container中運(yùn)行作業(yè)
ResourceManager:負(fù)責(zé)集群資源的統(tǒng)一管理和調(diào)度担猛,處理客戶端請求,監(jiān)控nodemanager 包括健康狀態(tài)資源使用情況丢氢,監(jiān)控applicationMaster包括作業(yè)的運(yùn)行情況
nodeManager:接收并執(zhí)行ResourceManager和applicationMaster的命令傅联,啟動(dòng)container并定期向ResourceManager發(fā)送心跳和container的運(yùn)行狀況資源使用情況,監(jiān)控container資源的使用情況疚察,負(fù)責(zé)并管理自己的資源使用情況
applicationMaster:applicationMaster負(fù)責(zé)管理運(yùn)行在yarn上的應(yīng)用程序蒸走,應(yīng)用程序可能是一個(gè)spark、mr等的作業(yè),applicationMaster將作業(yè)拆分成一個(gè)個(gè)task,這些task會(huì)運(yùn)行在一個(gè)或者多個(gè)容器中貌嫡,applicationMaster向ResourceManager申請資源比驻,分配資源給內(nèi)部的task進(jìn)行啟動(dòng),task會(huì)被運(yùn)行在nodeManager啟動(dòng)的container中,applicationMaster會(huì)運(yùn)行在第一個(gè)啟動(dòng)的container上岛抄,applicationMaster將信息注冊到ResourceManager别惦,ResourceManager將對applicationMaster的運(yùn)行情況進(jìn)行監(jiān)控,包括task的運(yùn)行情況弦撩,
container:集成了cpu,內(nèi)存等一系列步咪,是一個(gè)任務(wù)運(yùn)行環(huán)境抽象,作業(yè)和applicationMaster都是運(yùn)行在其中
yarn的環(huán)境搭建:
進(jìn)入hadoop的安裝目錄里的etc目錄益楼,將mapred-site.xml.template拷貝一份出來改名為mapred-site.xml猾漫,將配置寫入:
然后編輯etc目錄下的yarn-site.xml,加入配置
進(jìn)入安裝目錄下的sbin目錄中執(zhí)行 ./start-yarn.sh啟動(dòng)yarn
jps查看yarn是否啟動(dòng):
進(jìn)入yarn的管理界面感凤,瀏覽器訪問ip:8088悯周,如我虛擬機(jī)的ip是192.168.200.128
http://192.168.200.128:8088/通過這個(gè)頁面查看yarn的作業(yè)情況
yarn作業(yè)的提交
命令 hadoop jar XXXXX.jar classname 參數(shù)1 參數(shù)2 .....
例如hadoop安裝目錄下的/share/hadoop/mapreduce中有一個(gè)名為hadoop-mapreduce-examples-2.6.0-cdh5.7.0.jar的包,里面有個(gè)pi的類陪竿,可以使用它進(jìn)行試驗(yàn)執(zhí)行 hadoop jar hadoop-mapreduce-examples-2.6.0-cdh5.7.0.jar pi 3 4
程序在執(zhí)行中
執(zhí)行結(jié)果
到頁面看禽翼,可以看的任務(wù)的列表記錄
MapReduce
概述
mapreduce是一個(gè)能夠提供輕松編寫一個(gè)應(yīng)用程序的框架,這個(gè)應(yīng)用程序是用于以并行的方式去對一個(gè)集群上的海量數(shù)據(jù)進(jìn)行離線的批處理族跛,這個(gè)集群可以擁有上千個(gè)節(jié)點(diǎn)的闰挡、可以是使用廉價(jià)機(jī)器組成的集群
mapreduce工作過程:
mapreduce能夠?qū)?shù)據(jù)集拆分成一個(gè)個(gè)獨(dú)立的數(shù)據(jù)塊,多個(gè)map作業(yè)會(huì)以并行的方式對數(shù)據(jù)塊進(jìn)行處理礁哄,mapreduce會(huì)對這些map作業(yè)的輸出進(jìn)行排序长酗,并將結(jié)果作為reduce作業(yè)的輸入,而這些作業(yè)的輸出和輸入都會(huì)被存儲在文件系統(tǒng)hdfs中桐绒,mapreduce會(huì)對這些作業(yè)進(jìn)行調(diào)度夺脾,監(jiān)視和重新執(zhí)行失敗的作業(yè)
通過mapreduce的wc案例理解mapreduce的工作:如下圖我們要統(tǒng)計(jì)文件中三行英文的相同單詞出現(xiàn)的個(gè)數(shù)之拨,mapreduce利用inputFormat將文件輸入并拆分成三個(gè)輸入分片split,然后對split中的數(shù)據(jù)讀取,這個(gè)過程叫做splitting咧叭,利用Recordreaders將每個(gè)split數(shù)據(jù)讀取出來蚀乔,每個(gè)split都會(huì)產(chǎn)生一個(gè)作業(yè)map task,一般一個(gè)block只對應(yīng)一個(gè)split菲茬;圖中有三個(gè)split所以產(chǎn)生三個(gè)作業(yè)將split的數(shù)據(jù)讀取出來進(jìn)行并行的處理吉挣,將數(shù)據(jù)拆分成一個(gè)個(gè)單詞,這個(gè)過程稱為mapping生均;然后通過將各個(gè)節(jié)點(diǎn)上相同的單詞匯聚到同一個(gè)節(jié)點(diǎn)上進(jìn)行計(jì)算听想,這個(gè)過程稱為shuffing;之后將數(shù)據(jù)交由對應(yīng)的reduce task對各個(gè)節(jié)點(diǎn)上單詞的個(gè)數(shù)
進(jìn)行統(tǒng)計(jì)马胧,這個(gè)過程稱為reducing汉买;最后各個(gè)reduce task將統(tǒng)計(jì)的結(jié)果通過OutputFormat輸出到hdfs中。這個(gè)案例體現(xiàn)了mapreduce分而治之的思想
MapReduce編程:
我們還是以最經(jīng)典的案例wordcount進(jìn)行演示佩脊,統(tǒng)計(jì)英文單詞蛙粘,不多BB直接上代碼
先看map過程的方法,這個(gè)對應(yīng)的拆分(mapping)的過程
/**
* 類Mapper<LongWritable, Text, Text, IntWritable>的四個(gè)泛型分別表示
* map方法的輸入的鍵的類型key-input威彰、值的類型value-input出牧;輸出的鍵的類型key-output、輸出的值的類型value-output
* key-input 指的是當(dāng)前所讀行行首相對于split分片開頭的字節(jié)偏移量,所以是long類型歇盼,對應(yīng)序列化類型LongWritable
* value-input 指的是當(dāng)前所讀行舔痕,類型是String,對應(yīng)序列化類型Text
* key-output 輸出鍵,指的是單詞豹缀,類型是String伯复,對應(yīng)序列化類型是Text
* value-output 輸出值,指的是單詞的個(gè)數(shù),1邢笙,類型是int啸如,對應(yīng)序列化類型是IntWritable
*
*/
public class MapService extends Mapper<LongWritable, Text,Text,LongWritable> {
@Override
protected void map(LongWritable key, Text value, Context context) throws
IOException, InterruptedException {
String line = value.toString();//每行句子 Dear Bear River
String[] words = line.split(" ");//每行句子的單詞
for (String word : words) {
//得到的結(jié)果以鍵值對顯示,如 Bear:1,將所有的單詞都以這樣的形式輸出給reduce
context.write(new Text(word),new LongWritable(1));
}
}
}
/**
* 這里reduce的輸入就是map的輸出氮惯,reduce的key-input叮雳、value-input分別與map的key-output、value-output
* Reducer<Text, IntWritable, Text, IntWritable>的四個(gè)泛型分別表示
* reduce方法的輸入的鍵key-input妇汗、輸入的值value-input帘不;輸出的鍵key-output、輸出的值value-output
*
*/
public class ReduceService extends Reducer<Text,LongWritable,Text,LongWritable> {
//Iterable<LongWritable> 是相同單詞的 value值的集合杨箭,也就是一堆1寞焙,這個(gè)就對應(yīng)shuffling過程
@Override
protected void reduce(Text key, Iterable<LongWritable> values, Context context) throws IOException, InterruptedException {
long sum=0;
for (LongWritable value : values) {
sum+=value.get();//統(tǒng)計(jì)相同單詞的總數(shù)
}
context.write(key,new LongWritable(sum));//輸出 如:Dear:5;
}
}
public class WcTest {
public static void main(String[] args) throws Exception{
Configuration configuration=new Configuration();
Job wc = Job.getInstance(configuration, "WC");//作業(yè)的名字是WC
wc.setJarByClass(WcTest.class);//訪問入口類
FileInputFormat.setInputPaths(wc, new Path(args[0])); //設(shè)置輸入
FileOutputFormat.setOutputPath(wc, new Path(args[1]));//輸出路徑
wc.setMapperClass(MapService.class);//map類
wc.setMapOutputKeyClass(Text.class);//map輸出key類型
wc.setMapOutputValueClass(LongWritable.class);//map輸出value類型
wc.setReducerClass(ReduceService.class);//reduce類
wc.setMapOutputKeyClass(Text.class);//reduce輸出key類型
wc.setMapOutputValueClass(LongWritable.class);//reduce輸出value類型
wc.waitForCompletion(true);//提交作業(yè)
}
}
程序打包
統(tǒng)計(jì)這個(gè)文件內(nèi)的單詞,這個(gè)文件的名稱是mr.txt
上傳文件到hadoop的test目錄
把架包傳到服務(wù)器
執(zhí)行命令:
hadoop jar mapreduceDemo-1.0-SNAPSHOT.jar mapreduce.WcTest hdfs://localhost:8020/test/mr.txt hdfs://localhost:8020/out/wc
執(zhí)行成功
hadoop fs -ls /out/wc 進(jìn)入/out/wc目錄查看
hadoop fs -text /out/wc/part-r-00000 查看生成的文件part-r-00000的內(nèi)容