完全分布式集群

一、准备工作

1.规划
Hadoop中的进程在多台机器运行!

HDFS:  1个nn+N个DN
		n个2nn
YARN:  1个RM+N个NM

避免单点故障,NN和RM建议分散到多台机器!
注意负载均衡

salve01 master slave02
DN DN DN
NM NM NM
NN RM 2NN

2.准备集群,安装软件
①克隆三台虚拟机
a)在每台机器的/etc/hosts中配置集群所有机器的ip和主机名的映射
b)提供zkpk用户,配置zkpk用户具有root权限
c)保证三台机器可以互相联通
②安装软件,在一台机器安装,再将这台机器的软件复制到其他机器

二、常用命令

  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有写权限
  1. rsync (远程同步)
    可以只同步变化的文件(对比文件的修改时间)!增量同步!
使用: rsync -rvlt   path1    目标文件用户名B@主机名2:path2
 		-r: 递归,复制目录
 		-v: 显示复制的过程
 		-l:  同步软连接
 		-t:  基于文件的修改时间进行对比,只同步修改时间不同的文件
 		
 只能将本机的文件同步到其他机器!
 
 **注意:**  rsync -rvlt   path1    目标文件用户名B@主机名2:path2
 
 	path1是个目录,目录以/结尾,只会同步目录中的内容,不会同步目录本身!
 	path1是个目录,目录不以/结尾,同步目录中的内容,也会同步目录本身!
  1. 免输入密码登录,借助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 直接登录 主机名
 					默认使用当前用户对目标主机进行登录!
  1. 编写同步脚本xsync
    作用: 将当前机器的文件,同步到集群所有机器的相同路径下!
    hadoop102:/A/a , 执行脚本后,将此文件同步到集群中所有机器的 /A/a
用户在使用xsync时,只需要传入要同步的文件即可
 		xysnc a 
 		不管a是一个相对路径还是绝对路径,都需要将a转换为绝对路径!
 		
 文件的绝对路径:  
 		父路径:  dirpath=$(cd `dirname /home/atguigu/hi`; pwd -P)
 		文件名:  filename=`basename hi`
 		
 			
 核心命令:  
 		for(())
 		do
 			rsync -rvlt   path1 
 		done

三、集群的启动

1.使用ssh执行命令
①ssh 目标机器
登录之后,执行某个命令!
属于Login-shell,会自动读取 /etc/profile文件中定义的所有的变量!

②ssh 目标机器 命令
属于non-login-shell
不会读取/etc/profile

如果在使用命令时,我们需要使用/etc/profile定义的一些变量,需要在
	目标机器的对应的用户的家目录/.bashrc中添加以下代码
	
	*source /etc/profile*
	
	如果不添加以上代码,在执行start-all.sh | stop-all.sh一定会报错!

2.启动Hadoop
HDFS
①需要在NN所配置的节点进行格式化
②在不同的节点启动不同的进程

3.运行群起脚本
①群起脚本的原理是获取集群中所有的节点的主机名
默认读取当前机器 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所在机器到其他机器的SSH免密登录!
			都在RM所在的机器执行群起和群停脚本!
			xsync和xcall只放在RM所在的机器即可!