Hadoop集群搭建

Hadoop完全分布式安装配置

概述

​ Hadoop中的NameNode好比是人的心脏,非常重要,绝对不可以停止工作。在hadoop1时代,只有一个NameNode。如果该NameNode数据丢失或者不能工作,那么整个集群就不能恢复了。

​ 为了解决hadoop1中的单点问题,在hadoop2中新的NameNode不再是只有一个,可以有多个(目前只支持2个)。每一个都有相同的职能。一个是active状态的,一个是standby状态的。当集群运行时,只有active状态的NameNode是正常工作的,standby状态的NameNode是处于待命状态的,时刻同步active状态NameNode的数据。一旦active状态的NameNode不能工作,通过手工或者自动切换,standby状态的NameNode就可以转变为active状态的,就可以继续工作了。这就是高可用。

Hadoop2.0中,可以存在两个NameNode,一个是active状态,另一个是standby状态

当集群运行时,只有active状态的NameNode是正常工作的,standby状态的NameNode是处于待命状态的,时刻同步active状态NameNode的数据

使用JournalNode集群进行数据共享

在这里插入图片描述
两个NameNode为了数据同步,会通过一组称作JournalNodes的独立进程进行相互通信。当active状态的NameNode的命名空间有任何修改时,会告知大部分的JournalNodes进程。standby状态的NameNode有能力读取JNs中的变更信息,并且一直监控edit log的变化,把变化应用于自己的命名空间。standby可以确保在集群出错时,命名空间状态已经完全同步了

故障切换

对于HA集群而言,确保同一时刻只有一个NameNode处于active状态是至关重要的。否则,两个NameNode的数据状态就会产生分歧,可能丢失数据,或者产生错误的结果。为了保证这点,这就需要利用使用ZooKeeper了。首先HDFS集群中的两个NameNode都在ZooKeeper中注册,当active状态的NameNode出故障时,ZooKeeper能检测到这种情况,它就会自动把standby状态的NameNode切换为active状态。
在这里插入图片描述

相关概念

在hadoop完全分布式配置中,可以配置多个nameNode,形成互为热备的状态,解决单点故障的问题

两个NameNode通过JN集群来共享元数据,基本原理和Zookeeper相似,处于active状态的NameNode通过元数据的更新发送给大部分的JN集群,只要Jn集群的大部分机器存活,处于standby的NameNode就可以同步到这些元数据

两个NameNode通过zk实现选举,

NameNode(Active):真正工作状态的NameNode,保持元数据,并将元数据更新信息写入km

NameNode(Standby):出在备用的nameNode,从jn中获取信息。同步元数据

DataNode:保存数据的节点

JN集群:用来同步元数据的集群,防止单点故障

ZK:集群协调,包括nameNode的选举

FailOverController:联系nameNode和ZK

Hadoop完全分布式集群规划

hadoop安装集群配置的原则:

a.两个nameNode一般单独安装

b.ResourceManager一般单独安装或者和NameNode一起

c.dataNode单独安装

d.NodeManager一般和dataNode装在一起

e.FailOverController进程必须和NameNode在一起

f.JN要么单独安装,要么和DataNode在一起

g.zk通常是一个单独的集群,但没有条件,也可以配置在hadoop集群中

机器角色

  1. hadoop01

    ​ NameNode,FailOverController,ResourceManager,zookeeper

  2. hadoop02

    ​ DataNode,NodeManager,JN,Zookeeper

  3. hadoop03

    ​ DataNode,NodeManager,JN,Zookeeper

配置步骤 HDFS分布式

  1. 修改主机名
vi /etc/hosts
vi /etc/sysconfig/network
  1. 配置免密登录
ssh-keygen
ssh-copy-id hadoop01
  1. 关闭防火墙(或者将端口添加例外)
service iptables stop 
chkconfig iptables off 
  1. 安装zookeeper集群,并启动
dataDir=/home/software/zookeeper-3.4.7/tmp
clientPort=2181
server.1=192.168.168.101:2888:3888
server.2=192.168.168.102:2888:3888
server.3=192.168.168.103:2888:3888
分别在每个zookeeper的tmp目录下创建myid文件,并写上id

  1. 配置jdk
安装jdk,并在/etc/profile下进行如下配置
JAVA_HOME=/home/software/jdk1.8.0_65
PATH=$JAVA_HOME/bin:$PATH
CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
export JAVA_HOME PATH CLASSPATH

source /etc/profile
  1. 安装hadoop并配置环境变量
安装hadoop
export HADOOP_HOME=/home/software/hadoop-2.7.1/
export PATH=$PATH:$HADOOP_HOME/sbin:$HADOOP_HOME/bin
  1. 配置hadoop.env.sh
export JAVA_HOME=/home/software/jdk1.8.0_65
  1. 配置core-site.xml
