1. 程式人生 > 其它 >Hadoop叢集搭建(完全分散式版本) VMWARE虛擬機器

Hadoop叢集搭建(完全分散式版本) VMWARE虛擬機器

Hadoop叢集搭建(完全分散式版本)

VMWARE虛擬機器

一、準備工作

  • 三臺虛擬機器:master、node1、node2

  • 時間同步

    ntpdate ntp.aliyun.com
  • 調整時區

    cp  /usr/share/zoneinfo/Asia/Shanghai  /etc/localtime
  • jdk1.8(以1.8為例,目前大多數企業都是使用1.8版本,最穩定)

    java -version
  • 修改主機名

    三臺分別執行 vim /etc/hostname 並將內容指定為對應的主機名
  • 關閉防火牆:systemctl stop firewalld

    • 檢視防火牆狀態:systemctl status firewalld

    • 取消防火牆自啟:systemctl disable firewalld

  • 靜態IP配置

    • 直接使用圖形化介面配置(不推薦)

    • 手動編輯配置檔案進行配置

      1、編輯網路配置檔案
      vim /etc/sysconfig/network-scripts/ifcfg-ens33

      TYPE=Ethernet
      BOOTPROTO=static
      HWADDR=00:0C:29:E2:B8:F2
      NAME=ens33
      DEVICE=ens33
      ONBOOT=yes
      IPADDR=192.168.190.100
      GATEWAY=192.168.190.2
      NETMASK=255.255.255.0
      DNS1=192.168.190.2
      DNS2=223.6.6.6

      需要修改:HWADDR(mac地址,centos7不需要手動指定mac地址)
      IPADDR(根據自己的網段,自定義IP地址)
      GATEWAY(根據自己的網段填寫對應的閘道器地址)

      2、關閉NetworkManager,並取消開機自啟
      systemctl stop NetworkManager
      systemctl disable NetworkManager

      3、重啟網路服務
      systemctl restart network
  • 免密登入

    # 1、生成金鑰
    ssh-keygen -t rsa
    注意:連敲三次生成方格形狀的金鑰,在當前狀態下,配置免金鑰登陸。
    # 2、配置免密登入(三臺虛擬機器都需要進行免密操作,不要怕麻煩!!)
    ssh-copy-id master
    ssh-copy-id node1
    ssh-copy-id node2
    # 3、測試免密登入
    ssh node1
    ssh node2
    ssh master

     

  • 配置好對映檔案:/etc/hosts(三臺虛擬機器都需要配置)

    192.168.170.100 master
    192.168.170.101 node1
    192.168.170.102 node2
    注意:每個人的IP地址都是不一樣的,檢視自己的IP地址使用 ifconfig
    使用遠端複製
    cd /etc
    scp -r hosts/ node1:`pwd`
    scp -r hosts/ node2:`pwd`

二、搭建Hadoop叢集

NameNode:接受客戶端的讀/寫服務,收集 DataNode 彙報的 Block 列表資訊

DataNode:真實資料儲存的地方(block)

SecondaryNameNode:做持久化的時候用到

程序 master(主) node1(從) node2(從)
NameNode    
SecondaryNameNode    
ResourceManager    
DataNode  
NodeManager  

2.1 完全分散式搭建

1、上傳安裝包並解壓

# 使用xftp上傳壓縮包至master的/usr/local/soft/packages/
cd /urs/local/soft/packages/
# 解壓
tar -zxvf hadoop-2.7.6.tar.gz -C /usr/local/soft/

2、配置環境變數(三臺虛擬機器都需要i配置)

vim /etc/profile

JAVA_HOME=/usr/local/soft/jdk1.8.0_171
HADOOP_HOME=/usr/local/soft/hadoop-2.7.6
export PATH=$JAVA_HOME/bin:$HADOOP_HOME/bin:$HADOOP_HOME/sbin:$PATH

# 重新載入環境變數
source /etc/profile

使用遠端複製(進行覆蓋)
cd /etc
scp -r profile/ node1:`pwd`
scp -r profile/ node2:`pwd`

