一、Hadoop是什么?
從狹義來說,Hadoop指的是Apache下的一款開源框架,目前常用的是Hadoop2版本。
Hadoop2主要包含以下3個組件:
與Hadoop1區別在于1版本把資源管理和海量數據計算的任務都丟給MapReduce,即Hadoop1只有一個HDFS和MapReduce組成。
- HDFS:一個Hadoop的分布式文件系統,支持NameNode橫向擴展,解決海量數據的存儲。
- YARN:一個負責作業調度和集群資源管理的框架,解決資源任務調度。
- MapReduce:一個分布式運算編程框架,運行在YARN上,用來解決海量數據的計算。
從廣義來說,Hadoop類似于Spring,已經形成了一個Hadoop生態圈,許多技術都和Hadoop進行集成使用起來。
總結:Hadoop的應用場景并不會跟某些行業或某些業務掛鉤在一起,它只是一款海量數據分析處理的軟件平臺,提供HDFS、MapReduce、YARN這些模塊來對外提供幫助。
二、Hadoop2集群理論
搭建我使用的版本是:Hadoop2.6.4
Hadoop集群一般指的是HDFS集群和YARN集群,兩者在邏輯上分離,物理上在一起,如下圖:
前兩種主要用于調試,屬于單機部署,后面一種才是生產環境部署。
- Standalone mode(獨立模式):僅在一個機器運行一個java進程。
- Pseudo-Distributed(偽分布式模式):僅在一個機器上HDFS的NameNode和DataNode、YARN的ResourceManager和NodeManager,但分別啟動單獨的java進程。
- Cluster mode(群集模式):會使用N臺主機組成一個Hadoop集群,這種部署方式下,主節點和從節點會公開部署在不同的機器上。
三、實際操作搭建hadoop集群
- 1、在VMware14虛擬機中安裝centos7操作系統,并命名為master,我全程按這個教程裝的,很詳細。
附帶安裝教程:https://blog.csdn.net/babyxue/article/details/80970526。 - 2、安裝好虛擬機系統之后,通過xshell這個軟件來在windows系統上遠程連接到虛擬機的linux系統進行操作更加方便,并且通過xftp這個軟件來把jdk和hadoop上傳到linux系統中,很實用這2款軟件,服務器必備利器,學生可以通過郵箱注冊進行免費下載。怎么上傳jdk和hadoop到服務器上去我就不講述了,自行百度,上傳之后就是在服務器安裝jdk和hadoop,這個也自行百度,網上一大把。
- 3、
注意:以下操作都是基于root用戶來進行的,否則你可能會因為權限不夠而無法修改配置文件。
配置ip地址,敲命令vi /etc/sysconfig/network-scripts/ifcfg-ens33
修改指定文件配置,復制下面的內容進去替換掉原來的內容,#后面是注釋可以刪掉
TYPE="Ethernet" # 網絡類型為以太網
BOOTPROTO="static" # 手動分配ip
NAME="ens33" # 網卡設備名,設備名一定要跟文件名一致
DEVICE="ens33" # 網卡設備名,設備名一定要跟文件名一致
ONBOOT="yes" # 該網卡是否隨網絡服務啟動
IPADDR="10.14.28.100" # 該網卡ip地址就是你要配置的固定IP,如果你要用xshell等工具連接,220這個網段最好和你自己的電腦網段一致,否則有可能用xshell連接失敗
GATEWAY="10.14.28.2" # 網關
NETMASK="255.255.255.0" # 子網掩碼
DNS1="8.8.8.8" # DNS,8.8.8.8為Google提供的免費DNS服務器的IP地址
接著配置網絡工作,敲命令vi /etc/sysconfig/network
進行配置
NETWORKING=yes # 網絡是否工作,此處一定不能為no
配置公共DNS服務(可選),在/etc/resolv.conf
文件里增加如下配置
nameserver 8.8.8.8
最后關閉防火墻和重啟網絡服務
systemctl stop firewalld # 臨時關閉防火墻
systemctl disable firewalld # 禁止開機啟動
service network restart #重啟網絡服務
克隆步驟1新建的虛擬機master,以此克隆出3個新的虛擬機,并分別命名為slave1、slave2、slave3,克隆操作:在VMware中,把當前新建好的虛擬機關閉掉,因為在開啟狀態是不能克隆的,然后右鍵虛擬機-->選擇管理-->克隆-->完成克隆副本-->選擇保存的位置。
我們要完成的集群是這樣的架構。
和上面一樣的配置,只是修改了主機ip而已,不固定,在同一個網段就好(即網絡號相同),然后重啟網絡服務,命令和上面一樣就省略掉了。
然后,修改主機名,敲命令
hostnamectl set-hostname slave1(你要的主機名字)
,之后敲命令
vi /etc/hosts
修改hosts文件,將名字和IP建立聯系,然后重啟reboot命令。最后這是關鍵,4臺虛擬機都同樣的操作都修改好后,互相ping一下看看通不通,比如在windows使用cmd命令行ping4臺虛擬機試試,4臺虛擬機互相ping下或者ping下windows。最后4臺虛擬機就如下圖配置好了。
-
4、之后使用xshell這個軟件遠程連接4臺虛擬機,步驟如下:圖片.png圖片.png
- 5、上圖的master相當于namenode,存儲著文件名,記錄文件存放的位置,其他3臺slave相當于datanode,存儲著真實的數據。外部訪問都是通過namenode來間接訪問datanode,namenode相當于管理者,datanode相當于數據提供者。
- 6、cd進入到
/usr/local/hadoop/etc/hadoop
目錄下,顯示所有文件會看到有個core-site.xml
文件,這個文件是告訴master在哪里,slave被誰管理。修改此文件,在里面的configuration標簽里寫下述內容,4臺虛擬機都要寫:
<property>
<name>fs.defaultFS</name>
<value>hdfs://master:9000</value>
</property>
- 7、經過上面的文件配置,就可以啟動hadoop了,namenode與datanode默認是裝在一起的,所以得分開輸入命令分別啟動。
先格式化下namenode,敲命令hdfs namenode -format
,然后4臺虛擬機都配置下主機名與主機ip的關聯,敲命令vi /etc/hosts
編輯一個文件來配置主機。輸入以下內容
10.14.28.100 master
10.14.28.101 slave1
10.14.28.102 slave2
10.14.28.103 slave3
然后就可以敲命令hadoop-daemon.sh start namenode
單獨啟動namenode,再輸入jps
命令查看java進程,可看看namenode和datanode進程是否啟動。和敲命令hadoop-daemon.sh start datanode
單獨啟動datanode。如下圖:(PS:如果想要啟動所有節點的話,就可以cd /usr/local/hadoop/sbin
目錄下,使用start-all.sh
命令啟動全部,相反關閉全部的話就是stop-all.sh
命令。)
上圖解釋:hadoop在接受一個文件的時候,當文件超過128M的時候,會自動進行分塊,正如上面的b1、b2這種,然后還會對文件進行備份處理,默認分成3份,正如上面的slave1、slave2、slave3機器都存放在b1這樣的數據。上面的圖其實畫得不標準,應該是有master機器啟動這namenode進程,還有slave1、slave2、slave3三臺機器各啟動這datanode進程,master機器管理著3臺slave機器。體現出了hadoop是可以橫向水平擴展的(比如不斷得增加datanode存儲數據),還有安全穩定性,這依靠著冗余存儲,某臺機器宕機了不影響對外提供服務(比如slave1宕機了,數據在slave2照樣可以找到,另外namenode宕機了還有the second namenode這個節點來替代namenode)
四、在集群實現ssh免密登錄
背景:完成了上述的集群搭建,想要在master機器上想遠程登錄到slave1機器上,則輸入命令
ssh slave1
,之后就需要輸入密碼,如下圖。但這比較繁瑣,所以我們可以配置下完成集群機器間的免密登錄。關于免密登錄的原理:就是生成私鑰和公鑰,這2個是成對存在的,當我們把登錄的信息用私鑰加密,然后把公鑰傳遞給其他機器,這樣遠程登錄到其他機器時會對登錄信息用公鑰進行解密,只有對應的公鑰和私鑰才能完成加解密,所以這樣就不需要每次都密碼驗證了。圖片.png
步驟:輸入命令ls -la
可查看當前目錄下的所有文件和文件夾,包括隱藏文件夾,于是我發現我master機器上沒有.ssh文件夾,而slave1、slave2、slave3機器上都有.ssh文件夾,所以我懷疑我的master是沒有通過RSA加密算生成了密鑰,包括私鑰和公鑰。
輸入ssh-keygen -t rsa
這條命令后,連續按3次回車即可通過RSA加密算生成了密鑰,包括私鑰和公鑰。接著輸入ssh-copy-id slave1
命令然后根據提示輸入密碼后就把公鑰傳給了slave1機器。對應還有輸入ssh-copy-id slave2、ssh-copy-id slave3
命令。如下圖結果:
exit
。
背景:一個個地登錄比較麻煩,我們可不可以直接在master機器上對集群的所有datanode節點進行統一的啟動關閉管理?于是就有了下面的操作。配置統一集群節點管理
vi slave
命令修改文件,管理著多少臺slave機器就輸入多少臺
slave1
slave2
slave3
......
之后輸入start-dfs.sh
命令即可啟動namenode和datanode節點。如下操作:
五、期間排錯
- 1、輸入命令
hdfs dfsadmin -report | more
來報告下集群機器的情況,如果出現下圖錯誤1,則要檢查下fs.default.name是否配置了。具體操作是先cd /usr/local/hadoop/etc/hadoop
目錄下,再vi core-site.xml
修改配置,加上上面的第6點,之后:wq
保存退出即可。錯誤1 - 2、再次輸入命令
hdfs dfsadmin -report | more
報告下,出現下圖錯誤2,則要第一時間反應過來是不是服務器主機名沒有和ip地址映射上,于是輸入命令vi /etc/hosts
修改配置,加上上面的第7點,之后:wq
保存退出即可。錯誤2.png - 3、再次輸入命令
hdfs dfsadmin -report | more
報告下,出現下圖錯誤3,這個問題我找了好久,最后在一篇博客中發現有大神評論說是本地用戶administrator(本機windows用戶)沒有權限引起去遠程操作hadoop系統,所以得在hadoop的hdfs-site.xml
配置文件配置取消hadoop hdfs用戶權限檢查。先cd /usr/local/hadoop/etc/hadoop
目錄下,再vi hdfs-site.xml
修改配置文件,在<configuration>標簽組內加入下面代碼
<property>
<name>dfs.permissions</name>
<value>false</value>
</property>
- 4、再次輸入命令
hdfs dfsadmin -report | more
報告下,這次成功了,但是namenode沒有管理到datanode節點,如下圖:圖片.pngnetstat -ntlp
命令,查看hadoop集群對外提供的端口號。一般是50070,之后就可以在瀏覽器地址欄中輸入集群主機名+端口號進行訪問了。比如http://10.14.28.100:50070
,之后web界面是這樣的。圖片.pngcd /usr/local/hadoop/etc/hadoop
目錄下,再vi hdfs-site.xml
修改配置文件,在<configuration>標簽組內加入以下代碼即可。不過切記,修改完配置文件,要關閉namenode和datanode節點服務,再重新開啟才可以生效,我修改完沒重啟在這里栽了跟頭還好所耗時間不長就被我意識到了),感謝~
<property>
<name>dfs.namenode.datanode.registration.ip-hostname-check</name>
<value>false</value>
</property>
- 5、同一集群節點管理遇錯,拒絕連接,解決方案下面這篇文章可能有效。
https://www.imooc.com/article/12083 - 6、遇到下圖錯誤4,就首先考慮下Namenode和Datanode的clusterID相同,這個clusterID在hadoop啟動目錄下的
current
文件夾的VERSION文件中,查看下是否和datanode機器上匹配,因為格式化一次namenode的話這個clusterID可能會變化。
我的做法是:在namenode機器上進入到/var/hadoop/dfs/name/current/
查看VERSION文件的clusterID,然后把這個clusterID負責到所有datanode機器上的/var/hadoop/dfs/data/current
的VERSION文件中替換掉里面的clusterID,確保namenode機器和datanode機器的clusterID是一致的。
參考文章:http://www.lxweimin.com/p/079c341e424a?utm_campaign
https://blog.csdn.net/u013310025/article/details/52796233
錯誤4.png