CentOS 7 中配置 Hadoop 3.1.2 徹底分佈式

首先送上整個配置流程的思惟導圖html

1. 配置 hosts、hostname

我這邊有 1 個 master 主機,2 個 slave 主機,java

3 臺主機的 hosts 配置文件以下node

[root@master .ssh]$ cat /etc/hosts
127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
192.168.199.201         master
192.168.199.202         slave1
192.168.199.203         slave2
複製代碼

master 的 hostname 是python

$ cat /etc/hostname
master
複製代碼

slave1 的 hostname 是linux

$ cat /etc/slave1
master
複製代碼

slave2 的 hostname 是shell

$ cat /etc/slave2
master
複製代碼

2. 配置 SSH

2.1 安裝 ssh(三個主機都要安裝)
$ sudo yum install openssh-server
複製代碼
2.2 配置集羣間 ssh 無密鑰登錄

1) 首先在 master 上生成 ssh 公鑰apache

$ ssh-keygen -t rsa
複製代碼

而後連續按 3 個回車便可。再到生成 ssh 密鑰的目錄下查看是否成功centos

[root@master hadoop]$ cd ~/.ssh
[root@master .ssh]$ ls
authorized_keys  id_rsa  id_rsa.pub  known_hosts
複製代碼

注意:若沒有生成 authorized_keys 文件,須要本身手動建立,安全

**2)**而後將 id_rsa.pub 中的內容複製到 authorized_keys 文件中。bash

$ cat id_rsa.pub >> authorized_keys
複製代碼

**3)**最後將 authorized_keys 分發給另外兩個節點

$ scp authorized_keys slave1:~/.ssh/
$ scp authorized_keys slave2:~/.ssh/
複製代碼

**4)**測試 ssh 無密登錄是否成功

[root@master .ssh]$ ssh master
Last login: Sat Mar 23 17:11:13 2019 from master
[root@master ~]$ exit
logout
Connection to master closed.
[root@master .ssh]$ ssh slave1
Last login: Sat Mar 23 17:04:46 2019 from master
[root@slave1 ~]$ exit
logout
Connection to slave1 closed.
[root@master .ssh]$ ssh slave2
Last login: Sat Mar 23 15:31:54 2019 from master
[root@slave2 ~]$ exit
logout
Connection to slave2 closed.
複製代碼

3. 配置 jdk(三臺主機都要配置)

3.1 首先確認刪除 centos 系統自帶的 jdk
$ rpm -qa | grep java
python-javapackages-3.4.1-11.el7.noarch
tzdata-java-2018e-3.el7.noarch
javapackages-tools-3.4.1-11.el7.noarch
java-1.8.0-openjdk-1.8.0.102-4.b14.el7.x86_64
java-1.8.0-openjdk-headless-1.8.0.102-4.b14.el7.x86_64
複製代碼
  • rpm 是一種用於打包及安裝工具
  • -q 表明 query,a 表明 all
  • grep: 用於文本搜索

名稱裏有 openjdk 的要刪除

$ rpm -e --nodeps java-1.8.0-openjdk-1.8.0.102-4.b14.el7.x86_64
$ rpm -e --nodeps java-1.8.0-openjdk-headless-1.8.0.102-4.b14.el7.x86_64
複製代碼
3.2 安裝 jdk

這裏安裝的是 jdk1.8

**1)**建立 jdk 環境的路徑

$ mkdir /usr/local/java
複製代碼

**2)**將下載好的壓縮包解壓到指定路徑

[root@master Downloads]# tar -zxvf jdk-8u201-linux-x64.tar.gz -C /usr/local/java/
複製代碼

**3)**配置 java 的環境變量

# vi /etc/profile
export JAVA_HOME=/usr/local/java/jdk1.8.0_201
export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
export PATH=$PATH:$JAVA_HOME/bin
複製代碼

**4)**使配置生效

$ source /etc/profile
複製代碼

**5)**測試是否配置成功

$ java -version
java version "1.8.0_201"
Java(TM) SE Runtime Environment (build 1.8.0_201-b09)
Java HotSpot(TM) 64-Bit Server VM (build 25.201-b09, mixed mode)
複製代碼

4. 關閉防火牆(三個節點都關閉)

$ su firewall-cmd --state 查看防火牆狀態
$ su systemctl stop firewalld.service 關閉防火牆
$ su systemctl disable firewalld.service 禁止開機時防火牆自啓
複製代碼

5. 下載、解壓 Hadoop(三臺主機都要安裝)

這裏 下載 Hadoop 3.1.2 版本

