使用VMWare进行集群系统与Hadoop集群的搭建

集群系统的搭建

一、注意事项

1、确定Windows系统中所有关于VMWare的服务都已启动

在这里插入图片描述
2、确认好VMWare生成的网关地址
查看步骤:
虚拟机中:编辑 --> 虚拟网络编辑器 --> VMnet8 --> NAT设置
在这里插入图片描述
3、确认VMnet8网卡已经配置好了IP地址和DNS(域名服务器)
查看步骤:
电脑右下角的wifi图标点击右键 --> 打开网络和Internet 设置 --> 以太网 --> 更改适配器选项 --> 找到VMnet8后点击右键,选择属性 --> 双击Internet协议版本4 --> 选择“使用下面的IP地址”(本质上就算配置网卡的IP地址)
在这里插入图片描述

二、复制虚拟机

先安装好一台虚拟机,再将那台虚拟机的文件复制几份后,将文件名进行更改即可
进入文件,点击格式名为.vmx的文件打开虚拟机
注意下内存的分配,以16G内存,创建3台虚拟机为例,(16 -4) / 3 = 4

三、给虚拟机设置静态IP地址

使用下方命令打开虚拟机的网卡文件

vim /etc/sysconfig/network-scripts/ifcfg-ens33

配置后的文件如下:
在这里插入图片描述
接下来对添加和修改的部分做下解释:
BOOTPROTO属性可以有两种选项:dhcpstatic
1、dhcp表示centos7获取IP地址采用动态获取的方式,使用dhcp的前提是保证路由器已经开启了DHCP
2、static表示centos7获取IP地址采用静态获取的方式
ONBOOT属性,centos7默认是关闭的,需要手动改成yes才能进行网络连接
IPADDR属性为静态获取IP地址时所使用的IP地址
NETMASK为子网掩码
GATEWAY为网关IP,这个可以从上述的注意事项中的第二项中查看如何获取
DNS1为第一个域名服务器,这个可以去网上百度
DNS2为第二个域名服务器

四、给每台虚拟机修改对应的主机名

下面介绍几条指令,可以用于操作主机名

hostname # 单独使用可以查看当前主机名
hostname 主机名 # 可以临时修改主机名
hostnamectl # 可以查看主机信息
hostnamectl set-hostname 主机名 # 可以永久修改主机名

此处我为我的三台虚拟机分别设置主机名为node01、node02、node03(下列指令分别在不同的三台虚拟机里运行)

hostnamectl set-hostname node01
hostnamectl set-hostname node02
hostnamectl set-hostname node03

五、为每台虚拟机设置IP和域名映射

使用如下命令打开 /etc/hosts文件

vim /etc/hosts

在该文件中添加如下语句:

192.168.28.147 node01 node01.hadoop.com
192.168.28.148 node02 node02.hadoop.com
192.168.28.149 node03 node03.hadoop.com

对上列语句解释下:上列语句的列对应是 主机IP地址 主机名 域名
没域名可以不用写

六、关闭防火墙与SELinux

关闭防火墙指令如下:

systemctl stop firewalld # 关闭防火墙,但这只是暂时的,一当开机重启后,防火墙会再次打开
systemctl disable firewalld # 永久关闭防火墙

关闭SELinux的方法如下:

vim /etc/selinux/config
SELINUX=disabled # 关闭SELinux

这里解释下什么是SELinux,所谓的SELinux是一种Linux的安全子系统,Linux的权限管理是针对文件而非进程的,因此,如果root用户启动了某项进程的话,该进程便可操作任何一个文件,因为是root用户创建了它,它就相当于有了root用户的权限,这会存在着很高的安全风险,因此,我们使用SELinux增加对进程的限制,使得进程只能在允许的范围内操作资源
接下来再解释下SELinux的三大取值,也是它的三种工作模式:
1、enforcing强制模式(如果操作违反了SELinux的规则,会直接将操作禁止,并且把该行为记录到日志中)
2、permissive宽容模式(如果操作违反了SELinux的规则,不会直接制止,但是会把此次行为记录到日志中)
3、disabled关闭SELinux

