hadoop基礎整理

1、大數據概念

主要解決海量數據的存儲和數據分析計算的問題java

8bite =1 Byte,1k=1024Byte,node

Bite Byte KB MB,GB,TB,PB,EB,ZB,YB,BB,NB,DBmysql

  • 大數據特色:

Volume 大量 (部分企業數據量達EB)sql

Velocity 高速(數據處理效率要高)shell

Variety 多樣。(結構化+非結構化)數據庫

value 低價值密度apache

2、從hadoop框架討論大數據生態

  • Hadoop
    hadoop的初衷是採用大量的廉價機器,組成一個集羣!完成大數據的存儲和計算!

1 hadoop 1.x和2.x區別

1.x和2.x的區別是將資源調度和管理進行分離!由統一的資源調度平臺YARN進行大數據計算資源的調度!
提高了Hadoop的通用性!Hadoop搭建的集羣中的計算資源,不只能夠運行Hadoop中的MR程序!也能夠運行其餘計算框架的程序!編程

在hadoop不久以後,因爲MR的低效性,出現了許多更爲高效的計算框架!
例如: Tez,Storm,Spark,Flinktomcat

完成大數據的計算
①寫程序,程序須要複合計算框架的要求!安全

java---->main----->運行
    MapReduce(編程模型)----->Map--Reducer

②運行程序,申請計算資源(cpu+內存,磁盤IO,網絡IO)

java----->JVM------>OS----->申請計算資源
    1.0: MapReduce(編程模型)---->JobTracker----->JVM----->申請計算資源
    2.0: MapReduce(編程模型)---->jar------>運行時,將jar包中的任務,提交給YARN,和YARN進行通訊
            由YARN中的組件-----JVM------>申請計算資源

2 hadoop的組件

HDFS(框架):負責大數據的存儲
YARN(框架): 負責大數據的資源調度

MR(編程模型): 使用Hadoop制定的編程要求,編寫程序,完成大數據的計算!

2.1 HDFS:負責大數據的存儲
  • Namenode(1個):

    • 負責文件,名稱等元數據(屬性信息)的存儲!
      文件名,大小,文件切分了多少塊(block),建立和修改時間等!
    • 職責:接受客戶端的請求;接受DN的請求 ;向DN分配任務
  • DataNode(N個)

    • 負責文件中數據的存儲!
    • 負責接受NM分配的任務;負責數據塊(block)的管理(讀,寫)!
  • 可選進程:SecondaryNamenode(N個): 負責輔助NameNode工做!
2.2 MapReduce

MapReduce(編程規範): 程序中有Mapper(簡單處理)和Reducer(合併)

遵循MapReduce的編程規範,編寫的程序,打包後,稱爲一個Job(任務)!

Job須要提交到YARN上,向YARN申請計算資源,運行Job中的Task(進程)!

Job會先建立一個進程MRAppMaster(mapreduce 應用管理者),由MRAppMaster向YARN申請資源!
MRAppMaster負責監控Job中各個Task運行狀況,進行容錯管理!

2.3 Yarn:負責集羣中全部計算資源的管理和調度!
  • ResourceManager(1個): 負責整個集羣全部資源的管理!

    • 負責接受客戶端的提交Job的請求!
    • 負責向NM分配任務!
    • 負責接受NM上報的信息!
  • NodeManager(N個): 負責單臺計算機全部資源的管理!

    • 負責和RM進行通訊,上報本機中的可用資源!
    • 負責領取RM分配的任務!
    • 負責爲Job中的每一個Task分配計算資源!
  • Container(容器): 對任務運行環境的抽象

    • NodeManager爲Job的某個Task分配了2個CPU和2G內存的計算資源!
      ,避免被其餘的task搶佔資源!
    • 將計算資源,封裝到一個Container中,在Container中的資源,會被暫時隔離
    • 當前Task運行結束後,當前Container中的資源會被釋放!容許其餘task來使用
  • ApplicationMaster :數據切分,爲應用程序申請資源,並分配給內部任務,任務監控與容錯

3、Hadoop 的運行環境搭建

一、重要目錄

