1. 程式人生 > >記錄Hadoop學習---HDFS

記錄Hadoop學習---HDFS

一、Hadoop簡介:

1、概念:

   一個開源(免費)、高可靠(資料有備份,如果資料丟失,Hadoop可以自動恢復)、可擴充套件(靈活性很高,可以隨時新增服務節點)的分散式(多臺伺服器並行處理任務)計算框架。

 

2、解決的問題:

   * 海量資料的儲存--HDFS

   * 海量資料的分析--MapReduce

   * 分散式資源排程--Yarn

 

3、產生背景:

   受Google三篇論文啟發(GFS,MapReduce,BigTable)。

 

4、特點:

   * 擴容能力:能可靠的儲存和處理千兆位元組(PB)資料;

   * 成本低:可以通過普通機器組成的伺服器群來分發以及處理資料,這些伺服器群總計可達數千個節點。

   * 高效率:通過分發資料,Hadoop可以在資料所在的節點上並行的處理它們,這使得速度非常快。

   * 可靠性:hadoop能自動維護資料的多分副本,並且在任務失敗後能自動重新部署。

 

5、應用場景:

   * 日誌分析

   * 基於海量資料的線上應用

   * 推薦系統

   * 計算廣告

   * 複雜演算法

   * 網盤

   * 搜尋引擎

   * 。。。。。。

6、

7、核心元件:

   * Hadoop Common: 為其他Hadoop模組提供基礎設施;

   * Hadoop HDFS:一個高可靠、高吞吐量的分散式檔案系統;

   * Hadoop MapReduce:一個分散式的離線平行計算框架;

   * Hadoop YARN:一個新的MapReduce框架,任務排程與資源管理。

 

8、分散式(並行處理任務)離線(高延遲)計算框架--MapReduce

   * Map任務處理:

       ① 讀取輸入檔案內容,解析成key、value對;

       ② 重寫map方法,編寫業務邏輯輸出新的key、value對;

       ③ 對輸出的key、value對進行分割槽(Partitioner類);

       ④ 對資料按照key進行排序、分組,相同key的value放到一個集合中。

   * Reduce任務處理:

       ① 對多個map任務的輸出,按照不同的分割槽,通過網路copy到不同的reduce節點;

       ② 對多個map任務的輸出進行合併、排序,寫reduce函式自己的邏輯,對輸入的key、vlaue對處理,轉換成新的key、value對輸出;

       ③ 把reduce的輸出儲存到檔案中。

 

二、Hadoop前置環境安裝

1、Linux環境:

   * VMWare虛擬機器、CentOS、JDK

 

2、配置虛擬機器:

   * 關閉防火牆:service itables stop   (這樣關閉在下次重啟虛擬機器時無效,需要永久關閉 chkconfig iptables off);

   * 禁用selinux:vim /etc/sysconfig/selinux   ,把“SELINUX”改為“disabled”;

 

3、修改主機名:

   * 檢視當前主機名:hostname

   * 修改主機名:hostname newName(虛擬機器重啟,主機名會還原),修改配置檔案永久修改主機名 vim /etc/sysconfig/network   , 把“HOSTNAME”改為“新的主機名”;

 

4、配置對映關係,把ip地址指向新的主機名:

   *  vim /etc/hosts   加入一行 172.16.11.178      hadoop  儲存,reboot 重啟虛擬機器;

 

5、配置ssh免密碼登入:

   * 使用ssh遠端登入本機: ssh 172.16.11.178    yes   輸入密碼  ,每次遠端都需要輸入密碼;

   * 首先生成金鑰:ssh-keygen -t rsa  4次回車  ;

   * 複製金鑰到本機:ssh-copy-id 172.16.11.178    輸入密碼,確定,完成,再次使用ssh 172.16.11.178 就不需要輸入密碼了。

 

