1. 程式人生 > >Hadoop系列005-Hadoop執行模式(下)

Hadoop系列005-Hadoop執行模式(下)

本人微信公眾號,歡迎掃碼關注!

Hadoop執行模式(下)

2.3、完全分散式部署Hadoop
  • 1)分析:

    • 1)準備3臺客戶機(關閉防火牆、靜態ip、主機名稱)
    • 2)安裝jdk
    • 3)配置環境變數
    • 4)安裝hadoop
    • 5)配置環境變數
    • 6)安裝ssh
    • 7)配置叢集
    • 8)啟動測試叢集
  • 2)操作

    • (1) 虛擬機器準備

      • 克隆三臺乾淨的虛擬機器
    • (2) 主機名設定

    • (3) scp

    • (4)SSH無密碼登入

      • 1)配置ssh

        • (1)基本語法

          ssh 另一臺電腦的ip地址
        • (2)ssh連線時出現Host key verification failed的解決方法

          問題再現
          [[email protected] opt]# ssh 192.168.1.103
          The authenticity of host '192.168.1.103 (192.168.1.103)' can't be established.
          RSA key fingerprint is cf:1e:de:d7:d0:4c:2d:98:60:b4:fd:ae:b1:2d:ad:06.
          Are you sure you want to continue connecting (yes/no)? 
          Host key verification failed.
          
          解決辦法
          輸入yes,然後輸入目標機器的密碼即可
      • 2)無金鑰配置

        • (1)進入到我的home目錄

          cd  ~/.ssh
        • (2)生成公鑰和私鑰:

          ssh-keygen -t rsa 
          然後敲(三個回車),就會生成兩個檔案id_rsa(私鑰)、id_rsa.pub(公鑰)
        • (3)將公鑰拷貝到要免密登入的目標機器上

          ssh-copy-id 目標機器主機名或IP地址
      • 3).ssh資料夾下的檔案功能解釋

        • (1)~/.ssh/known_hosts :記錄ssh訪問過計算機的公鑰(public key)
        • (2)id_rsa :生成的私鑰
        • (3)id_rsa.pub :生成的公鑰
        • (4)authorized_keys :存放授權過得無祕登入伺服器公鑰
    • (5)rsync

      rsync遠端同步工具,主要用於備份和映象。具有速度快、避免複製相同內容和支援符號連結的優點。

      • 1)檢視rsync使用說明

        man rsync | more
      • 2)基本語法

        rsync  -rvl                 $pdir/$fname                       [email protected]$host:$pdir
        命令   命令引數   要拷貝的檔案路徑/名稱   目的使用者@主機:目的路徑
      • 3)案例實操

        把本機/opt/tmp目錄同步到hadoop103伺服器的root使用者下的/opt/tmp目錄

        rsync –rvl /opt/tmp/*  [email protected]:/op t/tmp
    • (6)編寫叢集分發指令碼xsync

      • 1)需求分析:迴圈複製檔案到所有節點的相同目錄下。

        • (1)原始拷貝:

          rsync  –rvl     /opt/module  [email protected]:/opt/
        • (2)期望指令碼:

          xsync 要同步的檔名稱

        • (3)在/usr/local/bin這個目錄下存放的指令碼,可以在系統任何地方直接執行,需要制定路徑。

      • 2)案例實操:

        • (1)在/usr/local/bin目錄下建立xsync檔案

          #!/bin/bash
          #1 獲取輸入引數個數,如果沒有引數,直接退出
          pcount=$#
          if((pcount==0)); then
          echo no args;
          exit;
          fi
          
          #2 獲取檔名稱
          p1=$1
          fname=`basename $p1`
          echo fname=$fname
          
          #3 獲取上級目錄到絕對路徑
          pdir=`cd -P $(dirname $p1); pwd`
          echo pdir=$pdir
          
          #4 獲取當前使用者名稱稱
          user=`whoami`
          
          #5 迴圈
          for((host=103; host<105; host++)); do
                  #echo $pdir/$fname [email protected]$host:$pdir
                  echo --------------- hadoop$host ----------------
                  rsync -rvl $pdir/$fname [email protected]$host:$pdir
          done
        • (2)修改指令碼 xsync 具有執行許可權

          [[email protected] bin]# chmod 777 xsync
        • (3)呼叫指令碼形式:xsync 檔名稱

    • (7)編寫分發指令碼xcall

      • 1)需求分析:在所有主機上同時執行相同的命令

        xcall +命令
      • 2)具體實現

        • (1)在/usr/local/bin目錄下建立xcall檔案

          #!/bin/bash
          pcount=$#
          if((pcount==0));then
                  echo no args;
                  exit;
          fi
          
          echo -------------localhost----------
          [email protected]
          for((host=101; host<=108; host++)); do
                  echo ----------hadoop$host---------
                  ssh hadoop$host [email protected]
          done
        • (2)修改指令碼 xcall 具有執行許可權

          [[email protected] bin]# chmod 777 xcall
        • (3)呼叫指令碼形式: xcall 操作命令

          [[email protected] ~]# xcall rm -rf /opt/tmp/profile 
    • (8) 基於偽分散式部署叢集

      • 1)叢集部署規劃

        規劃原則:儘量將耗記憶體的任務分散開來

        Hadoop102 Hadoop103 Hadoop104
        HDFS NameNode SecondaryNameNode
        DataNode DataNode DataNode
        YARN NodeManager ResourceManager NodeManager
      • 2)配置檔案

        • (1)core-site.xml

          <!-- 指定HDFS中NameNode的地址 -->
          <property>
              <name>fs.defaultFS</name>
              <value>hdfs://hadoop102:8020</value>
          </property>
          
          <!-- 指定hadoop執行時產生檔案的儲存目錄 -->
          <property>
              <name>hadoop.tmp.dir</name>
              <value>/opt/module/hadoop-2.7.2/data/tmp</value>
          </property>
        • (2)Hdfs

          • hadoop-env.sh

            export JAVA_HOME=/opt/module/jdk1.7.0_79
          • hdfs-site.xml

            <configuration>   
                <property>
                  <name>dfs.replication</name>
                  <value>3</value>
                </property>
            
                <property>
                  <name>dfs.namenode.secondary.http-address</name>
                  <value>hadoop104:50090</value>
                </property>
            </configuration>
          • slaves

            hadoop102
            hadoop103
            hadoop104
        • (3)yarn

          • yarn-env.sh

            export JAVA_HOME=/opt/module/jdk1.7.0_79
          • yarn-site.xml

            <configuration>
                <!-- Site specific YARN configuration properties -->
                <!-- reducer獲取資料的方式 -->
                <property>
                  <name>yarn.nodemanager.aux-services</name>
                  <value>mapreduce_shuffle</value>
                </property>
            
                <!-- 指定YARN的ResourceManager的地址 -->
                <property>
                  <name>yarn.resourcemanager.hostname</name>
                  <value>hadoop103</value>
                </property>
            </configuration>
        • (4)mapreduce

          • mapred-env.sh

            export JAVA_HOME=/opt/module/jdk1.7.0_79
          • mapred-site.xml

            <configuration>
                <!-- 指定mr執行在yarn上 -->
                <property>
                    <name>mapreduce.framework.name</name>
                    <value>yarn</value>
                </property>
            </configuration>
      • 3)在叢集上分發以上所有檔案

        cd /opt/module/hadoop-2.7.2/etc/hadoop
        xsync /opt/module/hadoop-2.7.2/etc/hadoop/core-site.xml
        xsync /opt/module/hadoop-2.7.2/etc/hadoop/yarn-site.xml
        xsync /opt/module/hadoop-2.7.2/etc/hadoop/slaves
      • 4)檢視檔案分發情況

        xcall cat /opt/module/hadoop-2.7.2/etc/hadoop/slaves
    • (9)叢集啟動及測試

      • 1)啟動叢集

        • (0)如果叢集是第一次啟動,需要格式化namenode

          [[email protected] hadoop-2.7.2]# bin/hdfs namenode –format
        • (1)啟動HDFS

          [[email protected] hadoop-2.7.2]$ sbin/start-dfs.sh
          
          啟動之後驗證
          [[email protected] hadoop-2.7.2]$ jps
          3690 DataNode
          9550 Jps
          3583 NameNode
          
          [[email protected] hadoop-2.7.2]$ jps
          9095 Jps
          3435 DataNode
          
          [[email protected] hadoop-2.7.2]$ jps
          3432 DataNode
          9371 Jps
          3518 SecondaryNameNode
        • (2)啟動yarn

          注意:Namenode和ResourceManger如果不是同一臺機器,不能在NameNode上啟動 yarn,應該在ResouceManager所在的機器上啟動yarn。

          sbin/start-yarn.sh
          
      • 2)叢集基本測試

        • (1)上傳檔案到叢集

          • 上傳小檔案

            bin/hdfs dfs –mkdir –p /user/atguigu/tmp/conf
            bin/hdfs dfs –put etc/hadoop/*-site.xml /user/atguigu/tmp/conf
            
          • 上傳大檔案

            [[email protected] hadoop-2.7.2]$ bin/hadoop fs -put /opt/software/hadoop-2.7.2.tar.gz  /user/atguigu/input
            
        • (2)上傳檔案後檢視檔案存放在什麼位置

          • 檔案儲存路徑

            [[email protected] subdir0]$ pwd
            /opt/module/hadoop-2.7.2/data/tmp/dfs/data/current/BP-938951106-192.168.10.107-1495462844069/current/finalized/subdir0/subdir0
            
          • 檢視檔案內容

            [[email protected] subdir0]$ cat blk_1073741825
            hadoop
            atguigu
            atguigu
            
        • (3)拼接

          -rw-rw-r--. 1 atguigu atguigu 134217728 5月  23 16:01 blk_1073741836
          -rw-rw-r--. 1 atguigu atguigu   1048583 5月  23 16:01 blk_1073741836_1012.meta
          -rw-rw-r--. 1 atguigu atguigu  63439959 5月  23 16:01 blk_1073741837
          -rw-rw-r--. 1 atguigu atguigu    495635 5月  23 16:01 blk_1073741837_1013.meta
          [[email protected] subdir0]$ cat blk_1073741836>>tmp.file
          [[email protected] subdir0]$ cat blk_1073741837>>tmp.file
          [[email protected] subdir0]$ tar -zxvf tmp.file
          
        • (4)下載

          [[email protected] hadoop-2.7.2]$ bin/hadoop fs -get /user/atguigu/input/hadoop-2.7.2.tar.gz
          
      • 3)叢集效能測試

        • 寫海量資料
        • 讀海量資料
    • (9)Hadoop啟動停止方式

      • 1)各個服務元件逐一啟動

        • (1)分別啟動hdfs元件

          hadoop-daemon.sh  start|stop  namenode|datanode|secondarynamenode
          
        • (2)啟動yarn

          yarn-daemon.sh  start|stop  resourcemanager|nodemanager
          
      • 2)各個模組分開啟動(配置ssh是前提)常用

        • (1)整體啟動/停止hdfs

          start-dfs.sh
          stop-dfs.sh
          
        • (2)整體啟動/停止yarn

          start-yarn.sh
          stop-yarn.sh
          
        • 3)全部啟動(不建議使用)

          start-all.sh
          stop-all.sh
          
    • (11)配置叢集常見問題

      • 1)防火牆沒關閉、或者沒有啟動yarn

        INFO client.RMProxy: Connecting to ResourceManager at hadoop108/192.168.10.108:8032
        
      • 2)主機名稱配置錯誤

      • 3)ip地址配置錯誤

      • 4)ssh沒有配置好

      • 5)root使用者和atguigu兩個使用者啟動叢集不統一

      • 6)配置檔案修改不細心

      • 7)未編譯原始碼

        Unable to load native-hadoop library for your platform... using builtin-java classes where applicable
        17/05/22 15:38:58 INFO client.RMProxy: Connecting to ResourceManager at hadoop108/192.168.10.108:8032
        
      • 8)datanode不被namenode識別問題

        Namenode在format初始化的時候會形成兩個標識,blockPoolId和clusterId。新的datanode加入時,會獲取這兩個標識作為自己工作目錄中的標識。
        
        一旦namenode重新format後,namenode的身份標識已變,而datanode如果依然持有原來的id,就不會被namenode識別。
        
        解決辦法,刪除datanode節點中的資料後,再次重新格式化namenode。