三、生产集群搭建
3.1 拷贝文件
在/opt目录下建立software和module文件夹并修改所有权:
sudo mkdir /opt/software /opt/module
sudo chown centos7:centos7 /opt/software /opt/module
上传“hadoop-3.3.1.tar.gz”和“jdk-8u301-linux-x64.tar.gz”到software并解压到module
tar -zxvf /opt/software/jdk-8u301-linux-x64.tar.gz -C /opt/module
tar -zxvf /opt/software/hadoop-3.3.1.tar.gz -C /opt/module
3.2 声明环境变量
CentOS中的环境变量一般在“/etc/profile”中定义
由于该文件中的代码规定会遍历“/etc/profile.d/*.sh”
因此可以直接新建sh文件声明变量
sudo vi /etc/profile.d/my_env.sh
文件内容如下
#JAVA_HOME
export JAVA_HOME=/opt/module/jdk1.8.0_301
export PATH=$PATH:$JAVA_HOME/bin
#export声明全局变量,冒号拼接新变量
#HADOOP_HOME
export HADOOP_HOME=/opt/module/hadoop-3.3.1
export PATH=$PATH:$HADOOP_HOME/bin
export PATH=$PATH:$HADOOP_HOME/sbin
#期间可以通过双击Xshell的选项卡新开一个终端查找路径
重新加载环境变量文件
source /etc/profile
检验安装情况
java -version
hadoop version
3.3 hadoop文件目录
bin 可执行命令文件
etc 配置文件
sbin启动服务的命令
share/doc 说明文档
share/hadoop/mapreduce 案例
3.4 hadoop三种运行模式
- 本地模式
数据存储在本地(测试偶尔用) - 伪分布式
数据存储在HDFS(公司没钱) - 完全分布式
数据存储在HDFS/多台服务器
3.5 ssh免密
A生成密钥对,保留私钥,分发公钥给B。SSH访问时,A使用私钥加密数据,传输给B,B使用公钥解密,再使用公钥加密新的数据传回A,A用私钥解密。
ssh相关的文件一般在~/.ssh文件夹中
在所有节点执行以下操作
ssh-keygen -t rsa
#生成一个私钥id_rsa和一个公钥id_rsa.pub
ssh-copy-id hadoop101
ssh-copy-id hadoop102
ssh-copy-id hadoop103
ssh-copy-id hadoop104
#分发公钥
#授权的用户会生成authorized_keys文件
#进行ssh访问后会生成known_hosts文件
3.6 集群同步分发synchronize
- scp(secure copy)安全拷贝
scp -r $user@$host:$pdir/$fname $user@$host:$pdir/$fname
#将第一个地址的文件复制到第二个地址
#-r递归文件夹
#本地省略用户名和主机名
#其它主机用户名相同可省略用户名只用主机名
#主机名需配hosts,也可直接使用IP
- rsync远程同步
rsync -av $user@$host:$pdir/$fname $user@$host:$pdir
#将第一个地址同步到第二个地址
#-a递归文件夹-v显示过程
#本地省略用户名和主机名
#其它主机用户名相同可省略用户名只用主机名
#主机名需配hosts,也可直接使用IP
- synchronize集群同步分发脚本
查看当前环境变量
echo $PATH
在存在的路径下创建脚本
mkdir ~/bin
vi ~/bin/synchronize
脚本内容如下:
#!/bin/bash
#1. 判断参数个数
if [ $# -lt 1 ]
then
echo Not Enough Arguement!
exit;
fi
#2. 遍历集群所有机器
for host in hadoop101 hadoop102 hadoop103 hadoop104
do
echo ==================== $host ====================
#3. 遍历所有目录,挨个发送
for file in $@
do
#4. 判断文件是否存在
if [ -e $file ]
then
#5. 获取父目录
pdir=$(cd -P $(dirname $file); pwd)
#6. 获取当前文件的名称
fname=$(basename $file)
ssh $host "mkdir -p $pdir"
rsync -av $pdir/$fname $host:$pdir
else
echo $file does not exists!
fi
done
done
- 赋予执行权限
chmod 751 ~/bin/synchronize
3.7 同步文件
synchronize ~/bin
sudo ~/bin/synchronize /opt
sudo ~/bin/synchronize /etc/profile.d/my_env.sh
#需要注意的是当同步需要root权限时,ssh免密只限配置了的用户,因此还需要输入root用户密码。另外当本地使用sudo时,或要输完整路径。
然后在每个节点source或重启