欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

hadoop高可用集群环境搭建

程序员文章站 2022-06-17 09:38:08
...

作者:贺圣军,叩丁狼高级讲师。原创文章,转载请注明出处。

1 环境介绍

  • 系统:CentOS6.8 64位系统
  • jdk:jdk-8u171-linux-x64
  • Zookeeper:zookeeper-3.4.12
  • hadoop:hadoop-2.6.5

2 基本环境配置

因为是使用vmware虚拟环境进行hadoop集群的安装,使用的是Apache版本的Hadoop集群环境搭建,使用三台虚拟机开始搭建环境,本次使用的网络模式是NAT,相关配置

主机名 IP地址
lab301 192.168.158.231
lab302 192.168.158.232
lab303 192.168.158.233

2.1 基本软件的安装

在进行搭建集群环境之前,请先确保完成以下操作(可以先lab301上进行相关配置,然后克隆出lab302 lab303)

  • 确定关闭防火墙iptables和selinux安全控制
  • 确定主机名和IP地址
  • 修改/etc/host文件,保证可以使用对应的主机名访问服务器
  • 安装好wget软件 yum install -y wget
  • 安装好jdk,并且配置好环境变量JAVA_HOME
  • ssh服务端和客户端的安装(yum install -y openssh.x86_64 openssh-clients.x86_64 openssh-server.x86_64)
  • 配置三个服务器ssh之间的免密登录操作
  • 配置服务器的时间同步,配置所有节点的NTP服务
  • 所有的操作都是使用root用户执行

2.2 zookeeper集群配置

对于zookeeper的集群的服务器使用单节点数量(2n+1),我们这里直接使用lab301 lab302 lab303这三个服务器,可以现在lab301配置好,然后拷贝到其他服务器即可

登录到lab301服务器

[aaa@qq.com soft]# cd /root/soft
[aaa@qq.com soft]# pwd
/root/soft
[aaa@qq.com soft]# wget http://mirrors.shu.edu.cn/apache/zookeeper/zookeeper-3.4.12/zookeeper-3.4.12.tar.gz
[aaa@qq.com soft]# mkdir -p /app/zookeeper  #级联创建文件目录/app/zookeeper
# 解压文件到 /app/zookeeper
# -C 解压到指定目录
# --strip-components=1  解压的时候去掉解压出来的第一个目录
[aaa@qq.com soft]# tar -zxvf zookeeper-3.4.12.tar.gz  -C /app/zookeeper/ --strip-components=1
[aaa@qq.com zookeeper]# cd /app/zookeeper/conf
# 重命名配置文件
[aaa@qq.com conf]# mv zoo_sample.cfg zoo.cfg
[aaa@qq.com conf]# vi zoo.cfg
# 心跳检查间隔时间2s
tickTime=2000
# 集群服务器中所有服务器之间的同步的时间限制的心跳数,如果在10个心跳周期内没有一半的集群服务器完成同步,那么会重新进行leader的选举
initLimit=10
# 值在5个心跳周期内如果follower没有从leader同步完成数据,那么对于follower会进行重启操作
syncLimit=5
# 数据的存放目录
dataDir=/app/zookeeper/data/
# 集群配置 server.1 第一个服务器
# lab301:2888:3888 第一个个是主机名称,2888是服务器之间进行数据传输的端口 3888 是服务器选举机制使用的端口
server.1=lab301:2888:3888
server.2=lab302:2888:3888
server.3=lab303:2888:3888
# 客户端连接端口
clientPort=2181

配置完zoo.cfg,然后需要在数据存放目录/app/zookeeper/data/创建一个名称为myid的文件,在集群的选举机制需要使用到

# 进入到数据存储目录
[aaa@qq.com bin]# cd /app/zookeeper/data/
# 使用重定向命令 往myid文件中输出2 如果myid不存在,会自动创建
[aaa@qq.com data]# echo 1 > myid

把修改好的文件夹使用scp拷贝到另外两台服务器

# 需要配置ssh免密登录 -r 用于拷贝文件目录 第一个参数是 需要拷贝的文件, 第二个参数是 拷贝到目录主机的文件目录
[aaa@qq.com app]# scr -r /app/zookeeper/ lab302:/app
[aaa@qq.com app]# scr -r /app/zookeeper/ lab303:/app

在拷贝的服务器lab302 lab303 上分别修改配置文件myid的值

#使用ssh在lab301 登录到lab302 lab302 执行命令,修改myid的值
[aaa@qq.com app]# ssh lab302 "echo 2 > /app/zookeeper/data/myid"
[aaa@qq.com app]# ssh lab303 "echo 3 > /app/zookeeper/data/myid"

在所有的服务器配置环境变量

[aaa@qq.com app]# vi /etc/profile
export ZOOKEEPER_HOME=/app/zookeeper
export PATH=$PATH:$JAVA_HOME/bin:$ZOOKEEPER_HOME/bin
# 重新加载环境变量
[aaa@qq.com app]# source /etc/profile

