四台kvm虚拟机搭建Hadoop HA集群

一、前言

终于搭建了四台虚拟机,正式开始搭建Hadoop集群,目前是四台虚拟分别为:
node01(192.168.122.11),node02(192.168.122.12),node03(192.168.122.13),node04(192.168.122.14)

二、集群规划

规划搭建HDFS2.X HA:
角色划分如下:

节点

NN-1

NN-2

DN

ZK

ZKFC

JNN

RM

NM

node01

node02

node03

node04

三、搭建Hadoop HA集群

1.环境准备
  • 依赖软件 ssh ,jdk
  • 环境配置:
  1. ip地址配置(静态ip)
  2. hostname配置:修改/etc/hostname
  3. hosts映射配置:修改/etc/hosts
  4. 防火墙关闭:sudo ufw disable
  5. ssh免密登陆:
    四台虚拟机运行命令ssh-keygen -t rsa -P ""生成密钥后,将node02、node03、node04的生成的id_rsa.pub公钥文件拷贝到node01里 (sudo scp id_rsa.pub node02@node02:/root/.ssh/id_rsa.pub.node02),再将这些公钥追加到node01的authorized_keys(没有该文件新建一个)文件里,最后将生成的包含四个节点的秘钥的authorized_keys 复制到node02、node03、node04的.ssh目录下(sudo scp authorized_keys node01:node02:/home/node02/.ssh/
  6. JAVA_HOME环境变量
  7. 虚拟机时间同步:
    ntpdate cn.pool.ntp.org
    hwclock --systohc
1. 安装zookeeper集群

先安装zookeeper集群是因为hadoop集群中需要配置zookeeper节点。

  • 下载安装包 zookeeper-3.4.6.tar.gz

  • 解压:tar -zxvf /opt/software/zookeeper-3.4.6.tar.gz -C home/hadoop/app/

  • 配置:
    cd /home/hadoop/app/zookeeper-3.4.6/conf/
    cp zoo_sample.cfg zoo.cfg
    vi zoo.cfg
    修改:dataDir=/home/hadoop/app/zookeeper-3.4.6/tmp
    在最后添加:
    server.1=node02:2888:3888
    server.2=node03:2888:3888
    server.3=node04:2888:3888
    保存退出
    然后创建一个tmp文件夹
    mkdir /home/hadoop/app/zookeeper-3.4.6/tmp
    echo 1 > /home/hadoop/app/zookeeper-3.4.6/tmp/myid

  • 将配置好的zookeeper拷贝到其他节点:
    首先分别在node03、node04目录下创建一个hadoop目录:
    sudo mkdir -p /home/hadoop/app
    修改文件夹用户:
    sudo chown node03:node03 /home/hadoop/app
    拷贝至node03、node04节点:
    scp -r /home/hadoop/app/zookeeper-3.4.6/node03@node03:/home/hadoop/app/
    scp -r /home/hadoop/app/zookeeper-3.4.6/node04@node04:/home/hadoop/app/

    注意:node03、node04对应/hadoop/zookeeper-3.4.6/tmp/myid内容
    node03:
    echo 2 > /home/hadoop/app/zookeeper-3.4.6/tmp/myid
    node04:
    echo 3 > /home/hadoop/app/zookeeper-3.4.6/tmp/myid

2. 安装Hadoop集群
  • 下载安装包:因为网速较慢,下载的是hadoop-2.7.6.tar.gz 附:hadoop安装包下载地址

  • 上传到虚拟机后解压:tar -zxvf hadoop-2.7.6.tar.gz -C /home/hadoop/app/

  • 配置相应环境变量
    (1) 配置HADOOP_HOME环境变量:修改/etc/profile
    export HADOOP_HOME=/home/hadoop/app/hadoop-2.7.6
    export PATH=$PATH:${JAVA_HOME}/bin:$HADOOP_HOME/bin:$HADOOP_HOME/sbin

    (2) 修改hadoo-env.sh mapred-env.sh yarn-env.sh的JAVA_HOME

  • 配置文件:core-site.xml、hdfs-site.xml、mapred-site.xml、yarn-site.xml、slaves
    (1) core-site.xml

    fs.defaultFS hdfs://mycluster hadoop.tmp.dir /var/hadoop/tmp ha.zookeeper.quorum node02:2181,node03:2181,node04:2181

(2) hdfs-site.xml

<!--指定hdfs的nameservice为mycluster,需要和core-site.xml中的保持一致 -->
<property>
  <name>dfs.nameservices</name>
  <value>mycluster</value>
</property>
<!-- mycluster下面有两个NameNode,分别是nn1,nn2 -->
<property>
  <name>dfs.ha.namenodes.mycluster</name>
  <value>nn1,nn2</value>
</property>
<!-- nn1的RPC通信地址 -->
<property>
  <name>dfs.namenode.rpc-address.mycluster.nn1</name>
  <value>node01:8020</value>
</property>
<!-- nn2的RPC通信地址 -->
<property>
  <name>dfs.namenode.rpc-address.mycluster.nn2</name>
  <value>node02:8020</value>
</property>
<!-- nn1的http通信地址 -->
<property>
  <name>dfs.namenode.http-address.mycluster.nn1</name>
  <value>node01:50070</value>
</property>
<!-- nn2的http通信地址 -->
<property>
  <name>dfs.namenode.http-address.mycluster.nn2</name>
  <value>node02:50070</value>
</property>
<!-- 指定NameNode的edits元数据在JournalNode上的存放位置 -->
<property>
  <name>dfs.namenode.shared.edits.dir</name>
  <value>qjournal://node01:8485;node02:8485;node03:8485/mycluster</value>
</property>
<!-- 指定JournalNode在本地磁盘存放数据的位置 -->
<property>
  <name>dfs.journalnode.edits.dir</name>
  <value>/var/hadoop/ha/jn</value>
</property>
<!-- 配置失败自动切换实现方式 -->
<property>
  <name>dfs.client.failover.proxy.provider.mycluster</name>
<value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>
</property>
<!-- 配置隔离机制方法,多个机制用换行分割,即每个机制暂用一行-->
<property>
  <name>dfs.ha.fencing.methods</name>
  <value>sshfence</value>
</property>
<!-- 使用sshfence隔离机制时需要ssh免登陆 -->
<property>
  <name>dfs.ha.fencing.ssh.private-key-files</name>
  <value>/home/leehan/.ssh</value>
</property>
<!-- 开启NameNode失败自动切换 -->
<property>
   <name>dfs.ha.automatic-failover.enabled</name>
   <value>true</value>
</property>

(3) mapred-site.xml

<configuration>
<!-- 指定mr框架为yarn方式 -->
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
</configuration>

(4) yarn-site.xml

<property>
    <name>yarn.nodemanager.aux-services</name>
    <value>mapreduce_shuffle</value>
</property>
<property>
<!-- 开启RM高可用 -->
   <name>yarn.resourcemanager.ha.enabled</name>
   <value>true</value>
</property>
<!-- 指定RM的cluster id -->
<property>
   <name>yarn.resourcemanager.cluster-id</name>
   <value>cluster1</value>
</property>
<!-- 指定RM的名字 -->
<property>
   <name>yarn.resourcemanager.ha.rm-ids</name>
   <value>rm1,rm2</value>
</property>
<!-- 分别指定RM的地址 -->
<property>
   <name>yarn.resourcemanager.hostname.rm1</name>
   <value>node03</value>
</property>
<property>
   <name>yarn.resourcemanager.hostname.rm2</name>
   <value>node04</value>
</property>
<!-- 指定zk集群地址 -->
<property>
   <name>yarn.resourcemanager.zk-address</name>
   <value>node02:2181,node03:2181,node04:2181</value>
</property>

(5) slaves
node02
node03
node04

  • 将node01节点的配置复制到node02、node03、node04上(注意权限问题,因为没有使用root 用户)
    scp -r /home/hadoop/app/hadoop-2.7.6/ node02@node02:/home/hadoop/app
3. 启动集群

严格按照下面的步骤!!!

3.1启动zookeeper集群(分别在node02、node03、node04上执行)

在all slave上启动zookeeper服务:
cd /home/hadoop/app/zookeeper-3.4.6/bin/
./zkServer.sh start

可查看状态:一个leader,两个follower
zkServer.sh status

3.2 手动启动journalnode(分别在在node01、node02、node03上执行)

hadoop-daemon.sh start journalnode
运行jps命令检验,是否多了JournalNode进程。

***** 初次启动需要格式化,以后启动无需格式化。*****
3.3 格式化namenode

在node01上执行命令:
hdfs namenode -format

在node02上执行:
hdfs namenode -bootstrapStandby

3.4 格式化ZKFC(在node02上执行一次即可)

hdfs zkfc -formatZK

启动过程中出现报错Configuration has multiple addresses that match local node’s address. Please configure the system with dfs.nameservice.id and dfs.ha.namenode.id:
原因是/etc/hosts文件中配置了多个本机,所以最好不要127.0.0.1的信息。

3.5 启动hdfs(在node01上执行)

start-dfs.sh
这里出现了需要密码认证,原因是四台虚拟机的用户名不一样,所以无法认证,因此需要将虚拟机的用户名统一。

3.6 启动YARN

在node01上执行:
start-yarn.sh

node03-node04启动resourcemanager:
yarn-daemon.sh start resourcemanager

以后启动集群

集群启动:
all slave —-> zkServer.sh start node02 node03、node04
one master —->start-dfs.sh node01
one master —–>start-yarn.sh node01
backup master —->yarn-daemon.sh start resourcemanager node03、node04

正常集群启动后,
namenode上的jps后的进程有:
2648 ResourceManager
2553 DFSZKFailoverController
3036 NameNode
3325 Jps

datanode上的jps后进程有:
2353 NodeManager
2200 DataNode
2264 JournalNode
2137 QuorumPeerMain
2526 Jps

到此,hadoop-2.7.6配置完毕,可以统计浏览器访问:
	http://node01:50070
	NameNode 'node01:9000' (active)
	http://node02:50070
	NameNode 'node02:9000' (standby)

验证HDFS HA
	首先向hdfs上传一个文件
	hadoop fs -put /etc/profile /profile
	hadoop fs -ls /
	然后再kill掉active的NameNode
	kill -9 <pid of NN>
	通过浏览器访问:http://192.168.1.202:50070
	NameNode 'hadoop02:9000' (active)
	这个时候hadoop02上的NameNode变成了active
	在执行命令:
	hadoop fs -ls /
	-rw-r--r--   3 root supergroup       1926 2014-02-06 15:36 /profile
	刚才上传的文件依然存在!!!
	手动启动那个挂掉的NameNode
	sbin/hadoop-daemon.sh start namenode
	通过浏览器访问:http://192.168.1.201:50070
	NameNode 'hadoop01:9000' (standby)

验证YARN:
	运行一下hadoop提供的demo中的WordCount程序:
	hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-2.4.1.jar wordcount /profile /out

OK,大功告成!!!

测试集群工作状态的一些指令 :
bin/hdfs dfsadmin -report 查看hdfs的各节点状态信息

bin/hdfs haadmin -getServiceState nn1 获取一个namenode节点的HA状态

sbin/hadoop-daemon.sh start namenode 单独启动一个namenode进程

./hadoop-daemon.sh start zkfc 单独启动一个zkfc进程

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值