Terry's blog

Focus on bigdata and cloud.

博客园 首页 新随笔 联系 订阅 管理
描述:鉴于本地电脑内存限制,采用三台虚机安装此环境。 主机名,分别为master、slave1、slave2. zookeeper分别安装这三台机器上,master和slave1做主从备份, slave1和slave2是DataNode, slave1充当了master和slave的角色。

 

集群规划:

主机名 IP 安装的软件 运行的进程
master 192.168.1.201 jdk、hadoop、zookeeper NameNode、ResourceManager、DFSZKFailoverController(zkfc)、QuorumPeerMain
slave1 192.168.1.202 jdk、hadoop、zookeeper NameNode、ResourceManager、DFSZKFailoverController(zkfc)、          DataNode、  NodeManager、JournalNode、QuorumPeerMain

slave2 192.168.1.206 jdk、hadoop、zookeeper DataNode、NodeManager、JournalNode、QuorumPeerMain

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

 

关键搭建步骤:
  1.安装配置zooekeeper集群(在master上)
1.1解压
tar -zxvf zookeeper-3.4.10.tar.gz -C /zookeeper/
1.2修改配置
cd /itcast/zookeeper-3.4.10/conf/
cp zoo_sample.cfg zoo.cfg
vim zoo.cfg
修改:dataDir=dataDir=/home/zookeeper/data
在最后添加:
server.1=slave1:2888:3888
server.2=slave2:2888:3888
server.3=master:2888:3888
保存退出
然后创建一个data文件夹
mkdir /home/zookeeper/data
再创建一个空文件
touch /home/zookeeper/data/myid
里面保存相应的id值,即3
1.3将配置好的zookeepe整个目录拷贝到其他节点(slave1,slave2)
scp -r/home/zookeeper/ root@slave1:/home/
scp -r/home/zookeeper/ root@slave2:/home/
注意:修改slave1、slave2对应/home/zookeeper/myid内容分别为1,2
   2.安装配置hadoop集群(在master上操作) 2.1解压 tar -zxvf hadoop-2.7.4.tar.gz -C /usr/local/hadoop/ 2.2配置HDFS(hadoop2.0所有的配置文件都在$HADOOP_HOME/etc/hadoop目录下) #将hadoop添加到环境变量中 vim /etc/profile export JAVA_HOME=/usr/local/jdk1.8.0_144 export HADOOP_HOME=/usr/local/hadoop export PATH=$PATH:$JAVA_HOME/bin:$HADOOP_HOME/bin #hadoop2.0的配置文件全部在$HADOOP_HOME/etc/hadoop下 cd /usr/local/hadoop/etc/hadoop 2.2.1修改hadoo-env.sh export JAVA_HOME=/usr/local/jdk1.8.0_144 2.2.2修改core-site.xml <configuration> <property> <name>fs.defaultFS</name> <value>hdfs://ns1</value> </property> <property> <name>hadoop.tmp.dir</name> <value>file:/usr/local/hadoop/tmp2</value> </property> <property> <name>ha.zookeeper.quorum</name> <value>slave1:2181,slave2:2181,master:2181</value> </property> </configuration> 2.2.3修改hdfs-site.xml   <configuration>       <property> <name>dfs.namenode.name.dir</name> <value>file:/usr/local/hadoop/tmp2/dfs/name</value> </property> <property> <name>dfs.datanode.data.dir</name> <value>file:/usr/local/hadoop/tmp2/dfs/data</value> </property> <!--指定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>master:9000</value> </property> <!-- nn1的http通信地址 --> <property> <name>dfs.namenode.http-address.ns1.nn1</name> <value>master:50070</value> </property> <!-- nn2的RPC通信地址 --> <property> <name>dfs.namenode.rpc-address.ns1.nn2</name> <value>slave1:9000</value> </property> <!-- nn2的http通信地址 --> <property> <name>dfs.namenode.http-address.ns1.nn2</name> <value>slave2:50070</value> </property> <!-- 指定NameNode的元数据在JournalNode上的存放位置 --> <property> <name>dfs.namenode.shared.edits.dir</name> <value>qjournal://slave1:8485;slave2:8485/ns1</value> </property> <!-- 指定JournalNode在本地磁盘存放数据的位置 --> <property> <name>dfs.journalnode.edits.dir</name> <value>/usr/local/hadoop/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 shell(/bin/true) </value> </property> <!-- 使用sshfence隔离机制时需要ssh免登陆 --> <property> <name>dfs.ha.fencing.ssh.private-key-files</name> <value>/home/hadoop/.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>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>master</value> </property> <property> <name>yarn.resourcemanager.hostname.rm2</name> <value>slave1</value> </property> <!-- 指定zk集群地址 --> <property> <name>yarn.resourcemanager.zk-address</name> <value>master:2181,slave1:2181,slave2:2181<</value> </property> <property> <name>yarn.nodemanager.aux-services</name> <value>mapreduce_shuffle</value> </property> </configuration> 2.2.6修改slaves slave1 slave2 2.2.7配置免密码登陆 #首先要配置master到slave1,slave2的免密码登陆 #在master上生产一对钥匙 ssh-keygen -t rsa #将公钥拷贝到其他节点,包括自己 ssh-coyp-id slave1 ssh-coyp-id slave2 2.4将配置好的hadoop拷贝到其他节点 scp -r /usr/local/hadoop/ root@slave1:/usr/local/ scp -r /usr/local/hadoop/ root@slave2:/usr/local/ ###注意:严格按照下面的步骤 2.5启动zookeeper集群(分别在master,slave1,slave2上启动zk) cd /home/zookeeper/bin/ ./zkServer.sh start #查看状态:一个leader,两个follower ./zkServer.sh status 2.6启动journalnode(分别在在slave1,slave2上执行) cd /usr/local/hadoop sbin/hadoop-daemon.sh start journalnode #运行jps命令检验,slave1,slave2上多了JournalNode进程 注意:通常配置奇数个JournalNode,否则格式化HDFS时会给出Warn, client.QuorumJournalManager: Quorum journal URI 'qjournal://slave1:8485;slave2:8485/ns1' has an even number of Journal Nodes specified. This is not recommended! 2.7格式化HDFS #在master上执行命令: bin/hdfs namenode -format #格式化后会在根据core-site.xml中的hadoop.tmp.dir配置生成个文件,这里我配置的是/usr/local/hadoop/tmp2,然后将/usr/local/hadoop/tmp2拷贝到slave1,slave2下 scp -r tmp2/ root@slave1:/usr/local/hadoop/ 2.8格式化ZK(在master上执行即可) bin/hdfs zkfc -formatZK 2.9启动HDFS(在master上执行) sbin/start-dfs.sh 2.10启动YARN sbin/start-yarn.sh 到此,hadoop-2.7.4配置完毕,可以统计浏览器访问: http://master的IP:50070 NameNode 'master:9000' (active) http://ip:50070 NameNode 'salve1的:9000' (standby) 

