完全分布式部署介绍
学习目标
完全分部式是真正利用多台Linux主机来进行部署Hadoop,对Linux机器集群进行规划,使得Hadoop各个模块分别 部署在不同的多台机器上。 能够了解完全分布式部署场景二、NameNode HA+完全分布式部署
学习目标
能够了解HA+完成分布式部署场景 能够对HA+完全分布式部署架构规划 能够对HA+完全分布式部署进行配置 预备知识1)什么是HA?
HA的意思是High Availability高可用,指当当前工作中的机器宕机后,会自动处理这个异常,并将工作无缝地转移到 其他备用机器上去,以来保证服务的高可用。 HA方式安装部署才是最常见的生产环境上的安装部署方式。Hadoop HA是Hadoop 2.x中新添加的特性,包括 NameNode HA 和 ResourceManager HA。因为DataNode和NodeManager本身就是被设计为高可用的,所以不用 对他们进行特殊的高可用处理。2)NameNode HA切换实现方法
Hadoop2.X对NameNode进行一个抽象:NameService 一个NameService下面有两个NameNode,分别处于Active 和Standby状态。 通过Zookeeper进行协调选举,确保只有一个活跃的NameNode。 一旦主(Active)宕掉,standby会切换成Active。![](/i/l/?n=23&i=blog/1286512/202303/1286512-20230310224950184-185950352.png)
zkfc提供以下功能:
Health monitoring
zkfc定期对本地的NN发起health-check的命令,如果NN正确返回,那么这个NN被认为是OK的。否则被认为是失效 节点。ZooKeeper session management
当本地NN是健康的时候,zkfc将会在zk中持有一个session。如果本地NN又正好是active的,那么zkfc还有持有一 个"ephemeral"的节点作为锁,一旦本地NN失效了,那么这个节点将会被自动删除。ZooKeeper-based election
如果本地NN是健康的,并且zkfc发现没有其他的NN持有那个独占锁。那么他将试图去获取该锁,一旦成功,那么它 就需要执行Failover,然后成为active的NN节点。Failover的过程是:第一步,对之前的NN执行fence,如果需要的 话。第二步,将本地NN转换到active状态。![](/i/l/?n=23&i=blog/1286512/202303/1286512-20230310225151083-1059584663.png)
3)NameNode HA数据共享方法
Namenode主要维护两个文件,一个是fsimage,一个是editlog。 fsimage保存了最新的元数据检查点,包含了整个HDFS文件系统的所有目录和文件的信息。对于文件来说包括了数 据块描述信息、修改时间、访问时间等;对于目录来说包括修改时间、访问权限控制信息(目录所属用户,所在组) 等。 editlog主要是在NameNode已经启动情况下对HDFS进行的各种更新操作进行记录,HDFS客户端执行所有的写操作 都会被记录到editlog中。![](/i/l/?n=23&i=blog/1286512/202303/1286512-20230310225427307-289565570.png)
![](/i/l/?n=23&i=blog/1286512/202303/1286512-20230310225522831-1604457269.png)
![](/i/l/?n=23&i=blog/1286512/202303/1286512-20230310225540454-2111731849.png)
![](/i/l/?n=23&i=blog/1286512/202303/1286512-20230310225602501-1958558626.png)
实施
1)系统时间同步[root@localhost ~]#ntpdate time1.aliyun.com12)设置主机IP及名称解析 把/etc/hosts文件复制到所有集群主机
[root@localhost ~]#vim /etc/hosts 192.168.208.5 hd1 192.168.208.10 hd2 192.168.208.20 hd3 192.168.208.30 hd4 192.168.208.40 hd5 192.168.208.50 hd63)关闭防火墙及Selinux
[root@localhost ~]# systemctl stop firewalld [root@localhost ~]# systemctl disable firewalld [root@localhost ~]# sed -ri 's/SELINUX=enforcing/SELINUX=disabled/' /etc/selinux/config4)部署JDK
[root@localhost ~]#firefox http://download.oracle.com [root@localhost ~]#tar xf jdk-8u191-linux-x64.tar.gz -C /usr/local [root@localhost ~]#mv /usr/local/jdk1.8 /usr/local/jdk5)SSH免密登录 把密钥复制到所有主机
[root@localhost ~]#ssh-keygen -t rsa -f /root/.ssh/id_rsa -P '' [root@localhost ~]#cd /root/.ssh [root@localhost ~]#cp id_rsa.pub authorized_keys [root@localhost ~]#for i in hd2 hd3 hd4 hd5 hd6;do scp -r /root/.ssh $i:/root;done6)zookeeper部署 6.0)zookeeper作用 ZooKeeper 是为分布式应用程序提供高性能协调服务的工具集合,译名为“动物园管理员”。 分布式应用程序可以基于它实现配置维护、命名服务、分布式同步、组服务等。 是 Hadoop集群管理的一个必不可少的模块,它主要用来解决分布式应用中经常遇到的数据管理问题,如集群管理、 统一命名服务、分布式配置管理、分布式消息队列、分布式锁、分布式协调等。 在ZooKeeper集群当中,集群中的服务器角色有两种Leader和Learner,Learner角色又分为Observer和Follower
![](/i/l/?n=23&i=blog/1286512/202303/1286512-20230310230816083-1876238646.png)
![](/i/l/?n=23&i=blog/1286512/202303/1286512-20230310231059298-1736909616.png)
Leader主要有三个功能
1. 恢复数据; 2. 维持与Learner的心跳,接收Learner请求并判断Learner的请求消息类型; 3. Learner的消息类型主要有PING消息、REQUEST消息、ACK消息、REVALIDATE消息,根据不同的消息类型,进 行不同的处理。Follower主要有四个功能
1. 向Leader发送请求(PING消息、REQUEST消息、ACK消息、REVALIDATE消息); 2. 接收Leader消息并进行处理; 3. 接收Client的请求,如果为写请求,发送给Leader进行投票; 4. 返回Client结果。 zookeeper部署至hdfs集群的datanode节点,此案例共3台。6.1)获取软件包
[root@localhost ~]#wget https://www-eu.apache.org/dist/zookeeper/zookeeper-3.4.13/zookeeper-3.4.13.tar.gz
6.2)部署软件包
每台服务器myid不同,需要分别修改,例如server.1对应的myid内容为1,server.2对应的myid内容为2, server.3对应的myid为3。 2888端口:follower连接到leader机器的端口 3888端口:leader选举端口[root@localhost ~]#tar xf zookeeper-3.4.13.tar.gz -C /usr/local [root@localhost ~]#mv /usr/local/zookeeper-3.4.13 /usr/local/zookeeper [root@localhost ~]#mv /usr/local/zookeeper/conf/zoo.sample.cfg /usr/local/zookeeper/conf/zoo.cfg [root@localhost ~]#vim /usr/local/zookeeper/conf/zoo.cfg data=/opt/dataserver.1=hd4:2888:3888 server.2=hd5:2888:3888 server.3=hd6:2888:3888
[root@localhost ~]#mkdir /opt/data [root@localhost ~]#echo 1 > /opt/data/myid
6.3)添加环境变量
[root@localhost ~]#vim /etc/profile.d/hadoop.sh export JAVA_HOME=/usr/local/jdk export ZOOKEEPER_HOME=/usr/local/zookeeper export PATH=${JAVA_HOME}/bin:${ZOOKEEPER_HOME}/bin:$PATH [root@localhost ~]# source /etc/profile在3台datanode节点上全部添加
6.4)验证zookeeper
需要把以上文件拷贝至3台datanode,然后全部执行开启命令[root@localhost ~]#zkServer.sh start [root@localhost ~]#zkServer.sh status
[root@localhost ~]#zkServer.sh stop
7)hadoop软件包获取
[root@localhost ~]#wget http://mirrors.tuna.tsinghua.edu.cn/apache/hadoop/common/hadoop-2.8.5/hadoop-2.8.5.tar.gz [root@localhost ~]#tar xf hadoop-2.8.5.tar.gz -C /opt
8)完全分布式(HA)配置文件修改
8.1)hadoop-env.sh
修改hadoop-env.sh 25行,mapred-env.sh 16行,yarn-env.sh 23行,针对hadoop-2.8.5版本[root@localhost ~]#vim hadoop-env.sh export JAVA_HOME=/usr/local/jdk
8.2)core-site.xml
[root@localhost ~]#vim core-site.xml <!-- 指定hdfs的nameservice为ns1 --> <property> <name>fs.defaultFS</name> <value>hdfs://ns1</value> </property> <!-- 指定hadoop临时目录 --> <property> <name>hadoop.tmp.dir</name> <value>/opt/data/tmp</value> </property> <!-- 指定zookeeper地址 --> <property> <name>ha.zookeeper.quorum</name> <value>hd4:2181,hd5:2181,hd6:2181</value> </property>
8.3)hdfs-site.xml
[root@localhost ~]#vim hdfs-site.xml <!--指定hdfs的nameservice为ns1,需要和core-site.xml中的保持一致 --> <property> <name>dfs.nameservices</name> <value>ns1</value> </property> <!-- ns1下面有两个NameNode,分别是nn1,nn2 --> <property> <name>dfs.ha.namenodes.ns1</name> <value>nn1,nn2</value> </property> <!-- nn1的RPC通信地址 --> <property> <name>dfs.namenode.rpc-address.ns1.nn1</name> <value>hd1:9000</value> </property> <!-- nn1的http通信地址 --> <property> <name>dfs.namenode.http-address.ns1.nn1</name> <value>hd1:50070</value> </property> <!-- nn2的RPC通信地址 --> <property> <name>dfs.namenode.rpc-address.ns1.nn2</name> <value>hd2:9000</value> </property> <!-- nn2的http通信地址 --> <property> <name>dfs.namenode.http-address.ns1.nn2</name> <value>hd2:50070</value> </property <!-- 指定NameNode的元数据在JournalNode上的存放位置 --> <property> <name>dfs.namenode.shared.edits.dir</name> <value>qjournal://hd4:8485;hd5:8485;hd6:8485/ns1</value> </property> <!-- 指定JournalNode在本地磁盘存放数据的位置 --> <property> <name>dfs.journalnode.edits.dir</name> <value>/opt/data/journal</value> </property> <!-- 开启NameNode失败自动切换 --> <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> <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>
8.4)配置datanode节点记录文件 slaves
[root@localhost ~]#vim slaves hd4 hd5 hd6
8.5)mapred-site.xml
[root@localhost ~]#cp /opt/hadoop285/etc/hadoop/mapred-site.xml.template /opt/hadoop285/etc/hadoop/mapred-site.xml [root@localhost ~]#vim mapred-site.xml <!-- 指定mr框架为yarn方式 --> <property> <name>mapreduce.framework.name</name> <value>yarn</value> </property
8.6)yarn-site.xml
[root@localhost ~]#vim yarn-site.xml <!-- 指定resourcemanager地址 --> <property> <name>yarn.resourcemanager.hostname</name> <value>hd3</value> </property> <!-- 指定nodemanager启动时加载server的方式为shuffle server --> <property> <name>yarn.nodemanager.aux-services</name> <value>mapreduce_shuffle</value> </property>
9)复制修改后的hadoop目录到所有集群节点
[root@localhost ~]#scp -r hadoop hdX:/opt [root@localhost ~]#scp /etc/profile.d/hadoop.sh hdX:/etc/profile.d/ [root@localhost ~]#source /etc/profile
10)在datanode节点(3台)启动zookeeper
[root@localhost ~]#zkServer.sh start
11)启动journalnode(在namenode上操作,例如hd1)
[root@localhost ~]#hadoop-daemons.sh start journalnode分别到hd4、hd5、hd6节点上进行验证
[root@localhost ~]#jps
12)格式化hdfs文件系统(在namenode上操作,例如hd1)
[root@localhost ~]#hdfs namenode -format1格式化完成后,请把/opt/data/tmp目录拷贝至hd2相应的位置,hd2将不再需要格式化,可以直接使用。
13)格式化zk(namenode上操作,例如hd1)
[root@localhost ~]#hdfs zkfc -formatZK
14)启动hdfs(namenode上操作,例如hd1)
[root@localhost ~]#start-dfs.sh
15)启动yarn(namenode上操作,例如想让hd2成为resourcemanager,需要在hd2上启动。)
[root@localhost ~]#start-yarn.sh
16)访问
NameNode1:http://hd1:50070 查看NameNode状态 NameNode2:http://hd2:50070 查看NameNode状态 NameNode3:http://hd3:8088 查看yarn状态
标签:部署,zookeeper,hadoop,sh,NameNode,root,localhost From: https://www.cnblogs.com/machangwei-8/p/17205017.html