七、设置虚拟机免密码登录

执行此操作,是为了避免从某个节点启动另一个节点时需要输入密码带来的烦恼
免密SSH登录的原理:
1、首先需要在B节点配置A节点的公钥
2、A节点请求B节点要求登录
3、B节点使用A节点的公钥,加密一段随机文本
4、A节点使用私钥解密,并发回给B节点
5、B节点验证文本是否正确
接下来是如何实现虚拟机免密码登录的操作:
1、分别在三个节点中使用如下命令,以在三个节点下生成公钥和私钥:

ssh-keygen -t rsa # 使用rsa加密算法生成公钥和私钥

2、使用以下命令将三台主机的公钥拷贝到一台主机上去,这里使用node01主机:

ssh-copy-id node01

3、在获得三台主机的公钥的主机上执行如下操作,以将第一台主机的公钥拷贝到另外几台主机上去:

scp /root/.ssh/authorized_keys node02:/root/.ssh
scp /root/.ssh/authorized_keys node03:/root/.ssh

注意,因为我是直接使用root用户来构建集群系统的,生成密钥也是用root用户在root的根目录下生成的,所有.ssh所在位置是 /root/.ssh,如果不是root用户的话,.ssh所在的路径应该是 /home/用户名/.ssh
4、查看每个节点的 .ssh目录下是否生成了 known_hosts文件,这是用于保存可以识别的主机的文件
5、使用 ssh 主机名便可以进行免密登录了

八、设置时钟同步

这是为了防止三个节点因为时间的不同步而出现应用程序运行的混乱,从而造成不可预知的问题,举个简单的例子,当我们使用HBase时,如果节点之间时间差别过大的话,就会导致HBase挂掉,下面介绍时钟同步的方法:
1、安装ntp

yum -y install ntp

2、通过定时任务启动时钟同步
执行下列命令:

crontab -e

弹出vim编辑框后输入下列语句保存后即可实现时钟同步:

*/1 * * * * /usr/sbin/ntpdate ntp4.aliyun.com

Hadoop集群搭建

1、下载并解压Hadoop

如果没有Hadoop文件,可以使用如下命令下载Hadoop的压缩包:

wget https://mirrors.tuna.tsinghua.edu.cn/apache/hadoop/common/hadoop-2.9.2/hadoop-2.9.2.tar.gz

如果Windows上有下载Hadoop的压缩包,可以使用 rz命令将压缩包上传到centos7中,该命令的安装如下:

yum -y install lrzsz # 安装 rz 命令
rz # 打开上传界面,进行文件从Windows到Linux的上传

解压Hadoop的命令如下:

tar -zxf hadoop-2.9.2.tar.gz -C /usr/local # 将Hadoop解压到 /usr/local 中

2、下载并解压JDK

如果没有JDK文件,可以执行如下命令在线下载:

yum -y install java-1.8.0-openjdk*

文件下载后一般存储于 /usr/lib/jvm中,如果要想具体知道文件下载后存储在哪,可以使用如下命令:

ls -l /etc/alternatives

找到java的软连接,该软连接所指向的文件位置就是文件下载后存储的位置
如果是通过 rz 命令上传的,一般将文件解压到 /usr/lib 中,如下:

tar -zxf jdk-8u271-linux-x64.tar.gz -C /usr/lib

注意,我这里用于代码演示的两jdk包是不同的,以下均采用 java-1.8.0-openjdk*

3、配置系统环境变量

使用如下命令打开系统环境变量的配置文件:

vim /etc/profile

在文件的末尾添加如下内容,可以直接在命令模式下键入 G 直接跳入最后一行(以下命令均为手打键入,可能会输错,但是大体就是这样):

