hadoop HA部署
说明:
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状态
2.hadoop-2.2.0中依然存在一个问题,就是ResourceManager只有一个,存在单点故障,hadoop2.5.1开启RM高用后可以解决这个问题,有两个ResourceManager,一个是Active,一个是Standby,状态由zookeeper进行协调
集群规划:
主机名 IP地址 安装的软件 运行的进程
node1 192.168.40.143 jdk,hadoop NameNode,DFSZKFailoverController
node2 192.168.40.144 jdk,hadoop,zookeeper NameNode,DFSZKFailoverController,DataNode,NodeManager,QuorumPeerMain,JournalNode
node3 192.168.40.145 jdk,hadoop,zookeeper DataNode,NodeManager,ResourceManager,QuorumPeerMain,JournalNode
node4 192.168.40.140 jdk,hadoop,zookeeper DataNode,NodeManager,ResourceManager,QuorumPeerMain,JournalNode
1.准备环境,四台虚拟机,64位CentOS6.5系统,hadoop版本2.5.1
192.168.40.143
192.168.40.144
192.168.40.145
192.168.40.140
2.配置hosts
在/etc/hosts下配置端口映射
192.168.40.143 node1
192.168.40.144 node2
192.168.40.145 node3
192.168.40.140 node4
3.安装jdk1.7.0_79
4.建立hadoop运行账号hello(四台机器一样)
5.使用hadoop用户操作:ssh远程免密码登陆
6.在node2,node3,node4上安装zookeeper(详细安装步骤略,见前面文章)
7.安装配置hadoop集群(在node1上操作)
7.1下载并解压hadoop安装包
tar -zxvf hadoop-2.5.1-x64.tar.gz
7.2修改配置文件(hadoop2.0所有的配置文件都在$HADOOP_HOME/etc/hadoop目录下)
#将hadoop添加到环境变量中
vim /etc/profile
export HADOOP_HOME=/home/hello/app/hadoop-2.5.1
export PATH=$PATH:$JAVA_HOME/bin:$HADOOP_HOME/bin
7.2.1修改core-site.xml
<configuration>
<!-- 指定hdfs的nameservice为ns1 -->
<property>
<name>fs.defaultFS</name>
<value>hdfs://ns1/</value>
</property>
<!-- 指定hadoop临时目录,tmp这个目录需要提前建立好 -->
<property>
<name>hadoop.tmp.dir</name>
<value>/home/hello/app/hadoop-2.5.1/tmp</value>
</property>
<!-- 指定zookeeper地址 -->
<property>
<name>ha.zookeeper.quorum</name>
<value>node2:2181,node3:2181,node4:2181</value>
</property>
</configuration>
7.2.2修改hdfs-site.xml
<configuration>
<!--指定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>node1:9000</value>
</property>
<!-- nn1的http通信地址 -->
<property>
<name>dfs.namenode.http-address.ns1.nn1</name>
<value>node1:50070</value>
</property>
<!-- nn2的RPC通信地址 -->
<property>
<name>dfs.namenode.rpc-address.ns1.nn2</name>
<value>node2:9000</value>
</property>
<!-- nn2的http通信地址 -->
<property>
<name>dfs.namenode.http-address.ns1.nn2</name>
<value>node2:50070</value>
</property>
<!-- 指定NameNode的元数据在JournalNode上的存放位置 -->
<property>
<name>dfs.namenode.shared.edits.dir</name>
<value>qjournal://node2:8485;node3:8485;node4:8485/ns1</value>
</property>
<!-- 指定JournalNode在本地磁盘存放数据的位置 -->
<property>
<name>dfs.journalnode.edits.dir</name>
<value>/home/hello/app/hadoop-2.5.1/journaldata</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
shell(/bin/true)
</value>
</property>
<!-- 使用sshfence隔离机制时需要ssh免登陆 -->
<property>
<name>dfs.ha.fencing.ssh.private-key-files</name>
<value>/home/hello/.ssh/id_rsa</value>
</property>
<!-- 配置sshfence隔离机制超时时间 -->
<property>
<name>dfs.ha.fencing.ssh.connect-timeout</name>
<value>30000</value>
</property>
</configuration>
7.2.3修改mapred-site.xml
<configuration>
<!-- 指定mr框架为yarn方式 -->
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
</configuration>
7.2.4修改yarn-site.xml
<configuration>
<!-- 开启RM高可用 -->
<property>
<name>yarn.resourcemanager.ha.enabled</name>
<value>true</value>
</property>
<!-- 指定RM的cluster id -->
<property>
<name>yarn.resourcemanager.cluster-id</name>
<value>yrc</value>
</property>
<!-- 指定RM的名字 -->
<property>
<name>yarn.resourcemanager.ha.rm-ids</name>
<value>rm1,rm2</value>
</property>
<!-- 分别指定RM的地址 -->
<property>
<name>yarn.resourcemanager.hostname.rm1</name>
<value>node3</value>
</property>
<property>
<name>yarn.resourcemanager.hostname.rm2</name>
<value>node4</value>
</property>
<!-- 指定zk集群地址 -->
<property>
<name>yarn.resourcemanager.zk-address</name>
<value>node2:2181,node3:2181,node4:2181</value>
</property>
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
</configuration>
7.2.5修改slaves
node2
node3
node4
7.2.6修改hadoop-env.sh
export JAVA_HOME=/usr/java/jdk1.7.0_79
7.2.7修改yarn-env.sh
export JAVA_HOME=/usr/java/jdk1.7.0_79
7.3将配置好的hadoop拷贝到其他节点
scp -r ./hadoop-2.5.1 [email protected]:/home/hello/app/
scp -r ./hadoop-2.5.1 [email protected]:/home/hello/app/
scp -r ./hadoop-2.5.1 [email protected]:/home/hello/app/
###注意:严格按照下面的步骤
8.启动集群
8.1启动zookeeper集群(分别在node2、node3、node4上启动zk)
cd /home/hello/app/zookeeper-3.4.7
./bin/zkServer.sh start
#查看状态:一个leader,两个follower
./bin/zkServer.sh status
8.2启动journalnode(分别在在node2、node3、node4上执行)
cd /weekend/hadoop-2.5.1
./sbin/hadoop-daemon.sh start journalnode
#运行/usr/java/jdk1.7.0_79/bin/jps命令检验,node2、node3、node4上多了JournalNode进程
8.3格式化HDFS
#在node1上执行命令:
./bin/hdfs namenode -format
#格式化后会在根据core-site.xml中的hadoop.tmp.dir配置生成个文件,这里我配置的是/home/hello/app/hadoop-2.5.1/tmp,
#然后将/home/hello/app/hadoop-2.5.1/tmp拷贝到node2的/home/hello/app/hadoop-2.5.1/下。
scp -r ./tmp/ [email protected]:/home/hello/app/hadoop-2.5.1/
##也可以这样,建议hdfs namenode -bootstrapStandby
8.4格式化ZKFC(在node1上执行即可)
./bin/hdfs zkfc -formatZK
8.5启动HDFS(在node1上执行)
./sbin/start-dfs.sh
8.6启动YARN(分别在node3,node4上执行)
./sbin/start-yarn.sh
测试集群工作状态的一些指令:
./bin/hdfs dfsadmin -report 查看hdfs的各节点状态信息
./bin/hdfs haadmin -getServiceState nn1 查看namenode高可用
./bin/yarn rmadmin –getServiceState rm1 查看ResourceManager高可用
./sbin/hadoop-daemon.sh start namenode 单独启动一个namenode进程
./hadoop-daemon.sh start zkfc 单独启动一个zkfc进程