Hadoop2.6 HA 高可靠部署 (2017.03修正,图文解说)

1.修改Linux主机名
2.修改IP
3.修改主机名和IP的映射关系
######注意######如果你们公司是租用的服务器或是使用的云主机(如华为用主机、阿里云主机等)
/etc/hosts里面要配置的是内网IP地址和主机名的映射关系
4.关闭防火墙
5.ssh免登陆
6.安装JDK,配置环境变量等

 

集群IP,角色信息   

nn =namenode

rm= resourcemanager

nm =nodemanager

dn= datanode

zk=zookeeper

jn=jonrnalnode 


172.16.11.221   mach40     nn     rm     zk

172.16.11.222   mach41     nn     rm      zk

172.16.11.223   mach42     dn      nmzk jn

172.16.11.224   mach43     dn      nm              jn

172.16.11.225   mach44     dn      nmjn

 

复制代码

 



说明:

1.在hadoop2.0中通常由两个NameNode组成,一个处于active状态,另一个处于standby状态。Active NameNode对外提供服务,而Standby NameNode则不对外提供服务,仅同步active namenode的状态,以便能够在它失败时快速进行切换。
hadoop2.0官方提供了两种HDFS HA的解决方案,一种是NFS,另一种是QJM。这里我们使用简单的QJM。在该方案中,主备NameNode之间通过一组JournalNode同步元数据信息,一条数据只要成功写入多数JournalNode即认为写入成功。通常配置奇数个JournalNode
这里还配置了一个zookeeper集群,用于ZKFC(DFSZKFailoverController)故障转移,当Active NameNode挂掉了,会自动切换Standby NameNode为standby状态

 

 

安装步骤:
1.安装配置zooekeeper集群(在mach40,mach41,mach42上)
1.1解压

1. [root@mach41]#tar -zxvf    zookeeper-3.4.6.tar.g-C /usr/local/

2. [root@mach41]#mv zookeeper-3.4.6/ zookeeper

复制代码


1.2修改配置

1. [root@mach41]#cd /usr/local/zookeeper/conf/

2. [root@mach41]#cp zoo_sample.cfg zoo.cfg

3. [root@mach41l]#vim zoo.cfg

复制代码


修改:

1. dataDir=/itcast/zookeeper/zkData

复制代码


在最后添加:

server.1=mach40:2888:3888

server.2=mach41:2888:3888

server.3=mach42:2888:3888

复制代码


保存退出
然后创建一个tmp文件夹

1. [root@mach41]#mkdir /usr/local/zookeeper/zkData

复制代码


再创建一个空文件

1. [root@mach41]#touch /usr/local/zookeeper/zkData/myid

复制代码


最后向该文件写入ID

1. [root@mach41]#echo 1 > /usr/local/zookeeper/zkData/myid

 

记得其他俩个zk服务器myid分别写入  2   、3  


1.3将配置好的zookeeper拷贝到其他节点(首先分别在Slave5、Slave6根目录:/usr/local/)

1. [root@mach41]#scp -r /usr/local/zookeeper/ mach40:/usr/local/

2. [root@mach41]#scp -r /usr/local/zookeeper/ mach42:/usr/local/

复制代码


注意:修改Slave5、Slave6对应/usr/local/zookeeper/zkData/myid内容

1. Slave5:

2. [root@Master local]#echo 2 > /usr/local/zookeeper/zkData/myid

3. Slave6:

4. [root@Master local]#echo 3 > /usr/local/zookeeper/zkData/myid

 


2.安装配置hadoop集群(在Master上操作)
2.1解压

1. [root@mach40]#tar -zxvf hadoop-2.6.0.tar.gz -C /usr/local/

复制代码


2.2配置HDFS(hadoop2.0所有的配置文件都在$HADOOP_HOME/etc/hadoop目录下)
#将hadoop添加到环境变量中

1. [root@mach40]#vim /etc/profile

2. export JAVA_HOME=/usr/jdk1.7

3. export HADOOP_HOME=/home/hadoop2.6

