hadoop完全分布式配置
新建虚拟机
修改时间为亚洲 上海时区
修改密码越简单越好
1、关闭防火墙
systemctl stop firewalld
systemctl disable firewalld
永久关闭防护墙修改配置文件
vi /etc/selinux/config
修改SELINUX=disabled
2、修改网络配置
vi /etc/sysconfig/network-scripts/ifcfg-ens33
修改静态IP
BOOTPROTO=static
修改启动时激活网卡
ONBOOT=yes
增加IP
IPADDR=192.168.136.222
NETMASK=255.255.255.0
GATEWAY=192.168.136.2
DNS1=114.114.114.114
DNS2=8.8.8.8
修改完成后记得使网络配置生效
systemctl restart network
检查是否生效,拼测外网是否可以拼通
ping baidu.com
3、修改主机名称
hostnamectl set-hostname master
修改完成后,切换主机名称su命令
4、配置主机名与IP的映射关系
vi /etc/hosts
增加映射关系
192.168.136.222 master
192.168.136.223 slave1
192.168.136.224 slave2
5、配置免密登录
cd ~
ssh-keygen -t rsa 一路回车 (-t是制定秘钥的类型,一般有2种rsa和dsa)
cd .ssh
ssh-copy-id -i id_rsa.pub root@master
输入yes后输入密码
验证:
ssh loacalhost
ssh master
ssh 0.0.0.0
6、配置时间同步
yum install chrony
启用
systemctl start chronyd
systemctl enable chronyd
设置亚洲时区
timedatectl set-timezone Asia/Shanghai
启用NTP同步
timedatectl set-ntp yes
防止重启不生效,写入磁盘:hwclock --systohc
验证是否生效:timedatectl
7、上传安装文件
利用finalshell
cd /opt
创建上传位置
mkdir software
创建解压缩位置
mkdri apps
解压缩
tar -zxvf 文件名 -C /opt/apps/
修改文件名
cd /opt/apps //切换到apps目录下
mv 文件名 新文件名 //修改文件名 例: mv hadoop3.2.1.jar hadoop
8、配置环境
添加以下内容
vi /etc/profile
export JAVA_HOME=/opt/apps/jdk
export HADOOP_HOME=/opt/apps/hadoop
export ZOOKEEPER_HOME=/opt/apps/zookeeper
export PATH=$JAVA_HOME/bin:$JAVA_HOME/jre/bin:$HADOOP_HOME/bin:$HADOOP_HOME/sbin:$ZOOKEEPER_HOME/bin:$PATH
配置完成后记得生效
source /etc/profile
验证:
输入java -version
输入hadoop version
9、修改hadoop四个配置文件
切换目录 cd /opt/apps/hadoop/etc/hadoop
需要修改以下四个配置文件
1、core-site.xml
2、hdfs-site.xml
3、yarn-site.xml
4、mapred-site.xml.template
第四个需要拷贝一份为mapred-site.xml再修改 :cp -rf mapredu-site.xml.template mapreduce-site.xml
core-site.xml文件如下:
<configuration>
<!-- hdfs的地址名称:schame,ip,port-->
<property>
<name>fs.defaultFS</name>
<value>hdfs://master:8020</value>
</property>
<!-- hdfs的基础路径,被其他属性所依赖的一个基础路径 -->
<property>
<name>hadoop.tmp.dir</name>
<value>/opt/apps/hadoop/tmp</value>
</property>
</configuration>
hdfs-site.xml文件如下:
<configuration>
<!-- namenode守护进程管理的元数据文件fsimage存储的位置-->
<property>
<name>dfs.namenode.name.dir</name>
<value>file://${hadoop.tmp.dir}/dfs/name</value>
</property>
<!-- 确定DFS数据节点应该将其块存储在本地文件系统的何处-->
<property>
<name>dfs.datanode.data.dir</name>
<value>file://${hadoop.tmp.dir}/dfs/data</value>
</property>
<!-- 块的副本数-->
<property>
<name>dfs.replication</name>
<value>3</value>
</property>
<!-- 块的大小-->
<property>
<name>dfs.blocksize</name>
<value>134217728</value>
</property>
<!-- secondarynamenode守护进程的http地址:主机名和端口号。参考守护进程布局-->
<property>
<name>dfs.namenode.secondary.http-address</name>
<value>slave1:50090</value>
</property>
</configuration>
mapred-site.xml文件如下:
<configuration>
<!-- 指定mapreduce使用yarn资源管理器-->
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
<!-- 配置作业历史服务器的地址-->
<property>
<name>mapreduce.jobhistory.address</name>
<value>master:10020</value>
</property>
<!-- 配置作业历史服务器的http地址-->
<property>
<name>mapreduce.jobhistory.webapp.address</name>
<value>master:19888</value>
</property>
</configuration>
yarn-site.xml文件如下:
<configuration>
<!-- 指定yarn的shuffle技术-->
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
<!-- 指定resourcemanager的主机名-->
<property>
<name>yarn.resourcemanager.hostname</name>
<value>master</value>
</property>
</configuration>
10、修改hadoop-env.sh脚本文件 此处是修改
export JAVA_HOME=/opt/apps/jdk
11、配置slaves文件
vi etc/hadoop/slaves
删除localhost
增加
master
slave1
slave2
12、配置yarn-env.sh文件 此处是修改
export JAVA_HOME=/opt/apps/jdk
注意将前面的注释符号#去掉
13、使用克隆技术克隆另外2台从机
进入从机修改ip
vi /etc/sysconfig/network-scripts/ifcfg-ens33
重启网络
修改主机名
hostnamectl set-hostname 主机名
su切换用户名
14、进入master测试另外2台免密登录是否正常
由master到slave1 1到2 2到1 由master到slave2
记得切换回来master
ssh slave1
ssh slave2
ssh master
15、格式化namenode
[root@master ~]# hdfs namenode -format
zookeeper完全分布式配置
1、修改zookeeper配置文件
1、cd /opt/apps/zookeeper/conf
2、cp zoo_sample.cfg zoo.cfg #复制出zoo.cfg文件
3、vi zoo.cfg
修改zookeeper存储路径
dataDir=/opt/apps/zookeeper/zkData
添加三个服务器节点
server.1=master:2888:3888
server.2=slave1:2888:3888
server.3=slave2:2888:3888
[root@master conf]# vi zoo.cfg
tickTime=2000 # 定义的时间单元(单位毫秒),下面的两个值都是tickTime的倍数。
initLimit=10 #follower连接并同步leader的初始化连接时间。
syncLimit=5 #心跳机制的时间(正常情况下的请求和应答的时间)
dataDir=/opt/apps/zookeeper/zkData #修改zookeeper的存储路径,zkData目录一会要创建出来
clientPort=2181 #客户端连接服务器的port
server.1=master:2888:3888 # 添加三个服务器节点
server.2=slave1:2888:3888
server.3=slave2:2888:3888
解析Server.id=ip:port1:port2
id: 服务器的id号,对应zkData/myid文件内的数字
ip: 服务器的ip地址
port1: follower与leader交互的port
port2: 选举期间使用的port
2、创建zookeeper存储路径
1、cd /opt/apps/zookeeper
2、mkdir zkData
3、指定服务器id号
cd zkData
echo "1" >> myid(此处为master服务器的id号,slave1和2对应的id分别为2,3)
3、将zookeeper目录复制到另外2台从机上
cd /opt/apps
scp -r zookeeper slave1:/opt/apps/
scp -r zookeeper slave2:/opt/apps/
4、进入对应主机的zookeeper目录中修改myid文件id号
cd /opt/apps/zookeeper/zkData
vi myid
5、启动zookeeper
zkServer.sh start
jps查看进程是否起来
查看各个主机状态是否正常
zkServer.sh status
ha高可用搭建
1、修改hdfs-site.xml里的配置信息
1.1 配置名称服务的逻辑名称:
1.2 配置两个namenode的唯一标识符
<property>
<name>dfs.ha.namenodes.supercluster</name>
<value>nn1,nn2</value>
</property>
1.3 针对于每一个唯一标识符的namenode,设置完整的rpc地址和端口。
<property>
<name>dfs.namenode.rpc-address.supercluster.nn1</name>
<value>master:8020</value>
</property>
<property>
<name>dfs.namenode.rpc-address.supercluster.nn2</name>
<value>slave1:8020</value>
</property>
1.4 针对于每一个唯一标识符的namenode,配置http协议的地址和端口。
<property>
<name>dfs.namenode.http-address.supercluster.nn1</name>
<value>master:50070</value>
</property>
<property>
<name>dfs.namenode.http-address.supercluster.nn2</name>
<value>slave1:50070</value>
</property>
1.5 配置journalnode的服务器地址和存储目录(数目为奇数个)
<!-- 服务器地址使用分号“;”作为分隔符-->
<property>
<name>dfs.namenode.shared.edits.dir</name>
<value>qjournal://master:8485;slave1:8485;slave2:8485/journalData</value>
</property>
1.6 指定客户端连接Active的namenode节点的java类型
<property>
<name>dfs.client.failover.proxy.provider.supercluster</name>
<value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>
</property>
1.7 配置防护机制、免密登陆、免密超时时间
<!--为了保证系统的正确性,在任何时间只有一个NameNode处于Active状态,需要配置一个防护机制 -->
<property>
<name>dfs.ha.fencing.methods</name>
<value>sshfence</value>
</property>
<!--为了使该防护选项起作用,它必须能够在不提供密码的情况下SSH到目标节点。因此,还必须配置以下属性-->
<property>
<name>dfs.ha.fencing.ssh.private-key-files</name>
<value>/root/.ssh/id_rsa</value>
</property>
<!-- 免密登陆超时时间,超过此时间未连接上,则登陆失败,此配置可选-->
<property>
<name>dfs.ha.fencing.ssh.connect-timeout</name>
<value>30000</value>
</property>
1.8 修改支持动容灾属性
<property>
<name>dfs.ha.automatic-failover.enabled</name>
<value>true</value>
</property>
2、在core-site.xml文件里修改部分属性
2.1 修改fs.defaultFS的属性值为名称服务的逻辑名称
<!--注意:是修改,修改,修改原属性的值不是追加,亲-->
<property>
<name>fs.defaultFS</name>
<value>hdfs://supercluster</value>
</property>
2.2 定义journalnode进程的数据存储的父路径(目录在上面已经定义好了的:journalData)
<property>
<name>dfs.journalnode.edits.dir</name>
<value>/opt/apps/hadoop/tmp</value>
</property>
2.3 添加zookeeper服务器
<property>
<name>ha.zookeeper.quorum</name>
<value>master:2181,slave1:2181,slave2:2181</value>
</property>
3、将配置信息分发到其他节点上
[root@master ~]# scp /opt/apps/hadoop/etc/hadoop/* slave1:/opt/apps/hadoop/etc/hadoop/
[root@master ~]# scp /opt/apps/hadoop/etc/hadoop/* slave2:/opt/apps/hadoop/etc/hadoop/
4、启动HA
4.1. 启动三个节点上的journalnode服务,(请注意,如果集群启动了,先把集群stop掉)
[root@master ~]# hadoop-daemon.sh start journalnode
[root@slave1 ~]# hadoop-daemon.sh start journalnode
[root@slave2 ~]# hadoop-daemon.sh start journalnode
4.2. 启动以前节点上的namenode进程
[root@master ~]# hadoop-daemon.sh start namenode
4.3. 在新的namenode节点上拉取镜像文件
[root@slave1 ~]# hdfs namenode -bootstrapStandby
4.4. 同步日志到journalnode集群
–先关namenode
[root@master ~]# hadoop-daemon.sh stop namenode
--再同步日志
[root@master ~]# hdfs namenode -initializeSharedEdits
4.5. 格式化zkfc
-
1、前提QuorumPeerMain服务必须处于开启状态,客户端zkfc才能格式化成功
zkServer.sh start 开启[root@master ~]# zkServer.sh start [root@slave1 ~]# zkServer.sh start [root@slave2 ~]# zkServer.sh start - 2、选择其中一个namenode节点进行格式化zkfc [root@master ~]# hdfs zkfc -formatZK
4.6. 你就可以快乐的开启HA集群进行测试了
[root@master ~]# start-all.sh
4.7自动容灾测试
-
-
kill掉Active的namenode,模拟宕机
kill 进程IDjps 查看进程 namenode前面的号码 kill 8462
-
-
-
查看另一个Standby的namenode,你会发现已经转为Active了
hdfs haadmin -getServiceState nn1
-
#注意如果不能切换到active状态,请检查zkfc的日志文件,如果出现warn:PATH=$PATH:/sbin:/usr/sbin fuser -v -k -n tcp 8090 via ssh: bash: fuser: 未找到命令
一般是因为centos采取的是最小安装并没有fuser这个东西,使用yum install psmisc安装在有那么namenode的机器上下载,后重启ha集群,再测试成功。
注意!!:以后开HA集群时,要先开zookeeper服务,再开HDFS。
有任何问题可关注我与我交流哦!🙂