(1)bin目錄:存放對Hadoop相關服務(HDFS,YARN)進行操做的腳本

(2)etc目錄:Hadoop的配置文件目錄,存放Hadoop的配置文件

(3)lib目錄:存放Hadoop的本地庫(對數據進行壓縮解壓縮功能)

(4)sbin目錄:存放啓動或中止Hadoop相關服務的腳本

(5)share目錄:存放Hadoop的依賴jar包、文檔、和官方案例

二、配置文件

(1)4個默認的配置文件:

位置:  HADOOP_HOME/share/xxxx.jar/xxx-default.xml

​ 文件名:core-default.xml: 設置hadoop最核心的參數!
​ hdfs-default.xml 保存的是hdfs相關的參數!

​ mapred-default.xml: MR程序在運行時,須要使用的參數!

​ yarn-default.xml: yarn在啓動時,須要的參數!

(2)4個可自定義的配置文件:xxx-site.xml

​ core-site.xml: 用戶自定義的設置hadoop最核心的參數!
​ hdfs-site.xml 用戶自定義的保存的是hdfs相關的參數!

​ mapred-site.xml: 用戶自定義的MR程序在運行時,須要使用的參數!
​ yarn-site.xml: 用戶自定義的yarn在啓動時,須要的參數!

(3) tips

能夠自定義配置文件的目錄: hadoop --config 配置文件的目錄
若是沒有配置,默認讀取 HADOOP_HOME/etc/hadoop 中對應的配置文件!

Hadoop在啓動時,先加載4個默認的配置文件,再加載用戶自定義的配置文件,若是用戶自定義的配置文件中有和4個默認配置文件中門的參數,能夠覆蓋以前已經加載的值!

​ hadoop-daemon.sh start namenode腳本在執行時,只會去默認的目錄中讀取配置文件!

三、hadoop的運行模式:本地模式、僞分佈式模式以及徹底分佈式模式

(1) 本地模式:在本機上使用hdfs,使用的就是本地的文件系統

​ 設置方法:

core-site.xmlfs.defaultFS=file:/// (默認,不用修改)

(2)僞分佈式:NN和DN在一臺機器,且只有一個DN節點

​ 設置方法:

  1. 配置集羣

    指定HDFS中namenode的地址,core-site.xmlfs.defaultFS=hdfs://hadoop101:9000

    配置hdfs-site.xml指定HDFS副本的數量dfs.replication

  2. 啓動集羣

    格式化nameNode ,bin/hdfs namenode -format,啓動namenode,datanode

    啓動NN: hadoop-daemon.sh start namenode

    中止NN:  hadoop-daemon.sh stop namenode
                啓動DN:  hadoop-daemon.sh start datanode
                中止DN:  hadoop-daemon.sh stop datanode
                使用:  hadoop fs  命令  文件路徑
  3. 查看集羣jps

    jps是JDK中的命令,不是Linux命令。不安裝JDK不能使用jps

  4. Yarn上運行mapreduce程序

    完成大數據的計算!

    ①按照MR的規範編寫一個程序
         ②將程序打包爲jar
         ③運行jar中的程序

    兩種運行模式:
    取決於參數: mapreduce.framework.name=local(默認)
    ①本地模式(在本機上運行MR) mapreduce.framework.name=local

    在本機運行MR!在本機使用多線程的方式,運行多個Task!

    ②在YARN上運行 mapreduce.framework.name=yarn

    將MR提交給YARN,由YARN將Job中的多個task分配到多臺機器中,啓動container運行task!
             須要啓動YARN,YARN由RM和NM進程組成!

(3) 徹底分佈式

準備3臺客戶機 P0501&wo

4、HDFS(hadoop distributed file system)分佈式文件系統

1. hfs 不支持對文件的隨機讀寫,能夠追加,但不能修改

​ 緣由:文件在HDFS上存儲時,以block爲基本單位存儲的

​ a. 沒有提供對文件的在線尋址功能

​ b. 文件以塊形式存儲,修改了一個塊中的內容,就會影響當前塊以後的全部塊,效率低

2. HDFS 不適合存小文件

