hadoop 僞分佈式模式學習筆記

前言

Hadoop在大數據技術體系中的地位相當重要,Hadoop是大數據技術的基礎。java

這是一篇記錄我本身學習的文章,Hadoop的學習方法不少,網上也有不少學習路線圖。node

hadoop介紹

Hadoop是一個可以對海量數據進行分佈式處理的系統架構。我採用的是hadoop-2.8.0,它主要包含3大塊:算法

  • hdfs:分佈式存儲系統HDFS(Hadoop Distributed File System)分佈式存儲層
  • mapreduce:分佈式計算框架MapReduce分佈式計算層
  • yarn:資源管理系統YARN(Yet Another Resource Negotiator)集羣資源管理層

Hadoop的核心是:HDFS和MapReduce。apache

分佈式存儲系統HDFS

HDFS(Hadoop Distributed File System,Hadoop 分佈式文件系統)是一個高度容錯性的系統,適合部署在廉價的機器上。HDFS 能提供高吞吐量的數據訪問,適合那些有着超大數據集(largedata set)的應用程序。HDFS負責大數據的存儲,經過將大文件分塊後進行分佈式存儲方式,突破了服務器硬盤大小的限制,解決了單臺機器沒法存儲大文件的問題,HDFS是個相對獨立的模塊,能夠爲YARN提供服務,也能夠爲HBase等其餘模塊提供服務。安全

核心bash

  • NameNode
  • DataNode
  • SecondaryNameNode(NameNode的快照)

HDFS是一個主從結構,一個HDFS集羣由一個名字節點(NameNode)和多個數據節點(DataNode)組成。服務器

HDFS的優勢(設計思想)

1.高容錯性 HDFS 認爲全部計算機均可能會出問題,爲了防止某個主機失效讀取不到該主機的塊文件,它將同一個文件塊副本分配到其它某幾個主機上,若是其中一臺主機失效,能夠迅速找另外一塊副本取文件。數據自動保存多個節點;備份丟失後,自動恢復。網絡

2.海量數據的存儲 很是適合上T 級別的大文件或者一堆大數據文件的存儲數據結構

3.文件分塊存儲 HDFS 將一個完整的大文件平均分塊(一般每塊64M)存儲到不一樣計算機上,這樣讀取文件能夠同時從多個主機取不一樣區塊的文件,多主機讀取比單主機讀取效率要高得多得多。架構

4.移動計算 在數據存儲的地方進行計算,而不是把數據拉取到計算的地方,下降了成本,提升了性能!

5.流式數據訪問 一次寫入,並行讀取。不支持動態改變文件內容,而是要求讓文件一次寫入就不作變化,要變化也只能在文件末添加內容。

6.可構建在廉價的機器上 經過多副本提升可靠性,提供了容錯和恢復機制。HDFS 能夠應用在普通PC 機上,這種機制可以讓一些公司用幾十臺廉價的計算機就能夠撐起一個大數據集羣。

NameNode

做用

  • 它是一個管理文件的命名空間
  • 協調客戶端對文件的訪問
  • 記錄每一個文件數據在各個DataNode上的位置和副本信息

文件解析

  • version:是一個properties文件,保存了HDFS的版本號
  • editlog:任何對文件系統數據產生的操做,都會被保存!
  • fsimage /.md5:文件系統元數據的一個永久性的檢查點,包括數據塊到文件的映射、文件的屬性等
  • seen_txid :很是重要,是存放事務相關信息的文件

什麼是FSImage和EditsLog

FsImage和Editlog是HDFS的核心數據結構。這些文件的損壞會致使整個集羣的失效。所以,名字節點能夠配置成支持多個FsImage和EditLog的副本。任何FsImage和EditLog的更新都會同步到每一份副本中。

SecondaryNameNode

做用

  • Namenode的一個快照,週期性的備份Namenode
  • 記錄Namenode中的metadata及其它數據
  • 能夠用來恢復Namenode,並不能替代NameNode!

