Hadoop技術(shù)總概

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備份但需要安裝第三方軟件和修改源碼

image.png

MapReduce

  1. 主節(jié)點(diǎn)Jobtracker,
    接受用戶提交的任務(wù)
    分配任務(wù)給taskTracker
    監(jiān)控taskTracker執(zhí)行的情況

  2. 從節(jié)點(diǎn)TaskTracker
    處理jobTracker分配的活

Hadoop1的架構(gòu)問(wèn)題

HDFS問(wèn)題:
  1. 存在單點(diǎn)故障問(wèn)題

  2. 內(nèi)存受限
    namenode存儲(chǔ)元數(shù)據(jù),響應(yīng)用戶操作請(qǐng)求。
    為了能快速響應(yīng)用戶請(qǐng)求,把元數(shù)據(jù)放入到內(nèi)存中。
    如果元數(shù)據(jù)量大,導(dǎo)致內(nèi)存不夠怎么辦?

  3. 權(quán)限的問(wèn)題

MapReduce1的問(wèn)題:
  1. 只有一個(gè)主節(jié)點(diǎn)單點(diǎn)故障問(wèn)題。
  2. 即要分配任務(wù)又要分配資源,干的活太多
  3. 難以支撐第三方框架(不可以給他們分配計(jì)算資源,如不能給spark分配計(jì)算資源只能分配MapReduce的計(jì)算資源)

Hadoop2

hdfs

解決單點(diǎn)故障問(wèn)題

  1. 解決兩個(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ù)。

  2. 解決兩個(gè)namenode自動(dòng)切換

    1. 引入zookeeper
    2. 每個(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)存,不好管理。


image.png

MapReduce

  1. 解決單點(diǎn)故障
  2. 解決任務(wù)分配和資源分配都做的問(wèn)題
  3. 解決不能支持其它計(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)

  1. 從架構(gòu)層面:
    網(wǎng)絡(luò)如何配置
    防火墻如何規(guī)劃
    帶寬如何規(guī)劃
    文件格式
    壓縮格式
    資源的管理方式(yarn,Mesos等)
  2. 從源碼層面:
    修改源碼
  3. SQL層面
    SQL經(jīng)驗(yàn)要豐富
  4. 參數(shù)層面
    HDFS,YARN,MapReduce,Hive

防止數(shù)據(jù)傾斜問(wèn)題

自定義UDF

  1. 新建一個(gè)java項(xiàng)目導(dǎo)入hivejar包

  2. 新建一個(gè)類繼承extend UDF

  3. 在這個(gè)類的內(nèi)部實(shí)現(xiàn)一個(gè)到多個(gè)重載的名叫evaluate的方法

  4. 將編寫好的自定義函數(shù)類打成jar包添加到hive的classpath中
    add jar /home/hadopp/**.jar ;
    list jar;

  5. 創(chuàng)建一個(gè)零時(shí)函數(shù)管理到用戶自定義的類
    create temporary function myfunc as "類全限定名"

  6. 驗(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能不使用就不使用原因:

  1. 不好 駕馭
  2. 如果數(shù)據(jù)不大的情況下,處理起來(lái)沒(méi)有關(guān)系型數(shù)據(jù)庫(kù)處理起來(lái)快。
  • 什么樣的情況下適合:

    1. 數(shù)據(jù)量大
    2. 實(shí)時(shí)處理
    3. 數(shù)據(jù)的分布比較稀疏。
  • 最成功的概念region
    把一張表分成各個(gè)region,把這些rejoin分到不同節(jié)點(diǎn)。

一次讀數(shù)據(jù)的過(guò)程:

get ’tableName‘,’rowkey‘

  1. 通過(guò)zookeeper找到.meta.表,查詢到region所在的regionserver
  2. 查找內(nèi)存MemStore
  3. 通過(guò)布隆過(guò)濾器查找在哪一個(gè)StoreFile中
  4. 讀取這個(gè)storeFile的Trailer,獲得Datablock位置
  5. 把DataBlock加入內(nèi)存找到rowkey
一次寫數(shù)據(jù)過(guò)程:

put 't_Name','rk001','cf1:name','zhangsan'

  1. 通過(guò)跳表結(jié)構(gòu)找到rejoin
  2. 把數(shù)據(jù)寫入HLog文件
  3. 把數(shù)據(jù)寫入MemStore(在其中排序)
  4. 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ì)三原則

  1. 長(zhǎng)度越短越好,防止資源浪費(fèi)
  2. 散列原則防止數(shù)據(jù)熱點(diǎn)。
    加鹽、哈希、反轉(zhuǎn)、時(shí)間戳反轉(zhuǎn)
  3. 唯一性原則。把經(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)

  1. 批處理層
    進(jìn)行數(shù)據(jù)的清洗,數(shù)據(jù)的預(yù)處理,得到可以進(jìn)行快速的查詢的數(shù)據(jù)。
  2. 服務(wù)層
    支持批處理層,對(duì)批處理成的數(shù)據(jù)進(jìn)行快速查詢。
  3. 速度層
    解決實(shí)時(shí)處理的需求。
    • 實(shí)時(shí)處理就像商場(chǎng)中的扶梯,來(lái)一個(gè)人上一個(gè)人。離線計(jì)算使用MapReduce就像直升梯。

大數(shù)據(jù)流程圖


image.png
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

推薦閱讀更多精彩內(nèi)容

  • 先思考問(wèn)題 我們處在一個(gè)大數(shù)據(jù)的時(shí)代已經(jīng)是不爭(zhēng)的事實(shí),這主要表現(xiàn)在數(shù)據(jù)源多且大,如互聯(lián)網(wǎng)數(shù)據(jù),人們也認(rèn)識(shí)到數(shù)據(jù)里往...
    墻角兒的花閱讀 7,405評(píng)論 0 9
  • 1、 性能調(diào)優(yōu) 1.1、 分配更多資源 1.1.1、分配哪些資源? Executor的數(shù)量 每個(gè)Executor所...
    Frank_8942閱讀 4,580評(píng)論 2 36
  • ——華池偶遇范仲淹 先天下之憂而憂,后天下之樂(lè)而樂(lè)被范仲淹遒勁有力地寫在了華池子午嶺。...
    心若鯤鵬閱讀 672評(píng)論 0 0
  • 今天是個(gè)悶熱的一天,讓我感到一種無(wú)法呼吸的沉悶感,真心覺(jué)得無(wú)法適應(yīng)夏天的到來(lái)。 這些天我練了練書法,發(fā)覺(jué)我的字較之...
    鉞鼓閱讀 228評(píng)論 0 0
  • Colinviva閱讀 250評(píng)論 0 0