緣由: HDFS存儲了大量的小文件,會下降NN的服務能力

NN負責文件元數據(屬性,塊的映射)的管理,NN在運行時,必須將當前集羣中存儲的全部文件的元數據所有加載到內存,NN須要大量的內存

4. 同一個文件在同一時刻只能有一個客戶端寫入

5. 塊大小,取決於dfs.blocksize ,2.x 默認爲128M,1.x 默認爲64M

緣由: 基於最佳傳輸損耗理論(在一次傳輸中,尋址時間佔用總傳輸時間的1%時,本次傳輸的損耗最小,爲最佳性價比傳輸)

不論對磁盤的文件進行讀仍是寫,都須要先進行尋址

目前硬件的發展條件,普通磁盤寫的速率大概爲100M/s,尋址時間通常爲10ms

塊在傳輸時,每64k還須要校驗一次,所以塊大小,必須爲2的n次方

6. 塊大小須要合適調節

不能太大,a. 在一些分塊讀取的場景,不夠靈活,會帶來額外的網絡消耗;b.在上傳文件時,一旦發生故障,會形成資源的浪費。

不能過小,a. 塊過小,一樣大小的文件,會佔用過多的NN的元數據空間;b. 塊過小,在進行讀寫操做時,會消耗額外的尋址空間

7 副本數的概念指的是最大副本數

默認塊大小128M,指的是塊的最大大小。每一個塊最多存128M,若是當前塊存儲的數據不滿128M,存了多少數據,就佔用多少磁盤空間,一個塊只屬於一個文件。

8 shell操做

hadoop fs 既能夠對本地文件系統進行操做還能夠操做分佈式文件系統

hdfs dfs 只能操做分佈式文件系統

hadoop fs -help +命令,可查幫助文檔

9 HDFS的寫數據流程

①服務端啓動HDFS中的NN和DN進程
②客戶端建立一個分佈式文件系統客戶端,由客戶端向NN發送請求,請求上傳文件
③NN處理請求,檢查客戶端是否有權限上傳,路徑是否合法等
④檢查經過,NN響應客戶端能夠上傳
⑤客戶端根據本身設置的塊大小,開始上傳第一個塊,默認0-128M,
NN根據客戶端上傳文件的副本數(默認爲3),根據機架感知策略選取指定數量的DN節點返回
⑥客戶端根據返回的DN節點,請求創建傳輸通道

客戶端向最近(網絡舉例最近)的DN節點發起通道創建請求,由這個DN節點依次向通道中的(距離當前DN距離最近)
下一個節點發送創建通道請求,各個節點發送響應 ,通道創建成功

⑦客戶端每讀取64K的數據,封裝爲一個packet(數據包,傳輸的基本單位),將packet發送到通道的下一個節點

通道中的節點收到packet以後,落盤(檢驗)存儲,將packet發送到通道的下一個節點!
每一個節點在收到packet後,向客戶端發送ack確認消息!

⑧一個塊的數據傳輸完成以後,通道關閉,DN向NN上報消息,已經收到某個塊
⑨第一個塊傳輸完成,第二塊開始傳輸,依次重複⑤-⑧,直到最後一個塊傳輸完成,NN向客戶端響應傳輸完成!

客戶端關閉輸出流

10 異常寫流程

①-⑥見上
⑦客戶端每讀取64K的數據,封裝爲一個packet,封裝成功的packet,放入到一個隊列中,這個隊列稱爲dataQuene(待發送數據包)
在發送時,先將dataQuene中的packet按順序發送,發送後再放入到ackquene(正在發送的隊列)。
每一個節點在收到packet後,向客戶端發送ack確認消息!
若是一個packet在發送後,已經收到了全部DN返回的ack確認消息,這個packet會在ackquene中刪除!
假如一個packet在發送後,在收到DN返回的ack確認消息時超時,傳輸停止,ackquene中的packet會回滾到
dataQuene。

從新創建通道,剔除壞的DN節點。創建完成以後,繼續傳輸!
只要有一個DN節點收到了數據,DN上報NN已經收完此塊,NN就認爲當前塊已經傳輸成功!
NN會自動維護副本數!