4. export PATH=$PATH:$JAVA_HOME/bin:$HADOOP_HOME/bin

复制代码


#hadoop2.0的配置文件全部在$HADOOP_HOME/etc/hadoop下

1. [root@mach40]#cd /usr/local/hadoop-2.6.0/etc/hadoop

复制代码


2.2.1修改hadoo-env.sh

1. export JAVA_HOME=/usr/local/jdk1.7

复制代码

 

特此声明:下面《配置文件》的IP地址 ,主机名,集群名字都是改过的,和转载原文不一样,你们要改的地方也一样(红色字体为重要地方)。

 


2.2.2修改core-site.xml

<configuration>

<!-- 指定hdfs的nameservice为masters -->

<property>

<name>fs.defaultFS</name>

<value>hdfs://Machenmaster</value>

</property>

<!-- 指定hadoop临时目录-->

<property>

<name>hadoop.tmp.dir</name>systemctl start zookeeper

<value>/home/hadoop2.6/tmp</value>

</property>

<!-- 指定zookeeper地址-->

<property>

<name>ha.zookeeper.quorum</name>

<value>172.16.11.223:2181,172.16.11.224:2181,172.16.11.225:2181</value>

</property>

</configuration>

复制代码


2.2.3修改hdfs-site.xml

<configuration>

        <!--指定hdfs的nameservice为masters,需要和core-site.xml中的保持一致-->

        <property>

                <name>dfs.nameservices</name>

                <value>Machenmaster</value>

        </property>

        <!-- Master下面有两个NameNode,分别是Master,Slave1 -->

        <property>

                <name>dfs.ha.namenodes.Machenmaster</name>

                <value>m1,m2</value>

        </property>

        <!-- Master的RPC通信地址-->

        <property>

                <name>dfs.namenode.rpc-address.Machenmaster.m1</name>

                <value>172.16.11.221:9000</value>

        </property>

        <!-- Master的http通信地址-->

        <property>

                <name>dfs.namenode.http-address.Machenmaster.m1</name>

                <value>172.16.11.221:50070</value>

        </property>

        <!-- Slave1的RPC通信地址-->

        <property>

                <name>dfs.namenode.rpc-address.Machenmaster.m2</name>

                <value>172.16.11.222:9000</value>

        </property>

        <!-- Slave1的http通信地址-->

        <property>

                <name>dfs.namenode.http-address.Machenmaster.m2</name>

                <value>172.16.11.222:50070</value>

        </property>

        <!-- 指定NameNode的元数据在JournalNode上的存放位置-->

        <property>

                <name>dfs.namenode.shared.edits.dir</name>

                <value>qjournal://172.16.11.221:8485;172.16.11.222:8485;172.16.11.223:8485/Machenmaster</value>

        </property>

        <!-- 指定JournalNode在本地磁盘存放数据的位置-->

        <property>

                <name>dfs.journalnode.edits.dir</name>

                <value>/home/hadoop2.6/journal</value>

        </property>

        <!-- 开启NameNode失败自动切换-->

        <property>

                <name>dfs.ha.automatic-failover.enabled</name>

                <value>true</value>

        </property>

        <!-- 配置失败自动切换实现方式-->

        <property>

                <name>dfs.client.failover.proxy.provider.Machenmaster</name>

                <value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>

        </property>

        <!-- 配置隔离机制方法,多个机制用换行分割,即每个机制暂用一行-->

        <property>

                <name>dfs.ha.fencing.methods</name>

                <value>sshfence</value>       //这里我要说一下,有些文档说要加入/bin/shell   没有必要

        </property>

        <!-- 使用sshfence隔离机制时需要ssh免登陆-->

        <property>

                <name>dfs.ha.fencing.ssh.private-key-files</name>

                <value>/root/.ssh/id_rsa</value>

        </property>

        <!-- 配置sshfence隔离机制超时时间-->

        <property>

                <name>dfs.ha.fencing.ssh.connect-timeout</name>

                <value>30000</value>

        </property>

</configuration>

复制代码




2.2.4修改mapred-site.xml

