1. 程式人生 > >Hadoop的三種配置模式以及免密登入

Hadoop的三種配置模式以及免密登入

本地模式

特點:只需要一臺伺服器,沒有HDFS、只能測試 MapReduce 程式,MapReduce 處理的是本地 Linux 的檔案資料。

配置步驟:

  1. 修改 hadoop-2.7.3/etc/hadoop 目錄下的 hadoop-env.sh 檔案,在第 25 行做如下修改(配置JAVA_HOME):

    export JAVA_HOME=/root/training/jdk1.8.0_144
    
  2. 測試 MapReduce 程式:

    2.1. 建立目錄 mkdir ~/input 作為測試資料的存放目錄。

    2.2. 在 input 目錄下建立 data.txt 檔案,內容如下:

     I love Beijing
     I love China
     Beijing is the capital of China
    

    2.3. 執行 hadoop 自帶的一個 MapRecue 程式中的詞頻統計程式:

    首先切換到 /root/training/hadoop-2.7.3/share/hadoop/mapreduce/ 目錄下。

    執行如下命令:
    hadoop jar hadoop-mapreduce-examples-2.7.3.jar wordcount ~/input ~/output

    該命令會執行 hadoop-mapreduce-examples-2.7.3.jar 中的 wordcount 程式,統計 ~/input 目錄下所有檔案中所有單詞出現的頻率,結果會儲存到 ~/output 目錄下。

    注:不要事先建立 ~/output 目錄,否則程式會丟擲異常,程式在執行的時候會自動建立 ~/output 目錄。

    2.4. 執行成功的話會在 ~/output 目錄下產生兩個檔案:part-r-00000,_SUCCESS。_SUCCESS 這個檔案是一個空檔案,出現這個檔案說明詞頻統計成功。part-r-00000 這個檔案裡面儲存的是 ~/input 目錄下每個單詞出現的次數,內容如下:
    在這裡插入圖片描述

偽分佈模式

特點:只需要一臺伺服器,模擬一個分散式的環境,具備 Hadoop 的主要功能。