3、修改Hadoop配置檔案

  • cd /usr/local/soft/hadoop-2.7.6/etc/hadoop/

  • core-site.xml

    fs.defaultFS: 預設檔案系統的名稱。其方案和許可權決定檔案系統實現的URI。uri的方案確定命名檔案系統實現類的配置屬性(fs.scheme.impl)。uri的許可權用於確定檔案系統的主機、埠等。

    hadoop.tmp.dir:是 hadoop檔案系統依賴的基本配置,很多配置路徑都依賴它,它的預設位置是在 /tmp/{$user}下面,注意這是個臨時目錄!!!

    因此,它的持久化配置很重要的! 如果選擇預設,一旦因為斷電等外在因素影響,/tmp/{$user}下的所有東西都會丟失。

    fs.trash.interval:啟用垃圾箱配置,dfs命令刪除的檔案不會立即從HDFS中刪除。相反,HDFS將其移動到垃圾目錄(每個使用者在/user/<username>/.Trash下都有自己的垃圾目錄)。只要檔案保留在垃圾箱中,檔案可以快速恢復。

        <property>
            <name>fs.defaultFS</name>
            <value>hdfs://master:9000</value>
        </property>
    
        <property>
            <name>hadoop.tmp.dir</name>
            <value>/usr/local/soft/hadoop-2.7.6/tmp</value>
        </property>
    
        <property>
            <name>fs.trash.interval</name>
            <value>1440</value>
        </property>
  • hadoop-env.sh

    export JAVA_HOME=/usr/local/soft/jdk1.8.0_171

  • hdfs-site.xml

  • dfs.replication:每個datanode上只能存放一個副本。我這裡就2個datanode

    dfs.permissions:如果為“true”,則在HDFS中啟用許可權檢查。如果為“false”,則關閉許可權檢查,但所有其他行為保持不變。從一個引數值切換到另一個引數值不會更改檔案或目錄的模式、所有者或組。

        <property>
            <name>dfs.replication</name>
            <value>1</value>
        </property>
    
        <property>
            <name>dfs.permissions</name>
            <value>false</value>
        </property>
  • mapred-site.xml.template

  • mapreduce.framework.name:用於執行MapReduce作業的執行時框架。

    mapreduce.jobhistory.address:Hadoop自帶了一個歷史伺服器,可以通過歷史伺服器檢視已經執行完的Mapreduce作業記錄,比如用了多少個Map、用了多少個Reduce、作業提交時間、作業啟動時間、作業完成時間等資訊。預設情況下,Hadoop歷史伺服器是沒有啟動的,我們可以通過*mr-jobhistory-daemon.sh start historyserver命令來啟動Havim doop歷史伺服器。我們可以通過Hadoop jar的命令來實現我們的程式jar包的執行,關於執行的日誌,我們一般都需要通過啟動一個服務來進行檢視,就是我們的JobHistoryServer,我們可以啟動一個程序,專門用於檢視我們的任務提交的日誌。mapreduce.jobhistory.address和mapreduce.jobhistory.webapp.address預設的值分別是0.0.0.0:10020和0.0.0.0:19888

    # 1、重新命名檔案
    cp mapred-site.xml.template mapred-site.xml
    # 2、修改
        <property>
            <name>mapreduce.framework.name</name>
            <value>yarn</value>
        </property>
    
        <property>  
            <name>mapreduce.jobhistory.address</name>  
            <value>master:10020</value>  
        </property>  
    
        <property>  
            <name>mapreduce.jobhistory.webapp.address</name>  
            <value>master:19888</value>  
        </property> 
  • slaves

  • 從節點的資訊

    node1
    node2
  • yarn-site.xml

  • yarn.resourcemanager.hostname:指定yarn主節點

yarn.nodemanager.aux-services:NodeManager上執行的附屬服務。需配置成mapreduce_shuffle,才可執行MapReduce程式。預設值:“”

yarn.log-aggregation-enable:yarn日誌聚合功能開關

