完全分佈式:
1.準備三臺客戶機
通過克隆複製三臺虛擬機hadoop102、hadoop103、hadoop104(從基本的虛擬機(未安裝或者安裝了jdk、hadoop都行)複製即可)
1)準備3臺客戶機(關閉防火牆、靜態ip、主機名稱)
2)安裝jdk
3)配置環境變量
4)安裝hadoop
5)配置環境變量
6)安裝ssh
7)配置集羣
8)啓動測試集羣
配置上述一些環境可參考下面的博客:
https://blog.csdn.net/qq_41544550/article/details/102749750
https://blog.csdn.net/qq_41544550/article/details/102788370
2.安裝jdk,安裝hadoop
安裝包可以從其它虛擬機複製,也可以通過SecureFX複製
scp -r hadoop-2.7.2.tar.gz atguigu@hadoop103:/opt/software/
scp -r jdk-8u144-linux-x64.tar.gz atguigu@hadoop103:/opt/software/
scp -r hadoop-2.7.2.tar.gz atguigu@hadoop104:/opt/software/
scp -r jdk-8u144-linux-x64.tar.gz atguigu@hadoop104:/opt/software/
解壓安裝包
tar -zxvf hadoop-2.7.2.tar.gz -C /opt/module/
tar -zxvf jdk-8u144-linux-x64.tar.gz -C /opt/module/
3.配置JAVA_HOME和HADOOP_HOME(三臺機器都要root權限下執行:vim /etc/profile)
#JAVA_HOME
export JAVA_HOME=/opt/module/jdk1.8.0_144
export PATH=$PATH:$JAVA_HOME/bin
#HADOOP_HOME
export HADOOP_HOME=/opt/module/hadoop-2.7.2
export PATH=$PATH:$HADOOP_HOME/bin
export PATH=$PATH:$HADOOP_HOME/sbin
4.使每個節點上的環境變量生效(三臺機器都要:source /etc/profile)
source /etc/profile
配置SSH無密登錄(hadoop102和hadoop103都要生成)
[atguigu@hadoop102 hadoop-2.7.2]$ ssh hadoop103
atguigu@hadoop103's password:
Last login: Fri Aug 16 14:34:13 2019 from hadoop102
[atguigu@hadoop103 ~]$ hostname
hadoop103
無密鑰配置
hadoop102配置:
(1)進入到我的home目錄cd ~/.ssh
(2)生成公鑰和私鑰:
[atguigu@hadoop102 .ssh]$ ssh-keygen -t rsa
然後敲(三個回車),就會生成兩個文件id_rsa(私鑰)、id_rsa.pub(公鑰)
[atguigu@hadoop102 .ssh]$ ll
總用量 12
-rw-------. 1 atguigu atguigu 1675 8月 16 15:30 id_rsa
-rw-r--r--. 1 atguigu atguigu 399 8月 16 15:30 id_rsa.pub
-rw-r--r--. 1 atguigu atguigu 814 8月 16 14:06 known_hosts
(3)將公鑰拷貝到要免密登錄的目標機器上 ssh-copy-id hadoop103、ssh-copy-id hadoop104
[atguigu@hadoop102 .ssh]$ ssh-copy-id hadoop103 輸入密碼
[atguigu@hadoop102 .ssh]$ ssh-copy-id hadoop104 輸入密碼
[atguigu@hadoop102 .ssh]$ ssh-copy-id hadoop102 輸入密碼
(4)在hadoop102下
[atguigu@hadoop102 .ssh]$ ssh hadoop102
known_hosts
hadoop103配置:
因爲ResourceManager是配置在這臺機器的,如果是配置在hadoop102上則只需要在102生成
(1)進入到我的home目錄cd ~/.ssh
(2)生成公鑰和私鑰:
[atguigu@hadoop103 .ssh]$ ssh-keygen -t rsa
然後敲(三個回車),就會生成兩個文件id_rsa(私鑰)、id_rsa.pub(公鑰)
[atguigu@hadoop103 .ssh]$ ll
總用量 16
-rw-------. 1 atguigu atguigu 399 8月 16 15:31 authorized_keys
-rw-------. 1 atguigu atguigu 1675 8月 17 11:12 id_rsa
-rw-r--r--. 1 atguigu atguigu 399 8月 17 11:12 id_rsa.pub
-rw-r--r--. 1 atguigu atguigu 1221 8月 17 10:22 known_hosts
(3)將公鑰拷貝到要免密登錄的目標機器上 ssh-copy-id hadoop103、ssh-copy-id hadoop104
[atguigu@hadoop102 .ssh]$ ssh-copy-id hadoop103 輸入密碼
[atguigu@hadoop102 .ssh]$ ssh-copy-id hadoop104 輸入密碼
[atguigu@hadoop102 .ssh]$ ssh-copy-id hadoop102 輸入密碼
(4)在hadoop103下
[atguigu@hadoop103 .ssh]$ ssh hadoop102
.ssh文件夾下的文件功能解釋
(1)~/.ssh/known_hosts :記錄ssh訪問過計算機的公鑰(public key)
(2)id_rsa :生成的私鑰
(3)id_rsa.pub :生成的公鑰
(4)authorized_keys :存放授權過得無祕登錄服務器公鑰
5.準備分發腳本 xsync:循環複製文件到所有節點的相同目錄下
1)在/usr/local/bin目錄下創建xsync文件
#!/bin/bash
#1 獲取輸入參數個數,如果沒有參數,直接退出
pcount=$#
if((pcount==0)); then
echo no args;
exit;
fi
#2 獲取文件名稱
p1=$1
fname=`basename $p1`
echo fname=$fname
#3 獲取上級目錄到絕對路徑
pdir=`cd -P $(dirname $p1); pwd`
echo pdir=$pdir
#4 獲取當前用戶名稱
user=`whoami`
#5 循環
for((host=103; host<105; host++)); do
#echo $pdir/$fname $user@hadoop$host:$pdir
echo --------------- hadoop$host ----------------
rsync -rvl $pdir/$fname $user@hadoop$host:$pdir
done
2)修改腳本 xsync 具有執行權限
[root@hadoop102 bin]# chmod a+x xsync
3)測試
配置SSH之後
5.配置xcall:在所有主機上同時執行相同的命令
xcall+命令
在/usr/local/bin目錄下創建xcall文件
#!/bin/bash
pcount=$#
if((pcount==0));then
echo no args;
exit;
fi
echo -------------localhost----------
$@
for((host=101; host<=108; host++)); do
echo ----------hadoop$host---------
ssh hadoop$host $@
done
賦予權限
[root@hadoop102 bin]# chmod 777 xcall
執行
6.明確集羣的配置
7.修改配置文件
核心配置文件
1)core-site.xml
<!-- 指定HDFS中NameNode的地址 -->
<property>
<name>fs.defaultFS</name>
<value>hdfs://hadoop102:9000</value>
</property>
<!-- 指定hadoop運行時產生文件的存儲目錄 -->
<property>
<name>hadoop.tmp.dir</name>
<value>/opt/module/hadoop-2.7.2/data/tmp</value>
</property>
hdfs配置文件
2)hadoop-env.sh
25行 export JAVA_HOME=/opt/module/jdk1.8.0_144
3)hdfs-site.xml
<configuration>
<property>
<name>dfs.replication</name>
<value>3</value>
</property>
<property>
<name>dfs.namenode.secondary.http-address</name>
<value>hadoop104:50090</value>
</property>
</configuration>
yarn配置文件
4)yarn-env.sh
23行 export JAVA_HOME=/opt/module/jdk1.8.0_144
5)yarn-site.xml
<configuration>
<!-- reducer獲取數據的方式 -->
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
<!-- 指定YARN的ResourceManager的地址 -->
<property>
<name>yarn.resourcemanager.hostname</name>
<value>hadoop103</value>
</property>
</configuration>
MapReduce配置文件
6)mapred-env.sh
<configuration>
<!-- 指定mr運行在yarn上 -->
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
</configuration>
7)mapred-site.xml
<configuration>
<!-- 指定mr運行在yarn上 -->
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
</configuration>
8)slaves
hadoop102
hadoop103
hadoop104
8.分發配置文件
9.集羣啓動並測試
注意:先啓動HDFS,在啓動YARN;關閉時,先關閉YARN,再關閉HDFS
1)啓動集羣
① 如果集羣是第一次啓動,則直接進行格式化;如果不是,則需要刪除data和logs文件夾在格式化啓動
[atguigu@hadoop102 hadoop-2.7.2]$ bin/hdfs namenode -format
② 啓動HDFS
[atguigu@hadoop102 hadoop-2.7.2]$ sbin/start-dfs.sh
啓動NameNode、DataNode、SecondryNamenode
③ 啓動yarn
[atguigu@hadoop103 hadoop-2.7.2]$ sbin/start-yarn.sh
注意:Namenode和ResourceManger如果不是同一臺機器,不能在NameNode上啓動 yarn,應該在ResouceManager所在的機器上啓動yarn。
web端查看: http://hadoop102:50070/dfshealth.html#tab-datanode
2)測試集羣
① 在hadoop下創建wcinput/wc.input,在上傳到HDFS上
[atguigu@hadoop102 hadoop-2.7.2]$ hadoop fs -put wcinput/wc.input /user/atguigu/input
② 啓動測試用例
[atguigu@hadoop102 hadoop-2.7.2]$ hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-2.7.2.jar wordcount /user/atguigu/input /user/atguigu/output
小於128M的文件上傳之後只有一個block,大於128M的1.1倍的會有多個block
[atguigu@hadoop102 hadoop-2.7.2]$ hadoop fs -put /opt/software/hadoop-2.7.2.tar.gz /user/atguigu
3)HDFS上文件存放位置
/opt/module/hadoop-2.7.2/data/tmp/dfs/data/current/BP-1935757359-192.168.137.102-1566011904417/current/finalized/subdir0/subdir0
根據Block ID來識別block
3)對HDFS上不同block數據進行拼接
下面兩個block是hadoop的安裝包,對兩個block進行合併
-rw-rw-r--. 1 atguigu atguigu 134217728 8月 17 14:33 blk_1073741857
-rw-rw-r--. 1 atguigu atguigu 1048583 8月 17 14:33 blk_1073741857_1033.meta
-rw-rw-r--. 1 atguigu atguigu 63439959 8月 17 14:33 blk_1073741858
-rw-rw-r--. 1 atguigu atguigu 495635 8月 17 14:33 blk_1073741858_1034.meta
[atguigu@hadoop102 subdir0]$ cat blk_1073741836>>tmp.file
[atguigu@hadoop102 subdir0]$ cat blk_1073741837>>tmp.file
[atguigu@hadoop102 subdir0]$ tar -zxvf tmp.file ==> 解壓
4)將HDFS上文件下載下來
[atguigu@hadoop102 hadoop-2.7.2]$ bin/hadoop fs -get /user/atguigu/input/hadoop-2.7.2.tar.gz ./
10.Hadoop啓動停止方式
1)各個服務組件逐一啓動
(1)分別啓動hdfs組件 hadoop-daemon.sh start|stop namenode|datanode|secondarynamenode
(2)啓動yarn yarn-daemon.sh start|stop resourcemanager|nodemanager
2)各個模塊分開啓動(配置ssh是前提)常用
(1)整體啓動/停止hdfs start-dfs.sh stop-dfs.sh
(2)整體啓動/停止yarn start-yarn.sh stop-yarn.sh
3)全部啓動(不建議使用)
start-all.sh
stop-all.sh
11.集羣時間同步(必須在root用戶下)
時間同步的方式:找一個機器,作爲時間服務器,所有的機器與這臺集羣時間進行定時的同步,比如,每隔十分鐘,同步一次時間。
[root@hadoop102 atguigu]# rpm -qa|grep ntp
[root@hadoop102 atguigu]# vim /etc/ntp.conf
[root@hadoop102 atguigu]# vim /etc/sysconfig/ntpd
重新啓動ntpd
[root@hadoop102 atguigu]# service ntpd status
ntpd 已停
[root@hadoop102 atguigu]# service ntpd start
正在啓動 ntpd: [確定]
[root@hadoop102 atguigu]# chkconfig ntpd on
其它機器配置(root用戶下)
[root@hadoop103 hadoop-2.7.2]# crontab -e
編寫腳本(每兩分鐘同步一次)
*/2 * * * * /usr/sbin/ntpdate hadoop102
[root@hadoop104 hadoop-2.7.2]# crontab -e
編寫腳本(每兩分鐘同步一次)
*/2 * * * * /usr/sbin/ntpdate hadoop102
修改任意機器時間
[root@hadoop103 hadoop]# date -s "2017-9-11 11:11:11"
兩分鐘之後使用date查看時間