<configuration>
        <property>
        <!--用来指定hdfs的老大,namenode的地址-->
                <name>fs.defaultFS</name>
                <value>hdfs://ns</value>
        </property>
        <property>
        <!--用来指定hadoop运行时产生文件的存放目录-->
                <name>hadoop.tmp.dir</name>
                <value>/home/software/hadoop-2.7.1/tmp</value>
        </property>
        <property>
         <name>io.file.buffer.size</name>
        <value>4096</value>
        </property>
        <!--指定zookeeper地址-->
         <property>
                 <name>ha.zookeeper.quorum</name>
                 <value>hadoop01:2181,hadoop02:2181,hadoop03:2181</value>
        </property>
  <!--修改core-site.xml中的ipc参数,防止出现连接journalnode服务ConnectException-->
        <property>
            <name>ipc.client.connect.max.retries</name>
            <value>100</value>
            <description>Indicates the number of retries a client will make to establish a server connection.</description>
        </property>
        <property>
            <name>ipc.client.connect.retry.interval</name>
            <value>10000</value>
            <description>Indicates the number of milliseconds a client will wait for before retrying to establish a server connection.</description>
        </property>
  </configuration>

  1. hdfs-site.xml
<configuration>
    <!--指定hdfs的nameservice为ns,需要和core-site.xml中的保持一致 -->
    <property>
        <name>dfs.nameservices</name>
        <value>ns</value>
    </property>
    <!-- ns下面有两个NameNode,分别是nn1,nn2 -->
    <property>
       <name>dfs.ha.namenodes.ns</name>
       <value>nn1,nn2</value>
    </property>
    <!-- nn1的RPC通信地址 -->
    <property>
       <name>dfs.namenode.rpc-address.ns.nn1</name>
       <value>hadoop01:9000</value>
    </property>
    <!-- nn1的http通信地址 -->
    <property>
        <name>dfs.namenode.http-address.ns.nn1</name>
        <value>hadoop01:50070</value>
    </property>
   <!-- nn2的RPC通信地址 -->
    <property>
        <name>dfs.namenode.rpc-address.ns.nn2</name>
        <value>hadoop02:9000</value>
    </property>
    <!-- nn2的http通信地址 -->
    <property>
        <name>dfs.namenode.http-address.ns.nn2</name>
        <value>hadoop02:50070</value>
    </property>
    <!-- 指定NameNode的元数据在JournalNode上的存放位置 -->
    <property>
         <name>dfs.namenode.shared.edits.dir</name>
         <value>qjournal://hadoop01:8485;hadoop02:8485;hadoop03:8485/ns</value>
    </property>
    <!-- 指定JournalNode在本地磁盘存放数据的位置 -->
    <property>
          <name>dfs.journalnode.edits.dir</name>
          <value>/home/software/hadoop-2.7.1/tmp/journal</value>
    </property>
   <!-- 开启NameNode故障时自动切换 -->
    <property>
          <name>dfs.ha.automatic-failover.enabled</name>
          <value>true</value>
    </property>
    <!-- 配置失败自动切换实现方式 -->
    <property>
            <name>dfs.client.failover.proxy.provider.ns</name>       				
            <value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>
    </property>
    <!-- 配置隔离机制 -->
    <property>
             <name>dfs.ha.fencing.methods</name>
             <value>sshfence</value>
    </property>
    <!-- 使用隔离机制时需要ssh免登陆 -->
    <property>
            <name>dfs.ha.fencing.ssh.private-key-files</name>
            <value>/root/.ssh/id_rsa</value>
    </property>
   <property>
        <name>dfs.namenode.name.dir</name>
        <value>file:///home/software/hadoop-2.7.1/tmp/hdfs/name</value>
    </property>

    <property>
        <name>dfs.datanode.data.dir</name>
        <value>file:///home/software/hadoop-2.7.1/tmp/hdfs/data</value>
    </property>

    <property>
       <name>dfs.replication</name>
       <value>2</value>
    </property>
    <!-- 在NN和DN上开启WebHDFS (REST API)功能,不是必须 -->                                       
    <property>
       <name>dfs.webhdfs.enabled</name>
       <value>true</value>
    </property>
</configuration>


  1. 配置mapred-site.xml
<configuration>
        <property>
                <!--指定mapreduce运行在yarn上-->
                <name>mapreduce.framework.name</name>
                <value>yarn</value>
        </property>
</configuration>

  1. 配置yarn-site.xml
<configuration>

		<!-- Site specific YARN configuration properties -->
        <property>
		<!--指定yarn的老大resourcemanager的地址-->
                <name>yarn.resourcemanager.hostname</name>
                <value>hadoop03</value>
        </property>
        <property>
                <!--NodeManager获取数据的方式-->
                <name>yarn.nodemanager.aux-services</name>
                <value>mapreduce_shuffle</value>
        </property>
</configuration>

  1. 修改slaves文件
