1. 程式人生 > >5.大資料學習之旅——hadoop-簡介及偽分散式安裝

5.大資料學習之旅——hadoop-簡介及偽分散式安裝

Hadoop簡介

是Apache的頂級專案,是一個可靠的、可擴充套件的、支援分散式計算的開源
專案。

起源

創始人:Doug Cutting 和Mike
2004 Doug和Mike建立了Nutch - 利用通用爬蟲爬取了網際網路上的所有數
據,獲取了10億個網頁資料 - 10億個網頁資料是非結構化資料,就意味
著這些資料是無法儲存到資料庫中
在這裡插入圖片描述
Doug發現了Google在2003年發表的一篇論文:《Google File System》,設計
了NDFS - Nutch Distributed File System解決了Nutch的儲存問題
Doug發現了Google在2003年發表的另一篇論文:《Google MapReduce》,
這篇論文講述了Google分散式系統的中的計算問題,Doug根據這篇論文設
計了MapReduce
後來,從Nutch0.8版本開始,就將NDFS和MapReduce模組獨立出來成為了
Hadoop,並且將NDFS更名為HDFS
Doug帶著Hadoop去了Yahoo,在Yahoo期間,設計了Pig, Hive, HBase等框架
Yahoo將Hadoop等框架貢獻給了Apache
Hadoop:Doug在命名的時候希望用一些無意義的單詞,就是為了防止重

Hadoop的版本

  1. Hadoop1.0:HDFS和MapReduce
  2. Hadoop2.0:完全重構的一套系統,不相容1.0。包含了
    HDFS、MapReduce和Yarn
  3. Hadoop3.0:包含了HDFS、MapReduce、Yarn以及Ozone

Hadoop的模組

  1. Hadoop Common:基本模組
  2. Hadoop Distributed File System:HDFS。進行資料的分散式儲存
  3. Hadoop YARN:進行任務排程和節點資源管理
  4. Hadoop MapReduce:基於Yarn對海量資料進行並行處理
  5. Hadoop Ozone:基於HDFS進行物件的儲存

Hadoop的偽分散式安裝

Hadoop的安裝方式

  1. 單機安裝。除了MapReduce模組以外,其他的都不能使用
  2. 偽分散式安裝。利用一臺主機模擬Hadoop的執行環境,可以使用
    Hadoop的所有模組
  3. 全分散式安裝。在真正的叢集上去安裝Hadoop。

偽分散式的安裝

  1. 關閉防火牆 service iptables stop
    vim /etc/sysnconfig/network
    更改HOSTNAME,例如
    HOSTNAME=hadoop01
    source /etc/sysconfig/network
  2. 修改主機名。在Hadoop叢集中,主機名中不允許出現_以及-,如果出現
    會導致找不到這臺主機。
    vim /etc/hosts
    新增 ip 主機名 ,例如
    192.168.60.132 hadoop01
  3. 更改hosts檔案
  4. 配置免密互通
    ssh-keygen
    ssh-copy-id 使用者名稱@主機地址,例如
    ssh-copy-id [email protected]
  5. 重啟計算機 reboot
  6. 安裝jdk
  7. 解壓Hadoop的安裝包 tar -xvf hadoop-2.7.1_64bit.tar.gz
  8. 進入安裝目錄下的子目錄etc下的子目錄hadoop cd
    hadoop-2.7.1/etc/hadoop
  9. 編輯hadoop-env.sh vim hadoop-env.sh
  10. 將JAVA_HOME替換為具體的jdk安裝目錄, 例如
    export JAVA_HOME=/home/preSoftware/jdk1.8
  11. 將HADOOP_CONF_DIR替換為具體的Hadoop的配置目錄。例如
    export HADOOP_CONF_DIR=/home/software/hadoop-2.7.1/etc/hadoop
  12. 重新生效 source hadoop-env.sh
  13. 編輯core-site.xml vim core-site.xml
  14. 新增內容
<!-- 指定HDFS中的管理節點 -->
<property>
<name>fs.defaultFS</name>
<value>hdfs://hadoop01:9000</value>
</property>
<!-- 指定儲存位置 -->
<property>
<name>hadoop.tmp.dir</name>
<value>/home/software/hadoop-2.7.1/tmp</value>
</property>
  1. 編輯hdfs-site.xml vim hdfs-site.xml
  2. 新增內容
<!-- hdfs中的複本數量 -->
<!-- 在偽分散式中,複本數量必須為1 -->
<property>
<name>dfs.replication</name>
<value>1</value>
</property>
  1. 將mapred-site.xml.template複製為mapred-site.xml cp mapred-
    site.xml.template mapred-site.xml
  2. 編輯mapred-site.xml vim mapred-site.xml
  3. 新增內容:
<!-- 在Hadoop的2.0版本中,MapReduce是基於Yarn執行 -->
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
  1. 配置yarn-site.xml vim yarn-site.xml
  2. 新增內容
<property>
<name>yarn.resourcemanager.hostname</name>
<value>hadoop01</value>
</property>
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
  1. Hadoop本身是主從結構,配置slaves指定從節點
    vim slaves
    新增從節點的地址
  2. 配置環境變數
    vim /etc/profile
    新增:
    export HADOOP_HOME=/home/software/hadoop-2.7.1
    export PATH= P A T H : PATH: HADOOP_HOME/bin:$HADOOP_HOME/sbin
    重新生效
    source /etc/profile
  3. 格式化資料目錄 hadoop namenode -format
    在這裡插入圖片描述
  4. 啟動hadoop start-all.sh
    在這裡插入圖片描述
  5. 如果啟動成功,可以在瀏覽器中輸入地址:50070訪問hadoop的頁面

