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只有一个,存在单点故障,hadoop-2.4.1解决了这个问题,有两个ResourceManager,一个是Active,一个是Standby,状态由zookeeper进行协调
安装步骤: 1.安装配置zooekeeper集群(在Slave4上) 1.1解压 [root@Master local]#tar -zxvf zookeeper-3.4.6.tar.g-C /usr/local/ [root@Master local]#mv zookeeper-3.4.6/ zookeeper 复制代码 1.2修改配置 [root@Master local]#cd /usr/local/zookeeper/conf/ [root@Master local]#cp zoo_sample.cfg zoo.cfg [root@Master local]#vim zoo.cfg 复制代码 修改: dataDir=/itcast/zookeeper/zkData 复制代码 在最后添加: server.1=Slave4:2888:3888 server.2=Slave5:2888:3888 server.3=Slave6:2888:3888 复制代码 保存退出 然后创建一个tmp文件夹 [root@Master local]#mkdir /usr/local/zookeeper/zkData 复制代码 再创建一个空文件 [root@Master local]#touch /usr/local/zookeeper/zkData/myid 复制代码 最后向该文件写入ID [root@Master local]#echo 1 > /usr/local/zookeeper/zkData/myid 复制代码 1.3将配置好的zookeeper拷贝到其他节点(首先分别在Slave5、Slave6根目录:/usr/local/) [root@Master local]#scp -r /usr/local/zookeeper/ Slave5:/usr/local/ [root@Master local]#scp -r /usr/local/zookeeper/ Slave6:/usr/local/ 复制代码 注意:修改Slave5、Slave6对应/usr/local/zookeeper/zkData/myid内容 Slave5: [root@Master local]#echo 2 > /usr/local/zookeeper/zkData/myid Slave6: [root@Master local]#echo 3 > /usr/local/zookeeper/zkData/myid 复制代码 2.安装配置hadoop集群(在Master上操作) 2.1解压 [root@Master local]#tar -zxvf hadoop-2.6.0.tar.gz -C /usr/local/ 复制代码 2.2配置HDFS(hadoop2.0所有的配置文件都在$HADOOP_HOME/etc/hadoop目录下) #将hadoop添加到环境变量中 [root@Master local]#vim /etc/profile export JAVA_HOME=/usr/local/jdk1.7 export HADOOP_HOME=/usr/local/hadoop-2.6.0 export PATH=$PATH:$JAVA_HOME/bin:$HADOOP_HOME/bin 复制代码 #hadoop2.0的配置文件全部在$HADOOP_HOME/etc/hadoop下 [root@Master local]#cd /usr/local/hadoop-2.6.0/etc/hadoop 复制代码 2.2.1修改hadoo-env.sh export JAVA_HOME=/usr/local/jdk1.7 复制代码 2.2.2修改core-site.xml <configuration> <!-- 指定hdfs的nameservice为masters --> <property> <name>fs.defaultFS</name> <value>hdfs://masters</value> </property> <!-- 指定hadoop临时目录 --> <property> <name>hadoop.tmp.dir</name> <value>/usr/local/hadoop-2.6.0/tmp</value> </property> <!-- 指定zookeeper地址 --> <property> <name>ha.zookeeper.quorum</name> <value>Slave4:2181,Slave5:2181,Slave6:2181</value> </property> </configuration> 复制代码 2.2.3修改hdfs-site.xml <configuration> <!--指定hdfs的nameservice为masters,需要和core-site.xml中的保持一致 --> <property> <name>dfs.nameservices</name> <value>masters,ns1,ns2,ns3</value> </property> <!-- Master下面有两个NameNode,分别是Master,Slave1 --> <property> <name>dfs.ha.namenodes.masters</name> <value>Master,Slave1</value> </property> <!-- Master的RPC通信地址 --> <property> <name>dfs.namenode.rpc-address.masters.Master</name> <value>Master:9000</value> </property> <!-- Master的http通信地址 --> <property> <name>dfs.namenode.http-address.masters.Master</name> <value>Master:50070</value> </property> <!-- Slave1的RPC通信地址 --> <property> <name>dfs.namenode.rpc-address.masters.Slave1</name> <value>Slave1:9000</value> </property> <!-- Slave1的http通信地址 --> <property> <name>dfs.namenode.http-address.masters.Slave1</name> <value>Slave1:50070</value> </property> <!-- 指定NameNode的元数据在JournalNode上的存放位置 --> <property> <name>dfs.namenode.shared.edits.dir</name> <value>qjournal://Slave4:8485;Slave5:8485;Slave6:8485/masters</value> </property> <!-- 指定JournalNode在本地磁盘存放数据的位置 --> <property> <name>dfs.journalnode.edits.dir</name> <value>/usr/local/hadoop-2.6.0/journal</value> </property> <!-- 开启NameNode失败自动切换 --> <property> <name>dfs.ha.automatic-failover.enabled</name> <value>true</value> </property> <!-- 配置失败自动切换实现方式 --> <property> <name>dfs.client.failover.proxy.provider.masters</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>/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 <configuration> <!-- 开启RM高可靠 --> <property> <name>yarn.resourcemanager.ha.enabled</name> <value>true</value> </property> <!-- 指定RM的cluster id --> <property> <name>yarn.resourcemanager.cluster-id</name> <value>RM_HA_ID</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>Slave2</value> </property> <property> <name>yarn.resourcemanager.hostname.rm2</name> <value>Slave3</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> <!-- 指定zk集群地址 --> <property> <name>yarn.resourcemanager.zk-address</name> <value>Slave4:2181,Slave5:2181,Slave6:2181</value> </property> <property> <name>yarn.nodemanager.aux-services</name> <value>mapreduce_shuffle</value> </property> </configuration> 复制代码 2.2.6修改slaves(slaves是指定子节点的位置,因为要在Master上启动HDFS、在Slave2启动yarn,所以Master上的slaves文件指定的是datanode的位置,slave2上的slaves文件指定的是nodemanager的位置) Slave4 Slave5 Slave6 复制代码 2.2.7配置免密码登陆 #首先要配置Master到Slave1、Slave2、Slave3、Slave4、Slave5、Slave6的免密码登陆 #在Master上生产一对钥匙 [root@Master local]#ssh-keygen -t rsa 复制代码 #将公钥拷贝到其他节点,包括自己 [root@Master local]#ssh-copy-id Master [root@Master local]#ssh-copy-id Slave1 [root@Master local]#ssh-copy-id Slave2 [root@Master local]#ssh-copy-id Slave3 [root@Master local]#ssh-copy-id Slave4 [root@Master local]#ssh-copy-id Slave5 [root@Master local]#ssh-copy-id Slave6 复制代码 #配置Slave2到Slave3、Slave4、Slave5、Slave6的免密码登陆 #在Slave2上生产一对钥匙 [root@Master local]#ssh-keygen -t rsa 复制代码 #将公钥拷贝到其他节点 [root@Master local]#ssh-copy-id Slave3 [root@Master local]#ssh-copy-id Slave4 [root@Master local]#ssh-copy-id Slave5 [root@Master local]#ssh-copy-id Slave6 复制代码 #注意:两个namenode之间要配置ssh免密码登陆,别忘了配置Slave1到Master的免登陆 在Slave1上生产一对钥匙 [root@Master local]#ssh-keygen -t rsa [root@Master local]#ssh-copy-id -i Master 复制代码 #在Slave3上生产一对钥匙 [root@Master local]#ssh-keygen -t rsa 复制代码 #将公钥拷贝到其他节点 [root@Master local]#ssh-copy-id Slave4 [root@Master local]#ssh-copy-id Slave5 [root@Master local]#ssh-copy-id Slave6 复制代码 2.4将配置好的hadoop拷贝到其他节点 [root@Master local]#scp -r /usr/local/hadoop-2.6.0/ Slave1:/usr/local/ [root@Master local]#scp -r /usr/local/hadoop-2.6.0/ Slave2:/usr/local/ [root@Master local]#scp -r /usr/local/hadoop-2.6.0/ Slave3:/usr/local/ [root@Master local]#scp -r /usr/local/hadoop-2.6.0/ Slave4:/usr/local/ [root@Master local]#scp -r /usr/local/hadoop-2.6.0/ Slave5:/usr/local/ [root@Master local]#scp -r /usr/local/hadoop-2.6.0/ Slave6:/usr/local/ 复制代码 ###注意:严格按照下面的步骤 2.5启动zookeeper集群(分别在Slave4、Slave5、Slave6上启动zk) [root@Master local]#cd /usr/local/zookeeper/bin/ [root@Master local]#./zkServer.sh start 复制代码 #查看状态:一个leader,两个follower [root@Master local]#./zkServer.sh status 复制代码 2.6启动journalnode(分别在Slave4、Slave5、Slave6上执行) [root@Master local]#cd /usr/local/hadoop-2.6.0/sbin [root@Master local]#sbin/hadoop-daemon.sh start journalnode 复制代码 #运行jps命令检验,Slave4、Slave5、Slave6上多了JournalNode进程 2.7格式化HDFS #在Master上执行命令: [root@Master local]#hdfs namenode -format 复制代码 #格式化后会在根据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/下。 [root@Master local]#scp -r tmp/ Slave1:/usr/local/hadoop-2.6.0/ 复制代码 2.8格式化ZK(在Master上执行即可) [root@Master local]#hdfs zkfc -formatZK 复制代码 2.9启动HDFS(在Master上执行) [root@Master local]#sbin/start-dfs.sh 复制代码 2.10启动YARN(#####注意#####:是在Slave2上执行start-yarn.sh,把namenode和resourcemanager分开是因为性能问题,因为他们都要占用大量资源,所以把他们分开了,他们分开了就要分别在不同的机器上启动) [root@Master local]#Slave2:${HADOOP_HOME}/sbin/start-yarn.sh [root@Master local]#Slave3:${HADOOP_HOME}/sbin/yarn-daemon.sh start resourcemanager 复制代码 到此,hadoop-2.6.0配置完毕,可以统计浏览器访问: http://192.168.80.100:50070 NameNode 'Master:9000' (active) http://192.168.80.101:50070 NameNode 'Slave1:9000' (standby) 复制代码 验证HDFS HA 首先向hdfs上传一个文件 [root@Master local]#hadoop fs -put /etc/profile /profile [root@Master local]#hadoop fs -ls / 复制代码 然后再kill掉active的NameNode [root@Master local]#kill -9 <pid of NN> 复制代码 通过浏览器访问: http://192.168.80.101:50070 NameNode 'Slave1:9000' (active) 这个时候Slave1上的NameNode变成了active 在执行命令: [root@Master local]#hadoop fs -ls / -rw-r--r-- 3 root supergroup 1926 2014-02-06 15:36 /profile 复制代码 刚才上传的文件依然存在!!! 手动启动那个挂掉的NameNode [root@Master local]#sbin/hadoop-daemon.sh start namenode 复制代码 通过浏览器访问: http://192.168.80.101:50070 NameNode 'Master:9000' (standby) 复制代码 验证YARN: 运行一下hadoop提供的demo中的WordCount程序: [root@Master local]#hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-2.4.1.jar wordcount /profile /out 复制代码 hadoop HA集群搭建完成 hbase-0.98.9-hadoop2 搭建 4.1 解压缩,并重命名 [root@Master local]#mv hbase-** hbase 复制代码 修改环境变量: export HBASE_HOME=/usr/local/hbase export PATH= .:$PATH:$HBASE_HOME/bin: 复制代码 保存,退出。 执行 source /etc/profile 生效 4.1 修改HBase的配置文件#HBASE_HOME/conf/hbase-env.sh 修改内容如下: export JAVA_HOME=usr/local/jdk/ export HBASE_MANAGES_ZK=true //HBase是否管理它自己的ZooKeeper的实例。 复制代码 保存,退出。 4.2 修改HBase的配置文件#HBASE_HOME/conf/hbase-site.xml,修改内容如下: <property> <name>hbase.rootdir</name> <value>hdfs://Master:9000/hbase</value> </property> <property> <name>hbase.cluster.distributed</name> <value>true</value> </property> <property> <name>hbase.zookeeper.quorum</name> <value>Master</value> </property> <property> <name>dfs.replication</name> <value>3</value> </property> 复制代码 注意:$HBASE_HOME/conf/hbase-site.xml的hbase.rootdir的主机和端口号与$HADOOP_HOME/conf/core-site.xml的fs.default.name的主机和端口号一致 4.3 (可选)文件 regionservers 的内容修改为Master. 4.4 执行目录到../bin ,执行命令 start-hbase.sh ******启动hbase之前,确保hadoop是运行正常的。并且可以写入文件。 4.5 验证:(1)执行jps ,发现新增加了3个Havana进程,分别是HMaster、HRegionServer、HQuorumPeer (HQuorumPeerMain 是ZooKeeper的进程 ) 备注:启动HBase时,请先执行 /usr/local/zookeeper/bin zkServer.sh stop 停止ZooKeeper的进程,以免hbase启动失败。 (2)通过浏览器查看: http://masters:60010 5.HBase的集群安装(在原来的Master上的hbase伪分布基础上搭建): 5.1 集群结构,主节点(hmaster)是Master,从节点(region server)是Slave1,Slave2,Slave3. 5.2 修改hadoop0上的hbase的几个文件 (1)修改hbase-env.sh 最后一行 export HBASE_MANAGES_ZK=false. (2)修改hbase-site.xml文件的 hbase.zookeeper.quorum 的值为 Master,Slave1,Slave2,Slave3 。 (3)修改regionservers文件(存放的 region server的hostname ),内容修改成 Slave1,Slave2,Slave3 。 5.3 复制Master中的hbase到Slave1,Slave2,Slave3的对应目录下,并复制、Master 的/etc/profile文件到hadoop1 、hadoop2 中。 [root@Master local]#scp -r hbase Slave1:/usr/local/ [root@Master local]#scp -r /etc/profile Slave1:/etc/profile [root@Master local]#source /etc/profile 复制代码 5.4 在HA集群中,首先各个节点启动ZooKeeper集群,其次 Master中启动hadoop集群,最后在Master上启动hbase集群。 6.测试Hbase是否启动正常: 1) 在Master主机中执行jps,查看进程。会新增一个 HMaster 进程 2) 在regionserver 中执行 jps,新增 HRegionServer。 7.执行hbase脚本命令: [root@Slave2 local]# hbase shell 复制代码