yarn.log-aggregation.retain-seconds:日誌保留時限,預設7天

      <property>
          <name>yarn.resourcemanager.hostname</name>
          <value>master</value>
      </property>
  
      <property>
          <name>yarn.nodemanager.aux-services</name>
          <value>mapreduce_shuffle</value>
      </property>
  
      <property>
          <name>yarn.log-aggregation-enable</name>
          <value>true</value>
      </property>
  
      <property>
          <name>yarn.log-aggregation.retain-seconds</name>
          <value>604800</value>
      </property>

4、分發Hadoop到node1、node2

cd /usr/local/soft/
scp -r hadoop-2.7.6/ node1:`pwd`
scp -r hadoop-2.7.6/ node2:`pwd`

5、格式化namenode(第一次啟動的時候需要執行,以及每次修改核心配置檔案後都需要)

hdfs namenode -format

6、啟動Hadoop叢集

start-all.sh

7、檢查master、node1、node2上的程序

  • master:

    [root@master soft]# jps
    2597 NameNode
    2793 SecondaryNameNode
    2953 ResourceManager
    3215 Jps
  • node1:

    [root@node1 jdk1.8.0_171]# jps
    11361 DataNode
    11459 NodeManager
    11559 Jps
  • node2:

    [root@node2 ~]# jps
    11384 DataNode
    11482 NodeManager
    11582 Jps

8、訪問HDFS的WEB介面

http://master:50070

9、訪問YARN的WEB介面

http://master:8088

Hadoop中的常見的shell命令

1、如何將linux本地的資料上傳到HDFS中呢?
hadoop fs -put 本地的檔案 HDFS中的目錄
hdfs dfs -put 本地的檔案 HDFS中的目錄
cd /usr/local/soft
hadoop fs -put hadoop-2.7.6.tar.gz  /
hadoop fs -put students.txt  /

2、如何建立HDFS中的資料夾呢?
需求:想建立/shujia/bigdata17
hadoop fs -mkdir -p /shujia/bigdata17
hdfs dfs -mkdir -p /shujia/bigdata17

3、檢視當前HDFS目錄下的檔案和資料夾
hadoop fs -ls /shujia/bigdata17
hdfs dfs -ls /shujia/bigdata17

舉例
[root@master soft]# hadoop fs -ls /
Found 4 items
-rw-r--r--   1 root supergroup  216745683 2022-05-21 19:23 /hadoop-2.7.6.tar.gz
-rw-r--r--   1 root supergroup       1415 2022-05-21 19:31 /initdemo.sh
drwxr-xr-x   - root supergroup          0 2022-05-21 19:33 /shujia
drwx------   - root supergroup          0 2022-05-21 19:26 /user


4、將HDFS的檔案下載到Linux本地中
hadoop fs -get HDFS中的檔案目錄 本地要存放檔案的目錄
hdfs dfs -get HDFS中的檔案目錄 本地要存放檔案的目錄
hdfs dfs -get /students.txt /usr/local/soft/data/

5、刪除命令(如果垃圾回收站大小小於被刪除檔案的大小,直接被刪除,不經過回收站)
hadoop fs -rm ....  # 僅刪除檔案
hadoop fs -rmr .... # 刪除資料夾
舉例:
[root@master soft]# hadoop fs -rmr /students.txt 
rmr: DEPRECATED: Please use 'rm -r' instead.
22/05/21 19:37:00 INFO fs.TrashPolicyDefault: Namenode trash configuration: Deletion interval = 1440 minutes, Emptier interval = 0 minutes.
22/05/21 19:37:00 INFO fs.TrashPolicyDefault: Moved: 'hdfs://master:9000/students.txt' to trash at: hdfs://master:9000/user/root/.Trash/Current/students.txt
Moved: 'hdfs://master:9000/students.txt' to trash at: hdfs://master:9000/user/root/.Trash/Current


6、移動檔案
hadoop fs -mv 目標檔案  目的地路徑
 hadoop fs -mv /user/root/.Trash/Current/students.txt /
7、HDFS內部複製檔案
hadoop fs -cp [-p] ... ... # 如果想複製資料夾,加上-p引數
hadoop fs -cp -p /hadoop-2.7.6.tar.gz /shujia/bigdata/

