大數據概述

大數據定義

	 在(短時間)內(快速)產生的(大量)的(多種多樣)的(有價值)的信息

數據量過大的問題:擴展

垂直擴展

文字詳情:在原本的服務器中,增加內存條,比較昂貴
如下圖:正方形爲服務器圓爲內存條 

在這裏插入圖片描述

橫向擴展

文字詳情:增加多臺服務器達到集羣,可以無限增加,簡單廉價的服務器或者PC端都可以
如圖:正方形爲服務器,可以無限增加

在這裏插入圖片描述

** hadoop生態圈來源谷歌的三大論文**
主要組件:HDFS、MapReduce、YARN、Sqoop、Hbase

一、GFS — HDFS分佈式文件系統(分佈式的存儲)

HDFS 採用了主從結構
  1. block塊的形式將大文件進行相應的存儲 —(大小可以隨意設置)
    1.x默認64M
    2.x默認128M
  1. 文件線性切割成塊(Block) : 以偏移量offset(byte)標識//等於每塊block的id
  1. Block 分散存儲在集羣結點中
    多臺服務器一起存儲一個切割後的文件的各個Block
  1. 單一文件Block大小一致 文件與文件可以不一致
    文件中的一個Block爲128M,則每個都爲128M
    文件a與文件b的Block的大小可以不一致
  1. Block可以設置副本數,副本分散在不同的節點中
    Block可以備份,要備份在不同的服務器節點中
  1. 副本數不要超過節點數量
    備份的數量不要超過節點的數量
  1. 文件上傳時可以設置Block的大小和副本數
    只有在上傳的時候才能設置Block的大小和備份的數量
  1. 只支持一次寫入多次讀取,同一時刻只能有一個寫入者
  1. 當文件按照給定的Block大小切割時,最後餘出一點,此時無論多出來的Block多小,都會多出一塊Block去裝最後的一點
主節點(Namenode)
  1. 掌控全局 管理從節點(Datenode的信息) 管理元數據
    元數據:描述數據的數據
    源數據:數據
  1. 接收客戶端(Client)的請求 讀寫
  1. 與從節點(Datenode)之間進行相應的通信
從結點(Datenode)
  1. 幹活的— 存儲數據
  1. 彙報自己的情況給主節點(Namenode)
  1. 接收客戶端(Client)的安排
客戶端(Client)
hdfs的讀寫機制:讀文件和存文件

寫操作:

  1. 源數據 : 一個大文件
  2. 客戶端(Client)會將這個大文件進行切塊 文件的大小/塊的大小=Block塊數
  3. 客戶端(Client)向主節點(Namenode)彙報
    3.1 塊(Block)的數量
    3.2 文件的大小
    3.3 文件的權限
    3.4 文件的屬主
    3.5 文件的上傳時間
  4. 客戶端(Client)切下來的塊(Block)默認128M
  5. 客戶端(Client)會向主節點(Namenode)去申請資源----得到從節點(Datanode)的信息
  6. 主節點(Namenode)會返回一批負載不高的從節點(Datanode)的信息
  7. 客戶端(Client)會向從節點(Datanode)裏面發送Block並且做好備份
  8. 從節點(Datanode)存放Block塊之後會向主節點(Namenode)彙報情況

讀請求:

  1. 主節點(Namenode)會向客戶端(Client)中發送一個請求,客戶端(Client)結束到請求後,會向主節點(Namenode)中申請得到從節點(Datanode)的信息(Blockid)//偏移量
  2. 主節點(Namenode)向客戶端(Client)中發送一些節點信息
  3. 客戶端(Client)獲取到節點信息後去從節點(Datanode)拿取數據 — 就近原則
備份—爲了解決安全問題
備份的機制:

1.提交

  1. 集羣內提交
    在提交的節點上(本節點)放置block—就近原則
  2. 集羣外提交
    選擇一個負載不高的節點進行存放

2.放置在與第一個備份不同機架(放置服務器的架子)的任意節點上

