本文是基於已經安裝好的ubuntu環境上搭建偽分布式hadoop,在virtualbox安裝ubuntu可以參考小編的
”virtualbox安裝ubuntu16.04 LTS及其配置“
一、Hadoop的三種運行模式(啟動模式)
1.1、單機模式(獨立模式)(Local或Standalone Mode)
-默認情況下,Hadoop即處於該模式,用於開發和調式。
-不對配置文件進行修改。
-使用本地文件系統,而不是分布式文件系統。
-Hadoop不會啟動NameNode、DataNode、JobTracker、TaskTracker等守護進程,Map()和Reduce()任務作為同一個進程的不同部分來執行的。
-用於對MapReduce程序的邏輯進行調試,確保程序的正確。
1.2、偽分布式模式(Pseudo-Distrubuted Mode)
-Hadoop的守護進程運行在本機機器,模擬一個小規模的集群
-在一台主機模擬多主機。
-Hadoop啟動NameNode、DataNode、JobTracker、TaskTracker這些守護進程都在同一台機器上運行,是相互獨立的Java進程。
-在這種模式下,Hadoop使用的是分布式文件系統,各個作業也是由JobTraker服務,來管理的獨立進程。在單機模式之上增加了代碼調試功能,允許檢查內存使用情況,HDFS輸入輸出,
以及其他的守護進程交互。類似於完全分布式模式,因此,這種模式常用來開發測試Hadoop程序的執行是否正確。
-修改3個配置文件:core-site.xml(Hadoop集群的特性,作用於全部進程及客戶端)、hdfs-site.xml(配置HDFS集群的工作屬性)、mapred-site.xml(配置MapReduce集群的屬性)
-格式化文件系統
1.3、全分布式集群模式(Full-Distributed Mode)
-Hadoop的守護進程運行在一個集群上
-Hadoop的守護進程運行在由多台主機搭建的集群上,是真正的生產環境。
-在所有的主機上安裝JDK和Hadoop,組成相互連通的網絡。
-在主機間設置SSH免密碼登錄,把各從節點生成的公鑰添加到主節點的信任列表。
-修改3個配置文件:core-site.xml、hdfs-site.xml、mapred-site.xml,指定NameNode和JobTraker的位置和端口,設置文件的副本等參數
-格式化文件系統
二、准備系統環境
2.1、運行虛擬機,進行靜態網絡配置:
在終端上輸入ifconfig -a命令查看網卡名,我的主機有三個網絡接口,分別是enp0s3(橋接網卡),enp0s8(NAT),lo(動態獲取ip)
# ifconfig -a
對/etc/network/interfaces文件進行編輯,以下是在終端上執行的命令:
sudo vim /etc/network/interfaces
上圖是ubuntu的/etc/network/interfaces文件默認的內容,默認動態獲取方法的配置。
但是在業務上需要給ubuntu主機配置靜態ip網絡,在這里我只對enp0s3進行修改,以下是靜態分配的配置方法(根據自己的需求改):
auto enp0s3 iface enp0s3 inet static address 192.168.87.138 netmask 255.255.255.0 gateway 192.168.87.254
接下來需要添加域名服務器,編輯/etc/resolv.conf文件,添加域名服務器,在這里我選擇了全球通用的DNS域名服務器,國內用戶推薦使用,速度較快!
sudo vim /etc/resolv.conf
nameserver 114.114.114.114
或者
nameserver 8.8.8.8
配置已經完成了,接下來需要重啟網絡,網絡重啟有多種方法,在這里只列出兩種方法,二選一即可。
1. 重啟網卡
/etc/init.d/networking restart
2. 這兩條命令是重啟某個網絡接口,一個系統可能有多個網絡接口
# ifdown enp0s3
# ifup enp0s3
檢查網絡配置參數是否正確:
# ifconfig
檢查是否能ping通:
ping www.qq.com
已成功ping通,靜態網絡已配置好了。
2.2、修改主機名與IP地址的對應關系
查看主機名:
# hostname
修改/etc/hosts文件:
# vim /etc/hosts
/etc/hosts文件默認是上圖所示,修改文件為以下內容,注釋127.0.1.1,添加主機靜態地址與主機名:
2.3、配置本機ssh免密碼登錄
單機配置ssh免密登陸的話,輸入以下的命令即可:
提示輸入信息,一直回車按默認即可。
# ssh-keygen -t rsa # cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys # chmod 600 ~/.ssh/authorized_keys
完成之后,以 root 用戶登錄,修改 ssh 配置文件:
vim /etc/ssh/sshd_config
把文件中的下面幾條信息的注釋去掉,如圖所示:
RSAAuthentication yes # 啟用RSA認證 PubkeyAuthentication yes # 啟用公鑰私鑰配對認證方式 AuthorizedKeysFile .ssh/authorized_keys #公鑰文件路徑(和上面生成的文件同)
然后重啟服務:
# service sshd restart
輸入ssh localhost驗證出現如下界面,中間不需要輸入密碼,即配置完成。
# ssh localhost
2.4、 安裝Oracle Java,並配置環境變量
2. 解壓tar包,指定解壓/usr/local/目錄
# tar -zxvf jdk-8u211-linux-x64.tar.gz -C /usr/local/
3. 配置環境變量
# vim /etc/profile
然后添加以下配置在文件尾:
export JAVA_HOME=/usr/local/jdk1.8.0_211 export PATH=$PATH:$JAVA_HOME/bin export JRE_HOME=$JAVA_HOME/jre export CLASSPATH=.:$JAVA_HOME/lib:$JRE_HOME/lib
保存退出即可。
4. 測試jdk配置成功否
刷新環境變量:
# source /etc/profile
輸入java -verion,如配置成功,有下圖的java版本在終端上顯示:
到此,hadoop需要的系統環境已經搭建完畢了,接下來開始搭建偽分布式hadoop集群~
三、搭建偽分布式hadoop集群
3.1 安裝hadoop
從官網下載hadoop3.1.2,解壓hadoop安裝包到/usr/local/目錄下:
# tar -zxvf hadoop-3.1.2.tar.gz -C /usr/local
在環境變量配置hadoop:
# vim /etc/profile
然后添加以下配置在文件尾:
export HADOOP_HOME=/usr/local/hadoop-3.1.2 export PATH=$PATH:$HADOOP_HOME/bin:$HADOOP_HOME/sbin export HADOOP_HDFS_HOME=/usr/local/hadoop-3.1.2 export HADOOP_CONF_DIR=/usr/local/hadoop-3.1.2/etc/hadoop
使用source /etc/profile刷新環境變量后,用hadoop version命令測試是否安裝成功:
# source /etc/profile
# hadoop version
3.2 偽分布式hadoop配置
hadoop的配置文件統一放在$HADOOP_HOME/etc/hadoop目錄下,在這里我們只需要修改5個文件,分別是hadoop-env.sh,core-site.xml,mapred-site.xml,yarn-site.xml,yarn-site.xml。
1. hadoop-env.sh
在文件中修改如下:
export JAVA_HOME=/usr/local/jdk1.8.0_211 export HADOOP_HOME=/usr/local/hadoop-3.1.2
2. core-site.xml
<configuration>
<property> <name>fs.defaultFS</name> <value>hdfs://localhost:9000/</value> </property>
<property>
<name>hadoop.tmp.dir</name>
<value>/usr/local/hadoop/data/</value>
</property>
<property>
<name>fs.checkpoint.dir</name>
<value>file:///usr/local/hadoop/data/dfs/namesecondary</value>
</property>
</configuration>
3. hdfs-site.xml
<configuration>
<property>
<name>dfs.replication</name>
<value>1</value>
</property>
<property>
<name>dfs.http.address</name>
<value>luengmingbiao:50070</value>
</property>
<property>
<name>dfs.namenode.name.dir</name>
<value>file:///usr/local/hadoop/data/dfs/name</value>
</property>
<property>
<name>dfs.datanode.data.dir</name>
<value>file:///usr/local/hadoop/data/dfs/data</value>
</property>
</configuration>
4. mapred-site.xml
<configuration> <property> <name>mapreduce.framework.name</name> <value>yarn</value> </property> </configuration>
5. yarn-site.xml
<configuraion>
<property> <name>yarn.resourcemanager.hostname</name> <value>luengmingbiao</value> </property> <property> <name>yarn.nodemanager.aux-services</name> <value>mapreduce_shuffle</value> </property> <property> <name>yarn.application.classpath</name> <value>/usr/local/hadoop-3.1.2/etc/hadoop:/usr/local/hadoop-3.1.2/share/hadoop/common/lib/*:/usr/local/hadoop-3.1.2/share/hadoop/common/*:/usr/local/hadoop-3.1.2/share/hadoop/hdfs:/usr/local/hadoop-3.1.2/share/hadoop/hdfs/lib/*:/usr/local/hadoop-3.1.2/share/hadoop/hdfs/*:/usr/local/hadoop-3.1.2/share/hadoop/mapreduce/lib/*:/usr/local/hadoop-3.1.2/share/hadoop/mapreduce/*:/usr/local/hadoop-3.1.2/share/hadoop/yarn:/usr/local/hadoop-3.1.2/share/hadoop/yarn/lib/*:/usr/local/hadoop-3.1.2/share/hadoop/yarn/*</value> </property> </configuraion>
注: “yarn.application.classpath“可以通過在終端上輸入如下命令獲取:
# hadoop classpath
對hdfs(Hadoop Distributed File System)進行格式化,hdfs是用來存儲數據的分布式文件系統。
# hdfs namenode -format
出現上述圖所示,代表成功格式化。
Hadoop3.x以上版本在啟動上有一個坑,不添加以下配置啟動進程的時候會報以下的錯並打印到終端上:
解決方案(可以只針對ERROR出現的變量進行定義,如果不行再配置全部):
# vim $HADOOP_HOME/sbin/start-dfs.sh
# vim $HADOOP_HOME/sbin/stop-dfs.sh
# vim $HADOOP_HOME/sbin/start-yarn.sh
# vim $HADOOP_HOME/sbin/stop-yarn.sh
3.3 啟動Hadoop
1. 啟動HDFS
# hdfs --daemon start namenode # hdfs --daemon start datanode
# hdfs --daemon start secondarynamenode
或
# start-dfs.sh
2. 啟動YARN集群
# yarn --daemon start resourcemanager
# yarn --daemon start nodemanager
或
# start-yarn.sh
3. jps命令查看是否啟動成功
4. HDFS和YARN集群都有默認的Web可視化頁面
HDFS: http://主機ip:50070
YARN:http://主機ip:8088
3.4 測試Hadoop
建立測試文件:
# vim test.txt
然后輸入如下數據:
hello hadoop hello World Hello Java Hey man i am a programmer
將測試文件放到測試目錄中:
# hdfs dfs -mkdir hdfs:///hadoop # hdfs dfs -mkdir hdfs:///hadoop/input # hdfs dfs -put ./test.txt hdfs:///hadoop/input
執行hadoop自帶的wordcount程序:
# hadoop jar /usr/local/hadoop-3.1.2/share/hadoop/mapreduce/hadoop-mapreduce-examples-3.1.2.jar wordcount hdfs:///hadoop/input hdfs:///output
然后在命令行輸入 hdfs dfs -cat hdfs:///output/part-r-00000 查看詞頻統計結果:
# hdfs dfs -cat hdfs:///output/part-r-00000
到此,偽分布式Hadoop已經搭建成功了~