執行流程

  1. SecondaryNameNode節點會按期和NameNode通訊,請求其中止使用EditLog,暫時將新的寫操做到一個新的文件edit.new上來,這個操做是瞬間完成的。
  2. SecondaryNameNode 經過HTTP Get方式從NameNode上獲取到FsImage和EditLog文件並下載到本地目錄
  3. 將下載下來的FsImage 和EditLog加載到內存中這個過程就是FsImage和EditLog的合併(checkpoint)
  4. 合併成功以後,會經過post方式將新的FsImage文件發送NameNode上。
  5. SecondaryNamenode 會將新接收到的FsImage替換掉舊的,同時將edit.new替換EditLog,這樣EditLog就會變小。

DataNode

做用

  • 真實數據的存儲管理
  • 一次寫入,屢次讀取(不修改)
  • 文件由數據塊組成,Hadoop2.x的塊大小默認是128MB
  • 將數據塊儘可能散佈到各個節點

文件解析

  • blk_<id>:HDFS的數據塊,保存具體的二進制數據
  • blk_<id>.meta:數據塊的屬性信息:版本信息、類型信息

能夠經過修改hdfs-site.xml的dfs.replication屬性設置產生副本的個數!默認是3!

基本操做

MapReduce

MapReduce分佈式處理框架爲海量的數據提供了計算。MapReduce是一個計算框架,它給出了一種數據處理的方式,即經過Map階段、Reduce階段來分佈式地流式處理數據。它只適用於大數據的離線處理,對實時性要求很高的應用不適用。

簡介

  • MapReduce是一種分佈式計算模型,是Google提出的,主要用於搜索領域,解決海量數據的計算問題。
  • MR有兩個階段組成:Map和Reduce,用戶只需實現map()和reduce()兩個函數,便可實現分佈式計算。

MapReduce執行流程

MapReduce原理

MapReduce的執行步驟

  1. 讀取HDFS中的文件。每一行解析成一個<k,v>。每個鍵值對調用一次map函數。 - <0,hello you> <10,hello me>
  2. 覆蓋map(),接收1產生的<k,v>,進行處理,轉換爲新的<k,v>輸出。 - <hello,1> <you,1> <hello,1> <me,1>
  3. 對2輸出的<k,v>進行分區。默認分爲一個區。
  4. 對不一樣分區中的數據進行排序(按照k)、分組。分組指的是相同key的value放到一個集合中。 - 排序後:<hello,1> <hello,1> <me,1> <you,1> ;分組後:<hello,{1,1}><me,{1}><you,{1}>
  5. (可選)對分組後的數據進行歸約
  6. 多個map任務的輸出,按照不一樣的分區,經過網絡copy到不一樣的reduce節點上。(shuffle)
  7. 對多個map的輸出進行合併、排序。覆蓋reduce函數,接收的是分組後的數據,實現本身的業務邏輯 -  <hello,2> <me,1> <you,1> 處理後,產生新的<k,v>輸出。
  8. 對reduce輸出的<k,v>寫到HDFS中。

MapReduce原理總結

原語一般由若干條指令組成,用來實現某個特定的操做。經過一段不可分割的或不可中斷的程序實現其功能。且常駐內存。可是這樣一來,若是原語執行須要的開銷超過了機器能給予的開銷,則該原語在機器上沒法執行,一般解決該問題的辦法是增長機器配置,但計算機的配置在上層每提高一點所須要的資金都是翻倍的。所以根據分佈式文件系統的原理,MapReduce誕生了。它將原語分紅了兩個步驟即map()和reduce(),同時兩個階段還能夠分紅多個模塊在不一樣的機器上執行。

開始學習

  1. 上傳hadoop.tar.gz到服務器並解壓

  1. 配置hadoop環境變量
vi /etc/prifile
複製代碼

添加配置

