Hadoop HA搭建
前提需要
准备三台虚拟机
创建三台虚拟机,主机名分别更改为hadoop01,hadoop02,hadoop03
Hadoop部署如下
主机名 | 主机IP |
hadoop01 | 192.168.197.101 |
hadoop02 | 192.168.197.102 |
hadoop03 | 192.168.197.103 |
以下更改主机名,配置网络,关闭防火墙,关闭selinux,时间同步,主机映射和免密登录三台虚拟机都要进行,不同的是主机名和IP地址,其余配置信息都相同
更改主机名
为了便于集群管理,需要更改主机名
永久修改主机名命令为:hostnamectl set-hostname 主机名
刷新命令:bash
例:hostnamectl set-hostname hadoop01
配置网络
为了便于使用和管理,需要配置静态IP
步骤如下
1.打开”虚拟网络编辑器”
2.查看网关
- 配置静态IP
进入网络配置文件,进行修改,命令如下:
sudo vim /etc/sysconfig/network-scripts/ifcfg-ens33
需要将原本的BOOTPROTO="dhcp"改为BOOTPROTO="static"
再添加IP地址,自行设置,前面的部分要与网关一致,最后一位的主机号可随意,建议三台主机分别设置为101,102,103
再添加网关,即前面查看到的网关
再添加子网掩码,一般都为255.255.255.0
最后添加DNS域名解析,可设为8.8.8.8或8.8.4.4或114.114.114.114
注意ONBOOT是否等于yes,将它设置为yes开机自启
保存退出
重启网络
重启网络命令:systemctl restart network.service
- 测试网络环境
可以用ping命令是否能够ping通
可以分别ping 主机IP
ping www.baidu.com
如果能够ping通,即完成网络配置
如下情况
关闭防火墙
为了三台服务器能够互相通信,需要关闭防火墙
- 查看防火墙状态
命令:systemctl status firewalld.service
可以看到防火墙开启状态
- 关闭防火墙
命令: systemctl stop firewalld.service
设置为开机关闭防火墙
systemctl disable firewalld.service
- 检查是否关闭完成
systemctl status firewalld.service
可以看到我们的防火墙已经关闭了
关闭selinux
为了避免安装过程出现各种错误,建议关闭
selinux有两种状态,一个是Enforcing,为开启状态,一个是Permissive,为关闭状态
- 查看selinux状态
命令:getenforce
如下图可以看到当前状态是开启的
- 临时关闭(不建议,重启之后就会失效)
命令:sudo setenforce 0
再次执行getenforce可以看到状态已经改成Permissive关闭状态了
3.永久关闭(建议)
修改配置文件selinux
命令:sudo vim /etc/selinux/config
或:sudo vim /etc/sysconfig/selinux
修改之后如下:
时间同步
为了防止服务器之间因时间的不同而导致出现问题,建议同步网络时间
- 安装时间服务,如果已有,无需安装(三台都需要)
查看是否安装命令:rpm -q ntp ntpdate
如果没有安装,则执行以下命令
命令:yum install ntpdate ntp
再次查看:rpm -q ntp ntpdate
- 修改本机时间
命令:cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
- 同步网络时间
命令:ntpdate cn.pool.ntp.org
4.集群时间同步
命令:ntpdate hadoop01
都与hadoop01同步时间
- 这时候发现节点间的时间同步了,但ntpdate只在开机运行,我们若要设置为1小时同步一次
命令:crontab -l
主机IP映射
为了便于集群管理,需要将三台服务器的主机名和IP做映射关系
首先进入所在文件目录,进行编辑,命令如下:
sudo vim /etc/hosts
将主机ip和主机名一一对应写入进去
设置如下
免密登录
为了便于集群之间的互联通信,需要进行免密登录的操作,可以减少输入密码次数,避免重复输入密码
1.输入命令:ssh-keygen -t rsa
2.然后连续按四下回车,出现如下就ok了
- 进入ssh目录,命令如下
cd ~/.ssh
然后ls或ll查看,可以发现有两个文件
5.拷贝公钥
复制ssh生成的本地公钥至远程服务器,命令如下:
cp id_rsa.pub authorized_keys
扩展:id_rsa为私钥,id_rsa.pub为公钥
- 本机测试
命令:ssh localhost
如果不需要输入密码说明已经完成好免密设置
安装以下组件,需要下载jdk,hadoop,zookeeper安装包至Downloads目录
cd Downloads进入下载目录
ll命令可以看到如下安装包
Java安装
- 卸载系统自带的默认jdk
先查看系统自带的jdk,命令:rpm -qa|grep jdk
可以看到有三个jdk,需要全部卸载
执行sudo yum remove 要卸载的jdk软件包名即可卸载
sudo yum remove java-1.8.0-openjdk-headless.x86_64 copy-jdk-configs.noarch java-1.8.0-openjdk*
再次查看就会发现已经卸载完了
- 解压jdk的tar.gz包
命令:tar -zxvf jdk* -C /usr/local/
tar -zxvf 安装包名 -C 指定安装目录
这里我将Java安装在/usr/local下,如果不加-C和后面的目录参数,则默认安装在当前目录
- 重命名
cd /usr/local 进入到java的安装目录
mv jdk* java进行重命名
- 配置jdk的环境变量
执行命令:vim ~/.bashrc
写下如下内容,将Java的安装目录添加进去
保存退出
source ~/.bashrc 使其配置生效
java -version命令就可以查看到安装好的Java版本了
Hadoop安装
1.同Java,先mv重命名为hadoop
之后配置hadoop环境变量,如下
source ~/.bashrc刷新使其配置生效
2.执行hadoop version查看hadoop版本
3.配置Hadoop配置文件
slaves文件
core-site.xml
<configuration>
<property>
<name>fs.defaultFS</name>
<value>hdfs://mycluster</value>
</property>
<property>
<name>hadoop.tmp.dir</name>
<value>/usr/local/hadoop/tmp</value>
</property>
<property>
<name>ha.zookeeper.quorum</name>
<value>hadoop01:2181,hadoop02:2181,hadoop03:2181</value>
</property>
<property>
<name>ha.zookeeper.session-timeout.ms</name>
<value>30000</value>
</property>
<property>
<name>fs.trash.interval</name>
<value>1440</value>
</property>
</configuration>
hdfs-dfs.xml
<configuration>
<property>
<name>dfs.permissions.enabled</name>
<value>false</value>
</property>
<property>
<name>dfs.replication</name>
<value>2</value>
</property>
<property>
<name>dfs.nameservices</name>
<value>mycluster</value>
</property>
<property>
<name>dfs.ha.namenodes.mycluster</name>
<value>hadoop01,hadoop02</value>
</property>
<property>
<name>dfs.namenode.rpc-address.mycluster.hadoop01</name>
<value>hadoop01:9000</value>
</property>
<property>
<name>dfs.namenode.rpc-address.mycluster.hadoop02</name>
<value>hadoop02:9000</value>
</property>
<property>
<name>dfs.namenode.http-address.mycluster.hadoop01</name>
<value>hadoop01:50070</value>
</property>
<property>
<name>dfs.namenode.http-address.mycluster.hadoop02</name>
<value>hadoop02:50070</value>
</property>
<property>
<name>dfs.namenode.shared.edits.dir</name>
<value>qjournal://hadoop01:8485;hadoop02:8485;hadoop03:8485/mycluster</value>
</property>
<property>
<name>dfs.ha.automatic-failover.enabled</name>
<value>true</value>
</property>
<property>
<name>dfs.client.failover.proxy.provider.mycluster</name> <value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>
</property>
<property>
<name>dfs.ha.fencing.methods</name>
<value>
sshfence
shell(/bin/true)
</value>
</property>
<property>
<name>dfs.ha.fencing.ssh.private-key-files</name>
<value>/home/miemiemie/.ssh/id_rsa</value>
</property>
<property>
<name>dfs.ha.fencing.ssh.connect-timeout</name>
<value>30000</value>
</property>
<property>
<name>dfs.journalnode.edits.dir</name>
<value>/usr/local/hadoop/tmp/dfs/journal</value>
</property>
<property>
<name>dfs.qjournal.start-segment.timeout.ms</name>
<value>60000</value>
</property>
</configuration>
mapred.site-xml
<configuration>
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
<property>
<name>mapreduce.jobhistory.address</name>
<value>hadoop01:10020</value>
</property>
<property>
<name>mapreduce.jobhistory.webapp.address</name>
<value>hadoop01:19888</value>
</property>
</configuration>
yarn-site.xml
<configuration>
<property>
<name>yarn.resourcemanager.ha.enabled</name>
<value>true</value>
</property>
<property>
<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>hadoop01</value>
</property>
<property>
<name>yarn.resourcemanager.hostname.rm2</name>
<value>hadoop02</value>
</property>
<property>
<name>yarn.resourcemanager.zk-address</name>
<value>hadoop01:2181,hadoop02:2181,hadoop03:2181</value>
</property>
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
<property>
<name>yarn.log-aggregation-enable</name>
<value>true</value>
</property>
<property>
<name>yarn.log-aggregation.retain-seconds</name>
<value>86400</value>
</property>
<property>
<name>yarn.resourcemanager.recovery.enabled</name>
<value>true</value>
</property>
<property>
<name>yarn.resourcemanager.store.class</name> <value>org.apache.hadoop.yarn.server.resourcemanager.recovery.ZKRMStateStore</value>
</property>
</configuration>
Zookeeper安装
1.同Java和Hadoop安装,重命名之后配置环境变量,之后source生效
2.进入zookeeper目录
进入zookeeper下的conf目录,拷贝zoo_sample.cfg并改名为zoo.cfg
- 配置zoo.cfg文件
修改如下
server.X = hadoop0N:2888:3888中,节点N所对应的数字X。因此hadoop01、hadoop02、hadoop03中myid文件内容分别是数字1,2,3
- 创建文件
回到zookeeper目录,创建zkData目录,命令:mkdir zkData
之后echo 1> myid
将1写入myid文件,如下
5.节点分发
上述配置可以在一台节点机器上配置完成,然后通过scp命令远程传输到另外两台数据节点机器上,只需修改myid文件里的对应的数字即可,同时将/etc/hosts和java,hadoop以及~/.bashrc的环境变量配置文件也分发过去。例如我在hadoop01上配置完成的,传输至hadoop02,hadoop03
sudo scp -r /usr/local/zookeeper root@hadoop02:/usr/local/
sudo scp -r /usr/local/zookeeper root@hadoop03:/usr/local/
sudo scp -r /usr/local/java root@hadoop02:/usr/local/
sudo scp -r /usr/local/java root@hadoop03:/usr/local/
sudo scp -r /usr/local/hadoop root@hadoop02:/usr/local/
sudo scp -r /usr/local/hadoop root@hadoop03:/usr/local/
sudo scp /etc/hosts root@hadoop02:/etc/
sudo scp /etc/hosts root@hadoop03:/etc/
sudo scp ~/.bashrc miemiemie@hadoop02:/home/miemiemie/
sudo scp ~/.bashrc miemiemie@hadoop03:/home/miemiemie/
以上Java和zookeeper的是分发到root用户下的,所以要分别进入两台虚拟机将所有权限改为使用的用户的,比如我的用户是miemiemie,这里我将hadoop02和hadoop03使用sudo chown -R miemiemie:miemiemie java和sudo chown -R miemiemie:miemiemie zookeeper和sudo chown -R miemiemie:miemiemie hadoop命令
分别进入zookeeper下的zkData目录,将myid分别改为2和3
即:
节点 | myid | 用户权限 |
hadoop01 | 1 | miemiemie |
hadoop02 | 2 | miemiemie |
hadoop01 | 3 | miemiemie |
格式化hadoop
hdfs namenode -format
格式化zookeeper
hdfs zkfc -formatZK
启动zookeeper
zkServer.sh start或hadoop-daemon.sh start zkfc
启动hdfs
start-dfs.sh
启动journalnode
hdfs --daemon start journalnode
启动yarn
start-yarn.sh
启动jobhistory
mr-jobhistory-daemon.sh history start
获取一个namenode节点的HA状态
hdfs haadmin -getServiceState hadoop01
查看hdfs的各节点状态信息
hdfs dfsadmin -report
查看进程jps
进入hdfs或yarn的web页面
HDFS web页面 192.168.197.101:50070或192.168.197.102:50070
YARN web页面 192.168.197.101:8088
至此,Hadoop的HA高可用版已经搭建完成
问题:
在编辑文件的时候出现”只读”,没有权限且加了sudo出现
“不在 sudoers 文件中。此事将被报告。”问题
解决:
将当前用户添加到sudoers文件中
- 切换root用户
- 命令:visudo
在大概100行左右,找到root ALL=(ALL) ALL这个位置,
将自己的用户添加进去,格式与root一致,如下设置
之后保存退出,再切换回自己的用户即可