启动所有的zookeeper服务

# 分别在三台服务器上执行
[aaa@qq.com bin]# /app/zookeeper/bin/zkServer.sh start
# 查看服务器状态 应该是一个leader 多个follower
[aaa@qq.com bin]# /app/zookeeper/bin/zkServer.sh start

如果状态是 是一个leader 多个follower说明zookeeper集群搭建完成

3 hadoop集群配置

3.1 下载并安装hadoop

对于hadoop集群可以现在lab301配置好,然后把整个目录拷贝到lab302 lab303服务器即可

#进入到个人的软件存放目录,可以自己定义
[aaa@qq.com soft]# cd /root/soft
#下载hadoop2 软件
[aaa@qq.com soft]# wget http://mirrors.tuna.tsinghua.edu.cn/apache/hadoop/common/hadoop-2.6.5/hadoop-2.6.5.tar.gz
[aaa@qq.com soft]# ls
hadoop-2.6.5.tar.gz  jdk-8u171-linux-x64.tar.gz  zookeeper-3.4.12.tar.gz
#创建hadoop的安装目录
[aaa@qq.com soft]# mkdir -p /app/hadoop
#解压到/app/hadoop目录下面
[aaa@qq.com soft]# tar -zxvf hadoop-2.6.5.tar.gz  -C /app/hadoop --strip-components=1

3.2 hadoop的java_home配置

#进入到配置目录
[aaa@qq.com hadoop]# cd /app/hadoop/etc/hadoop
# 编辑环境设置脚本
[aaa@qq.com hadoop]# vi hadoop-env.sh
# 设置java_home
export JAVA_HOME=/app/jdk8

3.3 配置集群节点

# 需要注意的是主机名必须在/etc/hosts文件中正常配置
[aaa@qq.com hadoop]# cat slaves
lab301
lab302
lab303

3.4 修改core-site.xml文件

[aaa@qq.com hadoop]# vi core-site.xml
<configuration>
    <property>
        <name>fs.defaultFS</name>
        <!-- 配置集群访问namenode节点  ns1值和hdfs-site.xml的配置相对应-->
        <value>hdfs://ns1</value>
    </property>
    <property>
        <!-- 配置数据的的临时存放目录-->
        <name>hadoop.tmp.dir</name>
        <value>/app/hadoop/tmp</value>
    </property>
    <property>
          <!-- 配置zookeeper的连接信息-->
        <name>ha.zookeeper.quorum</name>
        <value>lab301:2181,lab302:2181,lab303:2181</value>
    </property>
</configuration>

3.5 修改hdfs-site.xml文件

[aaa@qq.com hadoop]# vi hdfs-site.xml
<configuration>
    <property>
        <!--数据保存的副本数量,因为使用三台服务器,搭建三个数据节点,所以值只要不超过3即可 -->
        <name>dfs.replication</name>
        <value>2</value>
    </property>
    <property>
        <!--dfs的name服务的名称配置,在其他地方需要使用到该名称 -->
        <name>dfs.nameservices</name>
        <value>ns1</value>
    </property>
    <property>
        <!--对于ns1服务下的namenodes的配置,多个节点之间使用逗号隔开 -->
        <name>dfs.ha.namenodes.ns1</name>
        <value>nn1,nn2</value>
    </property>
    <property>
        <!--配置namenode节点的rpc调用-->
        <name>dfs.namenode.rpc-address.ns1.nn1</name>
        <value>lab301:9000</value>
    </property>
    <property>
        <!--配置namenode节点的http方式调用-->
        <name>dfs.namenode.http-address.ns1.nn1</name>
        <value>lab301:50070</value>
    </property>
    <property>
        <!--配置namenode节点的rpc调用-->
        <name>dfs.namenode.rpc-address.ns1.nn2</name>
        <value>lab302:9000</value>
    </property>
    <property>
        <!--配置namenode节点的http方式调用-->
        <name>dfs.namenode.http-address.ns1.nn2</name>
        <value>lab302:50070</value>
    </property>
    <property>
        <!--配置namenode节点的共享文件目录,使用qjournal的集群进行管理-->
        <name>dfs.namenode.shared.edits.dir</name>
        <value>qjournal://lab301:8485;lab302:8485;lab303:8485/ns1</value>
    </property>
    <property>
        <!--配置journalnode集群的数据存放目录-->
        <name>dfs.journalnode.edits.dir</name>
        <value>/app/hadoop/journaldata</value>
    </property>
    <property>
        <!--配置自动启动故障恢复-->
        <name>dfs.ha.automatic-failover.enabled</name>
        <value>true</value>
    </property>
    <property>
        <!--配置故障出现的时候具体去执行故障切换的一个代理-->
    <name>dfs.client.failover.proxy.provider.ns1</name>                                  <value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>
    </property>
    <property>
         <!--在namenode节点需要切换的时候,使用ssh的免密进行操作-->
        <name>dfs.ha.fencing.methods</name>
        <value>sshfence</value>
    </property>
    <property>
        <!--ssh秘钥存储的位置-->
        <name>dfs.ha.fencing.ssh.private-key-files</name>
        <value>/root/.ssh/id_rsa</value>
    </property>
    <property>
        <!--设置namenode节点的超时时间为30s-->
        <name>dfs.ha.fencing.ssh.connect-timeout</name>
        <value>30000</value>
    </property>
