目录

1.1 注意事项

1.1.1 windows系统确认所有的关于VmWare的服务都已经启动

1.1.2 确认好VmWare生成的网关地址

1.1.3 确认VmNet8网卡已经配置好了IP地址和DNS

1.2 复制虚拟机

1.2.1 将虚拟机文件夹复制三份,并分别重命名, 并使用VM打开重命名

2.2.2 分别设置三台虚拟机的内存

1.3 虚拟机修改Mac和IP 

1.3.1 每台虚拟机更改mac地址

1.3.2 每台虚拟机更改IP地址

1.3.3 每台虚拟机修改对应主机名

1.3.4 每台虚拟机设置ip和域名映射

1.3.5 重启虚拟机 reboot

4 虚拟机关闭防火墙和SELinux

1.4.1 关闭防火墙

1.4.2 三台机器关闭selinux

1.5 虚拟机免密码登录

1.6 三台机器时钟同步

1.7 三台机器安装jdk

1.7.1 查看自带的openjdk并卸载

1.7.2 创建安装目录

1.7.3 上传并解压

1.7.4 配置环境变量

1.8 mysql的安装

1.9 Shell编程增强

1.9.1 基本语法

1.9.2 变量

1.9.3 特殊字符

1.9.4 运算符

1.9.5 if语句

1.9.6 for语句

1.9.7 函数


1.1 注意事项

1.1.1 windows系统确认所有的关于VmWare的服务都已经启动

右键点击任务栏-任务管理器-服务-确保vm服务都处于运行状态

71a02fccdb43ca3382c289f30d6fa2c0.png

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,为谷歌的

 55350266344184866d93596cc469611f.png

1.2 复制虚拟机

1.2.1 将虚拟机文件夹复制三份,并分别重命名, 并使用VM打开重命名

找到虚拟机安装目录-复制virtual machines文件夹-在E盘重新创建一个空文件夹(hadoop_linux)并将virtual machines粘贴到里面,复制三份出来-重命名为node01、02、03

4f697dde1f42f4beeeb33bee4f278008.png

92c53da78fcbd816833825a7562129d9.png分别打开所复制出来的node01、02、03的文件夹,找到.vmx后缀的配置文件,通过VMware workstation打开-右击我的计算机创建文件夹(hadoop_linux)-将复制出来的三台虚拟机拖到新创建的文件夹中,并根据目录命名为node01、node02、node03 

0e6cf30a0df524d2925a8b6a522ece13.png

2.2.2 分别设置三台虚拟机的内存

· 需要三台虚拟机, 并且需要同时运行, 所以总体上的占用为: 每台虚拟机的内存×3

· 在分配的时候, 需要在总内存大小的基础上, 减去2G-4G作为系统内存, 剩余的除以3, 作为每台虚拟机的内存

每台机器的内存=(总内存-4)÷ 3

点击node01虚拟机-编辑虚拟机设置-将虚拟机设置为4GB。node02、node03同样重复上述步骤配置内存

 bd978dfe0d64b495d1e1763e5d8baca9.png

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

630c7b6084e14f9f939a9ee979f0d567.png

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 的值

  1. ATTR{address}=="00:0C:29:2A:31:F9"

从菜单栏找到虚拟机-设置-网络适配器-高级-查找mac地址

 2bcc62a5277f5a6b0ec25f601300cf1d.png

  1. 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命令的解决办法?

  1. ifconfig命令是设置或显示网络接口的程序,可以显示出我们机器的网卡信息,可是有些时候最小化安装CentOS等Linux发行版的时候会默认不安装ifconfig等命令,这时候你进入终端,运行ifconfig命令就会出错
  2. 首先想到是不是环境变量里没有ifconfig命令的路径,因为ifconfig是在/sbin路径下的,以root用户登录才可以运行,看看root用户的环境变量
  3. 结果表明/sbin目录下并没有ifconfig命令,所以:CentOS里边是没有安装ifconfig

  1. 解决办法:使用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主机接收到数据之后解密数据,那么这就是用到了公钥和私钥。

  1. 当A主机想向B主机发送一个“Hello"并且加密,这时B主机首先产生一个密钥对。密钥对分为公钥和私钥,这是一对。
  2. B主机需要将密钥对中的公钥提前发送给A主机,这时A主机里已经存了B主机的公钥,当A主机拿到公钥之后,需要将要发送的数据“Hello”用公钥进行加密,加密之后可能会变成一种看不懂的文字,比如图中的"u9e30d",这称之为密文。
  1. 将密文发送给B主机后,B主机需要拿私钥进行解密,解密完之后,B主机就能看到A主机想要发送的原始数据“Hello”。

为什么要免密登录?

Hadoop 节点众多, 所以一般在主节点启动从节点, 这个时候就需要程序自动在主节点 登录到从节点中, 如果不能免密就每次都要输入密码, 非常麻烦。

免密 SSH 登录的原理

  1. 需要先在B节点配置A节点的公钥
  2. A节点请求B节点要求登录
  1. B节点使用A节点的公钥, 加密一段随机文本
  2. A节点使用私钥解密, 并发回给B节点
  1. 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 "输入的两个数字之和为 $? !"

Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