6、配置JAVA環境:

    * cd /home

          mkdir tools  (存放工具安裝包)

          mkdir softwares   (存放安裝的軟體)

          mkdir datas   (存放測試用的資料)

         * 檢視系統是否自動安裝jkd :rpm -qa|grep jdk

         * 檢視系統是否安裝java :rpm -qa|grep java

         * 安裝上傳工具 lrzsz:yum install -y lrzsz 

         * 上傳jdk : rz   選擇jdk;

         * 解壓jdk到sorfwares目錄下: tar -zxf jdk-x-x-x.tar.gz -C /home/softwares/

         * 配置環境變數:進入jdk目錄下 cd /home/softwares/jdk-x-x/ ,  檢視安裝目錄 pwd   ,

                   修改配置檔案:vim /etc/profile, 

                   加入 export JAVA_HOME=/home/softwares/jdk-x-x

                        export PATH=$PATH:$JAVA_HOME/bin

                   重新整理配置檔案:source /etc/profile

                   輸入 java -version檢視jdk是否安裝成功。

 

7、建立普通使用者:

         * adduser hadoop01

          輸入密碼  admin

          再次輸入  admin  成功

          切換使用者 su hadoop01

          檢視當前使用者  whoami

          配置許可權 切換到root     su  輸入密碼

     新增檔案寫許可權  chmod u+x /etc/sudoers

          編輯檔案  vim /etc/sudoers

          加入 hadoop01     ALL=(ALL)                   ALL

          至此,hadoop01擁有了sudo許可權。

 

三、Hadoop偽分散式安裝

1、Hadoop執行模式:

         * 本地模式:所有Hadoop的守護程序執行在一個jvm中;

         * 偽分散式:所有Hadoop的守護程序各自執行在自己的jvm中;(適合開發學習)

         * 叢集模式:多臺機器來搭建分散式叢集,每個程序執行在獨立的jvm中,並對Namenode和ResourceMananger做Ha配置(適合企業使用)

 

2、安裝文件:

http://hadoop.apache.org/docs/r2.7.1/hadoop-project-dist/hadoop-common/SingleCluster.html

 

3、下載Hadoop:

         官方都是32位的,需要下載原始碼自己編譯成64位的。

         hadoop-x-x-src.tar.gz 原始碼包,解壓。

         編譯需要的工具:

         上傳,解壓到softwares;

         配置maven、findbugs的環境變數(同java環境變數)mvn -v  findbugs -version

         安裝protobuf,通過make來安裝:

                   安裝make和系統依賴:

                            yum -y install autoconf automake libtool cmake ncurses-devel openssl-devel lzo-devel zlib-devel gcc gcc-c++

                   cd /home/softwares/protobuf-2.5.0/

                   ./configure

                   make install

         編譯成64位hadoop:

                   cd /home/softwares/hadoop-x-x-src/

                   mvn package -Pdist,native,docs -DskipTests -Dtar

         編譯後的檔案位於maven目錄裡

 

4、設定hadoop

         * 進入hadoop安裝目錄 cd /home/softwares/hadoop-x-x/etc/hadoop/

         * vim hadoop-env.sh 設定java環境變數  echo $JAVA_HOME

         * 把“export JAVA_HOME=”改為“/home/softwares/jdk-x-x”

         * vim core-site.xml  加入:

                   <property>

                     <name>fs.defaultFS</name>

                     <value>hdfs://hadoop:8020</value>

                </property>

                   建立/home/softwares/hadoop-2.7.6/data/tmp這個目錄

                   <property>

                    <name>hadoop.tmp.dir</name>

                    <value>/home/softwares/hadoop-2.7.6/data/tmp</value>

               </property>

         fs.defaultFS:指定Namenode的通訊地址8020,

         hadoop.tmp.dir:指定執行中產生資料的存放目錄/data/tmp。

         *vim hdfs-site.xml  加入:

                   <property>

                   <name>dfs.replication</name>

                   <value>1</value>

             </property>

             <property>

                   <name>dfs.permissions.enabled</name>

                   <value>false</value>

             </property>

         * 格式化hdfs檔案系統:

                   cd /home/softwares/hadoop-x-x

                   bin/hadoop namenode -format

                   格式化成功

                   啟動檔案系統:sbin/start-dfs.sh   ,  jps 檢視程序

         * HDFS系統監控介面:

                   http://172.16.11.178:50070

         * 配置yarn:

                   重新命名mapred-site.xml.template為mapred-site.xml

                   vim mapred-site.xml  加入:

                            <property>

                           <name>mapreduce.framework.name</name>

                         <value>yarn</value>

                       </property>

                   vim yarn-site.xml  加入:

                            <property>

                         <name>yarn.nodemanager.aux-services</name>

                         <value>mapreduce_shuffle</value>

                       </property>

                   啟動yarn :sbin/start-yarn.sh

                   yarn監控介面:172.16.11.178:8088

                   cd /home/data/

                   建立words檔案:touch words

                   寫入資料:vim words

                   檢視words內容:more words

                   做詞頻統計:上傳words到hdfs

                            cd /home/softwares/hadoop-x-x/

                            bin/hadoop fs -put /home/data/words /words

                            hdfs系統介面裡會增加一個words檔案。

                   修改Windows的hosts檔案:

                            C:\Windows\System32\drivers\etc\目錄下hosts檔案加入:

                            172.16.11.178    hadoop

                   可以在hdfs系統介面下載上傳的檔案words了。

                   執行詞頻統計的demo:

                            bin/hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-2.7.1.jar wordcount /words /out

                   此時yarn介面有一個任務。

                   檢視執行結果:

                            bin/hadoop fs -ls /

                            bin/hadoop fs -ls /out

                   此時會有一個檔案:/out/part-r-00000記錄了執行結果,檢視檔案

                            bin/hadoop fs -cat /out/part-r-00000

 

