雖然在一般的學習當中,8必用上集羣,hadoop僞分佈式配置已經夠用,配置過程也很簡單
但學hadoop不搭個集羣說不過去。這裏搭個hadoop集羣,一邊搞一邊記錄
說是集羣,實際上只有一個master和一個slave,爲了憐惜自己那一點的內存,爲了不讓CPU燒熟桌子
本搭建基於Hadoop 2,可適合任何 Hadoop 2.x.y 版本
安裝CentOS6.4,兩臺
一臺做Master,一臺做Slave1,這裏不做克隆了
在Windows使用VirtualBox安裝CentOS教程
這步不必闡述,搭過虛擬機的同蟹都懂
在使用CentOS6過程中請注意,CentOS6和CentOS7的個別命令有些許不一樣,如果你的是CentOS7,那麼請注意有些命令間的差別
配置網絡
爲了虛擬機上各個節點都能互聯,我們必須得配置網絡,使它們使用同一個網段。
修改網絡配置文件
Master節點上修改網卡配置
vi /etc/network-scripts/ifcfg-eth0
#eth0這裏是我機子上的網卡名,注意查看自己機子上的網卡名
首先是改
BOOTPROTO=static
ONBOOT=yes
再然後是增加
IPADDR=192.168.100.10 #IP地址
NETMASK=255.255.255.0 #子網掩碼
GATEWAY=192.168.100.2 #網關地址
DNS1=8.8.8.8 #DNS服務器地址
Slave1節點上修改網卡配置,基本和Master上的配置一樣,但把IP地址改爲192.168.100.11
配置聯網方式
打開虛擬網絡編輯器:
VMnet8(NAT模式)----子網IP設置爲:192.168.100.0----NAT設置:網關改爲192.168.100.2—確定----去掉使用本地DHCP服務將IP地址分配給虛擬機選項—確定
重啓網卡
在Master節點和Slave1節點上重啓網卡
service network restart
注:CentOS7上重啓網卡的命令是
systemctl restart network
確保都重啓成功,假如有一項重啓失敗,則證明你還有bug要修
我們先永久關閉掉Master和Slave1上的防火牆
#按順序執行這兩個命令
service iptables stop
chkconfig iptables off
CentOS7上關閉防火牆的命令
systemctl stop firewalld.service #停止firewall
systemctl disable firewalld.service #禁止firewall開機啓動
改主機名並配置主機名到IP地址的映射
Master上改主機名
vi /etc/sysconfig/network
修改HOSTNAME=Master
Slave1上改主機名
vi /etc/sysconfig/network
注:CentOS7上改主機名命令
vi /etc/hostname
添加HOSTNAME=Slave1
配置主機名到IP地址的映射(兩個節點上都配一遍)
vi /etc/hosts
192.168.100.10 Master Master.cn
192.168.100.11 Slave1 Slave1.cn
注:原來的/etc/hosts裏面,只保留127.0.0.1 localhost
修改完之後我們都重啓一下
reboot
測試能不能跑通,實現節點間互聯
查看網絡配置是否成功
ifconfig #顯示的網絡信息是否和我們配置的契合
Master上
ping baidu.com
ping 192.168.100.11
ping Slave1
Slave1上
ping baidu.com
ping 192.168.100.10
ping Master
如果ping不通則說明你還有bug要修
更換yum源
我們現在把兩臺虛擬機的默認yum源更換爲國內的阿里雲yum源,讓下載安裝及更新速度更快一些
#備份緩存
mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backup
#下載新的CentOS-Base.repo 到/etc/yum.repos.d/
wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-6.repo
#添加EPEL
wget -O /etc/yum.repos.d/epel-6.repo http://mirrors.aliyun.com/repo/epel-6.repo
yum clean all #清楚緩存
yum makecache #生成緩存
CentOS7上更換yum源,請參考這篇文章
CentOS 7的yum更換爲國內的阿里雲yum源
兩個節點都創建hadoop用戶
useradd -m hadoop -s /bin/bash # 創建新用戶hadoop
passwd hadoop
visudo #爲hadoop用戶增加管理員權限,以避免後續遇到一系列權限問題
在root ALL=(ALL) ALL 這行下面增加
hadoop ALL=(ALL) ALL,如圖所示,圖中的間隔爲tab
兩個節點都登錄hadoop用戶
su hadoop #後續的操作在hadoop用戶下執行
配置SSH無密碼登錄
一般情況下,CentOS 默認已安裝了 SSH client、SSH server,我們在兩個節點上打開終端執行如下命令進行檢驗
rpm -qa | grep ssh
如圖,如果有顯示openssh-server和openssh-client就證明已安裝
假如沒有安裝,我們使用以下命令安裝
sudo yum install openssh-clients
sudo yum install openssh-server
在安裝 SSH client、SSH server之後,我們在Master和Slave1節點上檢驗是否能用ssh登錄到本機
ssh localhost
如圖,ssh在兩個節點上均是能正常使用的,雖然每次登錄時要輸入密碼
exit命令退出ssh連接後
我們在Master節點上設置無密碼ssh登錄本機
cd ~/.ssh #假如沒有此目錄,那麼你需要ssh localhost後再執行這一步操作
rm ./id_rsa* #如果有之前瞎鼓搗生成的公鑰的話,就刪除,刪除失敗就跳過
ssh-keygen -t rsa #生成公鑰,一直按回車就好
cat ./id_rsa.pub >> ./authorized_keys #讓Master節點能無密碼ssh本機
chmod 600 ./authorized_keys #修改文件權限爲只讀
檢驗一下是否能在Master節點上無密碼ssh登錄本機
ssh localhost
這時連接本機已經不需要密碼了
成功了之後就使用exit命令退出ssh連接
我們已經能在Master節點上無密碼ssh登錄本機了
接下來蝦一步
使Master節點能無密碼ssh登錄Slave1節點
這時我們的Master節點是能ssh連接到Slave1節點了,但每一次都得輸入密碼,我們設置使Master節點能無密碼ssh登錄Slave1節點。
在Master上
scp ~/.ssh/id_rsa.pub hadoop@Slave1:/home/hadoop/ #在線複製公鑰給Slave1
在Slave1上
mkdir ~/.ssh # 如果不存在該文件夾需先創建,若已存在則忽略
cat ~/id_rsa.pub >> ~/.ssh/authorized_keys #將Master傳送過來的公匙加入授權
rm ~/id_rsa.pub # 用完刪掉,過河拆橋
在Master上測試是否能無密碼ssh登錄到Slave1
ssh Slave1
這時已經不需要密碼登錄了
然後exit
兩個節點上均安裝Java環境
sudo yum install java-1.7.0-openjdk java-1.7.0-openjdk-devel #使用此命令安裝openjdk
查查剛纔的jdk安裝到哪裏了
rpm -ql java-1.7.0-openjdk-devel | grep '/bin/javac'
此命令返回的路徑去掉"bin/javac"就是我們jdk的安裝位置,我們拿這個路徑去配環境變量
像我這裏的是/usr/lib/jvm/java-1.7.0-openjdk-1.7.0.251.x86_64
vi ~/.bashrc
在文件後面加一行
export JAVA_HOME=/usr/lib/jvm/java-1.7.0-openjdk-1.7.0.251.x86_64
讓環境變量生效
source ~/.bashrc
檢驗變量是否設置生效
java -version
我這裏是ok了
在Master節點上安裝Hadoop2
注意:是在Master節點上完成hadoop安裝和配置。
下載Hadoop可以到這個網址https://mirrors.cnnic.cn/apache/hadoop/common/下載,選擇版本時請選擇Hadoop2.x.y版本。
下載時請下載 hadoop-2.x.y.tar.gz 這個格式的文件,這是編譯好的,另一個包含 src 的則是 Hadoop 源代碼,需要進行編譯纔可使用。
下載時也強烈建議下載(假如有) hadoop-2.x.y.tar.gz.mds 這個文件,該文件包含了檢驗值可用於檢查hadoop-2.x.y.tar.gz 的完整性,否則若文件發生了損壞或下載不完整,Hadoop 將無法正常運行。(假如想知道怎麼驗證文件完整性,請自行百度搜索,因爲我這裏下載的不是hadoop-2.x.y.tar.gz.mds就不做演示了)
插一句題外話:假如嫌瀏覽器下載太慢,那麼可以複製下載鏈接到迅雷打開下載,BT下載就是香。
下載好了之後我們執行解壓安裝
sudo tar -zxf ~/Download/hadoop-2.7.7.tar.gz -C /usr/local #注意對應自己hadoop壓縮包所在的位置
cd /usr/local/
sudo mv ./hadoop-2.7.7/ ./hadoop # 將文件夾名改爲hadoop
sudo chown -R hadoop:hadoop ./hadoop # 修改文件權限
接蝦來輸入以下命令來檢查 Hadoop 是否安裝成功,成功則會顯示 Hadoop 版本信息
cd /usr/local/hadoop
./bin/hadoop version
ojbk
配置PATH變量
將 Hadoop 安裝目錄加入 PATH 變量中,這樣就可以在任意目錄中直接使用 hadoop、hdfs 等命令了。
在 Master 節點上
vi ~/.bashrc
export PATH=$PATH:/usr/local/hadoop/bin:/usr/local/hadoop/sbin
如下圖所示:
source ~/.bashrc #使配置生效
在Master節點上配置Hadoop2
在Master上安裝hadoop之後,緊接着,我們在Master節點上配置hadoop,這裏並不具體解釋每個配置文件是什麼意思,感興趣的童鞋可以自行跳轉鏈接去查。
Hadoop 默認模式爲單機模式,無需進行其他配置即可運行。
如果要做Hadoop集羣/分佈式模式需要修改 /usr/local/hadoop/etc/hadoop 中的5個配置文件:slaves、core-site.xml、hdfs-site.xml、mapred-site.xml、yarn-site.xml 。
這裏的配置是進入相應的xml文件找到一對configuration空標籤,然後替換如下內容
cd /usr/local/hadoop/etc/hadoop
修改core-site.xml
<configuration>
<property>
<name>fs.defaultFS</name>
<value>hdfs://Master:9000</value>
</property>
<property>
<name>hadoop.tmp.dir</name>
<value>file:/usr/local/hadoop/tmp</value>
<description>Abase for other temporary directories.</description>
</property>
</configuration>
修改 hdfs-site.xml,因爲只有一個分片,所以dfs.replication爲1,dfs.datanode.data.dir也只有一個
<configuration>
<property>
<name>dfs.namenode.secondary.http-address</name>
<value>Master:50090</value>
</property>
<property>
<name>dfs.replication</name>
<value>1</value>
</property>
<property>
<name>dfs.namenode.name.dir</name>
<value>file:/usr/local/hadoop/tmp/dfs/name</value>
</property>
<property>
<name>dfs.datanode.data.dir</name>
<value>file:/usr/local/hadoop/tmp/dfs/data</value>
</property>
</configuration>
修改mapred-site.xml(實際上它默認文件名爲 mapred-site.xml.template)
<configuration>
<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>
</configuration>
修改 yarn-site.xml
<configuration>
<property>
<name>yarn.resourcemanager.hostname</name>
<value>Master</value>
</property>
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
</configuration>
修改 slaves
將作爲 DataNode 的主機名寫入該文件,每行一個。
在僞分佈式配置時,默認爲 localhost的,因爲節點即作爲 NameNode 也作爲 DataNode執行。
分佈式配置如果讓 Master 節點既作爲 NameNode,也作爲DataNode,就保留 localhost;如果讓Master節點作爲NameNode,就刪掉localhost。
我這裏選擇刪除localhost
把Master 上的 /usr/local/Hadoop 文件夾複製到Slave1節點上
假如之前有跑過僞分佈式模式,建議在切換到集羣模式前先刪除之前的臨時文件和日誌文件。在 Master 節點上執行
cd /usr/local
sudo rm -r ./hadoop/tmp # 刪除 Hadoop 臨時文件
sudo rm -r ./hadoop/logs/* # 刪除日誌文件
tar -zcf ~/hadoop.master.tar.gz ./hadoop # 先壓縮再複製
cd ~
scp ./hadoop.master.tar.gz Slave1:/home/hadoop #在線複製文件到Slave1上
在Slave1上執行
sudo rm -r /usr/local/hadoop # 刪掉舊的
sudo tar -zxf ~/hadoop.master.tar.gz -C /usr/local #解壓新的
sudo chown -R hadoop /usr/local/hadoop #修改文件權限
同樣,如果有其他 Slave 節點,也要執行將 hadoop.master.tar.gz 傳輸到 Slave 節點、在 Slave 節點解壓文件等操作。
在 Master 節點執行 NameNode 的格式化,之後不需要
hdfs namenode -format
如圖
開啓集羣
注意:CentOS系統默認開啓了防火牆,在開啓 Hadoop 集羣之前,需要關閉集羣中每個節點的防火牆。有防火牆會導致 ping 得通但 telnet 端口不通,從而導致 DataNode 啓動了,但 Live datanodes 爲 0 的情況。我們前面的操作中已經關閉防火牆了,如果防火牆沒關閉的請關閉再開啓集羣。
在Master執行
start-dfs.sh
start-yarn.sh
mr-jobhistory-daemon.sh start historyserver
這時可以通過jps
可以查看各個節點所啓動的進程。正確的話,在 Master 節點上可以看到 NameNode、ResourceManager、SecondrryNameNode、JobHistoryServer 進程
在Slave1節點上可以看到DataNode 和 NodeManager
如圖,集羣搭建成功,高興得像只兩百斤的小胖子
關閉集羣也是在Master上關閉,按順序執行命令
stop-yarn.sh
stop-dfs.sh
mr-jobhistory-daemon.sh stop historyserver
記一個bug
有事沒事不要初始化namenode玩。初始化一遍就好,假如初始化多遍導致Slave1節點上datanode不能啓動,那麼有兩種debug方法
- 請看看這篇博客:[Hadoop啓動datanode失敗,clusterID有問題,簡而言之,就是把namenode上的clusterID複製到不能正常啓動的datanode節點上。
- 在所有datanode節點上找到{hadoop.tmp.dir}/dfs/data目錄,刪除。然後在Masterj節點上再次初始化集羣:hdfs namenode -format。{hadoop.tmp.dir}具體路徑看個人配置(在配置文件core-site.xml中)。
以上兩種方法都能解決因爲初始化集羣多次而產生的clusterID不一致導致datanode不能正常啓動的問題。
但我還是建議採取第一種方法,畢竟當hadoop集羣真正用於生產環境中,要儘量避免刪數據。
監控集羣
監控集羣建立在hadoop集羣啓動之上,當hadoop啓動之後
start-dfs.sh
start-yarn.sh
mr-jobhistory-daemon.sh start historyserver
我們可以通過虛擬機CentOS裏自帶的火狐瀏覽器進入集羣監控的web界面,但這裏我選擇在宿主機查看集羣監控的web界面(虛擬機分配的內存太小,不想卡出翔)。
在宿主機添加IP到主機名的映射
在C:/Windows/Systems/drivers/etc/hosts中添加
192.168.100.10 Master Master.cn
192.168.100.11 Slave1 Slave1.cn
查看集羣監控的web界面
查看HDFS集羣狀態
地址配置在:hdfs-site.xml中的dfs.namenode.http-address
默認訪問地址:http://namenode的ip:50070
我這裏的是:http://Master:50070
查看secondarynamenode的集羣狀態
地址配置在:hdfs-site.xml中的dfs.namenode.secondary.http-address
默認訪問地址:http://namenode的ip:50090
我這裏的是:http://Master:50090
查看yarn集羣的狀態
地址配置在:yarn-site.xml中的yarn.resourcemanager.webapp.address
默認訪問地址:http://namenode的ip:50090
我這裏的是:http://Master:8088
至於能從這些web界面獲取到什麼信息:Hadoop大數據開發基礎 | 集羣監控