首先送上整個配置流程的思惟導圖html
我這邊有 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
複製代碼
$ sudo yum install openssh-server
複製代碼
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.
複製代碼
$ 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
複製代碼
名稱裏有 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
複製代碼
這裏安裝的是 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)
複製代碼
$ su firewall-cmd --state 查看防火牆狀態
$ su systemctl stop firewalld.service 關閉防火牆
$ su systemctl disable firewalld.service 禁止開機時防火牆自啓
複製代碼
到 這裏 下載 Hadoop 3.1.2 版本
$ mkdir /usr/local/hadoop
複製代碼
$ tar -zxvf hadoop-3.1.2.tar.gz -C /usr/local/hadoop/
複製代碼
配置文件的路徑在 /usr/local/hadoop/hadoop-3.1.2/etc/hadoop
$ vi /usr/local/hadoop/hadoop-3.1.2/etc/hadoop/hadoop-env.sh
加入這一行
export JAVA_HOME=/usr/local/java/jdk1.8.0_201
複製代碼
<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>
複製代碼
<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>
複製代碼
<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>
複製代碼
<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>
複製代碼
$ vi workers
添加以下內容
slave1
slave2
複製代碼
這兩個文件在 /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
複製代碼
這兩個文件在 /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
複製代碼
在 /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/
複製代碼
$ 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.
複製代碼
$ 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
複製代碼
查看 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 啓動成功
Wordcount 是 MapReduce 的示例程序,能夠統計某個文件中,各個單詞出現的次數。
input
$ hadoop fs -mkdir /input
複製代碼
input
目錄是否建立成功$ hadoop fs -ls -R /
drwxr-xr-x - root supergroup 0 2019-03-23 20:06 /input
複製代碼
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
複製代碼
$ 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
複製代碼
(1)運行 wordcount 時,出現錯誤 Error: Could not find or load main class.org.apache.hadoop.mapred.YarnChild.
檢查 mapred-site.xml
文件配置
(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、大數據、人工智能等學習資源。