查看各节点(master、slave1、slave2)的进程: [root@master hadoop]# jps 32195 QuorumPeerMain 32723 DFSZKFailoverController 356 ResourceManager 1175 Jps 32441 NameNode [root@master hadoop]# [root@slave1 ~]# jps 26320 JournalNode 27060 Jps 26245 QuorumPeerMain 26470 DataNode 26726 NodeManager 26409 NameNode 26623 DFSZKFailoverController [root@slave1 ~]# [root@slave2 ~]# jps 11185 QuorumPeerMain 11266 JournalNode 11493 NodeManager 11356 DataNode 11646 Jps [root@slave2 ~]#

验证HDFS HA首先向hdfs上传一个文件 [root@master hadoop]# bin/hdfs dfs -put test/a.txt /c.txt [root@master hadoop]# bin/hdfs dfs -ls / Found 1 items -rw-r--r-- 3 root supergroup 67 2017-11-10 16:38 /c.txt 然后再kill掉active的NameNode kill -9 <pid of NN> 通过浏览器访问:http://slave1:50070 NameNode 'slave1:9000' (active) 这个时候slave1上的NameNode变成了active 在执行命令: [root@slave1 hadoop]# bin/hdfs dfs -ls / Found 1 items -rw-r--r-- 3 root supergroup 67 2017-11-10 16:38 /c.txt [root@slave1 hadoop]# 手动启动那个挂掉的NameNode sbin/hadoop-daemon.sh start namenode 通过浏览器访问:http://master:50070 NameNode 'master:9000' (standby) 验证YARN:运行一下hadoop提供的demo中的WordCount程序: [root@slave1 hadoop]# bin/hdfs dfs -put test/a.txt /input [root@slave1 hadoop]# bin/hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-2.7.4.jar wordcount /input/a.txt /mrout 17/11/13 09:51:25 INFO input.FileInputFormat: Total input paths to process : 1 

17/11/13 09:51:25 INFO mapreduce.JobSubmitter: number of splits:1
17/11/13 09:51:26 INFO mapreduce.JobSubmitter: Submitting tokens for job: job_1510302622448_0009
17/11/13 09:51:27 INFO impl.YarnClientImpl: Submitted application application_1510302622448_0009
17/11/13 09:51:27 INFO mapreduce.Job: The url to track the job: http://master:8088/proxy/application_1510302622448_0009/
17/11/13 09:51:27 INFO mapreduce.Job: Running job: job_1510302622448_0009

 

 

posted on 2017-11-10 17:53  王晓成  阅读(537)  评论(0编辑  收藏  举报