将集群中的节点的主机名分别填入
hadoop01
hadoop02
hadoop03
  1. 将配置文件复制到hadoop02和hadoop03
scp -r $HADOOP_HOME/etc/hadoop root@hadoop02:/home/software/hadoop-2.7.1/etc/  
scp -r $HADOOP_HOME/etc/hadoop root@hadoop03:/home/software/hadoop-2.7.1/etc/  

集群的启动

  1. 启动zookeeper集群
分别在三台上执行 sh zkServer.sh start
查看集群状态 sh zkServer.sh status
  1. 在hadoop01上启动journalnode集群
hadoop-daemons.sh start journalnode
执行jps,查看是否启动成功
  1. 格式化zkfc,在zookeeper中生成ha节点
在hadoop01上执行 hdfs zkfc -formatZK
格式化成功后可以在zookeeper执行  ls /hadoop-ha 
会出现节点名称 [ns]
  1. 格式化hdfs
hadoop namenode -format
  1. 在hadoop01上启动active的namenode节点
hadoop-daemon.sh start namenode
  1. 在hadoop02上同步namenode的数据,并启动standby的namenode节点
hdfs namenode –bootstrapStandby
hadoop-daemon.sh start namenode
  1. 启动datanode
hadoop-daemons.sh start datanode
  1. 在作为resourceManager的机器启动yarn
start-yarn.sh
  1. 启动zkfc(选举的进程)
hadoop-daemons.sh start zkfc
  1. 启动结果
分别执行jps,查看启动结果
----------------------
[root@hadoop01 bin]# jps
19089 NameNode
19541 DFSZKFailoverController
19784 NodeManager
19976 Jps
18856 QuorumPeerMain
19193 DataNode
19390 JournalNode
----------------------
[root@hadoop02 bin]# jps
2099 Jps
2051 DFSZKFailoverController
1798 NodeManager
1367 QuorumPeerMain
1561 DataNode
1661 JournalNode
1503 NameNode
-----------------------
[root@hadoop03 bin]# jps
1729 ResourceManager
1507 DataNode
1831 NodeManager
1367 QuorumPeerMain
2220 Jps
1596 JournalNode

HA高可用

在这里插入图片描述

在这里插入图片描述

此时hadoop01为active,hadoop02为standby
将hadoop01的namenode关闭,测试高可用
[root@hadoop01 bin]# hadoop-daemon.sh stop namenode 

在这里插入图片描述

原来的standby节点变为了active节点

Yarn完全分布式配置

  1. 修改mapred-site.xml
 		<property>
                <!--指定mapreduce运行在yarn上-->
                <name>mapreduce.framework.name</name>
                <value>yarn</value>
        </property>

  1. 修改yarn-site.xml
<configuration>

        <property>
                <!--NodeManager获取数据的方式-->
                <name>yarn.nodemanager.aux-services</name>
                <value>mapreduce_shuffle</value>
        </property>
        <property>
                <name>yarn.resourcemanager.ha.enabled</name>
                <value>true</value>
        </property><!-- 指定 RM 的集群 id -->
        <property>
                <name>yarn.resourcemanager.cluster-id</name>
                <value>RM_CLUSTER</value>
        </property>
        <!-- 定义 RM 的节点-->
        <property>
                <name>yarn.resourcemanager.ha.rm-ids</name>
                <value>rm1,rm2</value>
        </property>
        <!-- 指定 RM1 的地址 -->
        <property>
                <name>yarn.resourcemanager.hostname.rm1</name>
                <value>hadoop03</value>
        </property>
        <!-- 指定 RM2 的地址 -->
        <property>
                <name>yarn.resourcemanager.hostname.rm2</name>
                <value>hadoop02</value>
        </property>
        <!-- 激活 RM 自动恢复 -->
        <property>
                <name>yarn.resourcemanager.recovery.enabled</name>
                <value>true</value>
        </property>
      <!-- 配置 RM 状态信息存储方式,有 MemStore 和 ZKStore-->
        <property>
                <name>yarn.resourcemanager.store.class</name>
                	<value>org.apache.hadoop.yarn.server.resourcemanager.recovery.ZKRMStateStore</value>
        </property>
        <!-- 配置为 zookeeper 存储时,指定 zookeeper 集群的地址 -->
        <property>
                <name>yarn.resourcemanager.zk-address</name>
                <value>hadoop01:2181,hadoop02:2181,hadoop03:2181</value>
        </property>

</configuration>

  1. 启动yarn ha模式
在active RM上启动
start-yarn.sh

在backup RM上启动
yarn-daemon.sh start resourcemanager
  1. 通过浏览器访问 8088端口

在这里插入图片描述

参考自:

http://www.iteye.com/news/30739

https://blog.csdn.net/Lockey23/article/details/78338133

学习中,有问题的地方多多指教!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值