export HADOOP_HOME="/opt/modules/hadoop-2.8.0"
export PATH=$HADOOP_HOME/bin:$HADOOP_HOME/sbin:$PATH
複製代碼

執行:

source /etc/profile
複製代碼

使得配置生效,並驗證參數

echo ${HADOOP_HOME}
複製代碼

  1. 配置 hadoop-env.shmapred-env.sh、yarn-env.sh文件的JAVA_HOME參數

修改JAVA_HOME參數爲java的安裝路徑

如何查看java安裝路徑:

4.配置core-site.xml

如下操做都是在hadoop解壓後的目錄中操做

vi etc/hadoop/core-site.xml
複製代碼

其中:

  • fs.defaultFS - 配置的是hdfs的地址,又爲默認文件系統的名稱。一個URI,其方案和權限決定了FileSystem的實現。uri的方案肯定命名FileSystem實現類的config屬性(fs.SCHEME.impl)。 uri的權限用於肯定文件系統的主機,端口等。 若是是本地模式,該配置能夠以下:
<configuration>
  <property>
    <name>fs.defaultFS</name>
    <value>hdfs://localhost:9000</value>
  </property>
</configuration>
複製代碼

若是是全分佈模式配置,該配置能夠以下:

<configuration>
  <property>
    <name>fs.defaultFS</name>
    <value>hdfs://master:9000</value>
  </property>
  <property>
    <name>io.file.buffer.size</name>
    <value>131072</value>
  </property>
  <property>
    <name>hadoop.tmp.dir</name>
    <value>file:/home/hadoop/tmp</value>
  </property>
  <property>
    <name>hadoop.proxyuser.hduser.hosts</name>
    <value>*</value>
  </property>
  <property>
    <name>hadoop.proxyuser.hduser.groups</name>
    <value>*</value>
  </property>
</configuration>
複製代碼
  • hadoop.tmp.dir - 配置的是Hadoop臨時目錄,好比HDFS的NameNode數據默認都存放這個目錄下,查看*-default.xml等默認配置文件,就能夠看到不少依賴${hadoop.tmp.dir}的配置。默認的hadoop.tmp.dir是/tmp/hadoop-${user.name},此時有個問題就是NameNode會將HDFS的元數據存儲在這個/tmp目錄下,若是操做系統重啓了,系統會清空/tmp目錄下的東西,致使NameNode元數據丟失,是個很是嚴重的問題,全部咱們應該修改這個路徑。

更多配置屬性介紹能夠查看這裏

5.配置hdfs-site.xml

vi etc/hadoop/hdfs-site.xml
複製代碼

dfs.replication - 配置的是HDFS存儲時的備份數量,由於這裏是僞分佈式環境只有一個節點,因此這裏設置爲1。

  1. 格式化hdfs
hdfs namenode -format
複製代碼

格式化是對HDFS這個分佈式文件系統中的DataNode進行分塊,統計全部分塊後的初始元數據的存儲在NameNode中。格式化後,查看core-site.xml裏hadoop.tmp.dir(本例是/opt/data目錄)指定的目錄下是否有了dfs目錄,若是有,說明格式化成功。

ll /opt/data/tmp
複製代碼

注意:

  • 格式化時,這裏注意hadoop.tmp.dir目錄的權限問題,應該hadoop普通用戶有讀寫權限才行,能夠將/opt/data的全部者改成hadoop。
sudo chown -R hadoop:hadoop /opt/data
複製代碼

查看NameNode格式化後的目錄

ll /opt/data/tmp/dfs/name/current
複製代碼

  • fsimage - 是NameNode元數據在內存滿了後,持久化保存到的文件。
  • fsimage*.md5 - 是校驗文件,用於校驗fsimage的完整性。
  • seen_txid - 是hadoop的版本
  • VERSSION - 文件中保存着namespaceID:NameNode的惟一ID。clusterID:集羣ID,NameNode和DataNode的集羣ID應該一致,代表是一個集羣。

  1. 啓動namenode、datanode、secondarynamenode

