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集群搭建完成