1 集群Linux环境搭建
目录1.1 注意事项1.2 复制虚拟机1.3 虚拟机修改Mac和IP1.4 虚拟机关闭防火墙和SeLinux1.5 虚拟机免密码登录1.6 三台机器时钟同步1.7 三台机器安装jdk1.8 MySQL安装1.9 shell编程增强1.1 注意事项1.1.1 windows系统确认所有的关于VmWare的服务都已经启动右键点击任务栏-任务管理器-服务-确保vm服务都处于运行状态1.1.2 确认好Vm
目录
1.1.1 windows系统确认所有的关于VmWare的服务都已经启动
1.1.3 确认VmNet8网卡已经配置好了IP地址和DNS
1.2.1 将虚拟机文件夹复制三份,并分别重命名, 并使用VM打开重命名
1.1 注意事项
1.1.1 windows系统确认所有的关于VmWare的服务都已经启动
右键点击任务栏-任务管理器-服务-确保vm服务都处于运行状态
1.1.2 确认好VmWare生成的网关地址
打开VMware workstat-编辑-虚拟网络编辑器-选中VMnet8-点击NAT设置-查看网关IP(192.168.245.2)
1.1.3 确认VmNet8网卡已经配置好了IP地址和DNS
桌面右下角找到网络和Internet设置-更改适配器设置-找到设备名VMnet8并右击点击属性-点击IPv4属性-配置IP地址、子网掩码和默认网关,DNS服务器地址选为四个8,为谷歌的
1.2 复制虚拟机
1.2.1 将虚拟机文件夹复制三份,并分别重命名, 并使用VM打开重命名
找到虚拟机安装目录-复制virtual machines文件夹-在E盘重新创建一个空文件夹(hadoop_linux)并将virtual machines粘贴到里面,复制三份出来-重命名为node01、02、03
分别打开所复制出来的node01、02、03的文件夹,找到.vmx后缀的配置文件,通过VMware workstation打开-右击我的计算机创建文件夹(hadoop_linux)-将复制出来的三台虚拟机拖到新创建的文件夹中,并根据目录命名为node01、node02、node03
2.2.2 分别设置三台虚拟机的内存
· 需要三台虚拟机, 并且需要同时运行, 所以总体上的占用为: 每台虚拟机的内存×3
· 在分配的时候, 需要在总内存大小的基础上, 减去2G-4G作为系统内存, 剩余的除以3, 作为每台虚拟机的内存
每台机器的内存=(总内存-4)÷ 3
点击node01虚拟机-编辑虚拟机设置-将虚拟机设置为4GB。node02、node03同样重复上述步骤配置内存
1.3 虚拟机修改Mac和IP
集群规划
IP | 主机名 | 环境配置 | 安装 |
192.168.245.100 | node01 | 关防火墙和selinux, host 映射, 时钟同步 | JDK, NameNode, ResourceManager, Zookeeper |
192.168.245.110 | node02 | 关防火墙和selinux, host 映射, 时钟同步 | JDK, DataNode, NodeManager, Zeekeeper |
192.168.245.120 | node03 | 关防火墙和selinux, host 映射, 时钟同步 | JDK, DataNode, NodeManager, Zeekeeper |
分别打开虚拟机node01、node02、node03-输入用户名和密码进入
用户名:root 密码:Aa123456
1.3.1 每台虚拟机更改mac地址
输入命令 vim /etc/udev/rules.d/70-persistent-net.rules
报出 -bash : vim: command not found 的错误
----------------------------------------------------------------------------------
安装命令:
rpm -qa | grep vim // 查看vim命令在什么软件包
yum install -y vim* //安装vim相关的软件包
rpm -qa | grep vim
现在就可以愉快的使用vim了
---------------------------------------------------------------------------------
rpm -qa | grep vim
现在就可以愉快的使用vim了
---------------------------------------------------------------------------------
重新输入命令 vim /etc/udev/rules.d/70-persistent-net.rules
问题又来了,这是个空文件
解决方法如下:
在/etc/udev/rules.d/ 目录中创建一个网卡规则 70-persistent-net.rules
以node01虚拟机为例
输入如下:
SUBSYSTEM=="net",ACTION=="add",DRIVERS=="?*",ATTR{address}=="00:0C:29:2A:31:F9",ATTR{type}=="1",KERNEL=="eth*",NAME="eth0"
保存退出
注意:修改 ATTR{address} 和 NAME 的值
- ATTR{address}=="00:0C:29:2A:31:F9"
从菜单栏找到虚拟机-设置-网络适配器-高级-查找mac地址
- NAME=="eth0"
node02、node03虚拟机同样重复上述步骤配置mac地址
1.3.2 每台虚拟机更改IP地址
vim /etc/sysconfig/network-scripts/ifcfg-eth0
HWADDR是该台虚拟机的mac地址
查询UUID命令 cat /proc/sys/kernel/random/uuid
配置完IP地址输入reboot命令重启虚拟机
----------------------------------------------------------------------------------------------------------------------------------
找不到ifconfig命令的解决办法?
- ifconfig命令是设置或显示网络接口的程序,可以显示出我们机器的网卡信息,可是有些时候最小化安装CentOS等Linux发行版的时候会默认不安装ifconfig等命令,这时候你进入终端,运行ifconfig命令就会出错
- 首先想到是不是环境变量里没有ifconfig命令的路径,因为ifconfig是在/sbin路径下的,以root用户登录才可以运行,看看root用户的环境变量
- 结果表明/sbin目录下并没有ifconfig命令,所以:CentOS里边是没有安装ifconfig
- 解决办法:使用yum安装ifconfig
输入yum search ifconfig命令检查,通过yum search 这个命令我们发现ifconfig这个命令是在net-tools.x86_64这个包里,接下来只要安装这个包就行了
输入 yum install net-tools.x86_64 安装
安装成功!
---------------------------------------------------------------------------------------------------------------------------------
node01虚拟机
ifconfig查看配置信息 IP为192.168.245.100
ping www.baidu.com 说明该台虚拟机可以联网
node02虚拟机
ifconfig查看配置信息 IP为192.168.245.110
node03虚拟机
ifconfig查看配置信息 IP为192.168.245.120
1.3.3 每台虚拟机修改对应主机名
vim /etc/sysconfig/network
HOSTNAME=node01
HOSTNAME=node02
HOSTNAME=node03
1.3.4 每台虚拟机设置ip和域名映射
vim /etc/hosts
分别对三台虚拟机配置如下:
1.3.5 重启虚拟机 reboot
4 虚拟机关闭防火墙和SELinux
使用Xshell7远程登录工具来远程登录linux,这样做配置文件时操作起来更加方便。
以node01虚拟机为例
--------------------------------------------------------------------------------------------------------------------------------
使用xshell第一次连接时,出现:WARNING!The remote SSH server rejected X11 forwarding request.
输入vi /etc/ssh/sshd_config
在X11这行改为X11Forwarding yes,然后再将UseLogin参数为no,可能这一行最开始是被注释,去掉注释,保存之后重启sshd服务,重新连接即可
重启查看是否成功
如果还不行检查 xorg-x11-xauth 的rpm包是否安装,未安装则进行下面操作
输入yum install xorg-x11-xauth命令
重启
成功!!
--------------------------------------------------------------------------------------------------------------------------------
右击会话点击属性-终端-终端类型选择linux-编码UTF-8
node02、node03虚拟机同样重复上述步骤
1.4.1 关闭防火墙
三台机器执行以下命令(root用户来执行)
service iptables stop #关闭防火墙
chkconfig iptables off #禁止开机启动
在关闭防火墙到时候,出现:
解决方法:
yum install iptables-services
后来发现service iptables stop不管用
实际上,centos7后是使用的基于iptable的systemctl stop firewalld,输入systemctl stop firewalld关闭防火墙,
systemctl disable firewalld禁止开机自启动
查看防火墙是否关闭:
查看服务是否开机启动:
1.4.2 三台机器关闭selinux
什么是SELinux?
SELinux是Linux的一种安全子系统,Linux中的权限管理是针对于文件的, 而不是针对进程的, 也就是说, 如果root启动了某个进程, 则这个进程可以操作任何一个文件。SELinux在Linux的文件权限之外, 增加了对进程的限制, 进程只能在进程允许的范围内 操作资源。
为什么要关闭SELinux?
如果开启了SELinux, 需要做非常复杂的配置, 才能正常使用系统, 在学习阶段, 在非生产环境, 一般不使用SELinux。
SELinux的工作模式
- enforcing 强制模式
如果操作违法了selinux规则,会直接制止,而且还会把行为记录到行为文件中去。
- permissive 宽容模式
如果操作违法了selinux规则,不会制止,但是会把行为记录到行为文件中去。
- disable 关闭
修改selinux的配置文件 vim /etc/selinux/config
1.5 虚拟机免密码登录
数据传输公钥和私钥分别起什么作用?
如果A主机想给B主机发送一个数据“Hello”,那么A主机把数据加密,B主机接收到数据之后解密数据,那么这就是用到了公钥和私钥。
- 当A主机想向B主机发送一个“Hello"并且加密,这时B主机首先产生一个密钥对。密钥对分为公钥和私钥,这是一对。
- B主机需要将密钥对中的公钥提前发送给A主机,这时A主机里已经存了B主机的公钥,当A主机拿到公钥之后,需要将要发送的数据“Hello”用公钥进行加密,加密之后可能会变成一种看不懂的文字,比如图中的"u9e30d",这称之为密文。
- 将密文发送给B主机后,B主机需要拿私钥进行解密,解密完之后,B主机就能看到A主机想要发送的原始数据“Hello”。
为什么要免密登录?
Hadoop 节点众多, 所以一般在主节点启动从节点, 这个时候就需要程序自动在主节点 登录到从节点中, 如果不能免密就每次都要输入密码, 非常麻烦。
免密 SSH 登录的原理
- 需要先在B节点配置A节点的公钥
- A节点请求B节点要求登录
- B节点使用A节点的公钥, 加密一段随机文本
- A节点使用私钥解密, 并发回给B节点
- B节点验证文本是否正确
第一步:三台机器生成公钥与私钥
在三台机器执行以下命令,生成公钥与私钥
ssh-keygen -t rsa
执行该命令之后,按下三个回车即可
查看密钥对存储的目录,以node01为例
id_rsa 存储私钥
id_rsa.pub 存储公钥
第二步:拷贝公钥到同一台机器
三台机器将拷贝公钥到第一台机器
三台机器执行命令: ssh-copy-id node01
第三步:复制第一台机器的认证到其他机器
将第一台机器的公钥拷贝到其他机器上
在第一台机器上面执行以下命令
scp /root/.ssh/authorized_keys node02:/root/.ssh 将第一台机子的公钥远程拷贝到node02
scp /root/.ssh/authorized_keys node03:/root/.ssh 将第一台机子的公钥远程拷贝到node03
验证一下:
在node01上免密登录node02
1.6 三台机器时钟同步
为什么需要时间同步?
因为很多分布式系统是有状态的, 比如说存储一个数据, A节点记录的时间是 1, B节点记录的时间是 2, 就会出问题。
方式 1: 所有主机和同一台主机的时间保持同步
方式2: 通过网络,所有主机和时钟同步服务器保持同步
yum install -y ntp 安装
crontab -e 启动定时任务
*/1 * * * * /usr/sbin/ntpdate ntp4.aliyun.com; 每一分钟就会执行sbin下面的命令,这个命令和阿里云服务器保持一致
1.7 三台机器安装jdk
1.7.1 查看自带的openjdk并卸载
openjdk是jdk的一个精简版,功能没有jdk强大,所以要把openjdk卸载。
rpm -qa | grep java
rpm -e java-1.6.0-openjdk-1.6.0.41-1.13.13.1.el6_8.x86_64 tzdata-java2016j-1.el6.noarch java-1.7.0-openjdk-1.7.0.131-2.6.9.0.el6_8.x86_64 -- nodeps
1.7.2 创建安装目录
mkdir -p /export/softwares #软件包存放目录
mkdir -p /export/servers #安装目录
1.7.3 上传并解压
#上传jdk到/export/softwares路径下去,并解压在servers目录下
tar -zxvf jdk-8u141-linux-x64.tar.gz -C ../servers/
-------------------------------------------------------------------------------------------------------
输入 rz -E 上传
发现没有这命令,这时需要安装一个工具
yum -y install lrzsz
-------------------------------------------------------------------------------------------------------
安装之后,再次输入 rz -E
mv jdk-8u141-linux-x64.tar.gz /export/softwares/ 移动到softwares下
在softwares目录下输入 tar -zxvf jdk-8u141-linux-x64.tar.gz -C ../servers/ 解压
1.7.4 配置环境变量
vim /etc/profile
在文本最后,插入两行命令:
export JAVA_HOME=/export/servers/jdk1.8.0_141
export PATH=:$JAVA_HOME/bin:$PATH
修改完成之后记得 输入source /etc/profile生效
可输入java -version 验证是否为1.8版本
以上node01配置完成
在node01下的servers目录下,输入
scp -r jdk1.8.0_141/ node02:$PWD 其中$PWD相当于获取的当前东西,发送到node02
在node01下的servers目录下,输入
scp -r jdk1.8.0_141/ node03:$PWD 其中$PWD相当于获取的当前东西,发送到node03
之后再进行环境变量的配置以及生效命令
1.8 mysql的安装
node03
第一步:在线安装mysql相关的软件包
yum install mysql mysql-server mysql-devel
第二步:启动mysql的服务
/etc/init.d/mysqld start
查看mysql服务的状态
第三步:通过mysql安装自带脚本进行设置
/usr/bin/mysql_secure_installation
第四步:进入mysql的客户端然后进行授权
mysql -u root -p
grant all privileges on *.* to 'root'@'%' identified by 'Aa123456' with grant option;
任何一台机子都可以通过root登录到数据库中,无论任何一个数据库任何一张表
flush privileges; 刷新权限
1.9 Shell编程增强
Shell 编程一般指编写 shell 脚本
1.9.1 基本语法
使用 vi 编辑器新建一个文件 hello.sh
#!/bin/bash echo "Hello World !"
创建shells文件夹,用来写shell脚本
执行方式:
方式1: sh hello.sh
方式2 :
chmod +x ./hello.sh #使脚本具有执行权限
./hello.sh #执行脚本 (相对路径)
1.9.2 变量
局部变量
#!/bin/bash str="hello" echo ${str}world
环境变量
echo $PATH
echo $HOME
env 查看所有的环境变量
1.9.3 特殊字符
$# 传递到脚本的参数个数
$* 以一个单字符串显示所有向脚本传递的参数。
$$ 脚本运行的当前进程 ID 号
$! 后台运行的最后一个进程的 ID 号 $@ 与$*相同,但是使用时加引号,并在引号中返回每个参数。
$? 显示最后命令的退出状态。 0 表示没有错误,其他任何值表明有错误。
#!/bin/bash echo "第一个参数为: $1"; echo "参数个数为: $#"; echo "传递的参数作为一个字符串显示: $*";
1.9.4 运算符
#!/bin/bash a=1; b=2; echo `expr $a + $b`; //加号两边留空格 echo $((a+b)); echo $[a+b];
1.9.5 if语句
#!/bin/bash read -p "please input your name:" NAME ## read命令用于从控制台读取输入数据 ## printf '%s\n' $NAME if [ $NAME = root ] then echo "hello ${NAME}, welcome !" elif [ $NAME = itcast ] then echo "hello ${NAME}, welcome !" else echo "Get out Please!" fi
1.9.6 for语句
方式1
#!/bin/bash for N in 1 2 3 do echo $N done
方式2
#!/bin/bash for ((i = 0; i <= 5; i++)) do echo "welcome $i times" done
1.9.7 函数
#!/bin/bash funWithReturn(){ echo "这个函数会对输入的两个数字进行相加运算..." echo "输入第一个数字: " read aNum echo "输入第二个数字: " read anotherNum echo "两个数字分别为 $aNum 和 $anotherNum !" return $(($aNum+$anotherNum)) } funWithReturn echo "输入的两个数字之和为 $? !"
更多推荐
所有评论(0)