hadoop ha集群搭建
一、虚拟机准备
1)克隆:原来装了一台虚拟机,现在要克隆出4台一样的虚拟机
虚拟机右击-》管理-》克隆 ,【创建完整克隆】就可以了
CentOS 64,CentOS 64-1,CentOS 64-2 ,CentOS 64-3 三台机器
2)修改网络IP:
在-1机器上
su root 进入root角色
cd /etc/sysconfig/network-script
vi ifcfg-ens33
修改IPADDR=192.168.60.127
保存退出
service network restart #重启网卡,生效
在-2机器上
su root 进入root角色
cd /etc/sysconfig/network-script
vi ifcfg-ens33
修改IPADDR=192.168.60.126
保存退出
service network restart #重启网卡,生效
在-3机器上
su root 进入root角色
cd /etc/sysconfig/network-script
vi ifcfg-ens33
修改IPADDR=192.168.60.125
保存退出
service network restart #重启网卡,生效
3)配置hosts
在第一台机器上
vi /etc/hosts
192.168.60.125 slave3
192.168.60.127 slave1
192.168.60.126 slave2
192.168.60.128 master
在第二台机器上
vi /etc/hosts
192.168.60.125 slave3
192.168.60.127 slave1
192.168.60.126 slave2
192.168.60.128 master
在第三台机器上
vi /etc/hosts
192.168.60.125 slave3
192.168.60.127 slave1
192.168.60.126 slave2
192.168.60.128 master
在第四台机器上
vi /etc/hosts
192.168.60.125 slave3
192.168.60.127 slave1
192.168.60.126 slave2
192.168.60.128 master
4)配置免密登录
yum install ssh
yum install openssh-server
yum install openssh-client
确认sshserver是否启动了:ps -e |grep ssh
如果没有则可以这样启动:sudo /etc/init.d/ssh start
ssh-server配置文件位于/ etc/ssh/sshd_config,在这里可以定义SSH的服务端口,默认端口是22,你可以自己定义成其他端口号,如222。然后重启SSH服务:sudo /etc/init.d/ssh stopsudo /etc/init.d/ssh start然后使用以下方式登陆SSH:ssh zhou@192.168.***.** zhou为192.168.***.**机器上的用户,需要输入密码。断开连接:exit1.检查是否装了SSH包 rpm -qa |grep ssh
2.没有安装SSH直接YUM安装 yum install openssh-server
3.检查SSH服务是否为开机启动 chkconfig --list sshd
4.设置开机启动SSH服务 chkconfig --level 2345 sshd on
5.重新启动下SSH服务 service sshd restart
6.验证是否启动了22端口 netstat -antp |grep sshd在三台主机上都执行命令:ssh-keygen -t dsa -P '' -f ~/.ssh/id_dsa
解释一下,ssh-keygen代表生成密钥;-t(注意区分大小写)表示指定生成的密钥类型;dsa是dsa密钥认证的意思,即密钥类型;-P用 于提供密语;-f指定生成的密钥文件。(关于密钥密语的相关知识这里就不详细介绍了,里面会涉及SSH的一些知识,如果读者有兴趣,可以自行查阅资料。)执行上面命令后:三台虚拟机的/root/.ssh/目录下,都会生成id_dsa和id_dsa.pub这两个文件其中:id_dsa是私钥,id_dsa.pub是公钥cat ~/.ssh/id_dsa.pub >> ~/.ssh/authorized_keys
这段话的意思是把公钥加到用于认证的公钥文件中,这里的authorized_keys是用于认证的公钥文件。至此无密码登录本机已设置完毕。因克隆出来的三台主机名都叫wcy,ssh连到别的机器上也不好分辨出来hostname #查看当前机器主机名hostnamectl set-hostname 主机名 #设置修改主机名使三台机器主机名与域名对应:master slave1 slave2 slave3rm -rf * #删除文件夹下所有文件rm -rf id_dsa_* #删除以id_dsa_名称开头的所有文件共享公钥在slave1机器上执行:scp id_dsa.pub root@master:/root/.ssh/id_dsa.pub_1scp是远程拷贝文件,拷贝/root/.ssh/id_dsa.pub文件,拷贝到master主机上,root是master主机的用户名,目录用:分隔,拷贝到master主机的/root/.ssh/目录上,重命名为id_dsa.pub_1在master主机上,把从slave1上拷贝过来的id_dsa.pub_1共享a.在master主机上,cat id_dsa.pub >> authorized_keys #把master上的公钥共享,>>是cat 1 >>2 ,是把1文件内容追加到2文件里,cat 1>2,是把1文件覆盖2文件操作后,可以ssh localhost不需要密码来登录自己b.在master主机上,cat id_dsa.pub_1 >> authorized_keys #把slave1主机上拷贝过来的公钥共享,然后这时在slave1主机上就可以登录到master上不需要密码ssh master,但在master上还不能直接登录到slave1c.在master主机上,cat id_dsa.pub_2 >> authorized_keys #把slave2主机上拷贝过来的公钥共享,然后这时在slave2主机上就可以登录到master上不需要密码ssh master,但在master上还不能直接登录到slave2d.在master主机上,分发authorized_keys 文件到slave1,slave2上,让master也能直接不需要密码来登录他们scp authorized_keys root@slave1:/root/.ssh/scp authorized_keys root@slave2:/root/.ssh/这时在master上能直接ssh slave1 ssh slave2
二、安装
1.安装Zookeeper
参见zookeeper安装
2.安装hadoop
1)下载软件:hadoop-2.7.4.tar.gz
解压:tar zxvf hadoop-2.7.4.tar.gz
2)配置:
a.添加环境变量
vi /etc/profile
export HADOOP_HOME=/usr/hadoop-2.7.4
export PATH=$HADOOP_HOME/bin:$PATH
source /etc/profile
分发环境变量:
scp /etc/profile root@slave1:/etc/profile
scp /etc/profile root@slave2:/etc/profile
在各slave上source /etc/profile
b.修改配置文件(hadoop2.0所有的配置文件都在$HADOOP_HOME/etc/hadoop目录下)
cd /usr/hadoop-2.7.4/etc/hadoop
vi core-site.xml #修改核心配置文件
<configuration> <!-- 指定hdfs的nameservice为cluster --> <property> <name>fs.defaultFS</name> <value>hdfs://cluster/</value> </property> <!-- 指定hadoop临时目录,tmp这个目录需要提前建立好 --> <property> <name>hadoop.tmp.dir</name> <value>/usr/hadoop-2.7.4/tmp</value> </property> <property> <name>io.file.buffer.size</name> <value>4096</value> </property> <!-- 指定zookeeper地址 --> <property> <name>ha.zookeeper.quorum</name> <value>192.168.60.128:2181,192.168.60.127:2181,192.168.60.126:2181</value> </property> <!--多长时间创建CheckPoint NameNode截点上运行的CheckPointer 从Current文件夹创建CheckPoint;默认:0 由fs.trash .interval项指定 --> <property> <name>fs.trash.checkpoint.interval</name> <value>0</value> </property> <!--多少分钟.Trash下的CheckPoint目录会被删除,该配置服务器设置优先级大于客户端,默认:0 不删除 --> <property> <name>fs.trash.interval</name> <value>1440</value> </property> </configuration>
修改hdfs-site.xml
vi hdfs-site.xml
<configuration> <property> <name>dfs.namenode.name.dir</name> <value>/usr/hadoop-2.7.4/hdfs/name</value> </property> <property> <name>dfs.datanode.data.dir</name> <value>/usr/hadoop-2.7.4/hdfs/data</value> </property> <property> <name>dfs.replication</name> <value>1</value> </property> <property> <name>dfs.webhdfs.enabled</name> <value>true</value> </property> <property> <name>dfs.permissions</name> <value>false</value> </property> <!--nameservices逻辑名 --> <property> <name>dfs.nameservices</name> <value>cluster</value> </property> <!--设置NameNode IDs 此版本最大只支持两个NameNode --> <property> <name>dfs.ha.namenodes.cluster</name> <value>nn1,nn2</value> </property> <!-- Hdfs HA: dfs.namenode.rpc-address.[nameservice ID] rpc 通信地址 --> <property> <name>dfs.namenode.rpc-address.cluster.nn1</name> <value>master:9000</value> </property> <property> <name>dfs.namenode.rpc-address.cluster.nn2</name> <value>slave1:9000</value> </property> <!-- Hdfs HA: dfs.namenode.http-address.[nameservice ID] http 通信地址 --> <property> <name>dfs.namenode.http-address.cluster.nn1</name> <value>master:50070</value> </property> <property> <name>dfs.namenode.http-address.cluster.nn2</name> <value>slave1:50070</value> </property> <property> <name>dfs.ha.automatic-failover.enabled</name> <value>true</value> </property> <!-- 启动故障自动恢复 --> <!--==================Namenode editlog同步 ============================================ --> <!--保证数据恢复 --> <property> <name>dfs.journalnode.http-address</name> <value>0.0.0.0:8480</value> </property> <property> <name>dfs.journalnode.rpc-address</name> <value>0.0.0.0:8485</value> </property> <!--设置JournalNode服务器地址,QuorumJournalManager 用于存储editlog --> <!--格式:qjournal://<host1:port1>;<host2:port2>;<host3:port3>/<journalId> 端口同journalnode.rpc-address --> <property> <name>dfs.namenode.shared.edits.dir</name> <value>qjournal://master:8485;slave1:8485;slave2:8485/cluster</value> </property> <!-- 指定journal --> <property> <name>dfs.client.failover.proxy.provider.cluster</name> <value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value> </property> <!-- 指定 cluster 出故障时,哪个实现类负责执行故障切换 --> <property> <name>dfs.journalnode.edits.dir</name> <value>/usr/hadoop-2.7.4/journaldata/jn</value> </property> <property> <name>dfs.qjournal.start-segment.timeout.ms</name> <value>600000</value> </property> <property> <name>dfs.qjournal.select-input-streams.timeout.ms</name> <value>600000</value> </property> <property> <name>dfs.qjournal.write-txns.timeout.ms</name> <value>600000</value> </property> <!-- 指定JournalNode集群在对nameNode的目录进行共享时,自己存储数据的磁盘路径 --> <property> <name>dfs.ha.fencing.methods</name> <value>shell(/bin/true)</value> </property> <!-- 使用sshfence隔离机制时需要ssh免登陆 --> <property> <name>dfs.ha.fencing.ssh.private-key-files</name> <value>/root/.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>
修改mapred-site.xml
vi mapred-site.xml
<configuration> <property> <name>mapreduce.framework.name</name> <value>yarn</value> </property> <property> <name>mapreduce.jobtracker.http.address</name> <value>master:50030</value> </property> <property> <name>mapreduce.jobhistory.address</name> <value>master:10020</value> </property> <property> <name>mapreduce.jobhistory.webapp.address</name> <value>master:19888</value> </property> <property> <name>mapred.compress.map.output</name> <value>true</value> </property> <property> <name>yarn.app.mapreduce.am.staging-dir</name> <value>/usr/hadoop-2.7.4/yarn</value> </property> </configuration>
修改yarn-site.xml
vi yarn-site.xml
<configuration> <property> <name>yarn.resourcemanager.hostname</name> <value>master</value> </property> <property> <name>yarn.nodemanager.aux-services</name> <value>mapreduce_shuffle</value> </property> <property> <name>yarn.resourcemanager.address</name> <value>master:8032</value> </property> <property> <name>yarn.resourcemanager.scheduler.address</name> <value>master:8030</value> </property> <property> <name>yarn.resourcemanager.resource-tracker.address</name> <value>master:8031</value> </property> <property> <name>yarn.resourcemanager.admin.address</name> <value>master:8033</value> </property> <property> <name>yarn.resourcemanager.webapp.address</name> <value>master:8088</value> </property> </configuration>
修改slaves:
在配置文件目录下创建slaves文件,写入内容:
cd /usr/hadoop-2.7.4/etc/hadoop
vi slaves
slave1
slave2
修改hadoop-env.sh
vi hadoop-env.sh
export JAVA_HOME=/usr/java/jdk1.8.0_111
将配置好的hadoop打包,拷贝到slave1,slave2
tar zcvf hadoop-2.7.4.tar.gz hadoop-2.7.4
scp hadoop-2.7.4.tar.gz root@slave1:/usr
scp hadoop-2.7.4.tar.gz root@slave2:/usr
在slave1,slave2上解压包
tar zxvf hadoop-2.7.4.tar.gz
三、集群启动步骤
1.启动zookeeper集群(分别在server.1,2,3上启动zk)
zkServer.sh start 分别启动三台集群
2.启动journalnode(分别在在master、slave1、slave2上执行)
cd /usr/hadoop-2.7.4/sbin
./hadoop-daemon.sh start journalnode
三台机器上执行以上命令
用jps命令检验刚才的journalnode是否启动成功
[root@slave1 usr]# jps
3792 JournalNode
2933 QuorumPeerMain
4013 Jps
3.格式化HDFS上
在master执行命令:
cd /usr/hadoop-2.7.4/bin
hdfs namenode -format #该命令会格式化hdfs
格式化后会在根据/usr/hadoop-2.7.4/etc/hadoop/core-site.xml中hadoop.tmp.dir配置生成个文件,
这里我配置的是/usr/hadoop-2.7.4/tmp,然后将新生成的文件/usr/hadoop-2.7.4/tmp
4.格式化ZKFC(在master上执行即可)
cd /usr/hadoop-2.7.4
./bin/hdfs zkfc -formatZK
5.启动HDFS(在master上执行)
cd /usr/hadoop-2.7.4
./sbin/start-dfs.sh
6.启动YARN(分别在slave1,slave2上执行)
cd /usr/hadoop-2.7.4
./sbin/start-yarn.sh
启动后检查进程:
master
[root@master hadoop-2.7.4]# jps
3987 JournalNode
30996 NameNode
933 Jps
2635 QuorumPeerMain
31420 DFSZKFailoverController
[root@master hadoop-2.7.4]# cd /usr/zookeeper-3.4.10/
[root@master zookeeper-3.4.10]# cd bin
[root@master bin]# ll
slave1
[root@slave1 hadoop-2.7.4]# jps
3792 JournalNode
2933 QuorumPeerMain
30860 DFSZKFailoverController
1021 Jps
30687 DataNode
[root@slave1 hadoop-2.7.4]# cd /usr/zookeeper-3.4.10/bin
[root@slave1 bin]# ll
slave2
[root@slave2 hadoop-2.7.4]# jps
2946 QuorumPeerMain
65282 Jps
30346 DataNode
3775 JournalNode
停止hadoop步骤:
1.先在三台机器上分别停止zk服务
zkServer.sh stop
2.在master上./sbin/stop-all.sh
会停止master上的namenode和slave1、slave2上的datanode