3.放置在與第二個備份相同的機架不同的節點上

pipeline管道 --- 各個節點接收block的備份

1.主節點(Namenode)在返回客戶端(Client)一些從節點(Datanode)的信息

2.客戶端(Client)會和這些從節點(Datanode)形成一個管道,並且將Block切割成一個個ackPageAge(64k)

3.從節點(Datanode)會從管道中拿取相應的數據進行存儲

4.當存儲完成後,從節點(Datanode)會向主節點(Namenode)進行彙報

二、MapReduce — 分佈式批處理

** MapReduce運行時,首先通過Map讀取HDFS中的數據,然後經過拆分,將每個文件中的每行數據分拆成鍵值對,最後輸出作爲Reduce的輸入**
在這裏插入圖片描述
文本的數據記錄:如文本的行就是以"鍵值對"的方式傳入Map函數,然後Map函數對這些鍵值對進行處理(例:計算詞頻),然後輸出到中間結果。

Map就是一個Java進程,它會讀取HDFS,會把數據解析成很多的鍵值對,然後經過我們的Map方法處理後,轉換成很多的鍵值對再輸出。
整個Mapper的執行過程又可以分如下幾步:
在這裏插入圖片描述

在上圖中,把Mapper任務的運行過程分爲六個階段。

  1. 把輸入文件按照一定的標準分片 (InputSplit),每個輸入片的大小是固定的。默認情況下,輸入片(InputSplit)的大小與數據塊(Block)的大小是相同的。如果數據塊(Block)的大小是默認值64MB,輸入文件有兩個,一個是32MB,一個是72MB。那麼小的文件是一個輸入片,大文件會分爲兩個數據塊,那麼是兩個輸入片,一共產生三個輸入片。每一個輸入片由一個Mapper進程處理,這裏的三個輸入片,會有三個Mapper進程處理。
  2. 對輸入片中的記錄按照一定的規則解析成鍵值對,有個默認規則是把每一行文本內容解析成鍵值對,這裏的“鍵”是每一行的起始位置(單位是字節),“值”是本行的文本內容。
  3. 調用Mapper類中的map方法,在第2階段中解析出來的每一個鍵值對,調用一次map方法,如果有1000個鍵值對,就會調用1000次map方法,每一次調用map方法會輸出零個或者多個鍵值對。
  4. 按照一定的規則對第3階段輸出的鍵值對進行分區,分區是基於鍵進行的,比如我們的鍵表示省份(如北京、上海、山東等),那麼就可以按照不同省份進行分區,同一個省份的鍵值對劃分到一個區中。默認情況下只有一個區,分區的數量就是Reducer任務運行的數量,因此默認只有一個Reducer任務。
  5. 對每個分區中的鍵值對進行排序。首先,按照鍵進行排序,對於鍵相同的鍵值對,按照值進行排序。比如三個鍵值 對<2,2>、<1,3>、<2,1>,鍵和值分別是整數。那麼排序後的結果 是<1,3>、<2,1>、<2,2>。如果有第6階段,那麼進入第6階段;如果沒有,直接輸出到本地的linux 文件中。
  6. 對數據進行歸約處理,也就是reduce處理,通常情況下的Comber過程,鍵相等的鍵值對會調用一次reduce方法,經過這一階段,數據量會減少,歸約後的數據輸出到本地的linxu文件中。本階段默認是沒有的,需要用戶自己增加這一階段的代碼。

Reducer任務的執行過程詳解

每個Reducer任務是一個java進程。Reducer任務接收Mapper任務的輸出,歸約處理後寫入到HDFS中,可以分爲如下圖所示的幾個階段。
在這裏插入圖片描述

  1. Reducer任務會主動從Mapper任務複製其輸出的鍵值對,Mapper任務可能會有很多,因此Reducer會複製多個Mapper的輸出。
  2. 把複製到Reducer本地數據,全部進行合併,即把分散的數據合併成一個大的數據,再對合並後的數據排序。
  3. 對排序後的鍵值對調用reduce方法,鍵相等的鍵值對調用一次reduce方法,每次調用會產生零個或者多個鍵值對,最後把這些輸出的鍵值對寫入到HDFS文件中。

