hadoop高可用集群环境搭建
作者:贺圣军,叩丁狼高级讲师。原创文章,转载请注明出处。
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
上一篇: docker registry的使用
下一篇: 自定义Android注解:注解变量