Hadoop1
HDFS
解決海量數(shù)據(jù)的存儲(chǔ)
一個(gè)主節(jié)點(diǎn)namenode,多個(gè)從節(jié)點(diǎn)datanode
namenode:存儲(chǔ)元數(shù)據(jù),響應(yīng)用戶的操作請(qǐng)求。
datanode:存儲(chǔ)數(shù)據(jù),block64M,有三個(gè)副本。
secondarynamenode
作用:進(jìn)行元數(shù)據(jù)的合并,備份元數(shù)據(jù)。
hdfs格式化以后會(huì)生成一個(gè)FSimage的鏡像文件,用于保存元數(shù)據(jù)。
fsimage的信息有兩份一份存在內(nèi)存中一份存在磁盤上。當(dāng)有文件上傳到hdfs上時(shí),會(huì)先把元數(shù)據(jù)存成兩份,一份存入內(nèi)存,一份以editlog線性追加的方式寫入磁盤。
為了在namenode重啟時(shí),加快磁盤元數(shù)據(jù)載入內(nèi)存的速度,磁盤上fsimage文件和editlog文件需要進(jìn)行合并,合并過(guò)程需要再內(nèi)存中進(jìn)行,所以就出現(xiàn)了secondarynamenode,它把fsimage和編輯日志進(jìn)行合并之后回傳給namenode,自己也作為元數(shù)據(jù)的備份者。
secondarynamenode可以作為nanode備份但需要安裝第三方軟件和修改源碼
MapReduce
主節(jié)點(diǎn)Jobtracker,
接受用戶提交的任務(wù)
分配任務(wù)給taskTracker
監(jiān)控taskTracker執(zhí)行的情況從節(jié)點(diǎn)TaskTracker
處理jobTracker分配的活
Hadoop1的架構(gòu)問(wèn)題
HDFS問(wèn)題:
存在單點(diǎn)故障問(wèn)題
內(nèi)存受限
namenode存儲(chǔ)元數(shù)據(jù),響應(yīng)用戶操作請(qǐng)求。
為了能快速響應(yīng)用戶請(qǐng)求,把元數(shù)據(jù)放入到內(nèi)存中。
如果元數(shù)據(jù)量大,導(dǎo)致內(nèi)存不夠怎么辦?權(quán)限的問(wèn)題
MapReduce1的問(wèn)題:
- 只有一個(gè)主節(jié)點(diǎn)單點(diǎn)故障問(wèn)題。
- 即要分配任務(wù)又要分配資源,干的活太多
- 難以支撐第三方框架(不可以給他們分配計(jì)算資源,如不能給spark分配計(jì)算資源只能分配MapReduce的計(jì)算資源)
Hadoop2
hdfs
解決單點(diǎn)故障問(wèn)題
解決兩個(gè)namenode元數(shù)據(jù)實(shí)時(shí)一致
方式1:共享目錄(幾乎不用)
方式2:QJM(使用奇數(shù)個(gè)節(jié)點(diǎn))
引用了JournalNode:可以保持?jǐn)?shù)據(jù)的事務(wù)性一致,namenode傳輸元數(shù)據(jù)數(shù)據(jù)到j(luò)ournalNode要么全部成功要么全部失敗。
active實(shí)時(shí)寫數(shù)據(jù),standby實(shí)時(shí)讀數(shù)據(jù)。-
解決兩個(gè)namenode自動(dòng)切換
- 引入zookeeper
-
每個(gè)namenode節(jié)點(diǎn)配置一個(gè)zkfc
過(guò)程:兩個(gè)namenode啟動(dòng)之后去zookeeper搶占鎖,搶到的就是active。zkfc實(shí)時(shí)監(jiān)控namenode健康狀況,通過(guò)心跳機(jī)制匯報(bào)給zookeeper。
注意:Hadoop2HA的實(shí)現(xiàn)只支持兩個(gè)namenode
image.png
解決內(nèi)存受限問(wèn)題
使用用兩套namenode,這兩套的namenode的元數(shù)據(jù)是不一樣的,而且各自是高可用的,這就叫做聯(lián)邦federation。
在進(jìn)行存數(shù)據(jù)時(shí)要指定存在哪個(gè)namenode上,就像存在哪個(gè)盤一樣。如Hadoop dfs -put hello.txt hdfs://hadoop01:9000/hello/
聯(lián)邦,可以按照部門或者項(xiàng)目來(lái)劃分各套namenode存取的地址。
聯(lián)邦也存在一定問(wèn)題比如有的計(jì)算框架依賴于磁盤有的依賴于內(nèi)存,不好管理。
MapReduce
- 解決單點(diǎn)故障
- 解決任務(wù)分配和資源分配都做的問(wèn)題
- 解決不能支持其它計(jì)算框架的問(wèn)題
yarn的出現(xiàn)解決了以上問(wèn)題。
YARN
YARN 是一個(gè)資源調(diào)度平臺(tái),負(fù)責(zé)為運(yùn)算程序提供服務(wù)器運(yùn)算資源,相當(dāng)于一個(gè)分布式的操作系統(tǒng)平臺(tái),而 MapReduce 等運(yùn)算程序則相當(dāng)于運(yùn)行于操作系統(tǒng)之上的應(yīng)用程序。 YARN 集群,具有更好的擴(kuò)展性,可用性,可靠性,向后兼容性,以及能支持除 MapReduce 以外的更多分布式計(jì)算程序。
YARN也是一個(gè)主從式的架構(gòu):主節(jié)點(diǎn)叫Resourcemanager從節(jié)點(diǎn)叫NodeManager
YARN 并不清楚用戶提交的程序的運(yùn)行機(jī)制。只提供運(yùn)算資源的調(diào)度(用戶程序向 YARN 申請(qǐng)資源,YARN 就負(fù)責(zé)分配資源)
YARN 中的主管角色叫ResourceManager,YARN 中具體提供運(yùn)算資源的角色叫 NodeManager這樣一來(lái),YARN 其實(shí)就與運(yùn)行的用戶程序完全解耦,就意味著 YARN 上可以運(yùn)行各種類型的分布式運(yùn)算程序(MapReduce 只是其中的一種),比如 MapReduce、Storm 程序,Spark程序,Tez ……;所以,Spark、Storm 等運(yùn)算框架都可以整合在 YARN 上運(yùn)行,只要他們各自的框架中有符合 YARN 規(guī)范的資源請(qǐng)求機(jī)制即可。
YARN/MRv2 最基本的想法是將原 JobTracker 主要的資源管理和 Job 調(diào)度功能分開作為兩個(gè)單獨(dú)的守護(hù)進(jìn)程。
yarn有一個(gè)全局的 ResourceManager(RM)和每個(gè) 應(yīng)用程序有一個(gè)ApplicationMaster(AM),Application 相當(dāng)于 MapReduce Job 或者 DAG jobs。
ResourceManager和 NodeManager(NM)組成了基本的數(shù)據(jù)計(jì)算框架。
ResourceManager 由兩個(gè)組件構(gòu)成: 調(diào)度器(Scheduler )和 應(yīng)用程序管理器(ApplicationsManager ,ASM )。協(xié)調(diào)集群的資源利用,任何Client或者運(yùn)行著的 ApplicatitonMaster 想要運(yùn)行Job 或者 Task 都得向RM 申請(qǐng)一定的資
源。YARN 本身為我們提供了多種直接可用的調(diào)度器,比如 FIFO,F(xiàn)air Scheduler
和 Capacity Scheduler 等-
ApplicatonMaster 是一個(gè)框架特殊的庫(kù),對(duì)于 MapReduce 框架而言有它自己的 AM 實(shí)現(xiàn),用戶也可以實(shí)現(xiàn)自己的 AM,在運(yùn)行的時(shí)候,AM 會(huì)與 NM 一起啟動(dòng)和監(jiān)視 Tasks。
image.png
ApplicationMaster
如果一個(gè)AM運(yùn)行到80%掛了,會(huì)由另一個(gè)nodeManager節(jié)點(diǎn)上的備用AM接著運(yùn)行。AM的信息是存在zookeeper之上的,其它備用AM成為active之后會(huì)繼續(xù)運(yùn)行80%之后的任務(wù)。
Yarn在2里面只能管理內(nèi)存和cpu但不能管理磁盤和網(wǎng)絡(luò),這是未來(lái)發(fā)展的一個(gè)方向。
- Hadoop3
支持兩個(gè)nameNode以上。糾刪碼解決備份存儲(chǔ)浪費(fèi)的問(wèn)題。
- Hadoop就是按一個(gè)類Linux操作系統(tǒng)來(lái)設(shè)計(jì)的。
如果把Hadoop看成一個(gè)操作系統(tǒng)
HDFS:分布式文件系統(tǒng),配置文件目錄放在/etc/
Yarn:資源管理器
MapReduce:就是一個(gè)自帶的計(jì)算程序
計(jì)算程序還有:Spark,F(xiàn)link
Hbase和Hive是數(shù)據(jù)庫(kù),的配置文件目錄是conf
Hive
調(diào)優(yōu)
- 從架構(gòu)層面:
網(wǎng)絡(luò)如何配置
防火墻如何規(guī)劃
帶寬如何規(guī)劃
文件格式
壓縮格式
資源的管理方式(yarn,Mesos等) - 從源碼層面:
修改源碼 - SQL層面
SQL經(jīng)驗(yàn)要豐富 - 參數(shù)層面
HDFS,YARN,MapReduce,Hive
防止數(shù)據(jù)傾斜問(wèn)題
自定義UDF
新建一個(gè)java項(xiàng)目導(dǎo)入hivejar包
新建一個(gè)類繼承extend UDF
在這個(gè)類的內(nèi)部實(shí)現(xiàn)一個(gè)到多個(gè)重載的名叫evaluate的方法
將編寫好的自定義函數(shù)類打成jar包添加到hive的classpath中
add jar /home/hadopp/**.jar ;
list jar;創(chuàng)建一個(gè)零時(shí)函數(shù)管理到用戶自定義的類
create temporary function myfunc as "類全限定名"-
驗(yàn)證函數(shù)
show functions;可以看到自定義的函數(shù)
select myfunc(3,4);補(bǔ)充:當(dāng)前會(huì)話斷開后臨時(shí)函數(shù)就失效。
hive hql
DDL的語(yǔ)句不需要跑MapReduce,因?yàn)樯婕暗降氖窃獢?shù)據(jù)的操作。
另外還有select * from user;也不需要跑,因?yàn)閡ser 是一張表,體現(xiàn)為hdfs上的一個(gè)目錄。select * 負(fù)from user where p="1" 分區(qū)也體現(xiàn)為hdfs上的一個(gè)目錄所以不需要計(jì)算。select name from user 特殊點(diǎn):現(xiàn)在的版本不需要跑了。
HBase
HBase是一個(gè)分布式的面向列的,適合非結(jié)構(gòu)化,半結(jié)構(gòu)化,結(jié)構(gòu)化,高性能的,可擴(kuò)展的開源NoSQL數(shù)據(jù)庫(kù)。
關(guān)系型數(shù)據(jù)庫(kù):
沒(méi)有分布式時(shí):如果庫(kù)存不下可以分庫(kù),表存不下可以分表(水平分表,垂直分表)。
mysql和Oracle都是支持分布式的為什么擴(kuò)展性不好呢?因?yàn)閿U(kuò)展時(shí)牽一發(fā)而動(dòng)全身,而HBase只需要添加節(jié)點(diǎn)就可以了。
缺點(diǎn)
面向行:關(guān)系型數(shù)據(jù)庫(kù),行的長(zhǎng)度是已知的,線性表的的方式進(jìn)行存儲(chǔ)。需要做磁盤預(yù)留,有的列的數(shù)據(jù)存不滿。
數(shù)據(jù)量大時(shí)磁盤空間浪費(fèi)就多。需要多表進(jìn)行查詢,會(huì)把多張表合并成一張大表。這樣磁盤預(yù)留就比較多就導(dǎo)致磁盤利用率不高。
內(nèi)存利用率不高:查詢數(shù)據(jù)時(shí)需要把整張表放入內(nèi)存。
在面向列的存儲(chǔ)中進(jìn)行select name from user的查詢的時(shí)候,只需要把name加入內(nèi)存。半結(jié)構(gòu)化的數(shù)據(jù),存不了。
HBase能不使用就不使用原因:
- 不好 駕馭
- 如果數(shù)據(jù)不大的情況下,處理起來(lái)沒(méi)有關(guān)系型數(shù)據(jù)庫(kù)處理起來(lái)快。
-
什么樣的情況下適合:
- 數(shù)據(jù)量大
- 實(shí)時(shí)處理
- 數(shù)據(jù)的分布比較稀疏。
最成功的概念region
把一張表分成各個(gè)region,把這些rejoin分到不同節(jié)點(diǎn)。
一次讀數(shù)據(jù)的過(guò)程:
get ’tableName‘,’rowkey‘
- 通過(guò)zookeeper找到.meta.表,查詢到region所在的regionserver
- 查找內(nèi)存MemStore
- 通過(guò)布隆過(guò)濾器查找在哪一個(gè)StoreFile中
- 讀取這個(gè)storeFile的Trailer,獲得Datablock位置
- 把DataBlock加入內(nèi)存找到rowkey
一次寫數(shù)據(jù)過(guò)程:
put 't_Name','rk001','cf1:name','zhangsan'
- 通過(guò)跳表結(jié)構(gòu)找到rejoin
- 把數(shù)據(jù)寫入HLog文件
- 把數(shù)據(jù)寫入MemStore(在其中排序)
- MemStore達(dá)到閾值,溢寫到磁盤。
a. 如果StoreFile達(dá)到3個(gè)進(jìn)行一個(gè)minorCompact,只刪除TTL=0且MIN_VERSION=>'0'的數(shù)據(jù)。
b. 手動(dòng)進(jìn)行majorCompact合并Store內(nèi)的所有文件為一個(gè)大文件,把相應(yīng)put和delete進(jìn)行抵消。
c. 如果當(dāng)前store所在的rejoin大于10G就會(huì)進(jìn)行分裂,分裂的原則是保證一個(gè)rowkey所有的數(shù)據(jù)只存在于一個(gè)region之中的前提下進(jìn)行均分。
一臺(tái)rejoinserver掛了
關(guān)鍵點(diǎn)在于把利用HLog內(nèi)存中數(shù)據(jù)恢復(fù)出來(lái)。因?yàn)槠渌腟toreFile都是持久化到成HFile的文件,也就是都有備份。
一臺(tái)master掛了
所有元數(shù)據(jù)(namespace,table,column family)被凍結(jié),無(wú)法創(chuàng)建表,刪除表,修改表,在rejoin分裂的時(shí)候,無(wú)法進(jìn)行rejoin的負(fù)載均衡。但是表的讀寫是正常的。
rowkey的設(shè)計(jì)三原則
- 長(zhǎng)度越短越好,防止資源浪費(fèi)
- 散列原則防止數(shù)據(jù)熱點(diǎn)。
加鹽、哈希、反轉(zhuǎn)、時(shí)間戳反轉(zhuǎn) - 唯一性原則。把經(jīng)常一起讀取數(shù)據(jù)設(shè)計(jì)成連續(xù)rowkey,存儲(chǔ)在一起。
flume:日志收集系統(tǒng)
自動(dòng)的把業(yè)務(wù)系統(tǒng)中的日志收集遷移到數(shù)據(jù)倉(cāng)庫(kù)中。
kafuka
在進(jìn)行實(shí)時(shí)計(jì)算時(shí)會(huì)先把前端收集來(lái)的數(shù)據(jù)先緩存在kafka中。類似于一個(gè)緩存,
- flume去收集日志,存入kafka中,分析系統(tǒng)再?gòu)膋afka中取數(shù)據(jù)。
實(shí)時(shí)處理系統(tǒng)的架構(gòu)
- 批處理層
進(jìn)行數(shù)據(jù)的清洗,數(shù)據(jù)的預(yù)處理,得到可以進(jìn)行快速的查詢的數(shù)據(jù)。 - 服務(wù)層
支持批處理層,對(duì)批處理成的數(shù)據(jù)進(jìn)行快速查詢。 - 速度層
解決實(shí)時(shí)處理的需求。- 實(shí)時(shí)處理就像商場(chǎng)中的扶梯,來(lái)一個(gè)人上一個(gè)人。離線計(jì)算使用MapReduce就像直升梯。
大數(shù)據(jù)流程圖