参考:http://blog.csdn.net/u010270403/article/details/51444677
虚拟机中共五个centos系统,每个系统有两个用户root和hadoop:cdh1,cdh2,cdh3,cdh4,cdh5
集群规划
第一步,切换到hadoop的家目录下,把已经下载好的hadoop放到/home/hadoop/app目录下并解压(以cdh1为例)
#tar zxvf hadoop-2.6.0-cdh5.4.5.tar.gz
第二步,删除hadoop的压缩文件
# rm -rf hadoop-2.6.0-cdh5.4.5.tar.gz
第三步,配置环境变量
# vi /home/hadoop/.bash_profile(hadoop用户)
# vi /etc/profile(root用户,所有节点都需要配置)
添加:
HADOOP_HOME=/home/hadoop/app/hadoop-2.6.0-cdh5.4.5 export PATH=$PATH:$HADOOP_HOME/bin
第四步,使环境变量文件即时生效
# source /home/hadoop/.bash_profile(Hadoop用户)
# source /etc/profile(root用户)
第五步,进入~/app/hadoop-2.6.0-cdh5.4.5/etc/hadoop目录,修改配置文件
配置hadoop-env.sh
原配置JAVA_HOME改为:
export JAVA_HOME=/home/hadoop/app/jdk1.7.0_79
配置core-site.xml
添加:
<property> <name>fs.defaultFS</name> <value>hdfs://cluster1</value> </property> <!-- 这里的值指的是默认的HDFS路径 ,取名为cluster1 --> <property> <name>hadoop.tmp.dir</name> <value>/home/hadoop/data/tmp</value> </property> <!-- hadoop的临时目录,如果需要配置多个目录,需要逗号隔开,data目录需要我们自己创建 --> <property> <name>ha.zookeeper.quorum</name> <value>cdh3:2181,cdh4:2181,cdh5:2181</value> </property> <!-- 配置Zookeeper 管理HDFS -->
配置hdfs-site.xml
添加:
<property> <name>dfs.replication</name> <value>3</value> </property> <!-- 数据块副本数为3 --> <property> <name>dfs.permissions</name> <value>false</value> </property> <property> <name>dfs.permissions.enabled</name> <value>false</value> </property> <!-- 权限默认配置为false --> <property> <name>dfs.nameservices</name> <value>cluster1</value> </property> <!-- 命名空间,它的值与fs.defaultFS的值要对应,namenode高可用之后有两个namenode,cluster1是对外提供的统一入口 --> <property> <name>dfs.ha.namenodes.cluster1</name> <value>nn1,nn2</value> </property> <!-- 指定 nameService 是 cluster1 时的nameNode有哪些,这里的值也是逻辑名称,名字随便起,相互不重复即可 --> <property> <name>dfs.namenode.rpc-address.cluster1.nn1</name> <value>cdh1:9000</value> </property> <!-- CDHNode1 rpc地址 --> <property> <name>dfs.namenode.http-address.cluster1.nn1</name> <value>cdh1:50070</value> </property> <!-- CDHNode1 http地址 --> <property> <name>dfs.namenode.rpc-address.cluster1.nn2</name> <value>cdh2:9000</value> </property> <!-- CDHNode2 rpc地址 --> <property> <name>dfs.namenode.http-address.cluster1.nn2</name> <value>cdh2:50070</value> </property> <!-- CDHNode2 http地址 --> <property> <name>dfs.ha.automatic-failover.enabled</name> <value>true</value> </property> <!-- 指定NameNode的元数据在JournalNode上的存放位置 journalnode在集群规划中属于所有节点 --> <property> <name>dfs.namenode.shared.edits.dir</name> <value>qjournal://cdh1:8485;cdh2:8485;cdh3:8485;cdh4:8485;cdh5:8485/cluster1</value> </property> <!-- 指定journal --> <property> <name>dfs.client.failover.proxy.provider.cluster1</name> <value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value> </property> <!-- 指定JournalNode在本地磁盘存放数据的位置--> <property> <name>dfs.journalnode.edits.dir</name> <value>/home/hadoop/data/journaldata/jn</value> </property> <!-- 指定JournalNode集群在对nameNode的目录进行共享时,自己存储数据的磁盘路径 --> <property> <name>dfs.ha.fencing.methods</name> <value>shell(/bin/true)</value> </property> <property> <name>dfs.ha.fencing.ssh.private-key-files</name> <value>/home/hadoop/.ssh/id_rsa</value> </property> <property> <name>dfs.ha.fencing.ssh.connect-timeout</name> <value>60000</value> </property> <!-- 默认配置 --> <property> <name>dfs.namenode.handler.count</name> <value>100</value> </property>
配置slaves(配置子节点的位置,也就是datanode的位置)
YARN安装配置
配置mapred-site.xml
首先复制mapred-site文件:# cp mapred-site.xml.template mapred-site.xml
配置mapred-site.xml
添加:
<!-- 指定运行mapreduce的环境是Yarn,与hadoop1不同的地方 --> <property> <name>mapreduce.framework.name</name> <value>yarn</value> </property>
配置yarn-site.xml
添加:
<property> <name>yarn.resourcemanager.connect.retry-interval.ms</name> <value>2000</value> </property> <!-- 超时的周期 --> <property> <name>yarn.resourcemanager.ha.enabled</name> <value>true</value> </property> <!-- 打开高可用 --> <property> <name>yarn.resourcemanager.ha.automatic-failover.enabled</name> <value>true</value> </property> <!-- 启动故障自动恢复 --> <property> <name>yarn.resourcemanager.ha.automatic-failover.embedded</name> <value>true</value> </property> <property> <name>yarn.resourcemanager.cluster-id</name> <value>yarn-rm-cluster</value> </property> <!-- 给yarn cluster 取个名字yarn-rm-cluster --> <property> <name>yarn.resourcemanager.ha.rm-ids</name> <value>rm1,rm2</value> </property> <!-- 给ResourceManager 取个名字 rm1,rm2 --> <property> <name>yarn.resourcemanager.hostname.rm1</name> <value>cdh1</value> </property> <!-- 配置ResourceManager rm1 hostname --> <property> <name>yarn.resourcemanager.hostname.rm2</name> <value>cdh2</value> </property> <!-- 配置ResourceManager rm2 hostname --> <property> <name>yarn.resourcemanager.recovery.enabled</name> <value>true</value> </property> <!-- 启用resourcemanager 自动恢复 --> <property> <name>yarn.resourcemanager.zk.state-store.address</name> <value>cdh3:2181,cdh4:2181,cdh5:2181</value> </property> <!-- 配置Zookeeper地址 --> <property> <name>yarn.resourcemanager.zk-address</name> <value>cdh3:2181,cdh4:2181,cdh5:2181</value> </property> <!-- 配置Zookeeper地址 --> <property> <name>yarn.resourcemanager.address.rm1</name> <value>cdh1:8032</value> </property> <!-- rm1端口号 --> <property> <name>yarn.resourcemanager.scheduler.address.rm1</name> <value>cdh1:8034</value> </property> <!-- rm1调度器的端口号 --> <property> <name>yarn.resourcemanager.webapp.address.rm1</name> <value>cdh1:8088</value> </property> <!-- rm1 webapp端口号 --> <property> <name>yarn.resourcemanager.address.rm2</name> <value>cdh2:8032</value> </property> <!-- rm2端口号 --> <property> <name>yarn.resourcemanager.scheduler.address.rm2</name> <value>cdh2:8034</value> </property> <!-- rm2调度器的端口号 --> <property> <name>yarn.resourcemanager.webapp.address.rm2</name> <value>cdh2:8088</value> </property> <!-- rm2 webapp端口号 --> <property> <name>yarn.nodemanager.aux-services</name> <value>mapreduce_shuffle</value> </property> <property> <name>yarn.nodemanager.aux-services.mapreduce_shuffle.class</name> <value>org.apache.hadoop.mapred.ShuffleHandler</value> </property> <!-- 执行MapReduce需要配置的shuffle过程 -->
第六步,在cdh1上通过命令deploy.sh将Hadoop安装目录拷贝到其他四个节点
查看cdh2的~/app目录
在cdh1的~/tools目录下执行deploy.sh批处理命令
#./deploy.sh ~/app/hadoop-2.6.0-cdh5.4.5/ ~/app/ slave
验证cdh2的~/app目录
第七步,在cdh1的~/tools目录下通过远程命令runRemoteCmd.sh在所有节点按照目录的规划创建存储数据目录 (cdh1-cdh5)
#./runRemoteCmd.sh "mkdir -p /home/hadoop/data/name" all #./runRemoteCmd.sh "mkdir -p /home/hadoop/data/hdfs/edits" all #./runRemoteCmd.sh "mkdir -p /home/hadoop/data/datanode" all #./runRemoteCmd.sh "mkdir -p /home/hadoop/data/journaldata/jn" all #./runRemoteCmd.sh "mkdir -p /home/hadoop/data/tmp/dfs/name " all #./runRemoteCmd.sh "touch /home/hadoop/app/hadoop-2.6.0-cdh5.4.5/etc/hadoop/excludes" all #./runRemoteCmd.sh "mkdir -p /home/hadoop/data/pid" all
在cdh1的~/tools目录下执行以上批处理命令
在其他节点上验证是否创建成功,以cdh2为例
当初始化过程中出错时,要把相关目录的文件删除,然后再重新初始化
在cdh1的~/tools目录下执行以上批处理命令:
#./runRemoteCmd.sh "rm -rf /home/hadoop/data/name/*" all #./runRemoteCmd.sh "rm -rf /home/hadoop/data/hdfs/edits/*" all #./runRemoteCmd.sh "rm -rf /home/hadoop/data/datanode/*" all #./runRemoteCmd.sh "rm -rf /home/hadoop/data/journaldata/jn/*" all #./runRemoteCmd.sh "rm -rf /home/hadoop/data/tmp/*" all
第八步,集群初始化
启动所有节点上面的Zookeeper进程
在cdh3的~/tools目录下执行以上批处理命令:
#./runRemoteCmd.sh "~/app/zookeeper-3.4.5-cdh5.4.5/bin/zkServer.sh start" zookeeper
查看zookeeper进程
# ./runRemoteCmd.sh "jps" zookeeper
启动所有节点上面的journalnode进程
在cdh1的~/tools目录下执行以上批处理命令:
# ./runRemoteCmd.sh "~/app/hadoop-2.6.0-cdh5.4.5/sbin/hadoop-daemon.sh start journalnode" all
查看journalnode进程
# ./runRemoteCmd.sh "jps" all
在主节点上(cdh1)执行格式化
进入脚本目录(以下命令从文档直接复制如果出错,则手动输入即可)
# cd ~/app/hadoop-2.6.0-cdh5.4.5/bin/
Namenode格式化
# hdfs namenode –format
格式化高可用
hdfs zkfc –formatZK
启动namenode
hdfs namenode
执行完上述命令后,cdh1程序就会处于等待状态
在cdh1等待过程中,进入cdh2执行#hdfs namenode –bootstrapStandby进行数据同步,等到cdh2执行完成后,返回cdh1按住ctrl+c退出即可。
进入~/tools目录,关闭所有journalnode节点
./runRemoteCmd.sh "~/app/hadoop-2.6.0-cdh5.4.5/sbin/hadoop-daemon.sh stop journalnode" all
第九步,如果上面操作没有问题,接着可以一键启动hdfs所有相关进程
进入/home/hadoop/app/hadoop-2.6.0-cdh5.4.5/sbin目录,执行以下命令
#./start-dfs.sh
第十步,查看Hadoop进程
进入~/tools目录下,执行
./runRemoteCmd.sh "jps" all
第十一步,杀掉active的namenode,验证是否可以完成namenode的切换
在本地(window系统)C:WindowsSystem32driversetchosts目录下添加:
192.168.150.101 cdh1 192.168.150.102 cdh2 192.168.150.103 cdh3 192.168.150.104 cdh4 192.168.150.105 cdh5
在浏览器输入:http://cdh1:50070/和http://cdh2:50070/
查看两个namenode的状态
查看cdh1节点namenode的进程号
#jps
杀掉active状态的cdh1节点的namenode
#kill -9 进程id
刷新http://cdh1:50070/和http://cdh2:50070/页面
由上看出,cdh1:50070已经无法访问了,说明cdh1的namenode已经挂掉了,cdh2:50070的namenode状态已经变成了active,说明成功完成了切换。
重新启动cdh1的namenode#hdfs namenode,然后查看cdh1和cdh2两个节点namenode的状态
由上看出,cdh1启动后状态变成了standby。
第十二步,环境测试
上传文件到HDFS系统
首先新建一个文件:
在hdfs上创建一个文件目录
# hadoop dfs -mkdir /datafs
把world.txt上传到hdfs
#hadoop dfs -put ~/world.txt /datafs
查看world.txt是否上传成功
# hadoop dfs -ls /datafs
如果上面操作没有问题说明hdfs配置成功。
第十三步,启动YARN
在cdh2进入~/app/hadoop-2.6.0-cdh5.4.5/sbin/目录,执行./start-yarn.sh
本步在启动的时候,提示我cdh4、cdh5的known_hosts文件需要配置其他节点的秘钥,用scp known_hosts hadoop@cdh3:~/.ssh/拷贝一份到这两个节点即可。
在cdh1进入~/app/hadoop-2.6.0-cdh5.4.5/sbin/目录,执行./yarn-daemon.sh start resourcemanager(启动完成后cdh1和cdh2的resourcemanager就都起来了)
打开http://cdh1:8088和http://cdh2:8088两个web界面
在打开cdh1:8088界面时,会首先提示“此为standby的RM,将跳转到active的cdh2:8088”,然后会自动跳转到cdh2:8088界面
通过上述web界面提示可以看出,cdh1是RM的standby,所以杀掉cdh2的resourcemanager进程,看一下效果
# ./yarn-daemon.sh stop resourcemanager
重新查看cdh1:8088界面
重新启动cdh2的RM
#./yarn-daemon.sh start resourcemanager
然后在cdh1和cdh2上查看ResourceManager状态
#yarn rmadmin -getServiceState rm1
由上可以看出,cdh1变成了active,说明resourcemanager完成了切换。
第十四步,Wordcount示例测试
在cdh1上执行以下语句
# hadoop jar /home/hadoop/app/hadoop-2.6.0-cdh5.4.5/share/hadoop/mapreduce/hadoop-mapreduce-examples-2.6.0-cdh5.4.5.jar wordcount /datafs/world.txt /datafs/out/
登录http://cdh2:50070查看执行结果
第十五步,集群关启顺序 关闭cdh1的resourcemanager,进入cdh1节点的~/app/hadoop-2.6.0-cdh5.4.5/sbin目录,执行./yarn-daemon.sh stop resourcemanager #cd ~/app/hadoop-2.6.0-cdh5.4.5/sbin #./yarn-daemon.sh stop resourcemanager 关闭yarn(也会关闭cdh2的resourcemanager),进入cdh2节点的~/app/hadoop-2.6.0-cdh5.4.5/sbin目录,执行./stop-yarn.sh #cd ~/app/hadoop-2.6.0-cdh5.4.5/sbin # ./stop-yarn.sh 关闭HDFS,进入cdh1节点的~/app/hadoop-2.6.0-cdh5.4.5/sbin目录,执行./stop-dfs.sh # cd ~/app/hadoop-2.6.0-cdh5.4.5/sbin #./stop-dfs.sh 关闭zookeeper,进入cdh3节点的~/tools目录 #cd ~/tools/ #./runRemoteCmd.sh "~/app/zookeeper-3.4.5-cdh5.4.5/bin/zkServer.sh stop" zookeeper 查看进程,进入cdh1的~/tools目录下 #cd ~/tools/ #./runRemoteCmd.sh "jps" all 再次启动集群 启动zookeeper,进入cdh3节点的~/tools目录 #cd ~/tools/ #./runRemoteCmd.sh "~/app/zookeeper-3.4.5-cdh5.4.5/bin/zkServer.sh start" zookeeper 启动HDFS,进入cdh1节点的~/app/hadoop-2.6.0-cdh5.4.5/sbin目录,执行./start-dfs.sh # cd ~/app/hadoop-2.6.0-cdh5.4.5/sbin #./start-dfs.sh 启动YARN,进入cdh1节点的~/app/hadoop-2.6.0-cdh5.4.5/sbin目录,执行./start-yarn.sh # cd ~/app/hadoop-2.6.0-cdh5.4.5/sbin #./start-yarn.sh 启动resourcemanager,进入cdh2节点的~/app/hadoop-2.6.0-cdh5.4.5/sbin目录 # cd ~/app/hadoop-2.6.0-cdh5.4.5/sbin # ./yarn-daemon.sh start resourcemanager 查看进程,进入cdh1的~/tools目录下 #cd ~/tools/ #./runRemoteCmd.sh "jps" all
至此,hadoop 的完全分布式集群搭建完毕。
完成!