5.1 建立 hadoop 目錄
$ mkdir /usr/local/hadoop
複製代碼
5.2 解壓 hadoop 壓縮包到指定目錄
$ tar -zxvf hadoop-3.1.2.tar.gz -C /usr/local/hadoop/
複製代碼

6. 修改配置文件(三臺主機都要配置)

配置文件的路徑在 /usr/local/hadoop/hadoop-3.1.2/etc/hadoop

1)hadoop-env.sh
$ vi /usr/local/hadoop/hadoop-3.1.2/etc/hadoop/hadoop-env.sh
加入這一行
export JAVA_HOME=/usr/local/java/jdk1.8.0_201
複製代碼
2)core-site.xml
<configuration>
    <!-- 指定 namenode 的通訊地址 默認 8020 端口 -->
    <property>
        <name>fs.defaultFS</name>
        <value>hdfs://master/</value>
    </property>

    <!-- 指定 hadoop 運行時產生文件的存儲路徑 -->
    <property>
        <name>hadoop.tmp.dir</name>
        <value>/usr/local/hadoop/hadoop-3.1.2/tmp</value>
    </property>
</configuration>
複製代碼
3)hdfs-site.xml
<configuration>
    
    <!-- namenode 上存儲 hdfs 名字空間元數據-->
    <property>
        <name>dfs.namenode.name.dir</name>
        <value>/usr/local/hadoop/hadoop-3.1.2/namenode</value>
    </property>

    <!-- datanode 上數據塊的物理存儲位置-->  
    <property>
        <name>dfs.datanode.data.dir</name>
        <value>/usr/local/hadoop/hadoop-3.1.2/datanode</value>
    </property>

    <!-- 設置 hdfs 副本數量 -->
    <property>
        <name>dfs.replication</name>
        <value>1</value>
    </property>

</configuration>
複製代碼
4)mapred-site.xml
<configuration>

    <!-- 指定yarn運行-->
    <property>
        <name>mapreduce.framework.name</name
        <value>yarn</value>
    </property>

    <property>
        <name>yarn.app.mapreduce.am.env</name>
        <value>HADOOP_MAPRED_HOME=/usr/local/hadoop/hadoop-3.1.2</value>
    </property>

    <property>
        <name>mapreduce.map.env</name>
        <value>HADOOP_MAPRED_HOME=/usr/local/hadoop/hadoop-3.1.2</value>
    </property>

    <property>
        <name>mapreduce.reduce.env</name>
        <value>HADOOP_MAPRED_HOME=/usr/local/hadoop/hadoop-3.1.2</value>
    </property>

</configuration>
複製代碼
5)year-site.xml
<configuration>
<!-- Site specific YARN configuration properties -->
    <!-- 指定ResourceManager的地址 -->
    <property>
        <name>yarn.resourcemanager.hostname</name>
        <value>master</value>
    </property>

    <!-- reducer取數據的方式是mapreduce_shuffle -->  
    <property>
        <name>yarn.nodemanager.aux-services</name>
        <value>mapreduce_shuffle</value>
    </property>

</configuration>
複製代碼
6)workers
$ vi workers

添加以下內容
slave1
slave2
複製代碼
7)start-dfs.sh 和 stop-dfs.sh

這兩個文件在 /usr/local/hadoop/hadoop-3.1.2/sbin/ 中,分別在 start-dfs.sh 和 stop-dfs.sh 中添加以下內容

HDFS_DATANODE_USER=root
HDFS_DATANODE_SECURE_USER=hdfs
HDFS_NAMENODE_USER=root
HDFS_SECONDARYNAMENODE_USER=root
複製代碼
8)start-yarn.sh 和 stop-yarn.sh

這兩個文件在 /usr/local/hadoop/hadoop-3.1.2/sbin/ 中,分別在 start-yarn.sh 和 stop-yarn.sh 中添加以下內容

YARN_RESOURCEMANAGER_USER=root
HADOOP_SECURE_DN_USER=yarn
YARN_NODEMANAGER_USER=root
複製代碼
9)配置 hadoop 環境變量

/etc/profile 中添加以下內容

$ vi /etc/profile

export HADOOP_HOME=/usr/local/hadoop/hadoop-3.1.2
export PATH=$PATH:$JAVA_HOME/bin:$HADOOP_HOME/bin:$HADOOP_HOME/sbin
複製代碼

添加成功後

$ source /etc/profile
複製代碼

上面的操做要在每個節點上都同步,可是一個一個的去編輯太麻煩了,能夠用 scp 命令,在 master 節點編輯好以後,直接發送給 slave 節點