四、HDFS架構詳解

1、分散式檔案系統

         * 物理層儲存的分散式:用多臺伺服器共同儲存;

         * 基於客戶機/伺服器模式:通常一個分散式檔案系統提供多個供使用者訪問的伺服器

         * 通常情況下都會提供備份和容錯的功能;

         * 通常情況下都是基於作業系統的本地檔案系統:

                   ext3,ext4

                   NTFS

2、分散式檔案系統的優點:

         * 傳統檔案系統最大的問題是容量和吞吐量的限制;

         * 多使用者多應用的並行讀寫是分散式檔案系統產生的根源

         * 擴充儲存空間的成本低廉,可以使用普通的pc機代替

         * 可提供冗餘備份;

         * 為分散式計算提供基礎服務

3、基本概念:

         * 是一個分散式檔案系統;

         * 是使用java實現的、分散式的、可橫向擴充套件的檔案系統

         * 是Hadoop的核心元件

         * 基於*nix

         * 具有很高的容錯性,提供了高吞吐量的資料訪問

         * 適用於一次寫入,多次查詢的情況,不支援併發寫的情況,小檔案不合適

4、前提和設計目標:

         * 硬體錯誤是常態

                   錯誤檢測和快速自動的恢復是HDFS最核心的架構目標

         * 儲存超大檔案

                   HDFS適合大量儲存,總儲存量可達到PB、EB級

                   HDFS適合大檔案,單個檔案一般在百MB級以上

                   檔案數目適中

         * 流式資料訪問

                   HDFS適合用於批量處理,不適合隨機定位訪問

         * 簡單一致性模型

                   HDFS的應用程式需要對檔案實行一次性寫、多次讀的訪問模式

                   不能修改已寫入的資料

         * 程式採用“資料就近”原則分配節點執行

                   移動計算比移動資料的代價要低

         * 執行在普通廉價的伺服器上

                   HDFS設計理念之一就是讓它能執行在普通的硬體指上,即便硬體出現故障,也可以通過容錯策略來保證資料的高可用

        

5、侷限性:

         * 不適合低延遲資料訪問

                   高吞吐量可能要求以高延遲為代價

                   HBase可以彌補不足

         * 無法高效儲存大量小檔案

                   檔案數量大小的限制由namenode決定

         * 不支援多使用者寫入及任意修改檔案

 

6、基本概念--塊

         * HDFS基本儲存單位是塊,傳統的塊儲存介質中,塊是讀寫的最小資料單位(扇區)

         * HDFS也使用塊的概念,Hadoop1.x版本預設為64M,Hadoop2.x版本預設為128M

                   可自行在hdfs-site.xml檔案中配置:

                   1.x版本修改:dfs.block.size , 2.x版本修改:dfs.blocksize

                   預設單位為位元,兆與位元的計算方法:128*1024*1024

                   每一個塊有一個自己的全域性ID

         * HDFS將一個檔案分為一個或數個塊來儲存

                   每個塊是獨立的儲存單位

                   以塊為單位在叢集伺服器上分配儲存