鍵值對的編號

&nbsp; &nbsp; &nbsp;在對Mapper任務、Reducer任務的分析過程中,會看到很多階段都出現了鍵值對,這裏對鍵值對進行編號,方便理解鍵值對的變化情況,如下圖所示。
![在這裏插入圖片描述](https://img-blog.csdnimg.cn/20190617151504131.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3lvdUFyZVJpZGljdWxvdXM=,size_16,color_FFFFFF,t_70)
&nbsp; &nbsp; &nbsp;在上圖中,對於Mapper任務輸入的鍵值對,定義爲key1和value1,在map方法中處理後,輸出的鍵值對,定義爲key2和value2,reduce方法接收key2和value2處理後,輸出key3和value3。在下文討論鍵值對時,可能把key1和value1簡寫 爲<k1,v1>,key2和value2簡寫爲<k2,v2>,key3和value3簡寫爲<k3,v3>。

三、BigDate — HBase

四、yarn — 資源和任務調度

      YARN工作流程:
   運行在YARN上的應用程序主要分爲兩類:
短應用程序和長應用程序,其中,短應用程序是指一定時間內(可能是秒級、分鐘級或小時級,儘管天級別或者更長時間的也存在,但非常少)可運行完成並正常退出的應用程序,長應用程序是指不出意外,永不終止運行的應用程序,通常是一些服務。儘管這兩類應用程序作用不同,一類直接運行數據處理程序,一類用於部署服務(服務之上再運行數據處理程序),但運行在YARN上的流程是相同的。
   當用戶向YARN中提交一個應用程序後,YARN將分兩個階段運行該應用程序:第一個階段是啓動ApplicationMaster;第二個階段是由ApplicationMaster創建應用程序,爲它申請資源,並監控它的整個運行過程,直到運行完成。如下圖所示,
在這裏插入圖片描述

YARN的工作流程分爲以下幾個步驟:

  1. 用戶向YARN中提交應用程序,其中包括ApplicationMaster程序、啓動ApplicationMaster的命令、用戶程序等。

  2. ResourceManager爲該應用程序分配第一個Container,並與對應的Node-Manager通信,要求它在這個Container中啓動應用程序的ApplicationMaster。

  3. ApplicationMaster首先向ResourceManager註冊,這樣用戶可以直接通過ResourceManage查看應用程序的運行狀態,然後它將爲各個任務申請資源,並監控它的運行狀態,直到運行結束,即重複步驟4~7。

  4. ApplicationMaster採用輪訓的方式通過RPC協議向ResourceManager申請和領取資源。

  5. 一旦ApplicationMaster申請到資源後,便與對應的NodeManager通信,要求它啓動任務

  6. NodeManager爲任務設置好運行環境(包括環境變量、JAR包、二進制程序等)後,將任務啓動命令寫到一個腳本中,並通過運行該腳本啓動任務。

  7. 各個任務通過某個RPC協議向ApplicationMaster彙報自己的狀態和進度,以讓ApplicationMaster隨時掌握各個任務的運行狀態,從而可以在任務失敗時重新啓動任務。在應用程序運行過程中,用戶可隨時通過RPC向ApplicationMaster查詢應用程序的當前運行狀態。

  8. 應用程序運行完成後,ApplicationMaster向ResourceManager註銷並關閉自己。

    啓動命令:start-all.sh

五、Spark — 新一代計算框架

1 spark core
2 sparkSQL --- 可以使用sql語句處理
3 sparkStreaming --- 流式處理
4 mllib --- 機器學習庫
5 graphx --- sqark停止維護 

sqark需要 kafka zookeeper flume hive fink storm hbase 上實現
zookeeper 爲協調服務
hive 爲大型數據庫—使用sql語句

hadoop官網


僅供參考

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章