@TOC
1.初識Hadoop
大數(shù)據(jù)時代已經(jīng)到來薪前,越來越多的行業(yè)面臨著大量數(shù)據(jù)需要存儲以及分析的挑戰(zhàn)乏屯。Hadoop,作為一個開源的分布式并行處理平臺份企,以其高擴(kuò)展、高效率惦费、高可靠等優(yōu)點,得到越來越廣泛的應(yīng)用抢韭。本課旨在培養(yǎng)學(xué)員理解Hadoop的架構(gòu)設(shè)計以及掌握Hadoop的運用能力薪贫。
1.1前言
1.1.1課程名稱
Hadoop大數(shù)據(jù)平臺架構(gòu)與實踐
1.1.2主要內(nèi)容
- 1.大數(shù)據(jù)的相關(guān)概念
- 2.Hadoop的架構(gòu)和運行機(jī)制
- 3.實戰(zhàn):Hadoop的安裝和配置
- 4.實戰(zhàn):Hadoop開發(fā)
1.1.3學(xué)習(xí)目標(biāo)
- 掌握大數(shù)據(jù)存儲與處理技術(shù)的原理(理論知識)
- 掌握Hadoop的使用和開發(fā)能力(實踐能力)
1.1.4 課程學(xué)習(xí)建議
- 1.結(jié)合書本,知識點更加系統(tǒng)全面
對應(yīng)的書本:hadoop技術(shù)詳解刻恭、hadoop權(quán)威指南 - 2.實踐經(jīng)驗很重要瞧省,邊聽課邊實踐。
1.1.5課程預(yù)備知識:
- linux常用命令
- java編程基礎(chǔ)
1.2Hadoop的前世今生
1.2.1Hadoop基本概念
Hadoop是解決大數(shù)據(jù)的分布式集成架構(gòu)鳍贾。
當(dāng)數(shù)據(jù)達(dá)到一定規(guī)模時鞍匾,單機(jī)的存儲和分析就變得非常困難,存儲量和效率都無法達(dá)到用戶的需求骑科。
所以橡淑,為了解決大數(shù)據(jù)的存儲和處理,Google提出了三大技術(shù):
-
MapReduce
- 概念:"Map(映射)"和"Reduce(歸約)"咆爽,它們的主要思想梁棠,都是從函數(shù)式編程語言里借來的,還有從矢量編程語言里借來的特性斗埂。它極大地方便了編程人員在不會分布式并行編程的情況下符糊,將自己的程序運行在分布式系統(tǒng)上。 當(dāng)前的軟件實現(xiàn)是指定一個Map(映射)函數(shù)蜜笤,用來把一組鍵值對映射成一組新的鍵值對濒蒋,指定并發(fā)的Reduce(歸約)函數(shù),用來保證所有映射的鍵值對中的每一個共享相同的鍵組把兔。
-
BigTable
- 是Google設(shè)計的分布式數(shù)據(jù)存儲系統(tǒng)沪伙,用來處理海量的數(shù)據(jù)的一種非關(guān)系型的數(shù)據(jù)庫
-
GFS
- 是一個可擴(kuò)展的分布式文件系統(tǒng),用于大型的县好、分布式的围橡、對大量數(shù)據(jù)進(jìn)行訪問的應(yīng)用。它運行于廉價的普通硬件上缕贡,并提供容錯功能翁授。它可以給大量的用戶提供總體性能較高的服務(wù)。
Hadoop是模仿Google三大技術(shù)的開源實現(xiàn)晾咪。相比于Google之前的解決方案收擦,它有如下優(yōu)勢:
- (1)降低成本,能用PC機(jī)就不用大型機(jī)和高端存儲;
- (2)因為用的是PC機(jī)谍倦,所以經(jīng)常發(fā)生硬件錯誤塞赂,所以通過軟件來保證高可靠性;
- (3)簡化了并行分布式計算昼蛀。
1.2.2為什么取名Hadoop
創(chuàng)作者以他兒子一個黃色的玩具小象命名
1.3Hadoop的功能與優(yōu)勢
1.3.1 Hadoop是什么
是一個開源的宴猾、分布式存儲和分布式計算平臺
1.3.2Hadoop的兩個核心組件
- 1.HDFS圆存,分布式文件系統(tǒng),存儲海量數(shù)據(jù)仇哆。
- 2.MapReduce沦辙,并行處理框架,實現(xiàn)任務(wù)分解和調(diào)度讹剔。
1.3.3Hadoopk可以做什么
搭建大型數(shù)據(jù)倉庫油讯,PB級數(shù)據(jù)的存儲、處理辟拷、分析撞羽、統(tǒng)計等業(yè)務(wù)阐斜。
1.3.3Hadoopk的優(yōu)勢
- 1.高擴(kuò)展衫冻,理論上無限擴(kuò)展
- 2.低成本
-
3.成熟的生態(tài)圈
Hadop生態(tài)圈
1.3.4Hadoopk的應(yīng)用
1.4Hadoop的生態(tài)系統(tǒng)與版本
1.4.1hadoop生態(tài)系統(tǒng)
- 1.hdfs分布式存儲系統(tǒng)
- 2.mapreduce 大數(shù)據(jù)編程模型
- 3.相關(guān)開源工具:
- (1)hive:將sql語句轉(zhuǎn)化為hadoop任務(wù),降低使用hadoop的門檻
- (2)HBASE:存儲結(jié)構(gòu)化數(shù)據(jù)的分布式數(shù)據(jù)庫谒出,放棄事務(wù)特性隅俘,追求更高的擴(kuò)展,它提供數(shù)據(jù)的隨機(jī)讀寫和實時訪問笤喳,實現(xiàn)對表數(shù)據(jù)的讀寫功能
注:和傳統(tǒng)的關(guān)系型數(shù)據(jù)庫的區(qū)別是放棄事務(wù)特性为居,追求更高的擴(kuò)展、和HDFS的區(qū)別就是habse提供數(shù)據(jù)的隨機(jī)讀寫和實時訪問杀狡,實現(xiàn)對表數(shù)據(jù)的讀寫功能
- (3)zookeeper:監(jiān)控Hadoop集群里的每個節(jié)點的狀態(tài)蒙畴,管理整個集群的配置,維護(hù)數(shù)據(jù)節(jié)點之間的一致性
1.4.2hadoop版本
- 1.x:穩(wěn)定
- 2.x:不穩(wěn)定
2.Hadoop的安裝
- Step1:準(zhǔn)備liunx環(huán)境呜象;
- Step1:安裝JDK膳凝;
- Step1:配置hadoop;
2.1準(zhǔn)備liunx環(huán)境
兩種方式:
- 1.本機(jī)先安裝虛擬機(jī)恭陡,再安裝linux
- 2.租用云主機(jī)蹬音,申請公網(wǎng)IP
2.2安裝JDK
Linux 下下載安裝JDK (centos)
//1、下載 :
yum install java-1.7.0-openjdk
//查看可升級下載的軟件包
yum search java|grep jdk
//2休玩、配置環(huán)境變量:
vim /etc/profile
export JAVA_HOME=/usr/lib/jvm/java-7-openjdk-amd64
export JRE_HOME=$JAVA_HOME/jre
export CLASSPATH=.:$JAVA_HOME/lib:$JRE_HOME/lib:$CLASSPATH
export PATH=$JAVA_HOME/bin:$JRE_HOME/bin:$PATH
//3著淆、讓配置生效
source /etc/profile
//4、測試
java -version
注解:
1.Linux下用冒號 : 分割路徑
2.$PATH / $JAVA_HOME / $JRE_HOME 是用來引用原來環(huán)境變量的值拴疤,在設(shè)置環(huán)境變量時不能把原來的值給覆蓋掉
3.$CLASSPATH 中 當(dāng)前目錄 “.”不能丟
4.export 是把這4個變量導(dǎo)出為全局變量
2.3配置Hadoop
2.3.1安裝總結(jié)
- 1.下載hdoop按照包并進(jìn)行解壓
- 2.配置hdoop-env.sh文件永部,目的是配置jdk,并在profile配置haddoop的安裝位置
- 3.配置core-site.xml文件:hdoop的核心文件呐矾,里面有關(guān)于hdoop的節(jié)點端口與主機(jī)端口
- 4.配置hdfs-site.xml文件:hdoop的文件存儲的基本信息與目錄
- 5.配置mapred-site.xml文件:hadoop的計算節(jié)點的端口號
- 6.啟動hadoop:start-all.sh
- 7.查看端口:jps,可以看到五大守護(hù)進(jìn)程說明正確
- 8.停止hdoop:stop-all.sh
2.3.2安裝細(xì)節(jié)
- 1苔埋、下載Hadoop安裝包 ,兩種方式
- 方式一:官網(wǎng)下載好后凫佛,通過Xftp上傳到Linux上讲坎,下載地址http://mirror.bit.edu.cn/apache/hadoop/common/hadoop-1.2.1/hadoop-1.2.1.tar.gz
- 方式一:通過 wget命令直接下載到Linux服務(wù)器上
$ wget http://mirror.bit.edu.cn/apache/hadoop/common/hadoop-1.2.1/hadoop-1.2.1.tar.gz
- 2孕惜、解壓到指定目錄下;
- 移動文件:
$ mv 文件 /opt - 解壓:
$ tar -zxvf hadoop-1.2.1.tar.gz
- 移動文件:
- 3晨炕、配置hadoop-env.sh衫画、core-site.xml、hdfs-site.xml瓮栗、mapred-site.xml四個文件
//1削罩、hadoop-env.sh
配置java 環(huán)境變量的地址
export JAVA_HOME=/usr/lib/jvm/java-7-openjdk-amd64
//2、 core-site.xml
<configuration>
<property>
<name>hadoop.tmp.dir</name>
<value>/hadoop</value>
</property>
</configuration>
<property>
<name>dfs.name.dir</name>
<value>/hadoop/name</value>
</property>
<property>
<name>fs.default.name</name>
<value>hdfs://imooc:9000</value>
</property>
//3费奸、hdfs-site.xml配置
<property>
<name>dfs.data.dir</name>
<value>/hadoop/data</value>
</property>
//4弥激、mapred-site.xml配置
<property>
<name>mapred.job.tracker</name>
<value>imooc:9001</value>
</property>
- 4、編輯/etc/profile文件愿阐,配置hadoop相關(guān)的環(huán)境變量
vim /etc/profile
添加hadoop的HADOOP_PATH
export HADOOP_PATH="安裝目錄"
PATH里面添加$HADOOP_HOME/bin:$PATH
//讓配置生效
source /etc/profile
//測試是否安裝成功
hadoop
- 5微服、第一次使用hadoop先進(jìn)行格式化
//對namenode 進(jìn)行格式化
$ hadoop namenode -format;
- 6缨历、啟動hadoop
start-all.sh -
7以蕴、檢查進(jìn)程:jpsjps
// 查看hadoop文件系統(tǒng)下下有哪些文件
hadoop fs -ls
3.Hadoop的核心-HDFS簡介
3.1HDFS基本概念
- HDFS設(shè)計架構(gòu):
- 塊:文件以“塊”進(jìn)行存儲,HDFS默認(rèn)塊大小為64M
- namenode:是管理節(jié)點辛孵,存放文件元數(shù)據(jù)丛肮,包括文件與數(shù)據(jù)塊的映射表、數(shù)據(jù)塊與數(shù)據(jù)節(jié)點的映射表
- datenode:工作節(jié)點魄缚,真正存儲數(shù)據(jù)塊
最終體系結(jié)構(gòu):由block宝与、namenode、datanode冶匹、secondarynamenode习劫、client組成
HDFS的文件被分成塊進(jìn)行存儲,HDFS塊默認(rèn)大小是64MB徙硅,塊是整個文件存儲處理的邏輯單元榜聂。
HDFS最終體系結(jié)構(gòu):由block、namenode嗓蘑、datanode须肆、secondarynamenode、client組成桩皿。
3.2HDFS數(shù)據(jù)管理與容錯
為保證硬件上的容錯豌汇,數(shù)據(jù)塊有多份冗余。
- 數(shù)據(jù)塊副本:每個數(shù)據(jù)塊3個副本泄隔,分布在2機(jī)架3節(jié)點上(容錯性)
- 心跳檢測:DataNode定期向NameNode發(fā)心跳消息拒贱。
- 二級NameNode:NameNdoe定期同步元數(shù)據(jù)映像文件到二級NameNode(secondryNameNode),一旦故障,備胎轉(zhuǎn)正。
3.2HDFS讀寫文件的流程
- HDFS讀取文件的流程:
- (1)客戶端向namenode發(fā)起獨立請求逻澳,把文件名闸天,路徑告訴namenode;
- (2)namenode查詢元數(shù)據(jù)斜做,并把數(shù)據(jù)庫返回客戶端苞氮;
-
(3)此時客戶端就明白文件包含哪些塊,這些塊在哪些datanode中可以找到瓤逼;
HDFS讀取文件的流程
- HDFS寫文件流程:
- (1)客戶端把文件拆分成固定大小64M的塊笼吟,并通知namenode;
- (2)namenode找到可用的datanode返回給客戶端霸旗;
- (3)客戶端根據(jù)返回的datanode贷帮,對塊進(jìn)行寫入;
- (4)通過流水線管道流水線復(fù)制诱告;
-
(5)更新元數(shù)據(jù)撵枢。告訴namenode已經(jīng)完成了創(chuàng)建心的數(shù)據(jù)塊,保證了namenode中的元數(shù)據(jù)都是最新的狀態(tài)蔬啡。
HDFS寫文件流程
3.2HDFS的特點
- HDFS特點:
- 1诲侮、數(shù)據(jù)冗余,硬件容錯(一式三份來保證)箱蟆。
- 2、流式數(shù)據(jù)訪問:寫一次刮便,讀多次空猜,一旦寫入無法修改,只能通過寫入到新的塊刪除舊文件恨旱。
- 3辈毯、存儲大文件(特適合,因為小文件多搜贤,勢必加重NameNode的負(fù)擔(dān))谆沃。
- HDFS適用性及局限性:
- 1、適合數(shù)據(jù)批量讀寫仪芒,吞吐量高唁影;
- 2、不適合交互式應(yīng)用掂名、低延遲很難滿足据沈;
- 3、適合一次寫入多次讀取饺蔑、順序讀寫锌介;
- 4、不支持多用戶并發(fā)寫相同文件。
- HDFS優(yōu)缺點:
- 優(yōu)點:存儲塊大孔祸,吞吐量高隆敢,為存儲大文件設(shè)計;
- 缺點:延遲高崔慧,不適合交互式訪問筑公,不支持多用戶同時操作一個塊。
3.3HDFS的使用
- 提供了 shell 接口尊浪,可以進(jìn)行命令行操作
hadoop namenode -format #格式化namenode
hadoop fs -ls / #打印 / 目錄文件列表
hadoop fs -mkdir input #創(chuàng)建目錄 input
hadoop fs -put hadoop-env.sh input/ #上傳文件 hadoop-env.sh 到 input 目錄下
hadoop fs -get input/abc.sh hadoop-envcomp.sh #從 input 目錄中下載文件
hadoop fs -cat input/hadoop-env.sh #查看文件 input/hadoop-env.sh
hadoop dfsadmin -report #dfs報告
4.Hadoop的核心-MapReduce原理與實現(xiàn)
4.1MapReduce的原理
- MapReduce原理:分而治之匣屡,一個大任務(wù)分成多個子任務(wù)(map),并行執(zhí)行之后拇涤,合并結(jié)果(reduce)捣作。
eg:做統(tǒng)計的時候,把統(tǒng)計的文件拆分鹅士,然后分別統(tǒng)計每一個數(shù)據(jù)出現(xiàn)的次數(shù)券躁,然后合并拆分項,就可以統(tǒng)計每一個數(shù)據(jù)出現(xiàn)的總次數(shù)掉盅。
MapReduce處理數(shù)據(jù)過程主要分成2個階段:Map階段和Reduce階段也拜。首先執(zhí)行Map階段,再執(zhí)行Reduce階段趾痘。Map和Reduce的處理邏輯由用戶自定義實現(xiàn)慢哈,但要符合MapReduce框架的約定。
正式執(zhí)行Map前永票,需要將輸入數(shù)據(jù)進(jìn)行”分片”卵贱。所謂分片,就是將輸入數(shù)據(jù)切分為大小相等的數(shù)據(jù)塊侣集,每一塊作為單個Map Worker的輸入被處理键俱,以便于多個Map Worker同時工作。分片完畢后世分,多個Map Worker就可以同時工作了编振。每個Map Worker在讀入各自的數(shù)據(jù)后,進(jìn)行計算處理臭埋,最終輸出給Reduce踪央。Map Worker在輸出數(shù)據(jù)時,需要為每一條輸出數(shù)據(jù)指定一個Key斋泄。這個Key值決定了這條數(shù)據(jù)將會被發(fā)送給哪一個Reduce Worker杯瞻。Key值和Reduce Worker是多對一的關(guān)系,具有相同Key的數(shù)據(jù)會被發(fā)送給同一個Reduce Worker炫掐,單個Reduce Worker有可能會接收到多個Key值的數(shù)據(jù)魁莉。
-
在進(jìn)入Reduce階段之前,MapReduce框架會對數(shù)據(jù)按照Key值排序,使得具有相同Key的數(shù)據(jù)彼此相鄰旗唁。如果用戶指定了”合并操作”(Combiner)畦浓,框架會調(diào)用Combiner,將具有相同Key的數(shù)據(jù)進(jìn)行聚合检疫。Combiner的邏輯可以由用戶自定義實現(xiàn)讶请。這部分的處理通常也叫做”洗牌”(Shuffle)。
接下來進(jìn)入Reduce階段屎媳。相同的Key的數(shù)據(jù)會到達(dá)同一個Reduce Worker夺溢。同一個Reduce Worker會接收來自多個Map Worker的數(shù)據(jù)。每個Reduce Worker會對Key相同的多個數(shù)據(jù)進(jìn)行Reduce操作烛谊。最后风响,一個Key的多條數(shù)據(jù)經(jīng)過Reduce的作用后,將變成了一個值丹禀。
MapReduce原理
4.2MapReduce的運行流程
4.2.1. 原理
- 分而治之 的思想状勤,一個大任務(wù)分成多個小任務(wù)(map),并行執(zhí)行后,合并結(jié)果(reduce).
4.2.2 運行流程
- 基本概念:
- Job & Task:
一個 Job(任務(wù)双泪、作業(yè)) 被切分為多個 Task持搜,Task 又分為 MapTask 和 ReduceTask - JobTracker
作業(yè)調(diào)度
分配任務(wù)、監(jiān)控任務(wù)
監(jiān)控 TaskTracker 的狀態(tài) - TaskTracker
執(zhí)行任務(wù)
向 JobTracker 匯報任務(wù)狀態(tài)
- Job & Task:
4.2.3 容錯機(jī)制
- 重復(fù)執(zhí)行:
默認(rèn)重復(fù)執(zhí)行 4 次焙矛,若還是失敗葫盼,則放棄執(zhí)行 - 推測執(zhí)行:
可以保證任務(wù)不會因為某1-2個機(jī)器錯誤或故障而導(dǎo)致整體效率下降
5.開發(fā)Hadoop應(yīng)用程序
5.1WordCount單詞計數(shù)(上)
- 計算文件中出現(xiàn)每個單詞的頻數(shù),輸入結(jié)果按照字母順序進(jìn)行排序薄扁。利用mapReduce的思想剪返,來計算輸入的單詞的個數(shù)。
- Map過程:分而治之
-
Reduce過程:合并
Map過程Reduce過程
5.2WordCount單詞計數(shù)(中)
- 分析源代碼
- 代碼其實在hadoop的安裝目錄下有example邓梅,一般的目錄是/hadoop/src/examples/org/apache/hadoop/examples/WordCount.jar
- 源代碼 http://hadoop.apache.org/docs/r1.0.4/cn/mapred_tutorial.html
5.3WordCount單詞計數(shù)(下)
5.3.1整體流程
- 1.編寫WordCount.java,包含Mapper類和Reducec類;
- 2.編譯WordCount.java,java -classpath 邑滨;
- 3.打包 jar -cvf WordCount.jar classes/*日缨;
- 4.作業(yè)提交 hadoop jar WordCount.jar WordCount input output;
- 提交到hadoop中運行掖看,指定輸入文件 匣距,指定輸出文件。
5.3.2具體流程
//(1)啟動hadoop
start -all.sh
//(2)rz把某某.java類放到根目錄下/opt/根目錄下邊或者根目錄下任意文件
cd /mkdir project_hadoop/
rz 類路徑添加
//(3)cd 新創(chuàng)建的文件,創(chuàng)建file1和file2
mkdir input
vi file1
vi file2
ls project_hadoop
//(4)創(chuàng)建文件
hadoop fs -mkdir input_wordcount
//(5)創(chuàng)建目錄:
hadoop fs -mkdir input
//查看文件:
hadoop fs -ls
hadoop fs -ls input_wordcount
//(6)把file1和file2文件放到input_wordcount
提交輸入文件給hadoop
hadoop fs -put 文件路徑 提交后的路徑
//例:
hadoop fs -put input/input_wordcount/
//(7)查看文件
hadoop fs -ls input_wordcount
fs -cat input_wordcount/file1
fs -cat input_wordcount/file2
//(8)編譯java文件
javac -classpath /opt/hadoop-1.2.1/hadoop-core-1.2.1.jar:/opt/hadoop-1.2.1/lib/commons-cli-1.2.jar -d 編譯后地址 編譯文件
//(9)打包指令
jar -cvf 打包后文件名.jar 某某.class
jar -cvf wordcount.jar *.class
//(10)提交jar給hadoop執(zhí)行
hadoop jar jar包路徑 執(zhí)行的主函數(shù)名(主類名哎壳,main方法所在類名) 輸入目錄名 輸出目錄名
//例:
hadoop jar project_hadoop/wordcount.jar WordCount input_wordcount output_wordcount
//(11)查看通過算法計算出單詞個數(shù)的結(jié)果
fs -cat output_wordcount/part-r-00000
5.4利用MapReduce進(jìn)行排序(上)
-
先分片毅待,再排序
分片排序
5.5利用MapReduce進(jìn)行排序(下)
- 分析代碼
在這里插入圖片描述
注:配合慕課網(wǎng)視頻使用更佳
鏈接: 點擊跳轉(zhuǎn).