7、塊--帶來的好處:

         * 一個檔案的大小可以大於網路中任意一個磁碟的容量

         * 簡化了儲存子系統的設計,簡化了儲存管理,消除了對元資料的顧慮

         * 適合用於資料備份,提高了容錯能力和可用性

8、塊的冗餘備份:

         * 每個塊在叢集上會儲存多份副本,預設三份,可以動態修改

         * 簡化了儲存子系統的設計,簡化了儲存管理,消除了對元資料的顧慮

         * 適合用於資料備份,提高了容錯能力和可用性

9、體系架構圖:

 

10、HDFS元資料:

         * 檔案系統目錄樹資訊

                   檔名、目錄名

                   檔案和目錄的從屬關係

                   檔案和目錄的大小,建立及最後訪問時間

                   檔案和目錄的許可權

         * 檔案和塊的對應關係

                   檔案由哪些塊組成

 

11、NameNode職責詳解:

         * 管理檔案系統的名稱空間

         * 記錄每個檔案資料塊在各個DataNode上的位置和副本資訊

         * 記錄客戶端對檔案的方位

         * 記錄名稱空間內的改動或空間本身屬性的改動

         * NameNode使用事務日誌記錄HDFS元資料的變化。使用映像檔案儲存檔案系統的名稱空間,包括檔案對映、檔案屬性等

         * 通過檢查點(CheckPoint)更新影像檔案,Secondary NameNode輔助完成處理

 

12、DataNode職責詳解:

         * 負責所在物理節點的儲存管理

         * 一次寫入,多次讀取,不支援修改

         * 檔案由資料塊組成,典型的塊大小是64和128M

         * 資料塊儘量散佈到各個節點

 

13、HDFS讀取檔案流程:

        

 

14、HDFS寫檔案流程:

15、HDFS可靠性

         * 冗餘副本策略

                   可以在hdfs-site.xml中設定複製因子指定副本數量

                   所有資料塊都有副本

                   DataNode啟動時,遍歷本地檔案系統,產生一份hdfs資料塊和本地檔案的對應關係列表彙報給namenode

         * 機架策略

                   叢集一般放在不同的機架上,機架間的頻寬要比機架內的頻寬小

                   預設在一個機架記憶體放2個副本,在另外一個機架記憶體放1個副本,這樣可以防止機架失效時丟失資料,也可以提高寬頻利用率

         * 心跳機制

                   Namenode週期性從datanode接收心跳訊號和塊報告

                   Namenode根據塊報告驗證元資料

                   沒有按時傳送心跳的datanode會被標記為宕機,不會再給它任何I/O請求

                   如果datanode失效造成副本數量下降,並且低於預先設定的閥值,namenode會檢測出這些資料塊,並在合適的時機進行重新複製

                   重新複製的原因還包括資料副本本身損壞、磁碟錯誤、複製因子被增大等

         * 安全模式

                   namenode啟動時會先經過一個“安全模式”階段

                   安全模式階段不會產生資料寫

                   在此階段Namenode收集各個datanode的報告,當資料塊達到最小副本數以上時,會被認為是“安全”的

                   在一定比例(可設定)的資料塊被確定為“安全”後,再過若干時間,安全模式結束

                   當檢測到副本數不足的資料塊時,該塊會被複制直到達到最小副本數

         * 校驗和

                   HDFS客戶端軟體實現了對HDFS檔案內容的校驗和(Checksum)檢查

                   在檔案創立時,會計算每個資料塊的校驗和

                   校驗和會作為單獨一個隱藏檔案儲存在名稱空間下

                   客戶端獲取檔案時,可以檢查資料塊對應的校驗和是否和隱藏在檔案中的相同,從而發現數據塊是否損壞

                   如果正在讀取的資料塊損壞,則可以繼續讀取其他副本

         * 回收站

                   刪除檔案時,其實是放入回收站/trash

                   回收站裡的檔案可以快速恢復

                   可以設定一個時間閥值,當回收站裡的檔案存放時間超過這個閥值,就被徹底刪除,並且釋放佔用的資料塊

                   預設回收站是關閉的,可以通過在core-site.xml中新增fs.trash.interval來開啟並配置時間閥值,時間單位是分鐘

         * 元資料的保護

                   映像檔案和事務日誌是Namenode的核心資料,可以配置為擁有多個副本

                   副本會降低Namenode的處理速度,但是增加安全性

                   Namenode依然是單點,如果發生故障需要手工切換,Hadoop2.x版本中可配置Namenode HA解決該問題

