准备工作
1. 虚拟机修改Mac和IP(CentOS7)
1.1 集群规划
IP | 主机名 | 环境配置 | 安装 |
---|---|---|---|
192.168.217.100 | node01 | 关防火墙和seLinux,host映射,时钟同步 | JDK,NameNode,ResourceManager,Zookeeper |
192.168.217.110 | node02 | 关防火墙和seLinux,host映射,时钟同步 | JDK,DataNode,NodeManager,Zookeeper |
192.168.217.120 | node03 | 关防火墙和seLinux,host映射,时钟同步 | JDK,DataNode,NodeManager,Zookeeper |
1.2 设置静态ip和Mac地址
[root@localhost ~]# vim /etc/sysconfig/network-scripts/ifcfg-ens33
参数设置如下
TYPE=Ethernet
PROXY_METHOD=none
BROWSER_ONLY=no
BOOTPROTO=static #静态IP
DEFROUTE=yes
IPV4_FAILURE_FATAL=no
IPV6INIT=yes
IPV6_AUTOCONF=yes
IPV6_DEFROUTE=yes
IPV6_FAILURE_FATAL=no
IPV6_ADDR_GEN_MODE=stable-privacy
NAME=ens33
UUID=efb90b5a-671d-4ee0-8ec3-bed9fb75cd4d
DEVICE=ens33
HWADDR=00:0C:29:BC:61:3F #Mac地址
ONBOOT=yes
IPADDR=192.168.217.100 #IP地址
PREFIX=24 #子网掩码
GATEWAY=192.168.217.2 #网关
DNS1=8.8.8.8 #DNS服务器
其中Mac地址在Vmvare设置->网络(NAT)->高级中点击生成,每个节点独一无二。
每个虚拟机修改主机名:
[root@localhost ~]# vim /etc/hostname
每个虚拟机设置IP和域名映射
[root@localhost ~]# vim /etc/hosts
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6192.168.217.100 node01 node01.hadoop.com
192.168.217.110 node02 node02.hadoop.com
192.168.217.120 node03 node03.hadoop.com
修改之后重启或systemctl restart network
2. 关闭防火墙和SeLinux
关闭防火墙
[root@localhost ~]# systemctl stop firewalld #关闭防火墙
[root@localhost ~]# systemctl disable firewalld #设置开机禁止启动
关闭SELinux(安全子模式,控制进程的行为)
[root@localhost ~]# vim /etc/selinux/config
改为disabled
SELINUX=disabled
- enforcing 强制模式(制止违反规则的行为并记录到日志)
- permissive 宽容模式(不制止,记录到日志)
- disable 关闭
3.虚拟机免密码登录
- 第一步,生成公钥和私钥
三台机器上执行
ssh-keygen -t rsa
三次回车生成公钥和私钥到/root/.ssh/目录
- 第二步,拷贝公钥到同一台机器上
三台机器上都执行
ssh-copy-id node01
可以在/root/.ssh/authorized_keys中看到拷贝的公钥
复制包含三台机器公钥的authorized_keys到另两台机器,在第一台机器上执行
scp /root/.ssh/authorized_keys node02:/root/.ssh/
scp /root/.ssh/authorized_keys node03:/root/.ssh/
4.三台机器时钟同步
为什么需要时钟同步
- 因为很多分布式系统是有状态的,比如存一个数据,A节点记录的时间和B节点应该一样
方式1
所有主机和同一台主机的时间保持同步
方式2
通过网络,所有主机和时钟同步服务器保持同步
采用第二种,安装ntp
[root@localhost ~]# yum install -y ntp
创建定时任务
[root@localhost ~]# crontab -e
输入
*/1 * * * * /usr/sbin/ntpdate ntp4.aliyun.com
即每隔1分钟执行后面的命令同步一次
5.安装JDK
卸载之前的java的rpm包
[root@localhost ~]# rpm -qa | grep java #查询
[root@localhost ~]# rpm -e 包名1 包名2 … --nodeps #删除
创建安装目录
[root@localhost ~]# mkdir -p /export/softwares #软件包存放目录
[root@localhost ~]# mkdir -p /export/servers #安装目录
上传(拖拽或者使用rz命令)并解压
[root@node01 ~]# cd /export/softwares/
[root@node01 softwares]# tar zvxf jdk-8u261-linux-x64.tar.gz -C …/servers/
修改配置文件,添加环境变量
[root@node01 servers]# vim /etc/profile
添加
export JAVA_HOME=/export/servers/jdk1.8.0_261
export PATH=$JAVA_HOME/bin:$PATH
使配置的环境变量生效
[root@node01 ~]# source /etc/profile
[root@node01 ~]# java -version
java version “1.8.0_261”
Java™ SE Runtime Environment (build 1.8.0_261-b12)
Java HotSpot™ 64-Bit Server VM (build 25.261-b12, mixed mode)
远程拷贝jdk到另两台主机
[root@node01 servers]# scp -r jdk1.8.0_261/ node03:/export/servers
同样的方式配置环境变量即可
关闭邮箱提醒(执行命令会提示You have new mail in /var/spool/mail/root),在/etc/profile中添加
unset MAILCHECK
6.安装MySQL
**第一步:**在线安装mysql相关软件包
[root@node03 ~]# yum install -y mysql mysql-server mysql-devel
**第二步:**启动mysql的服务
[root@node03 ~]# systemctl start mysqld
**第三步:**通过mysql自带脚本进行设置
[root@node03 ~]# /usr/bin/mysql_secure_installation
**第四步:**进入mysql的客户端进行授权
mysql> grant all privileges on . to ‘root’@’%’ identified by ‘123456’ with grant option;
Query OK, 0 rows affected (0.00 sec)mysql> flush privileges;
Query OK, 0 rows affected (0.00 sec)
No package mysql-server available解决办法
[root@node03 ~]# wget http://repo.mysql.com/mysql-community-release-el7-5.noarch.rpm
[root@node03 ~]# rpm -ivh mysql-community-release-el7-5.noarch.rpm
再进行安装即可
7.Shell编程增强
Shell编程一般指编写Shell脚本
-
基本语法
使用vi编辑器新建一个文件hello.sh
#!/bin/bash echo "Hello World!"
执行方式
方式1:
[root@node01 shells]# sh hello.sh
方式2:
[root@node01 shells]# chmod +x hello.sh [root@node01 shells]# ./hello.sh
-
变量
局部变量
#!/bin/bash str="hello" echo ${str}world
环境变量
echo $PATH
echo $HOME
在/etc/profile中添加export 变量名=变量值即可,多个值用":"分开。
-
特殊字符
$# 传递到脚本的参数个数 $* 以一个单字符串显示所有向脚本传递的参数 $$ 脚本运行的当前进程的ID号 $! 后台运行的最后一个进程的ID号 $@ 与$*相同,但是使用时加引号,并在引号中返回每个参数 $? 显示最后命令的退出状态,0表示没有错误,其他任何值表示有错误 #!/bin/bash echo "第一个参数为:$1" echo "参数个数为:$#" echo "传递的参数以一个字符串显示:$*"
[root@node01 shells]# sh demo.sh aaa bbb ccc 第一个参数为:aaa 参数个数为:3 传递的参数以一个字符串显示:aaa bbb ccc
-
运算符
#!/bin/bash a=1 b=2 echo `expr $a + $b` echo $((a+b)) echo $[a+b] echo `expr $a \* $b` #转义 echo $[a*b]
-
if语句
#!/bin/bash read -p "please input your name:" NAME #从控制台读入并存放到name中 if [ $NAME = root ] #注意中括号内的空格 then echo "hello ${NAME}, welcome!" elif [ $NAME = itcast ] then echo "hello ${NAME}, welcome!" else echo "Get out please!" fi
-
for语句
方式1:
#!/bin/bash for n in 1 2 3 do echo $n done
方式2:
for ((i=0;i<5;i++)) do echo "welcome $i" done
-
函数
#!/bin/bash sum(){ echo "please enter the first number:" read a echo "please enter the second number:" read b echo "The two numbers are $a and $b." return $(($a+$b)) } sum echo "The sum is $?."