11 機架感知

2.7.2默認的策略:
第一個副本放在本地機架的一個DN節點
第二個副本放在本地機架的另外一個DN節點

本地機架的網絡拓撲舉例最多爲2,速度快!

第三個副本放在其餘機架的一個DN節點

爲了安全性

tomcat服務器日誌
數據庫服務卡mysql數據 客戶端()

5、MapReduce

6、zookeeper

一、概述:zookeeper= 文件系統+通知機制

開源的分佈式的,爲分佈式應用提供協調服務的apache項目,多用做爲集羣提供服務的中間件

負責存儲和管理你們都關心的數據,eg,hdfs 的url

Zookeeper是java編寫的一個開源的分佈式的存儲中間件!
Zookeeper能夠用來存儲分佈式系統中各個進程都關心的核心數據!
Zookeeper採起觀察者模式設計,能夠運行客戶端在讀取數據時,設置一個觀察者一旦觀察的節點觸發了指定的事件,服務端會通知客戶端線程,客戶端能夠執行回調方法,執行對應的操做!

二、特色:

(1)一致性:zookpeer 中的數據按順序分批入庫,並最終一致

(2)原子性:一次數據更新要麼成功要麼失敗

(3)單一視圖:client 不管鏈接到哪一個zk節點,數據都是一致的

(4)可靠性:每次對zk的操做狀態都會保存到服務器,每一個server保存一份相同的數據副本(和hdfs不同,dhfs 每一個datanode 數據不一致)

(5)更新請求順序進行,來自同一個client的更新請求按其發送順序依次執行

(6)實時性:在必定範圍內,client 能讀取到最新數據

三、數據結構

與unix文件系統相似,總體可看做一棵樹,每一個節點稱做一個znode,每一個znode能夠相似看做一個目錄,其餘能夠建立子目錄

zookeeper 集羣自身維護了一套數據結構,存儲結構是一個樹形結構,其上每一個節點,成爲znode,每一個znode默認能存1M的數據,每一個znode能夠經過其路徑惟一標示

四、應用場景:

數據發佈與訂閱:適用於配置信息多設備共享,會發生動態變化

軟負載均衡:負責收集服務信息與狀態監控

集羣管理:每臺機器的運行狀態收集

五、使用

啓動:   bin/zkServer.sh start
             bin/zkCli.sh -server host:port
             
中止:   bin/zkServer.sh stop
          bin/zkCli.sh -server host:port  close|exit
          
增:   create [-s] [-e]  path  data
                -s:  建立一個帶序號的znode
                -e:  建立一個臨時znode,臨時的znode被所建立的session擁有,一旦session關閉,臨時
                        節點會被刪除
刪:   delete  path 
            rmr   path
改:   set  path  data

查:   get  path 
       stat path
       ls   path
       ls2  path
支持四字命令
nc hadoop101 2181  ruok
設置觀察者
  get  path watch:  監聽指定節點數據的變化
    ls   path watch:  監聽當前路徑子階段數據的變化,一旦新增或刪除了子節點,會觸發事件
    注意: 觀察者在設置後,只有當次有效!

2、ZK集羣的注意事項

  1. ZK在設計時,採用了paxos協議設計,這個協議要求,集羣半數以上服務實例存儲,集羣

    才能夠正常提供服務
  2. ZK集羣中,server有Leader 和Followwer兩種角色

    Leader只有一個,在集羣啓動時,自動選舉產生!
    
    選舉Leader時,只有數據和Leader保持同步的Follower有權參與競選Leader!
    在競選Leader時,serverid大的Server有優點!
  3. 集羣模式ZK的寫流程

    ①客戶端能夠鏈接任意的zkserver實例,向server發送寫請求命令
    ②若是當前鏈接的server不是Leader,server會將寫命令發送給Leader
    ③Leader將寫操做命令廣播到集羣的其餘節點,全部節點都執行寫操做命令
    ④一旦集羣中半數以上的節點寫數據成功,Leader會響應當前Server,讓當前Server
            響應客戶端,寫操做完成!

相關文章
相關標籤/搜索