並經過jps命令查看是否啓動

  1. hdfs上測試建立目錄、上傳、下載文件
  • 建立目錄
hdfs dfs -mkdir /demol
複製代碼

經過hdfs建立的目錄咱們直接用ls是查看不到的,此時可使用如下命令查看

hdfs dfs -ls /
複製代碼

  • 上傳本地文件到HDFS上
hdfs dfs -put {本地文件路徑} /demol
複製代碼

這裏我遇到了一個問題,上傳的時候提示我datanode沒有啓動,後來我用jps命令查看了發現datanode自動關閉了,這個問題的緣由是由於datanode的clusterID 和 namenode的clusterID 不匹配。

解決辦法,檢查hdfs-site.xml和core-site.xml的配置,若是沒有錯誤,則查看tmp/dfs下的name和data的VERISON中的集羣id是否匹配,若是不匹配則刪除datanode中current下的文件而後從新啓動;或者直接修改集羣id

  • 下載文件到本地
hdfs dfs -get {HDFS文件路徑} 
複製代碼

  1. 配置mapred-site.xml,yarn-site.xml

默認沒有mapred-site.xml文件,可是有個mapred-site.xml.template配置模板文件。複製模板生成mapred-site.xml

cp etc/hadoop/mapred-site.xml.template etc/hadoop/mapred-site.xml 
複製代碼

添加配置以下:

<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
複製代碼

指定mapreduce運行在yarn框架上。

配置yarn-site.xml,添加配置以下:

<property>
  <name>yarn.nodemanager.aux-services</name>
  <value>mapreduce_shuffle</value>
</property>
<property>
    <name>yarn.resourcemanager.hostname</name>
    <value>0.0.0.0</value>
</property>
複製代碼
  • yarn.nodemanager.aux-services配置了yarn的默認混洗方式,選擇爲mapreduce的默認混洗算法。
  • yarn.resourcemanager.hostname指定了Resourcemanager運行在哪一個節點上。

更多屬性查看

  1. 啓動resourcemanager、nodemanager
yarn-daemon.sh start resourcemanager
yarn-daemon.sh start nodemanager
複製代碼

經過jsp查看是否成功開啓

  1. 運行MapReduce Job

在hadoop的share目錄裏,自帶了一些jar包,裏面帶有一些mapreduce實例的小例子,位置在share/hadoop/mapreduce/hadoop-mapreduce-examples-2.5.0.jar,這裏運行一個經典的單詞統計實例

建立測試用的input文件

建立輸入目錄並將文件上傳上去

hdfs dfs -mkdir -p /wordcount/input
hdfs dfs -put /opt/data/wc.input /wordcount/input
複製代碼

運行wordcount mapreduce job

yarn jar share/hadoop/mapreduce/hadoop-mapreduce-examples-2.8.0.jar wordcount /wordcount/input /wordcount/output
複製代碼

查看結果目錄

hdfs dfs -ls /wordcount/output
複製代碼

  • output目錄中有兩個文件,_SUCCESS文件是空文件,有這個文件說明Job執行成功。

  • part-r-00000文件是結果文件,其中-r-說明這個文件是Reduce階段產生的結果,mapreduce程序執行時,能夠沒有reduce階段,可是確定會有map階段,若是沒有reduce階段這個地方有是-m-。

  • 一個reduce會產生一個part-r-開頭的文件。

查看結果文件

總結

  • hdfs - 負責大數據文件的存儲,文件保存爲hadoop二進制文件,沒法被直接查看,保證了安全性。其中的目錄至關於虛擬目錄。
  • yarn - 一個任務調度框架,mapreduce在它上面運行。同時它還能夠運行storm,spark等
  • mapreduce - 計算框架,給出數據處理方案,而後經過yarn在多臺機器上運行,若是將每臺機器看做一個CPU,那麼該程序編寫過程當中要求能支持並行且不會致使數據混亂。
相關文章
相關標籤/搜索