export JAVA_HOME=/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.262.b10-0.el7_8.x86_64
export PATH=$PATH:$JAVA_HOME/bin
export HADOOP_HOME=/usr/local/hadoop-2.9.2
export PATH=$PATH:$HADOOP_HOME/bin

输入完毕后保存退出,使用如下命令使文件生效:

. /etc/profile # 或者使用 source /etc/profile也行, . 是 source的缩写

检查Hadoop环境变量是否配置成功(配置Hadoop环境变量的原因在于,配置完后可以方便地在任意目录下执行hadoop命令,而不需要进入到hadoop的安装目录中使用 ./ 来运行),直接键入 hadoop 命令即可,出现如下情况即表明配置成功:
在这里插入图片描述

4、为相关的Hadoop文件配置JAVA_HOME环境变量

使用如下命令,进入 hadoop 文件

cd /usr/local/hadoop-2.9.2/etc/hadoop

对下方三个文件分别使用 vim 在文件末添加语句

vim hadoop-env.sh
vim mapred-env.sh
vim yarn-env.sh

每个文件末添加的语句:

export JAVA_HOME=/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.262.b10-0.el7_8.x86_64

5、配置HDFS

使用 vim 打开 core-site.xml 文件(该文件仍在上方目录中)
添加如下语句:

<configuration>
        <property>
                <name>fs.defaultFS</name>
                <value>hdfs://node01:9000</value>
        </property>
        <property>
                <name>hadoop.tmp.dir</name>
                <value>file:/root/server/hadoop-2.9.2/tmp</value>
        </property>
</configuration>

对上方的语句进行下解释:
1、fs.defaultFS:这是HDFS的默认访问路径,也是NameNode的访问地址
2、hadoop.tmp.dir:这是Hadoop数据文件的存放目录,如果不配置该参数,则会默认指向 /tmp,而 /tmp目录在重启后会被自动清空
使用 vim修改 hdfs-site.xml文件,加入如下内容:

<configuration>
        <property>
                <name>dfs.replication</name>
                <value>2</value>
        </property>
        <property><!--不用检查用户权限-->
                <name>dfs.permissions.enabled</name>
                <value>false</value>
        </property>
        <property>
                <name>dfs.namenode.name.dir</name>
                <value>file:/root/server/hadoop-2.9.2/tmp/dfs/name</value>
        </property>
        <property>
                <name>dfs.datanode.data.dir</name>
                <value>file:/root/server/hadoop-2.9.2/tmp/dfs/data</value>
        </property>
</configuration>

对上方语句进行下解释:
1、dfs.replication:文件在HDFS系统中的副本数
2、dfs.namenode.name.dir:NameNode节点数据在本地文件系统中的存放位置
3、dfs.datanode.data.dir:DataNode节点数据在本地文件系统中的存放位置
4、dfs.permissions.enabled:用来决定是否检查用户权限
vim 打开 slaves文件,加入如下内容(主机名):

node01
node02
node03

注意,如果使用Hadoop3.x版本的,则修改workers文件,增加内容一样

6、配置YARN

所需修改的文件仍在上方文件所在目录中

先将 mapred-site.xml.template 文件重命名为 mapred-site.xml,重命名方法如下(Hadoop 3.x已经默认将名字改过,就不用改了):

mv mapred-site.xml.template mapred-site.xml

然后对该文件进行修改,添加如下语句:

<configuration>
        <property>
                <name>mapreduce.framework.name</name>
                <value>yarn</value>
        </property>
</configuration>

解释下该语句的意思,该语句指定了mapreduce任务的执行框架为yarn
接着再打开 yarn-site.xml 文件,添加如下内容:

<configuration>
        <property>
                <name>yarn.nodemanager.aux-services</name>
                <value>mapreduce_shuffle</value>
        </property>
        <property>
        		<name>yarn.resourcemanager.address</name>
        		<value>node01:8032</value>
		</property>
</configuration>

