02-Hadoop完全分布式
一、完全分布式集群搭建
1、规划
HDFS: 1个NN+N个DN
YARN: 1个RM+N个NM
避免单点故障,NN和RM建议分散到多台机器。注意负载均衡。
hadoop101 | hadoop102 | hadoop103 |
DN | DN | DN |
NM | NM | NM |
NN | RM | 2NN |
2、准备集群,安装软件
(1)克隆三台虚拟机
- 在每台机器的/etc/hosts中配置集群所有机器的ip和主机名的映射
- 提供安装用户,配置安装用户具有root权限
- 保证三台机器可以互相联通
(2)安装软件,在一台机器安装,再将这台机器的软件复制到其他机器
二、常用命令
1、scp(安全拷贝)
全量复制
命令: scp -r 源文件用户名A@主机名1:path1 目标文件用户名B@主机名2:path2
-r:递归,复制目录
如果从本机执行读取或写入,用户名B@主机名2:可以省略!
解释:在主机1上,使用A用户读取path1的文件,再使用用户B登录到主机2,在主机2的path2路径执行写入。
要求: 用户名A@主机名1 对path1有读权限
用户名B@主机名2 对path2有写权限
2、rsync (远程同步)
可以只同步变化的文件(对比文件的修改时间)!增量同步
命令: rsync -rvlt path1 目标文件用户名B@主机名2:path2
-r:递归,复制目录
-v:显示复制的过程
-l: 同步软连接
-t:基于文件的修改时间进行对比,只同步修改时间不同的文件
只能将本机的文件同步到其他机器。
注意:
path1是个目录,目录以/结尾,只会同步目录中的内容,不会同步目录本身!
path1是个目录,目录不以/结尾,同步目录中的内容,也会同步目录本身!
3. 免输入密码登录,借助SSH实现
举例: A机器的a用户,希望在A机器上,使用b用户的身份登录到B机器!
实现步骤:
① A机器的a用户,在A机器上生成一对密钥
ssh-keygen -t rsa
② 密钥分为公钥和私钥,a用户需要将公钥拷贝到B机器上b用户的家目录下的
authorithxxxx_keys
a)使用b用户登录到B机器
b)编辑authorithxxxx_keys,将公钥的内容进行添加
在A机器,使用a用户执行以下命令: ssh-copy-id b@B
③ A机器的a用户,可以使用 ssh b@B进行登录!
3. 免输入密码登录,借助SSH实现
举例: A机器的a用户,希望在A机器上,使用b用户的身份登录到B机器!
实现步骤: ①A机器的a用户,在A机器上生成一对密钥
ssh-keygen -t rsa
②密钥分为公钥和私钥,a用户需要将公钥拷贝到B机器上b用户的家目录下的
authorithxxxx_keys
a)使用b用户登录到B机器
b)编辑authorithxxxx_keys,将公钥的内容进行添加
在A机器,使用a用户执行以下命令: ssh-copy-id b@B
③A机器的a用户,可以使用 ssh b@B进行登录!
注意:如果使用ssh 直接登录 主机名
默认使用当前用户对目标主机进行登录!
4. 编写同步脚本
#!/bin/bash #校验参数是否合法 #脚本名称:xsync if(($#==0)) then echo 请输入要分发的文件! exit; fi #获取分发文件的绝对路径 dirpath=$(cd `dirname $1`; pwd -P) filename=`basename $1` echo 要分发的文件的路径是:$dirpath/$filename #循环执行rsync分发文件到集群的每条机器 for((i=101;i<=103;i++)) do echo ---------------------hadoop$i--------------------- rsync -rvlt $dirpath/$filename atguigu@hadoop$i:$dirpath done
5. 编写多机器执行命令脚本
#!/bin/bash #在集群的所有机器上批量执行同一条命令 #脚本名称:xcall if(($#==0)) then echo 请输入您要操作的命令! exit fi echo 要执行的命令是$* #循环执行此命令 for((i=101;i<=103;i++)) do echo ---------------------hadoop$i----------------- ssh hadoop$i $* done
三、使用ssh执行命令注意
① ssh 目标机器
登录之后,执行某个命令!
属于Login-shell,会自动读取 /etc/profile文件中定义的所有的变量!
② ssh 目标机器 命令
属于non-login-shell
不会读取/etc/profile
如果在使用命令时,我们需要使用/etc/profile定义的一些变量,需要在
目标机器的对应的用户的家目录(~/.bashrc)/.bashrc中添加以下代码:
source /etc/profile
如果不添加以上代码,在执行start-all.sh | stop-all.sh一定会报错!
注意:当前主机也要配置自己到自己的SSH免密登录!
配置SSH的作用 :
①执行scp,rsync命令时,不需要输入密码,方便
②在执行start-all.sh群起脚本时,需要输入密码
四、运行群起脚本
① 群起脚本的原理是获取集群中所有的节点的主机名
默认读取当前机器 HADOOP_HOME/etc/hadoop/slaves,获取集群中所有的节点的主机名
② 循环执行 ssh 主机名 hadoop-daemon.sh start xxx
保证当前机器到其他节点,已经配置了ssh免密登录
保证集群中所有当前用户的家目录/.bashrc中,已经配置source /etc/profile
注意: start-all.sh时,其实分别调用了start-dfs.sh和start-yarn.sh
start-dfs.sh可以在集群的任意一台机器使用!可以启动HDFS中的所有进程!
start-yarn.sh在集群的非RM所在的机器使用,不会启动ResourceManager,只能再RM所在机器
建议: 只需要配置RM所在机器到其他机器的SSH免密登录!
都在RM所在的机器执行群起和群停脚本!
xsync和xcall只放在RM所在的机器即可!
五、集群的时间同步
一个集群中,每台机器的时间必须保证是同步的!
主要借助linux的ntp服务执行和远程时间服务器的时间同步!
保证当前机器的ntp服务是开机自启动!
chkconfig --list ntpd
使用 ntpdate -u 时间服务器的地址