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 stop
sudo /etc/init.d/ssh start
然后使用以下方式登陆SSH:
ssh zhou@192.168.***.** zhou为192.168.***.**机器上的用户,需要输入密码。
断开连接:exit
 
1.检查是否装了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  slave3
 
rm -rf *                 #删除文件夹下所有文件
rm -rf id_dsa_*     #删除以id_dsa_名称开头的所有文件
 
共享公钥
在slave1机器上执行:
scp是远程拷贝文件,拷贝/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上还不能直接登录到slave1
c.在master主机上,cat id_dsa.pub_2 >> authorized_keys   #把slave2主机上拷贝过来的公钥共享,然后这时在slave2主机上就可以登录到master上不需要密码ssh master,但在master上还不能直接登录到slave2
d.在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

posted @ 2018-12-02 18:16  点点积累  阅读(257)  评论(0编辑  收藏  举报