五、HDFS Shell操作

1、HDFS常見Shell命令

         * HDFS Shell文件地址:

         http://hadoop.apache.org/docs/r2.7.2/hadoop-project-dist/hadoop-common/FileSystemSehell.html

         * HDFS集中式快取管理文件地址:

         http://hadoop.apache.org/docs/r2.7.2/hadoop-mapreduce-client/hadoop-mapreduce-client-core/DistributedCacheDeploy.html

         * HDFS小檔案歸檔文件地址:

         htp://hadoop.apache.org/docs/r2.7.2/hadoop-archives/HadoopArchives.html

 

2、shell命令:

         cd /home/softwares/hadoop-x-x/

         * 檢視常見shell命令:

                   bin/hdfs -help

         * 建立資料夾:

                   bin/hdfs dfs -mkdir -p /jkxy/test  (/jkxy/test---在hdfs上的儲存位置)        

         * 上傳單個檔案到上面的目錄:

                   bin/hdfs dfs -put /etc/profile /jkxy/test/profile  (/etc/profile--目標檔案路徑  /jkxy/test/profile---要上傳的位置路徑)

         * 上傳資料夾(內含檔案)

                   bin/hdfs dfs -put /etc/* /jkxy/test/

         * 檢視hdfs上的一個檔案內容:

                   bin/hdfs dfs -cat /jkxy/test/profile

         * 下載hdfs上的檔案:

                   bin/hdfs dfs -get /jkxy/test/profile /home/data/  (/jkxy/test/profile---要下載的檔案在hdfs的路徑    /home/data/---要儲存在本地的路徑 )

         * 刪除hdfs裡的檔案:

                   bin/hdfs dfs -rm -r /jkxy/test/profile

         * 刪除的檔案會在回收站保留一定時間,這個時間可以設定:

                   vim core-site.xml  加入:

                            <property>

                           <name>fs.trash.interval</name>

                         <value>10</value> <!--單位是分鐘 -->

                       </property>

                   重啟hdfs

                   刪除一個檔案,檢視hdfs系統/user/root/.Trash/jkxy/test目錄下有個剛才刪除的檔案,至此回收站配置完成

         * 集中式快取管理:

                   檢視所有快取池:

                   bin/hdfs cacheadmin -listPools

                   新建快取池:

                   bin/hdfs cacheadmin -addPool test  (test---新建快取池名稱)

                   hdfs中的檔案放入快取池中:

                   bin/hdfs cacheadmin -addDirective -path /jkxy/test -pool test  (/jkxy/test---要操作的檔案路徑   test---要放入的快取池名稱  )

                   檢視某個快取池下的檔案:

                   bin/hdfs cacheadmin -listDirectives -pool test

                   檢視hdfs中的檔案內容:

                   bin/hdfs dfs -cat /jkxy/test/xxxx.xml

         * 小檔案歸檔:

                   屬於Hadoop的一個指令碼,使用bin/hadoop 檢視幫助,要啟動hdfs和yarn

                   bin/hadoop archive -archiveName conf.har -p /jkxy/test -r 1 /conf(conf.har---要歸檔成為的檔名,.har字尾代表是歸檔檔案   /jkxy/test---要歸檔的小檔案路徑    1---歸檔的備份數     /conf---歸檔後要存放在hdfs上的位置)

         * 檢視歸檔檔案:

                   bin/hdfs dfs -ls har:///conf/conf.har (///conf/conf.har---hdfs上的路徑)

         * 解壓歸檔檔案:

                   bin/hdfs dfs -cp har:///conf/conf.har /har  (///conf/conf.har---要解壓的檔案在hdfs上的路徑    /har---要解壓到hdfs上的位置)

           hdfs系統裡多了一個har,裡面的檔案跟/jkxy/test/下的檔案一樣,至此,小檔案歸檔成功