完全分布式:
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查看时间