一、集群规划
1.主机规划
2.软件规划
jdk
centos
zookeeper
hadoop
3.用户规划
创建hadoop用户和用户组
4.目录规划
所有软件目录: /home/hadoop/app
所有数据和日志目录: /home/hadoop/data
二、安装前环境准备(所有节点)
1.禁用防火墙
[root@pc1 ~]#chkconfig iptables off
[root@pc1 ~]#reboot
[root@pc1 ~]#service iptables status
2.hosts文件检查
配置集群间的主机IP与hostname一一对应
[root@pc1 ~]# vi /etc/hosts
3.时钟同步:所有节点的时间要与当前时间一致
[root@pc1 ~]#yum install -y ntp //安装时钟同步工具
4.创建hadoop用户和用户组
设置密码
5.配置集群之间ssh免密码登录
①分别配置每个节点的免密码登录
②将所有节点的公钥id_rsa.pub拷贝到pc1节点的authorized_keys文件中
[hadoop@pc3 .ssh]$ cat ~/.ssh/id_rsa.pub | ssh hadoop@pc1 'cat >> ~/.ssh/authorized_keys'
[hadoop@pc2 .ssh]$ cat ~/.ssh/id_rsa.pub | ssh hadoop@pc1 'cat >> ~/.ssh/authorized_keys'
③然后将pc1的authorized_keys文件分发到所有节点
[hadoop@pc1 .ssh]$ scp -r authorized_keys hadoop@pc3:~/.ssh/
④赋予权限
⑥相互登录
6.在pc1安装脚本工具deploy.sh,runRemoteCmd.sh
参考http://blog.csdn.net/zoeyen_/article/details/78861971
7.创建程序安装目录和数据目录
三、集群搭建
1.安装jdk
①上传jdk1.7.0_79至/home/hadoop/app目录,解压。
②配置环境变量
③使环境变量文件生效,并查看jdk版本,出现以下信息说明安装成功
④将pc1的jdk文件分发到其他节点
[hadoop@pc1 app]$ deploy.sh jdk /home/hadoop/app/ slave // slave是pc2和pc3的共同标签
⑤在pc2和pc3上重复②③步骤
2.安装zookeeper
①上传,解压zookeeper-3.4.6.tar.gz。
②进入conf目录,修改配置文件
因为是上传在root目录下,还需要赋予zookeeper目录hadoop权限
[root@pc1 app]# chown -R hadoop:hadoop zookeeper
③修改数据目录和日志目录
④创建数据目录和日志目录
⑤创建文件 myid
进入 zkdata 文件夹,创建文件 myid ,填入 1 。这里写入的 1 ,是在 zoo.cfg 文本中的 server.1 中的 1 。
⑥添加环境变量
⑦分发到pc2,pc3节点
⑧在pc2,pc3上重复④⑤⑥步骤
⑨在主节点pc1上启动所有节点的zookeeper,查看状态和jps
3.安装配置hadoop
①上传,解压,重命名
②修改配置文件
core-site.xml
hadoop-env.sh
hdfs-site.xml
<configuration>
<property>
<name>dfs.replication</name>
<value>3</value> < 数据块副本数3 >
</property>
<property>
<name>dfs.permissions</name>
<value>false</value>
</property>
<property>
<name>dfs.permissions.enabled</name>
<value>false</value>< 权限默认配置为false >
</property>
<property>
<name>dfs.nameservices</name>
<value>cluster1</value>
< 命名空间,它的值与fs.defaultFS的值要对应,namenode高可用之后有两个namenode,cluster1是对外提供的统一入口>
</property>
<property>
<name>dfs.ha.namenodes.cluster1</name>
<value>pc1,pc2</value>
< 指定 nameService 是 cluster1 时的nameNode有哪些,这里的值也是逻辑名称,名字随便起,相互不重复即可>
</property>
<property>
<name>dfs.namenode.rpc-address.cluster1.pc1</name>
<value>pc1:9000</value>< pc1 http地址>
</property>
<property>
<name>dfs.namenode.http-address.cluster1.pc1</name>
<value>pc1:50070</value>< pc1 http地址>
</property>
<property>
<name>dfs.namenode.rpc-address.cluster1.pc2</name>
<value>pc2:9000</value>
</property>
<property>
<name>dfs.namenode.http-address.cluster1.pc2</name>
<value>pc2:50070</value>
</property>
<property>
<name>dfs.ha.automatic-failover.enabled</name>
<value>true</value>< 启动故障自动恢复>
</property>
<property>
<name>dfs.namenode.shared.edits.dir</name>
<value>qjournal://pc1:8485;pc2:8485;pc3:8485/cluster1</value>
</property>
<property>
<name>dfs.client.failover.proxy.provider.cluster1</name>
<value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>< 指定 cluster1 出故障时,哪个实现类负责执行故障切换>
</property>
<property>
<name>dfs.journalnode.edits.dir</name>
<value>/home/hadoop/data/journaldata/jn</value>
< 指定JournalNode集群在对nameNode的目录进行共享时,自己存储数据的磁盘路径 >
</property>
<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>10000</value>< 脑裂默认配置>
</property>
<property>
<name>dfs.namenode.handler.count</name>
<value>100</value>
</property>
</configuration>
slaves
mapred-site.xml
[hadoop@pc1 hadoop]$ vi mapred-site.xml
<configuration>
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
<指定运行mapreduce的环境是Yarn,与hadoop1不同的地方>
</configuration>
yarn-site.xml
[hadoop@pc1 hadoop]$ vi yarn-site.xml
<configuration>
<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>pc1</value>
</property>
<配置ResourceManager rm1 hostname>
<property>
<name>yarn.resourcemanager.hostname.rm2</name>
<value>pc2</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>pc1:2181,pc2:2181,pc3:2181</value>
</property>
<配置Zookeeper地址>
<property>
<name>yarn.resourcemanager.zk-address</name>
<value>pc1:2181,pc2:2181,pc3:2181</value>
</property>
<配置Zookeeper地址>
<property>
<name>yarn.resourcemanager.address.rm1</name>
<value>pc1:8032</value>
</property>
< rm1端口号>
<property>
<name>yarn.resourcemanager.scheduler.address.rm1</name>
<value>pc1:8034</value>
</property>
< rm1调度器的端口号>
<property>
<name>yarn.resourcemanager.webapp.address.rm1</name>
<value>pc1:8088</value>
</property>
< rm1 webapp端口号>
<property>
<name>yarn.resourcemanager.address.rm2</name>
<value>pc2:8032</value>
</property>
< rm2端口号>
<property>
<name>yarn.resourcemanager.scheduler.address.rm2</name>
<value>pc2:8034</value>
</property>
< rm2调度器的端口号>
<property>
<name>yarn.resourcemanager.webapp.address.rm2</name>
<value>pc2: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过程>
</configuration>
③添加环境变量
④向其它节点分发hadoop文件,并添加相应节点的环境变量
[hadoop@pc1 app]$ deploy.sh hadoop /home/hadoop/app/ slave
四、启动集群
1.启动所有节点的zookeeper进程
[hadoop@pc1 app]$runRemoteCmd.sh "/home/hadoop/app/zookeeper/bin/zkServer.sh start" all
2.启动所有节点的journalnode进程
[hadoop@pc1 app]$ runRemoteCmd.sh "/home/hadoop/app/hadoop/sbin/hadoop-daemon.sh start journalnode" all
3.在主节点pc1格式化并启动namenode。
[hadoop@pc1 hadoop]$ bin/hdfs namenode -format //格式化namenode
[hadoop@pc1 hadoop]$ bin/hdfs zkfc -formatZK //格式化高可用
[hadoop@pc1 hadoop]$ bin/hdfs namenode //启动namenode
4.同时在备节点pc2同步数据
[hadoop@pc2 hadoop]$ bin/hdfs namenode -bootstrapStandby
5.同步数据结束后,在pc1按Ctrl+z结束namenode进程,然后关闭所有节点journalnode
[hadoop@pc1 hadoop]$ runRemoteCmd.sh "/home/hadoop/app/hadoop/sbin/hadoop-daemon.sh stop journalnode" all
6.以上步骤成功执行,一键启动hdfs相关进程
[hadoop@pc1 hadoop]$ sbin/start-dfs.sh
7.启动yarn
主节点:
[hadoop@pc1 hadoop]$ sbin/start-yarn.sh
其它节点:
[hadoop@pc2 hadoop]$ sbin/yarn-daemon.sh start resourcemanager
8.检查resourcemanager的状态
[hadoop@pc1 hadoop]$ bin/yarn rmadmin -getServiceState rm1
[hadoop@pc1 hadoop]$ bin/yarn rmadmin -getServiceState rm2
9.在web中查看
在本地浏览器中输入连接
pc1:57770 //hdfs
pc2:50070
pc1:8088 //yarn
pc2:8088