<configuration>

<!-- 指定mr框架为yarn方式-->

<property>

<name>mapreduce.framework.name</name>

<value>yarn</value>

</property>

</configuration>

复制代码


2.2.5修改yarn-site.xml

<property>

 

<name>yarn.resourcemanager.ha.enabled</name>

 

<value>true</value>

 

</property>

 

<property>

 

<description>Enable automatic failover.By default, it is enabled only when HA is enabled</description>

 

<name>yarn.resourcemanager.ha.automatic-failover.enabled</name>

 

<value>true</value>

 

</property>

 

<property>

 

<name>yarn.resourcemanager.ha.rm-ids</name>

 

<value>rm1,rm2</value>

 

</property>

 

<property>

 

<name>yarn.resourcemanager.zk-address</name>

 

<value>172.16.11.221:2181,172.16.11.222:2181,172.16.11.223:2181</value>

 

</property>

 

<property>

 

<name>yarn.resourcemanager.hostname.rm1</name>

 

<value>mach40</value>

 

</property>

<property>

 

<name>yarn.resourcemanager.hostname.rm2</name>

 

<value>mach41</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>

 

<property>

 

<name>yarn.resourcemanager.cluster-id</name>

 

<value>yarn-cluster</value>

 

//下面的可以不写,我是想自己指定端口,所以写上去了

 

</property>

<property>

<name>yarn.resourcemanager.address.rm1</name>

<value>mach40:8132</value>

</property>

<property>

<name>yarn.resourcemanager.address.rm2</name>

<value>mach41:8132</value>

</property>

<property>

<name>yarn.resourcemanager.scheduler.address.rm1</name>

<value>mach40:8130</value>

</property>

<property>

<name>yarn.resourcemanager.scheduler.address.rm2</name>

<value>mach41:8130</value>

</property>

<property>

<name>yarn.resourcemanager.resource-tracker.address.rm1</name>

<value>mach40:8131</value>

</property>

<name>yarn.resourcemanager.resource-tracker.address.rm2</name>

<value>mach41:8131</value>

</property>

<property>

<name>yarn.resourcemanager.webapp.address.rm1</name>

<value>mach40:8088</value>

</property>

<property>

<name>yarn.resourcemanager.webapp.address.rm2</name>

<value>mach41:8088</value>

</property>

 


2.2.6修改slaves(slaves是指定子节点的位置,因为要在Master上启动HDFS、在Slave2启动yarn,所以Master上的slaves文件指定的是datanode的位置,slave2上的slaves文件指定的是nodemanager的位置)

 

mach42

mach43

mach44

复制代码


2.2.7配置免密码登陆   <简单的偷懒版,慎重点的可以百度,这里我的很简单>


#配置mach40 。。mach44之间的免密码登陆
#在Master上生产一对钥匙

1. [root@mach40]#ssh-keygen -t rsa

复制代码


#将公钥拷贝到其他节点,包括自己

1. [root@mach40]# ssh-copy-id -i /root/.ssh/id_rsa.pub mach40

2. [root@mach40]# ssh-copy-id -i /root/.ssh/id_rsa.pub mach41

3. [root@mach40]# ssh-copy-id -i /root/.ssh/id_rsa.pub mach42

4. [root@mach40]# ssh-copy-id -i /root/.ssh/id_rsa.pub mach43

5. [root@mach40]# ssh-copy-id -i /root/.ssh/id_rsa.pub mach44

 

其他节点重复上述动作,虽然手指头疼,但是简单粗暴!

 

2.4将配置好的hadoop拷贝到其他节点

 

1. [root@mach40l]#scp -r /home/hadoop2.6/  mach41:/home

[root@mach40l]#scp -r /home/hadoop2.6/  mach42:/home

[root@mach40l]#scp -r /home/hadoop2.6/  mach43:/home

[root@mach40l]#scp -r /home/hadoop2.6/  mach44:/home

 

 

 

 

复制代码


###注意:严格按照下面的步骤
2.5启动zookeeper集群(分别在Slave4、Slave5、Slave6上启动zk)