解释下上方内容:
1、yarn.nodemanager.aux-services:这是NodeMananger上运行的附属服务,我们需要将其配置为 mapreduce_shuffle,只有这样,我们才能运行MapReduce程序,至于为什么需要它,之后关于mapreduce的博客中会介绍。YARN提供了该配置项用于在NodeManager上扩展自定义服务,MapReduce的Shuffle功能正是一种扩展服务
2、yarn.resourcemanager.address:指定ResourceManager所在的节点与访问端口,默认为8032,此处指定ResourceManager运行在node01节点,若不添加上述内容,ResourceManager将默认在执行YARN启动命令(start-yarn.sh)的节点上启动

7、复制Hadoop安装文件到其他主机

scp -r /usr/local/hadoop-2.9.2 node02:/usr/local/
scp -r /usr/local/hadoop-2.9.2 node03:/usr/local/

直接复制就可以减少了再在另外两个节点中配置的麻烦

8、格式化NameNode

在启动Hadoop之前,需要先格式化NameNode,其目的是初始化HDFS文件系统中的一些目录和文件,我们在node01节点上执行以下命令,进行格式化操作:

hadoop namenode -format

格式化成功后会生成 /usr/local/hadoop-2.9.2/tmp/dfs/name/current 目录,该目录中则会生成用于存储HDFS文件系统元数据信息的文件 fsimage

9、启动Hadoop

在node01节点上执行以下命令,启动Hadoop集群,命令在 /usr/local/hadoop-2.9.2/sbin

./start-all.sh

以下阐述下一些配置不进行会产生的结果:
1、若不配置SecondaryNameNode所在的节点,将默认在执行HDFS启动命令(start-dfs.sh)的节点上启动
2、若不配置ResourceManager所在的节点,将默认在执行YARN启动命令(start-yarn.sh)的节点上启动;若配置了ResourceManager所在的节点,则必须在所配置的节点启动YARN,否则在其他节点启动时将抛出异常
3、NodeManager无需配置,会与DataNode在同一个节点上,以获取任务执行时的数据本地优势,即有DataNode的节点就会有NodeManager
我在启动Hadoop 3.x时有遇到个问题,就是启动Hadoop是出现如下报错:

ERROR: Attempting to operate on hdfs namenode as root
ERROR: but there is no HDFS_NAMENODE_USER defined. Aborting operation.

我暂时将解决方法写在下方,由于具体源由我还没弄清,就暂时不是很详细,补充留在下篇博客
修改下面四个文件
1、对于 start-dfs.shstop-dfs.sh文件,在第一行非注释代码的上一行添加如下代码:

HDFS_DATANODE_USER=root
HADOOP_SECURE_DN_USER=hdfs
HDFS_NAMENODE_USER=root
HDFS_SECONDARYNAMENODE_USER=root

2、对于 start-yarn.shstop-yarn.sh文件,在第一行非注释代码的上一行添加如下代码:

YARN_RESOURCEMANAGER_USER=root
HADOOP_SECURE_DN_USER=yarn
YARN_NODEMANAGER_USER=root

之后重新 ./start-all.sh即可

10、查看各个节点启动的进程

[root@node01 sbin]# jps
15088 NodeManager
14786 SecondaryNameNode
1987 QuorumPeerMain
14617 DataNode
14941 ResourceManager
15374 Jps
14479 NameNode

[root@node02 ~]# jps
15697 QuorumPeerMain
20611 Jps
20360 DataNode
20475 NodeManager

[root@node03 ~]# jps
20548 DataNode
20663 NodeManager
20793 Jps
15789 QuorumPeerMain

注意,如果jps时没有出现DataNode有可能是因为再次使用 hadoop namenode -format 后,我们没有将 /usr/local/hadoop-2.9.2/tmp/dfs/data/current中的数据删除,并且每个节点中的都要删除

猜你喜欢

转载自blog.csdn.net/myWarren/article/details/109278438