完全分布式部署介绍
学习目标
完全分部式是真正利用多台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。 作为一个ZK集群的客户端,用来监控NN的状态信息。每个运行NN的节点必须要运行一个zkfc。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状态。3)NameNode HA数据共享方法
Namenode主要维护两个文件,一个是fsimage,一个是editlog。 fsimage保存了最新的元数据检查点,包含了整个HDFS文件系统的所有目录和文件的信息。对于文件来说包括了数 据块描述信息、修改时间、访问时间等;对于目录来说包括修改时间、访问权限控制信息(目录所属用户,所在组) 等。 editlog主要是在NameNode已经启动情况下对HDFS进行的各种更新操作进行记录,HDFS客户端执行所有的写操作 都会被记录到editlog中。 上面在Active Namenode与StandBy Namenode之间的绿色区域就是JournalNode,当然数量不一定只有1个,作用 相当于NFS共享文件系统,Active Namenode往里写editlog数据,StandBy再从里面读取数据进行同步。 两个NameNode为了数据同步,会通过一组称作JournalNodes的独立进程进行相互通信。当active状态的 NameNode的命名空间有任何修改时,会告知大部分的JournalNodes进程。standby状态的NameNode有能力读取 JNs中的变更信息,并且一直监控edit log的变化,把变化应用于自己的命名空间。standby可以确保在集群出错时, 命名空间状态已经完全同步了。 集群启动时,可以同时启动2个NameNode。这些NameNode只有一个是active的,另一个属于standby状态。 active状态意味着提供服务,standby状态意味着处于休眠状态,只进行数据同步,时刻准备着提供服务 部署规划
实施
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 Zookeeper的核心是原子广播,这个机制保证了各个Server之间的同步。实现这个机制的协议叫做Zab协议。Zab协 议有两种模式,它们分别是恢复模式(选主)和广播模式(同步)。 当服务启动或者在领导者崩溃后,Zab就进入了恢复模式,当领导者被选举出来,且大多数Follower完成了和leader 的状态同步以后,恢复模式就结束了。状态同步保证了leader和Follower具有相同的系统状态。 如下图所示: 该ZooKeeper集群当中一共有5台服务器,有两种角色Leader和Follwer,5台服务器连通在一起,客户端又分别连在 不同的ZK服务器上。 如果当数据通过客户端1,在左边第一台Follower服务器上做了一次数据变更,它会把这个数据的变化同步到其他所 有的服务器,同步结束之后,那么其他的客户端都会获得这个数据的变化。 Zookeeper是一个由多个server组成的集群,一个leader,多个follower,每个server保存一份数据副本,全局数据 一致、分布式读写,更新请求转发,由leader实施。
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