</configuration>

3.5 修改mapred-site.xml文件

[aaa@qq.com hadoop]# mv mapred-site.xml.template mapred-site.xml
[aaa@qq.com hadoop]# vi mapred-site.xml
<!--配置使用yarn模拟进行管理-->
<configuration>
    <property>
        <name>mapreduce.framework.name</name>
        <value>yarn</value>
    </property>
</configuration>

3.6 修改yarn-site.xml文件

[aaa@qq.com hadoop]# vi yarn-site.xml
<configuration>
    <property>
        <!--启用HA高可用性-->
        <name>yarn.resourcemanager.ha.enabled</name>
        <value>true</value>
    </property>
    <property>
        <!--配置资源管理resourcemanager的id -->
        <name>yarn.resourcemanager.cluster-id</name>
        <value>yrc</value>
    </property>
    <property>
        <!--配置具体的资源管理的列表 -->
        <name>yarn.resourcemanager.ha.rm-ids</name>
        <value>rm1,rm2</value>
    </property>
    <property>
        <!--配置具体的资源管理的服务器 -->
        <name>yarn.resourcemanager.hostname.rm1</name>
        <value>lab301</value>
    </property>
    <property>
        <!--配置具体的资源管理的服务器 -->
        <name>yarn.resourcemanager.hostname.rm2</name>
        <value>lab302</value>
    </property>
    <property>
         <!--配置zookeeper的客户端连接信息 -->
        <name>yarn.resourcemanager.zk-address</name>
        <value>lab301:2181,lab302:2181,lab303:2181</value>
    </property>
    <property>
        <!--配置mapreduce的工作模式 -->
        <name>yarn.nodemanager.aux-services</name>
        <value>mapreduce_shuffle</value>
    </property>
</configuration>

4 hadoop的集群管理

在上述的配置文件修改以后,需要拷贝到lab302 lab303两个服务器上

[aaa@qq.com app]# scp -r  /app/hadoop/ lab302:/app
[aaa@qq.com app]# scp -r  /app/hadoop/ lab303:/app

4.1 配置环境变量(所有节点 lab301 lab302 lab303)

[aaa@qq.com app]# vi /etc/profile
export HADOOP_HOME=/app/hadoop
export PATH=$PATH:$JAVA_HOME/bin:$ZOOKEEPER_HOME/bin:$HADOOP_HOME/bin

重新加载环境变量

[aaa@qq.com app]# source /etc/profile

4.2 启动日志节点进程(所有节点 lab301 lab302 lab303)

[aaa@qq.com sbin]# pwd
/app/hadoop/sbin
[aaa@qq.com sbin]# ./hadoop-daemon.sh start journalnode
# 其中JournalNode进程代表journalnode
[aaa@qq.com sbin]# jps
2177 NameNode
1589 JournalNode
2293 DataNode
1431 QuorumPeerMain
2951 ResourceManager
2524 DFSZKFailoverController
3037 NodeManager
5150 Jps

4.3 格式化HDFS

[aaa@qq.com sbin]# cd /app/hadoop/bin/
[aaa@qq.com bin]# hdfs namenode -format

生成完对应的目录文件后,拷贝一份文件到lab302服务器,应为namenode的ha是在lab301和lab302进行配置的

[aaa@qq.com tmp]# scp -r /app/hadoop/tmp lab302:/app/hadoop/

4.4 格式化ZKFC

使用zookeeper进行对ha的namenode的管理

[aaa@qq.com bin]# cd /app/hadoop/bin
[aaa@qq.com bin]# hdfs zkfc -formatZK

4.5 启动HDFS

[aaa@qq.com bin]# cd /app/hadoop/sbin
[aaa@qq.com sbin]# ./start-dfs.sh

4.6 启动YARN

[aaa@qq.com bin]# cd /app/hadoop/sbin
[aaa@qq.com sbin]# ./start-yarn.sh

4.7 访问HDFS和YARN

查看HDFS:http://192.168.158.231:50070

查看YARN:http://192.168.158.231:8088

4.8 实例程序演示

上传一个文件到HDFS

#上传centos的/etc/passwd 到HDFS中/passwd
[aaa@qq.com sbin]# hadoop fs -put /etc/passwd /passwd

使用MapReduce进行计算分析

# 运行示例程序中的字数统计程序,统计上传的/passwd文件的中信息 并且把输出结果保存到/info中

[aaa@qq.com hadoop]# hadoop jar /app/hadoop/share/hadoop/mapreduce/hadoop-mapreduce-examples-2.6.5.jar w

hadoop高可用集群环境搭建