超詳細!CentOS 7 + Hadoop3.0.0 搭建偽分布式集群
超詳細!CentOS 7 + Hadoop3.0.0 搭建偽分布式集群
(施工中...)
準備linux主機環境
一、安裝虛擬機
下載地址:
VMware workstation 14 Pro (附:許可證秘鑰)
CentOS7
基本上就是下一步下一步這種簡單的默認安裝就好了。因為不需要圖形界面,所以只給個512M內存也沒問題。
裝好後,更改網絡適配器為VMnet8(NAT)。
附上NAT的工作原理
在我這臺機子上:
虛擬網關地址 192.168.216.1
VMnet8 IP地址 192.168.216.2
運行虛擬機,進行網絡配置:(我安裝的是黑不溜秋的無圖形界面系統)
1.輸入 ip addr
2.輸入
ls /etc/sysconfig/network-scripts/
看到網卡ip信息的配置文件名叫做ifcfg-ens333.輸入
cat /etc/sysconfig/network-scripts/ifcfg-ens33
雖然BOOTPROTO=dhcp,但是ONBOOT=no4.輸入
vi /etc/sysconfig/network-scripts/ifcfg-ens33
將ONBOOT=no修改為yes,在此之前要先進入root模式chmod 777 文件名
把文件改為可寫狀態5.輸入
shutdown -r now
重啟系統6.重啟完成後,
ip addr
看到分配到的地址是192.168.216.128,下面進行固定ip的設置vi /etc/sysconfig/network-scripts/ifcfg-ens33
,用#將BOOTPROTO=dhcp註釋,並輸入以下參數
IPADDR0=192.168.216.100
PREFIX0=24
GATEWAY0=192.168.216.1
DNS1=192.168.216.1
(後來看到有BOOTPROTO=dhcp這行不註釋而是改為BOOTPROTO=static,以及多配置一行NETMASK=255.255.255.0而沒有DNS=192.168.216.1的做法,似乎也行)
8.輸入 service network restart
重啟網絡服務
9.輸入 ip addr
確認配置成功
現在用windows主機ping一下剛配置好的虛擬機試試看能否ping通,行的話這步就已經完成了。
下載安裝終端軟件 Mobaxterm。點擊 sessions -> New sessions -> SSH,輸入虛擬機的IP地址和用戶名。現在就可以把剛建好的虛擬機假裝是遠程終端一樣的用了。
然後修改主機名方便集群間的訪問
sudo vi /etc/sysconfig/network
,假設我給它起名字叫node01,則輸入
NETWORKING=yes
HOSTNAME=node01
改好後需要重啟。若不想重啟可以輸入 sudo hostname node01
然後exit登出,重新登錄終端,就可以看到已經生效了。
修改域名解析映射文件使得後續可以直接通過主機名訪問,sudo vi /etc/hosts
,添加一行 IP地址 主機名
PING一波試試是否已生效
到此為止linux主機環境已完成。
安裝jdk
在主目錄~下新建一個文件夾來放之後要裝的所有文件比如叫做app mkdir app
從官網下載jdk包,我下載的是 jdk-8u161-linux-x64.tar.gz
打開 Mobaxterm。點擊 sessions -> New sessions -> SFTP,註意要使用root登錄。然後打開相應目錄直接把本地文件拖拽到那一大塊空白處即可。
把剛剛的壓縮包解壓到這個目錄下 tar -zxvf jdk-8u161-linux-x64.tar.gz -C ~/app/
(由於我拖拽的時候把原壓縮包放到/usr/java文件夾了所以用 -C 把它解壓到規定文件夾下,如果本來就傳到了app文件夾則不需要這個參數)
進入 app/jdk1.8.0_161/bin 目錄下,./java -version
看是否成功安裝
配置環境變量PATH
sudo vi /etc/profile
在最末尾處添加兩行
export JAVA_HOME=/home/thousfeet/app/jdk1.8.0_161
export PATH=$PATH:$JAVA_HOME/bin
(JAVA_HOME變量的值可能因人而異,查看方式是進入之前jdk文件夾下輸入pwd
)
進入~目錄輸入 java
發現提示“未找到命令”,我們想要使它立刻生效,則輸入 source /etc/profile
,然後再次輸入 java -version
,能夠使用。這樣就已經配置好了。
安裝Hadoop
下載 hadoop 3.0.0 壓縮包。
打開 Mobaxterm 剛剛那個 SFTP ,老樣子拖拽上傳解壓到/app。
然後進入解壓目錄 cd /app/hadoop-3.0.0/etc/hadoop
vi hadoop-env.sh
,修改 JAVA_HOME 為之前那個參數
vi core-site.xml
,在configuration中添加各配置項
1.配置默認采用的文件系統。
(由於存儲層和運算層松耦合,要為它們指定使用hadoop原生的分布式文件系統hdfs。value填入的是uri,參數是 分布式集群中主節點的地址 : 指定端口號
)
<property>
<name>fs.defaultFS</name>
<value>hdfs://node01:9000/</value>
</property>
2.配置hadoop的公共目錄
(指定hadoop進程運行中產生的數據存放的工作目錄,NameNode、DataNode等就在本地工作目錄下建子目錄存放數據。但事實上在生產系統裏,NameNode、DataNode等進程都應單獨配置目錄,而且配置的應該是磁盤掛載點,以方便掛載更多的磁盤擴展容量)
<property>
<name>hadoop.tmp.dir</name>
<value>/home/thousfeet/app/hadoop-3.0.0/data/</value>
</property>
(value的參數仍與之前一樣可以進入安裝目錄輸入pwd
查看)
vi hdfs-site.xml
,配置hdfs的副本數
(客戶端將文件存到hdfs的時候,會存放在多個副本。value一般指定3,但因為搭建的是偽分布式就只有一臺機器,所以只能寫1。)
<property>
<name>dfs.replication</name>
<value>1</value>
</property>
vi mapred-site.xml
,指定MapReduce程序應該放在哪個資源調度集群上運行。若不指定為yarn,那麽MapReduce程序就只會在本地運行而非在整個集群中運行。
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
vi yarn-site.xml
,配置2處
1.指定yarn集群中的老大(就是本機)
<property>
<name>yarn.resourcemanager.hostname</name>
<value>node01</value>
</property>
2.配置yarn集群中的重節點,指定map產生的中間結果傳遞給reduce采用的機制是shuffle
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
關掉防火墻
由於hadoop中的程序都是網絡服務,需要監聽端口,這些端口默認會被linux防火墻擋住。因此要把hadoop中的端口一個個打開,或者把防火墻關掉。由於都是內網,所以關掉就好了。
sudo firewall-cmd --state
查看防火墻狀態
sudo systemctl stop firewalld.service
關閉防火墻
再次查看狀態,看到已經關閉了。但在下一次開機時還會自啟動,因此 sudo systemctl disable firewalld.service
禁止開機時防火墻自啟。
啟動Hadoop
配置環境變量PATH
sudo vi /etc/profile
加入一行 export HADOOP_HOME=/home/thousfeet/app/hadoop-3.0.0
以及修改PATH,追加參數 export PATH=$PATH:$JAVA_HOME/bin:$HADOOP_HOME/bin:$HADOOP_HOME/sbin
然後記得 source /etc/profile
現在就可以在任意地方使用hadoop指令了。
初始化(格式化)hadoop namenode -format
實現SSH免密碼遠程登錄
ssh-keygen -t rsa
,然後yes加一路回車
創建authorized_keys文件並修改權限為600
cd .ssh
touch authorized_keys
chmod 600 authorized_keys
將公鑰追加到authorized_keys文件中去
cat id_rsa.pub >> authorized_keys
ssh node01
試試看能否成功免密登錄
啟動hadoop
啟動:
start-dfs.sh
start-yarn.sh
驗證是否成功:
jps
附:vi命令的使用
首先使用命令
vi filename
打開一個文件,這個時候進入到的是命令模式
接下來按i
進入insert模式,然後鍵盤隨便輸入寫內容。
然後按ESC重新進入到命令模式。
在命令模式的情況下,按:
,進入到了末行模式。
輸入wq!
,然後回車,強行保存退出。
下次再打開對應文件(可用less filename命令打開),即可看到內容已經更改。補充:
(1)末行模式下:q! 【強制退出不保存】 q【退出不保存】 wq【退出並保存後面也可以加個!】
(2)如果你不想保存直接退出有可以在命令模式下使用“ctrl+z”快捷鍵或者按住“shift”鍵,輸入兩個z即可退出。
幾個坑點
出事點1:在網絡配置第4步的時候,遇到了can‘t open file for writing
,然而試圖chmod也並沒有成功,查了半天得知可能需要刪除在/var/tmp路徑下的.swp隱藏文件(來自http://blog.csdn.net/luoluoguo/article/details/11557291)。然後chmod,發現root狀態下vi這個文件看到裏面內容是空的(?)於是切換回普通用戶vi修改保存後退出就成功了。
出事點2:第一次使用sudo命令的時候失敗提示“不在sudoers文件中”,因此要切換到root修改一下sudoers文件:vi /etc/sudoers
,在如下圖的位置加上一行自己的用戶名
出事點3:安裝jdk的時候試圖用wget直接從官網下載,高高興興的一波操作
sudo wget http://download.Oracle.com/otn-pub/java/jdk/8u121-b13/e9e7ea248e2c4826b92b3f075a80e441/jdk-8u121-linux-x64.tar.gz
tar -xf jdk-8u121-linux-x64.tar.gz
發現GG了,怎麽都解壓不了,查了下發現非要手動下載再傳,迷得不行orz(來自http://blog.csdn.net/jdjdndhj/article/details/73649419#/)
出事點4:環境變量配置到一半的時候電腦突然死機了(T T 渣機是真的難受),重啟後再次進入編譯/etc/profile的時候出現如下錯誤提示
E325: ATTENTION
Found a swap file by the name "/etc/.profile.swp"
owned by: root dated: Wed Jul 14 10:01:10 2010
file name: /etc/profile
modified: YES
user name: root host name: zhaoyang-laptop
process ID: 1934
While opening file "/etc/profile"
dated: Thu Apr 29 20:18:30 2010
解決方法是:q!
退出vi編輯器,在終端輸入sudo rm -f /etc/.profile.swp
出事點5:在配置完成後我直接啟動了hadoop並jps查看,發現只有JPS一個進程,開始沒註意啟動過程提示一直在檢查配置錯誤,除去上文的配置又補做了如下操作:(事實上下面的做不做都並不需要,但為了避免最終操作和文中不符所以還是列出來)
修改了hadoop-env.sh配置了hadoop_home變量
把core-site.xml的9000後多余的/去掉
mapred-site.xml加上了<property> <name>mapreduce.admin.user.env</name> <value>HADOOP_MAPRED_HOME=$HADOOP_COMMON_HOME</value> </property> <property> <name>yarn.app.mapreduce.am.env</name> <value>HADOOP_MAPRED_HOME=$HADOOP_COMMON_HOME</value> </property>
後來恍然意識到是沒有輸入密碼,啟動過程中也不會給輸入密碼的提示步驟,所以一定要先配置SSH免密登錄。
參考資料:
VMware安裝Centos7超詳細過程(圖文)
CentOS 7 網絡配置詳解
CentOS中防火墻相關的命令(CentOS7中演示)
超詳細!CentOS 7 + Hadoop3.0.0 搭建偽分布式集群