HDFS


本身是用於儲存資料的
在這裡插入圖片描述

  1. 儲存資料的節點 - datanode, 管理資料的節點 - namenode
  2. HDFS儲存資料的時候會將檔案進行切塊,並且給每一個檔案塊分配
    一個遞增的編號
  3. HDFS儲存資料的時候會對資料進行備份,每一個備份稱之為是一個
    複本。在偽分散式下,複本設定為1,但是在全分散式下,複本預設
    是3個
  4. 3個複本是放到不同的datanode中。複本的放置策略 - 機架感知策
    略:
    1. 第一個複本:客戶端連線的是哪一個datanode,複本就放到哪一
      個datanode上
    2. 第二個複本:要放到另一個機架的datanode上
    3. 第三個複本:放到和第二個複本同機架的另一個datanode上
    4. 如果有更多的複本數量,其他的複本隨機放到其他的datanode
  5. 如果某一個datanode宕機,那麼這個時候namenode就會將這個
    datanode上所存放的複本進行復制,保證整個hdfs中有指定的複本數量
  6. namenode需要管理datanode,namenode中儲存管理資訊 — 元資料 -
    metadata — FileName replicas block-Ids id2host:
    1. 記錄檔案儲存位置 /node01/a.txt
    2. 記錄檔案切的塊數
    3. 檔案塊儲存的datanode的地址
      /test/a.log,3,{b1,b2},[{b1:[h0,h1,h3]},{b2:[h0,h2,h4]}] — 儲存的檔案
      時a.log檔案,儲存在/test路徑下,複本數量為3,切了2塊,編號
      為b1,b2,b1存放在h0,h1,h3節點下,b2存放在h0,h2,h4節點下
  7. datanode主動向namenode傳送心跳,保持namenode對datanode的管
    理。心跳資訊包含:1.節點狀態 2.節點儲存的資料
  8. 如果超過10min中,namenode沒有收到datanode的心跳,那麼就認
    為這個datanode已經lost,那麼namenode就會將這個lost的datanode
    中的資料進行備份

優點

  1. 支援超大檔案:將檔案進行切塊分別放到不同的節點上
  2. 檢測和快速應對硬體故障:心跳機制
  3. 流式資料訪問
  4. 簡化的一致性模型:只要一個檔案塊寫好,那麼這個檔案塊就不允許
    在進行改動,只能讀取
  5. 高容錯性:多複本。
  6. 可構建在廉價機器上:HDFS具有較好的擴充套件性。

缺點

  1. 高延遲資料訪問:不適合於互動式,也就意味著Hadoop不適合做實
    時分析,而是做的離線分析
  2. 大量的小檔案:檔案的儲存要經過namenode,namenode中要記錄元
    資料,元資料是儲存在記憶體中。大量的小檔案會產生大量的元資料,導
    致記憶體被大量佔用,降低namenode的處理效率
  3. 多使用者寫入檔案、修改檔案:在hadoop2.0版本中,不支援修改,但
    是支援追加
  4. 不支援超強的事務

技術細節

Block

HDFS在儲存資料的時候是將資料進行切塊,分別儲存到不同的節點上。
在Hadoop1.0版本中,每一個block預設是64M大小,在Hadoop2.0版本
中,每一個block預設是128M大小
400M - 4 - 其中前3塊,每一塊是128M,第4塊是16M
100M - 1 - 檔案塊按照實際大小100M儲存
好處:

  1. 利於大檔案的儲存
  2. 方便傳輸
  3. 便於計算

NameNode

負責datanode的管理以及儲存元資料。
元資料存在記憶體(快速查詢)和磁碟(崩潰恢復)中
HDFS的結構中,namenode存在單點問題
fsimage - 儲存元資料。但是注意fsimage中的元資料和記憶體中並不一致,
也就意味著fsimage中的資料並不是實時資料
edits - 儲存HDFS的操作
fstime - 記錄上一次的更新時間
在這裡插入圖片描述

觸發更新的條件:

  1. 檔案大小 — 根據配置檔案設定的edits log大小 fs.checkpoint.size 預設
    64MB
  2. 定時更新 — 根據配置檔案設定的時間間隔:fs.checkpoint.period 默
    認3600秒
  3. 重啟hdfs的時候也會觸發更新 — 在合併過程中,HDFS不對外提供
    寫服務,只提供讀服務 — 重啟hdfs的時候進行的更新階段 — 安
    全模式

安全模式:

  1. 只能讀不能寫
  2. 檢查複本數量以及總量 — 導致偽分散式環境下,複本數量必須設
    置為1
    安全模式:
    如果重啟hdfs,處於安全模式,等待一會兒,檢查完資料都沒有問題,
    自動退出安全模式
    在學習期間,重啟hdfs之後如果長期處於安全模式中,說明資料有損
    壞:
  3. 強制退出安全模式 hadoop dfsadmin -safemode leave
  4. 關閉HDFS
  5. 刪除dfs、nm-local-dir、logs
  6. 重新格式化 hadoop namenode -format
    SecondaryNameNode
    不是namenode的熱備份,而是進行fsimage和edits的合併的

hdfs體系結構

在這裡插入圖片描述

hdfs讀取資料

在這裡插入圖片描述

#hdfs寫入資料
在這裡插入圖片描述

mr原理

在這裡插入圖片描述

ssn合併流程

在這裡插入圖片描述

上一篇 4.大資料學習之旅——Avro