本文主要介紹了 Hadoop 的三種運行模式以及配置的方式。html
Hadoop 的運行模式分爲三種:java
Standalone(本地模式/單機模式/local模式)node
該模式下沒有任何守護進程,用戶程序和 Hadoop 程序運行在同一個 Java 進程,使用的文件系統是本地文件系統而不是分佈式文件系統,此模式下通常用於本地調試。web
Pseudo-Distributed(僞集羣模式)shell
在單機上模擬集羣模式,各守護進程運行在單獨的 Java 進程當中,使用的文件系統是 HDFSapache
Fully-Distributed(集羣模式)ubuntu
守護進程運行在集羣上,使用的文件系統也是 HDFScentos
本次配置基於 Hadoop2.9.2,其中 Standalone 在 CentOS 7.2 系統下進行配置, Pseudo-Distributed 模式在 MacOS 10.14.4 上進行配置,Fully-Distributed 模式在騰訊雲主機上進行配置,集羣由兩臺雲主機組成,分別運行 Ubuntu 14.04.1 和 CentOS 7.2 系統。bash
Java 7/8ssh
Hadoop 2.7.x to 2.x 支持 Java 7/8,其它 Hadoop 版本支持的 Java 版本請點擊 🔗 進行查詢
下載:
sudo yum install java-1.8.0-openjdk-devel //centos 安裝 Java8,ubuntu 下須要用 apt-get 進行安裝
複製代碼
配置環境變量:
cd ~
vi .bash_profile
export JAVA_HOME=/usr/lib/jvm/jre-1.8.0-openjdk.i386
source .bash_profile
複製代碼
ssh 和 rsync: 用 ssh
和 rsync
命令測試後發現 Centos 自己就有,因此無須進行安裝。
Hadoop
sudo wget http://mirror.bit.edu.cn/apache/hadoop/common/hadoop-2.9.2/hadoop-2.9.2.tar.gz
tar -zxvf hadoop-2.9.2.tar.gz
複製代碼
這裏的下載地址最好根據雲主機所在的區域進行選擇,若是是國內的雲主機最好使用國內的鏡像地址,這樣下載會快不少。
下載解壓以後的 Hadoop 默認就是 Standalone 模式,可直接運行 wordcount 進行測試
mkdir input //hadoop 的同級目錄建立
cp hadoop-2.9.2/LICENSE.txt input/
hadoop-2.9.2/bin/hadoop jar hadoop-2.9.2/share/hadoop/mapreduce/hadoop-mapreduce-examples-2.9.2.jar wordcount input output //運行 wordcount
cat output/part-r-00000 //查看結果
複製代碼
同時再開一個終端在做業運行的時候輸入 jps 查看進程
能夠看到 Standalone 模式下 Hadoop 只會啓動 RunJar 進程來運行整個做業
修改 etc/hadoop/core-site.xml
<configuration>
<property>
<name>fs.defaultFS</name> <!--配置訪問 nameNode 的 URI-->
<value>hdfs://localhost:9000</value>
</property>
<property>
<name>hadoop.tmp.dir</name> <!--指定臨時目錄,MapReduce 和 HDFS 的許多路徑配置依賴此路徑-->
<value>/home/hadoop/tmp</value>
</property>
</configuration>
複製代碼
修改 etc/hadoop/hdfs-site.xml
<configuration>
<property>
<name>dfs.replication</name> <!--配置文件的副本數量-->
<value>1</value>
</property>
<property>
<name>dfs.permissions</name>
<value>false</value> <!--關閉防火牆-->
</property>
</configuration>
複製代碼
配置免密登陸
ssh localhost 測試可否免密登陸(若是可以則跳過如下操做)
ssh-keygen -t rsa -P '' -f ~/.ssh/id_rsa
cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys
chmod 0600 ~/.ssh/authorized_keys
複製代碼
修改 etc/hadoop/hadoop-env.sh(若是提示找不到 JAVA_HOME)
export JAVA_HOME=/usr/lib/jvm/jre-1.8.0-openjdk.i386 //上面配置的 JAVA_HOME 好像沒起做用
複製代碼
格式化 HDFS
bin/hdfs namenode -format
複製代碼
啓動 HDFS
sbin/start-dfs.sh
複製代碼
啓動後輸入 jps 看到如下進程即成功,這個時候能夠經過 http://localhost:50070/ 訪問 NameNode
運行 wordcount
bin/hdfs dfs -mkdir /user
bin/hdfs dfs -mkdir /user/<username>
bin/hdfs dfs -mkdir /user/<username>/input
bin/hdfs dfs -put LICENSE.txt /user/<username>/input //建立文件夾並上傳文件
bin/hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-2.9.2.jar wordcount input output //運行 wordcount
bin/hdfs dfs -cat output/part-r-00000 //顯示結果
複製代碼
在另外一終端輸入 jps 能夠看到運行時的如下進程
依舊是用 RunJar 提交,只是讀取和寫入採用了 HDFS。
經過 YARN 執行 Job(可選配置,不過爲了更接近真實集羣仍是建議配置)
修改 etc/hadoop/mapred-site.xml
cp etc/hadoop/mapred-site.xml.template etc/hadoop/mapred-site.xml
vi etc/hadoop/mapred-site.xml
複製代碼
增長如下內容
<configuration>
<property>
<name>mapreduce.framework.name</name> <!--代表運行在 YARN 上-->
<value>yarn</value>
</property>
</configuration>
複製代碼
修改 etc/hadoop/yarn-site.xml
<configuration>
<property>
<name>yarn.resourcemanager.hostname</name><!--設置resourcemanager的hostname-->
<value>localhost</value>
</property>
<property>
<name>yarn.nodemanager.aux-services</name> <!--指定 nodemanager 獲取數據的方式-->
<value>mapreduce_shuffle</value>
</property>
</configuration>
複製代碼
啓動 YARN
sbin/start-yarn.sh
複製代碼
啓動成功後能夠經過 http://localhost:8088/ 訪問 ResourceManager 節點,而且輸入 jps 會顯示如下進程
其中 ResourceManager 和 NodeManager 是屬於 YARN 的進程。
重複 7
的操做,輸入 jps 查詢進程
能夠看到新增長了 YarnChild 進程和 MRAppMaster 進程,之因此有兩個 YarnChild 進程是由於輸入文件夾中存在兩個文本文件,這說明了 MapReduce 是經過建立多個進程並行計算的。
集羣包括兩個節點,節點名分別爲 master 和 slave,master 和 slave 的節點配置過程基本一致,如下是配置過程(兩個節點差別配置會進行註明,建議先配置好 master 節點的 Hadoop,而後用 scp 命令複製到 slave 節點進行修改。):
修改 /etc/hosts
152.136.76.12 master //騰訊雲公網ip
94.191.43.137 slave
複製代碼
免密登陸(⚠️兩個節點的登陸名必須一致,這裏都爲 root)
master 節點配置本機免密登陸以及移動公鑰到子節點
ssh-keygen -t rsa -P '' -f ~/.ssh/id_rsa
cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys
chmod 0600 ~/.ssh/authorized_keys
scp ~/.ssh/id_rsa.pub root@slave:~/
slave 節點配置 master 節點免密登陸
cat ~/id_rsa.pub >> ~/.ssh/authorized_keys
chmod 600 ~/.ssh/authorized_keys
複製代碼
修改 etc/hadoop/core-site.xml
<configuration>
<property>
<name>fs.defaultFS</name> <!--配置訪問 nameNode 的 URI-->
<value>hdfs://localhost:9000</value>
</property>
<property>
<name>hadoop.tmp.dir</name> <!--指定臨時目錄,MapReduce 和 HDFS 的許多路徑配置依賴此路徑-->
<value>/home/hadoop/tmp</value>
</property>
</configuration>
複製代碼
修改 etc/hadoop/hdfs-site.xml
<configuration>
<property>
<name>dfs.replication</name> <!--配置文件的副本數量-->
<value>1</value>
</property>
<property>
<name>dfs.permissions</name>
<value>false</value> <!--關閉防火牆-->
</property>
<property>
<name>dfs.namenode.secondary.http-address</name>
<value>slave:50090</value> <!-- 指定secondarynamenode位置 -->
</property>
</configuration>
複製代碼
修改 etc/hadoop/mapred-site.xml
<configuration>
<property>
<name>mapreduce.framework.name</name> <!--代表運行在 YARN 上-->
<value>yarn</value>
</property>
</configuration>
複製代碼
修改 etc/hadoop/yarn-site.xml
<configuration>
<property>
<name>yarn.resourcemanager.hostname</name><!--設置resourcemanager的hostname-->
<value>master</value>
</property>
<property>
<name>yarn.nodemanager.aux-services</name> <!--指定 nodemanager 獲取數據的方式-->
<value>mapreduce_shuffle</value>
</property>
</configuration>
複製代碼
修改 etc/hadoop/hadoop-env.sh
export JAVA_HOME=/usr/lib/jvm/jre-1.8.0-openjdk.i386 //master 和 slave 填入各自路徑
export HADOOP_LOG_DIR=/root/hadoop/hadoop-2.9.2/logs //能夠本身選定
複製代碼
修改 etc/hadoop/mapred-env.sh
export JAVA_HOME=/usr/lib/jvm/jre-1.8.0-openjdk.i386
複製代碼
修改 etc/hadoop/yarn-env.sh
export JAVA_HOME=/usr/lib/jvm/jre-1.8.0-openjdk.i386
export YARN_LOG_DIR=/root/hadoop/hadoop-2.9.2/logs
複製代碼
修改 etc/hadoop/slaves
master
slave
複製代碼
啓動 HDFS 和 YARN
bin/hdfs namenode -format //首次運行時格式化
sbin/start-dfs.sh
sbin/start-yarn.sh
複製代碼
在 master 和 slave 節點分別輸入 jps 後有
運行 wordcount(與僞分佈式中一致)
bin/hdfs dfs -mkdir /user
bin/hdfs dfs -mkdir /user/<username>
bin/hdfs dfs -mkdir /user/<username>/input
bin/hdfs dfs -put LICENSE.txt /user/<username>/input
bin/hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-2.9.2.jar wordcount input output
bin/hdfs dfs -cat output/part-r-00000
複製代碼
繼續用 jps 查看兩臺主機的進程
能夠看到集羣模式中的進程與僞集羣模式中的進程沒有區別,惟一的區別在於進程在不一樣的主機上運行。
這裏主要記錄配置過程當中遇到的一部分錯誤
Container exited with a non-zero exit code 1. Error file: prelaunch.err.
該錯誤是在騰訊雲主機上配置的僞集羣模式運行 wordcount 時出現的,嘗試了網上的一些辦法都沒有解決。最後採用本身電腦配置再運行一遍成功,多是由於雲主機的配置問題。
在 YARN 上運行 Java.net.ConnectException: Connection refused
多是防火牆的緣由,根據 🔗 中的提示解決
沒法外網訪問VM中的 Hadoop YARN 的8088端口
沒法經過雲主機 ip:8088 訪問 YARN 的 Web 頁面時,不妨經過 netstat -nlp | grep java
查看當前提供 web 服務的端口,若是 ip 是 127.0.0.1 證實存在問題,須要修改 hosts,具體過程見 🔗。
slave: bash: line 0: cd: /root/hadoop/hadoop-2.9.2: No such file or directory
配置集羣模式時出現,主要緣由是手動配置 slave 時 Hadoop 存放路徑與 master 不一致,只須要將 slave 的 Hadoop 放在與 master 的同一路徑下便可解決。