$ scp /usr/local/hadoop/hadoop-3.1.2/etc/hadoop/ slave1 /usr/local/hadoop/hadoop-3.1.2/etc/hadoop/
 $ scp /usr/local/hadoop/hadoop-3.1.2/etc/hadoop/ slave2 /usr/local/hadoop/hadoop-3.1.2/etc/hadoop/
複製代碼

7. 啓動 hadoop(在主節點上操做)

7.1 啓動 hadoop 以前在 master 上 format 名稱節點
$ cd /usr/local/hadoop/hadoop-3.1.2/bin
$ hdfs namenode -format

2019-03-23 19:47:19,332 INFO namenode.NameNode: STARTUP_MSG:
/************************************************************
STARTUP_MSG: Starting NameNode
STARTUP_MSG:   host = master/192.168.199.201
STARTUP_MSG:   args = [-format]
STARTUP_MSG:   version = 3.1.2
...此處省略不少日誌信息
2019-03-23 19:47:21,670 INFO common.Storage: Storage directory /usr/local/hadoop/hadoop-3.1.2/namenode has been successfully formatted.
2019-03-23 19:47:21,692 INFO namenode.FSImageFormatProtobuf: Saving image file /usr/local/hadoop/hadoop-3.1.2/namenode/current/fsimage.ckpt_0000000000000000000 using no compression
2019-03-23 19:47:21,899 INFO namenode.FSImageFormatProtobuf: Image file /usr/local/hadoop/hadoop-3.1.2/namenode/current/fsimage.ckpt_0000000000000000000 of size 391 bytes saved in 0 seconds .
2019-03-23 19:47:21,933 INFO namenode.NNStorageRetentionManager: Going to retain 1 images with txid >= 0
2019-03-23 19:47:21,962 INFO namenode.NameNode: SHUTDOWN_MSG:
/************************************************************
SHUTDOWN_MSG: Shutting down NameNode at master/192.168.199.201
複製代碼

出現如下信息則說明 namenode 格式化成功

INFO common.Storage: Storage directory /usr/local/hadoop/hadoop-3.1.2/namenode has been successfully formatted.
複製代碼
7.2 在 master 節點上啓動 hadoop 服務
$ start-all.sh

Starting namenodes on [master]
Last login: Sat Mar 23 19:42:41 CST 2019 on pts/1
Starting datanodes
Last login: Sat Mar 23 19:54:46 CST 2019 on pts/1
Starting secondary namenodes [master]
Last login: Sat Mar 23 19:54:49 CST 2019 on pts/1
Starting resourcemanager
Last login: Sat Mar 23 19:54:56 CST 2019 on pts/1
Starting nodemanagers
Last login: Sat Mar 23 19:55:11 CST 2019 on pts/1
複製代碼
7.3 查看 hadoop 服務是否啓動成功

查看 master 節點

$ jps
39578 ResourceManager
39324 SecondaryNameNode
39933 Jps
39039 NameNode
複製代碼

查看 slave1 節點

$ jps
16000 Jps
15907 NodeManager
15780 DataNode
複製代碼

查看 slave2 節點

$ jps
15040 DataNode
15298 Jps
15167 NodeManager
複製代碼

當 3 臺節點分別出現這些 java 進程,則 hadoop 啓動成功

8. 運行 wordcount 示例

Wordcount 是 MapReduce 的示例程序,能夠統計某個文件中,各個單詞出現的次數。

8.1 在 hdfs 文件系統中建立存放被測試文件的目錄 input
$ hadoop fs -mkdir /input
複製代碼
8.2 查看 input 目錄是否建立成功
$ hadoop fs -ls -R /

drwxr-xr-x   - root supergroup          0 2019-03-23 20:06 /input
複製代碼
8.3 建立測試文件 test.txt 並上傳到 hdfs 中

首先介紹一些 hdfs 經常使用的命令語句

列出 hdfs 下的文件
$ hadoop dfs -ls
列出 hdfs / 路徑下的全部文件,文件夾  
$ hadoop dfs -ls -R /
建立目錄 /input
$ hadoop dfs -mkdir /input
列出 hsfs 名爲 input 的文件夾中的文件
$ hadoop dfs -ls input
將 test.txt 上傳到 hdfs 中
$ hadoop fs -put /home/binguner/Desktop/test.txt /input
將 hsdf 中的 test.txt 文件保存到本地桌面文件夾
$ hadoop dfs -get /input/test.txt /home/binguenr/Desktop
刪除 hdfs 上的 test.txt 文件
$ hadoop dfs -rmr /input/test.txt
查看 hdfs 下 input 文件夾中的內容
$ hadoop fs -cat input/*
進入安全模式
$ hadoop dfsadmin –safemode enter
退出安全模式
$ hadoop dfsadmin -safemode leave
報告 hdfs 的基本統計狀況
$ hadoop dfsadmin -report
複製代碼

在 Desktop 下建立 test.txt

$ vi /home/binguner/Desktop/test.txt

hello world
hello hadoop
複製代碼

test.txt 上傳到 hdfs 中

# hadoop fs -put /home/binguner/Desktop/test.txt /input
複製代碼
8.4 運行 wordcount 程序
$ hadoop jar /usr/local/hadoop/hadoop-3.1.2/share/hadoop/mapreduce/hadoop-mapreduce-examples-3.1.2.jar wordcount /input /output
複製代碼

日誌信息出現

INFO mapreduce.Job: Job job_1553342123652_0001 completed successfully
複製代碼

則運行成功

而後查看 hdfs 中新生成的文件

$ hadoop fs -ls -R /

drwxr-xr-x   - root supergroup          0 2019-03-23 20:11 /input
-rw-r--r--   1 root supergroup         25 2019-03-23 20:11 /input/test.txt
drwxr-xr-x   - root supergroup          0 2019-03-23 20:13 /output
-rw-r--r--   1 root supergroup          0 2019-03-23 20:13 /output/_SUCCESS
-rw-r--r--   1 root supergroup         25 2019-03-23 20:13 /output/part-r-00000
drwx------   - root supergroup          0 2019-03-23 20:12 /tmp
drwx------   - root supergroup          0 2019-03-23 20:12 /tmp/hadoop-yarn
drwx------   - root supergroup          0 2019-03-23 20:12 /tmp/hadoop-yarn/staging
drwxr-xr-x   - root supergroup          0 2019-03-23 20:12 /tmp/hadoop-yarn/staging/history
drwxrwxrwt   - root supergroup          0 2019-03-23 20:12 /tmp/hadoop-yarn/staging/history/done_intermediate
drwxrwx---   - root supergroup          0 2019-03-23 20:13 /tmp/hadoop-yarn/staging/history/done_intermediate/root
-rwxrwx---   1 root supergroup      22276 2019-03-23 20:13 /tmp/hadoop-yarn/staging/history/done_intermediate/root/job_1553342123652_0001-1553343159309-root-word+count-1553343194205-1-1-SUCCEEDED-default-1553343173503.jhist
-rwxrwx---   1 root supergroup        439 2019-03-23 20:13 /tmp/hadoop-yarn/staging/history/done_intermediate/root/job_1553342123652_0001.summary
-rwxrwx---   1 root supergroup     213381 2019-03-23 20:13 /tmp/hadoop-yarn/staging/history/done_intermediate/root/job_1553342123652_0001_conf.xml
drwx------   - root supergroup          0 2019-03-23 20:12 /tmp/hadoop-yarn/staging/root
drwx------   - root supergroup          0 2019-03-23 20:13 /tmp/hadoop-yarn/staging/root/.staging
複製代碼

/output/part-r-00000 裏就是本次運行的結果

$ hadoop fs -cat /output/part-r-00000


hadoop  1
hello   2
world   1
複製代碼

Q&A

(1)運行 wordcount 時,出現錯誤 Error: Could not find or load main class.org.apache.hadoop.mapred.YarnChild.

檢查 mapred-site.xml 文件配置

參考連接 1 參考連接 2

(2)啓動 hadoop 時:Starting resourcemanager ERROR: Attempting to launch yarn resourcemanager as root ERROR: but there is no YARN_RESOURCEMANAGER_USER defined. Aborting launch. Starting nodemanagers ERROR: Attempting to launch yarn nodemanager as root ERROR: but there is no YARN_NODEMANAGER_USER defined. Aborting launch.

編輯 start-yarn.sh 和 stop-yarn.sh,添加文章中提到的參數。

(3)啓動 hadoop 時:Starting namenodes on [localhost] ERROR: Attempting to launch hdfs namenode as root ERROR: but there is no HDFS_NAMENODE_USER defined. Aborting launch.

編輯 start-dfs.sh 和 stop-dfs.sh,添加文章中提到的參數。

(4)啓動 start-dfs.sh 後,節點中的 datanode 閃退

重複格式化致使出錯,確認各個 xml 文件配置無誤後, 刪除 dfs.namenode.name.dir,dfs.datanode.data.dir,hadoop.tmp.dir 對應的文件夾後從新 format。

若是出現了其餘奇奇怪怪的錯誤,去 logs 文件夾下查看出錯的緣由。

歡迎關注本文做者:

掃碼關注並回復「乾貨」,獲取我整理的千G Android、iOS、JavaWeb、大數據、人工智能等學習資源。

相關文章
相關標籤/搜索