配置步驟:

  1. 修改 hadoop-2.7.3/etc/hadoop 目錄下的 hadoop-env.sh

    檔案,在第 25 行做如下修改(配置JAVA_HOME):

    export JAVA_HOME=/root/training/jdk1.8.0_144
    
  2. 修改 hdfs-site.xml 檔案,新增的內容如下:

    <!-- 原則:一般資料塊的冗餘度跟資料節點(DataNode)的個數一致;最大不超過3 -->
    
    <!--表示資料塊的冗餘度,預設:3-->
    <property>
       <name>dfs.replication</name>
       <value>1</value>
    </property>
    				
    
    <!--是否開啟HDFS的許可權檢查,預設true,先不設定-->
    <property>
       <name>dfs.permissions</name>
       <value>false</value>
    </property>
    
  3. 修改 core-site.xml 檔案,新增內容如下:

    <!--配置NameNode地址,9000是RPC通訊埠-->
    <property>
       <name>fs.defaultFS</name>
       <value>hdfs://bigdata111:9000</value>
    </property>	
    
    <!--HDFS資料儲存在Linux的哪個目錄,預設值是Linux的tmp目錄-->
    <property>
       <name>hadoop.tmp.dir</name>
       <value>/root/training/hadoop-2.7.3/tmp</value> <!-- 該目錄必須事先建立 -->
    </property>	
    
  4. 修改 mapred-site.xml 檔案,新增內容如下:

    <!--MapReduce程式執行在yarn裡面-->
    <property>
       <name>mapreduce.framework.name</name>
       <value>yarn</value>
    </property>	
    

    :hadoop-2.7.3/etc/hadoop/ 目錄下預設是沒有 mapred-site.xml 檔案的,需要複製一份 mapred-site.xml.template 檔案,執行如下命令:cp mapred-site.xml.template mapred-site.xml

  5. 修改 yarn-site.xml 檔案,新增內容如下:

    <!--Yarn的主節點ResourceManager的位置-->
    <property>
       <name>yarn.resourcemanager.hostname</name>
       <value>bigdata111</value>
    </property>	
    
    <!--MapReduce執行方式:shuffle洗牌-->
    <property>
       <name>yarn.nodemanager.aux-services</name>
       <value>mapreduce_shuffle</value>
    </property>	
    
  6. 格式化 HDFS:

    執行命令:hdfs namenode -format

    看到列印的日誌中顯示:Storage directory /root/training/hadoop-2.7.3/tmp/dfs/name has been successfully formatted 就說明格式化成功。

  7. 啟動停止 Hadoop 環境:

    啟動:start-all.sh

    停止:stop-all.sh

    ps:啟動和停止 Hadoop 都會讓你輸入四次當前伺服器的密碼。因此我們需要配置免密碼登入伺服器。

    免密碼登入

    原理

    使用非對稱加密演算法。

    在這裡插入圖片描述

    1. 從 ServerA 登入到 ServerB。

    2. ServerB 隨機產生一個字串,使用 ServerA 給的公鑰進行加密。

    3. ServerB 把加密後的字串發給 ServerA。

    4. ServerA 用私鑰解密收到的字串。

    5. ServerA 將解密後的字串回發給ServerB。

    6. ServerB 將收到的字串與最開始生成的字串對比,匹配則直接登入,不匹配則需要 ServerA 重新輸入密碼進行登入。

    配置
    1. 使用 ssh-keygen -t rsa命令產生一個金鑰對:公鑰(給別人,用於加密),私鑰(給自己,用於解密)。

    2. 在當前使用者的家目錄下會產生一個 .ssh 隱藏目錄,裡面會產生兩個檔案:id_rsa(私鑰),id_rsa.pub(公鑰)。

    3. 把公鑰拷貝給要登入的伺服器:ssh-copy-id -i .ssh/id_rsa.pub [email protected]

    4. 在對方伺服器的 .ssh/ 目錄下就會多一個 authorized_keys 檔案,裡面儲存著別的伺服器發來的所有公鑰。

  8. 通過 Web 介面訪問:

    HDFS:http://192.168.220.111:50070
    Yarn:http://192.168.220.111:8088

    ps:具體的伺服器地址取決於自己的配置。

    記錄下這歷史性的一刻:

    在這裡插入圖片描述

    在這裡插入圖片描述

    ps:再執行一下之前那個 wordcount 程式,看看會發生什麼。

    丟擲異常,原因:原來資料的目錄時本地 Linux 上的,現在已經開啟偽分散式模式,需要使用 HDFS 的目錄。

    1. hdfs dfs -mkdir /input,該命令會在 HDFS 的根目錄 / 下建立一個 input 目錄。(執行該命令時,需要啟動 HDFS start-all.sh
    2. hdfs dfs -put ~/input/data.txt /input,該命令會把我們本地的 ~/input/data.txt 檔案上傳到 HDFS 的 /input 目錄下。
    3. 檢視 HDFS 根目錄下的檔案:hdfs dfs -ls /
    4. 檢視 HDFS 根目錄下的檔案(包含子目錄):hdfs dfs -lsr /
    5. 執行原來的 mapreduce 程式:hadoop jar hadoop-mapreduce-examples-2.7.3.jar wordcount /input/data.txt /output/1117,該命令會讀取 HDFS 的 /input 目錄下的 data.txt 檔案,進行詞頻統計,統計的結果會輸出到 HDFS 的 /output/1117 目錄下。
    6. 在程式執行的過程中可以訪問:http://192.168.220.111:8088/ 檢視執行中的 mapreduce 程式。
    7. 最後程式執行完畢,執行 hdfs dfs -ls /output/1117檢視裡面生成的檔案內容。

全分佈模式

特點:需要多臺伺服器構建叢集,真正的分散式環境,用於生產。

準備工作

  1. 關閉防火牆:

    本次停止:systemctl stop firewalld.service
    永久關停:systemctl disable firewalld.service

  2. 安裝JDK

  3. 為叢集中的每臺機器配置IP到主機名的對映:

     192.168.220.112 bigdata112
     192.168.220.113 bigdata113
     192.168.220.114 bigdata114
    
  4. 配置免密碼登入,兩兩之間都要配置

    4.1. 每臺機器產生自己的公鑰和私鑰:ssh-keygen -t rsa

    4.2. 每臺機器把自己的公鑰給別人和自己:

     	ssh-copy-id -i .ssh/id_rsa.pub [email protected]
     	ssh-copy-id -i .ssh/id_rsa.pub [email protected]
     	ssh-copy-id -i .ssh/id_rsa.pub [email protected]
    
  5. 保證每臺機器的時間同步:

    同時向三個終端傳送如下命令:date -s "2018-11-18 14:47:57",來協調時間的一致,如果時間不一致,後續在執行 mapreduce 程式的時候有可能出現問題。

在主節點上進行安裝

  1. 解壓 tar 包,向 .bash_profile 中設定 Hadoop 的環境變數:

    tar -zxvf hadoop-2.7.3.tar.gz -C ~/training/

    叢集中的每臺機器都要設定環境變數

    HADOOP_HOME=/root/training/hadoop-2.7.3
    export HADOOP_HOME
    
    PATH=$HADOOP_HOME/bin:$HADOOP_HOME/sbin:$PATH
    export PATH
    
  2. 修改 hadoop-env.sh 檔案,將第 25 行的內容修改為:

    export JAVA_HOME=/root/training/jdk1.8.0_144
    
  3. 修改 hdfs-site.xml 檔案:

    <!--表示資料塊的冗餘度,預設:3-->
    <property>
       <name>dfs.replication</name>
       <value>2</value>
    </property>
    
  4. 修改 core-site.xml 檔案:

    <!--配置NameNode地址,9000是RPC通訊埠-->
    <property>
       <name>fs.defaultFS</name>
       <value>hdfs://bigdata112:9000</value>
    </property>	
    
    <!--HDFS資料儲存在Linux的哪個目錄,預設值是Linux的tmp目錄-->
    <property>
       <name>hadoop.tmp.dir</name>
       <value>/root/training/hadoop-2.7.3/tmp</value>
    </property>	
    
  5. 拷貝 mapred-site.xml.template 生成一份 mapred-site.xml:

    cp mapred-site.xml.template mapred-site.xml
    

    修改內容如下:

    <!--MR執行的框架-->
    <property>
       <name>mapreduce.framework.name</name>
       <value>yarn</value>
    </property>	
    
  6. 修改 yarn-site.xml 檔案:

    <!--Yarn的主節點RM的位置-->
    <property>
       <name>yarn.resourcemanager.hostname</name>
       <value>bigdata112</value>
    </property>	
    
    <!--MapReduce執行方式:shuffle洗牌-->
    <property>
       <name>yarn.nodemanager.aux-services</name>
       <value>mapreduce_shuffle</value>
    </property>
    
  7. 修改 slaves 檔案,配置從機的位置:

    bigdata113
    bigdata114
    
  8. 格式化 namenode:hdfs namenode -format

  9. 把主節點上配置好的 hadoop 複製到從節點上:

    scp -r hadoop-2.7.3/ [email protected]:/root/training
    scp -r hadoop-2.7.3/ [email protected]:/root/training
    
  10. 在主節點上啟動:start-all.sh

    值得紀念的一刻:

    datanode

    也可以通過執行 hdfs dfsadmin -report命令,檢視 HDFS 的 namenode 和 datanode 節點的狀態。

    [[email protected] ~]# hdfs dfsadmin -report
    Configured Capacity: 100865679360 (93.94 GB)
    Present Capacity: 96658509824 (90.02 GB)
    DFS Remaining: 96658493440 (90.02 GB)
    DFS Used: 16384 (16 KB)
    DFS Used%: 0.00%
    Under replicated blocks: 0
    Blocks with corrupt replicas: 0
    Missing blocks: 0
    Missing blocks (with replication factor 1): 0
    
    -------------------------------------------------
    Live datanodes (2):
    
    Name: 192.168.220.113:50010 (bigdata113)
    Hostname: bigdata113
    Decommission Status : Normal
    Configured Capacity: 50432839680 (46.97 GB)
    DFS Used: 8192 (8 KB)
    Non DFS Used: 2103767040 (1.96 GB)
    DFS Remaining: 48329064448 (45.01 GB)
    DFS Used%: 0.00%
    DFS Remaining%: 95.83%
    Configured Cache Capacity: 0 (0 B)
    Cache Used: 0 (0 B)
    Cache Remaining: 0 (0 B)
    Cache Used%: 100.00%
    Cache Remaining%: 0.00%
    Xceivers: 1
    Last contact: Sun Nov 18 15:05:23 CST 2018
    
    
    Name: 192.168.220.114:50010 (bigdata114)
    Hostname: bigdata114
    Decommission Status : Normal
    Configured Capacity: 50432839680 (46.97 GB)
    DFS Used: 8192 (8 KB)
    Non DFS Used: 2103402496 (1.96 GB)
    DFS Remaining: 48329428992 (45.01 GB)
    DFS Used%: 0.00%
    DFS Remaining%: 95.83%
    Configured Cache Capacity: 0 (0 B)
    Cache Used: 0 (0 B)
    Cache Remaining: 0 (0 B)
    Cache Used%: 100.00%
    Cache Remaining%: 0.00%
    Xceivers: 1
    Last contact: Sun Nov 18 15:05:23 CST 2018
    

安裝過程中出現的問題

  1. value 標籤錯寫成 valual,導致執行 start-all.sh 的時候拋異常。

  2. 之前在主節點上搭建了偽分散式環境,已經格式化了 hdfs,導致在搭建全分散式環境啟動 HDFS 和 Yarn 的時候,從節點雖然已啟動了 DataNode 程序但是在 web 頁面上卻顯示存活的節點數為 0。按照網上的教程,刪除儲存資料的目錄,重新格式化無果。刪除 hadoop 重灌,問題解決。

全分佈模式最終的叢集結構

Hadoop全分佈模式