1. [root@mach40]#cd /home/zookeeper/bin/

2. [root@mach40]#./zkServer.sh start

复制代码


#查看状态:一个leader,两个follower

 

1. [root@mach40]#./zkServer.sh status

 


2.6启动journalnode(分别在mach42,mach43,mach44上执行)

1. [root@mach42]#cd /home/hadoop2.6/sbin

2. [root@mach42]#sbin/hadoop-daemon.sh start journalnode

复制代码


#运行jps命令检验,mach42,mach43,mach44上多了JournalNode进程

 

2.7格式化ZK(在mach40上执行即可)

1. [root@mach40]#hdfs zkfc -formatZK

复制代码

--------------------------------------------------------------------------------------------------------

【第一种方式直接格式化,手动拷贝相关tmp文件 】


2.8 格式化HDFS  
#在mach40上执行命令:

1. [root@mach40]#hdfs namenode -format

此处坑爹指数  五颗星!  :

有可能第一次初始化没弄好   肯定不对 如果想第二次初始化 有两个关键点要做:

1.删除 tmp 目录下的全部文件,连TMP删了得了;

2.要把所要节点的日志 logs 全部清空

复制代码


#格式化后会在根据core-site.xml中的hadoop.tmp.dir配置生成个文件,这里我配置的是/usr/local/hadoop-2.6.0/tmp,
然后将/usr/local/hadoop-2.6.0/tmp拷贝到Slave1的/usr/local/hadoop-2.6.0/下。

1. [root@mach40]#scp   -r     /home/hadoop2.6/tmp/     mach41:/home/hadoop2.6

【第二种单独格式化 ,再启用备份NN,自动同步tmp文件 (两者均可任选其一) 】

2.8 格式化HDFS  
#在mach40上执行命令:

1. [root@mach40]#hadoop  namenode  -format  MacheMaster

2 .[root@mach41]# hdfs namenode -bootstrapStandby

3. 两个节点依次执行启动:

 [root@mach40]# hadoop-daemon.sh start namenode

 [root@mach41]# hadoop-daemon.sh start namenode

4 .再关闭:

 [root@mach40]# hadoop-daemon.sh stop namenode

 [root@mach41]# hadoop-daemon.sh stop namenode

----------------------------------------------------------------------------------------------------------------
 


2.9启动HDFS(在mach40上执行)

1. [root@mach40]#sbin/start-dfs.sh

复制代码


2.10启动YARN(#####注意#####:是在mach41上执行start-yarn.sh,把namenode和resourcemanager分开是因为性能问题,因为他们都要占用大量资源,所以把他们分开了,他们分开了就要分别在不同的机器上启动)

1. [root@mach41]#start-yarn.sh

2. [root@mach40]#sbin/yarn-daemon.sh start resourcemanager

复制代码


到此,hadoop-2.6.0配置完毕,可以统计浏览器访问:

1. http://mach40:50070

2. NameNode 'Master:9000' (active)

3. http://mach41:50070

4. NameNode 'Slave1:9000' (standby)

复制代码


验证HDFS HA
首先向hdfs上传一个文件

1. [root@mach40]#hadoop fs -put /etc/profile /profile

2. [root@mach40]#hadoop fs -ls /

复制代码


然后再kill掉active的NameNode

1. [root@mach40]#kill -9 <pid of NN>

复制代码


通过浏览器访问:http://mach41:50070
NameNode 'mach41:9000' (active)
这个时候mach41上的NameNode变成了active
在执行命令:

1. [root@mach41]#hadoop fs -ls /

2. -rw-r--r--   3 root supergroup       1926 2014-02-06 15:36 /profile

复制代码


刚才上传的文件依然存在!!!
手动启动那个挂掉的NameNode

1. [root@mach40]#sbin/hadoop-daemon.sh start namenode

 

复制代码


验证YARN:
运行一下hadoop提供的demo中的WordCount程序:

1. [root@mach40]#hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-x.x.x.jar wordcount /profile /out

复制代码


hadoop HA集群搭建完成


 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值