強制格式化叢集(遇到問題的簡單暴力的方法)

1、停止正在執行的叢集

stop-all.sh

2、刪除所有節點hadoop根目錄中的tmp資料夾

3、在主節點(master)中hadoop的根目錄中的bin目錄下,重新格式化HDFS

./hdfs namenode -format

4、啟動叢集

start-all.sh

2.2 程序理解

2.1.1 HDFS相關(NN,DN,SSN)

NameNode(NN)

功能:

1、接受客戶端的讀/寫服務

因為NameNode知道檔案與DataNode的對應關係

2、儲存檔案的時候會儲存檔案的元資料資訊

a. 檔案的歸屬

b. 檔案的許可權

c. 檔案的大小,時間

d. Block資訊,但是block的位置資訊不會持久化,需要每次開啟叢集的時候DN向NN彙報。(帶同學們畫圖講解,引出這4個點)

3、收集Block的位置資訊

3.1 系統啟動

a. NN關機的時候是不會儲存任意的Block與DataNode的對映資訊的

b. DN啟動的時候會自動將自己節點上儲存的Block資訊彙報給NN

c. NN接收請求之後會重新生成對映關係

File ----> Block

Block---> DN

d. 如果資料塊的副本數小於設定數,那麼NN會將這個副本拷貝到其他節點

3.2 叢集執行中

a. NN與DN保持心跳機制,三秒鐘傳送一次

b. 如果客戶端需要讀取或者上傳資料的時候,NN可以知道DN的健康情況

c. 可以讓客戶端讀取存活的DN節點

d. 如果NN與DN三秒沒有心跳則認為DN出現異常,此時不會讓新的資料寫到這個異常的DN中,客戶端訪問的時候不提供異常DN節點地址

e. 如果超過十分鐘沒有心跳,那麼NN會將當前DN節點儲存的資料轉移到其他的節點

4、NameNode為了效率,將所有的操作都在記憶體中進行

a. 執行速度快

b. NameNode不會和磁碟進行任何的資料交換

但是會存在兩個問題:

1)資料的持久化

2)資料儲存在記憶體中,斷電丟失

DataNode(DN)

1、存放的是檔案的資料資訊,以及驗證檔案完整性的校驗資訊

2、資料會存放在硬碟上

a. 1m=1條元資料

b. 1G=1條元資料

c. NameNode非常排斥儲存小檔案(能存,但是不推薦!!)

一般小檔案在儲存之前需要進行壓縮

3、彙報

1)啟動時

彙報之前會驗證Block檔案是否被損壞

向NN彙報當前DN上block的資訊

2)執行中

向NN保持心跳機制

4、當客戶端讀寫資料的時候,首先會先去NN查詢file與block與DN的對映,然後直接與DN建立連線,然後讀寫資料

SecondaryNameNode(SNN)

1、傳統的那日村持久化方案

1)日誌機制

a. 做任何操作之前先記錄日誌

b. 在資料改變之前先記錄對應的日誌,當NN停止的時候

c. 當我下次啟動的時候,只需要重新按照以前的日誌“重做一遍”即可

缺點:

a. log日誌檔案的大小不可控,隨著時間的發展,叢集啟動的時間會越來越長

b. 有可能日誌中存在大量的無效日誌

優點:

a. 絕對不會丟失資料

2)拍攝快照

a. 我們可以將記憶體中的資料寫出到硬碟上(序列化)

b. 啟動時還可以將硬碟上的資料寫回到記憶體中(反序列化)

缺點:

a. 關機時間過長

b. 如果是異常關機,資料還在記憶體中,沒法寫入到硬碟

c. 如果寫出的頻率過高,導致記憶體使用效率低

優點:

啟動時間較短

 

2、SNN的解決方案

1)解決思路

a. 讓日誌大小可控

b. 快照需要定時儲存

c. 日誌+快照

2)解決方案

a. 當我們啟動一個叢集的時候,會產生4個檔案 ..../name/current/

b. 我們每次操作都會記錄日誌