(八)完全分布式模式搭建Hadoop集群

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qinshi965273101/article/details/83550514

小技巧:配置好一台服务器后,通过 scp -r /opt/zookeeper-3.4.7/ hadoop02:/opt/ 命令,把文件发送到另外两台机器。

1、搭建方案

  • 引入zookeeper,通过注册临时节点来监控服务是否挂掉,保证能及时切换到正在运行的服务上,防止单点故障。

例如:NameNode(active)挂了 ,会有进程 FailOverController 来负责切换到 NameNode(standby)

ResourceManager(active)挂了,  会通过zookeeper自主切换到 ResourceManager(standby)

  • 机器分配
主机名 hadoop01 hadoop02 hadoop03
进程 zookeeper zookeeper zookeeper
NameNode(active) NameNode(standby)  
FailOverController FailOverController  
ResourceManager(active)   ResourceManager(standby)
JournalNode JournalNode JournalNode
DataNode DataNode DataNode
NameNode NameNode NameNode

2、环境准备

  • 三台linux服务器,都配置好主机名。且每台服务器把主机名和ip关系配置到hosts文件中

  • 配置免密登录:每台机器给自己和其他机器都发送一次免密登录。以hadoop01为例:
生成秘钥,输入命令后一直回车即可 ssh-keygen
把秘钥发送给自己 ssh-copy-id root@hadoop01
把秘钥发送给hadoop02 ssh-copy-id root@hadoop02
把秘钥发送给hadoop03 ssh-copy-id root@hadoop03

 

  • 三台服务器防火墙确保关闭

3、zookeeper集群搭建

搭建步骤参看:

https://mp.csdn.net/postedit/82818981   

https://mp.csdn.net/postedit/82937890

4、hadoop集群搭建

首先安装和配置hadoop01节点,配置好后把hadoop整个文件夹拷贝到另外两台机器。

  • vim hadoop-env.sh

配置jdk安装所在目录,hadoop配置文件所在目录

export JAVA_HOME=/usr/java/jdk1.8.0_181-amd64
export HADOOP_CONF_DIR=/opt/hadoop-2.7.1/etc/hadoop
  • vim core-site.xml

该目录需要手动创建:/opt/hadoop-2.7.1/tmp 

<configuration>
<!--用来指定hdfs的老大,ns为固定属性名,表示两个namenode-->
<property>
<name>fs.defaultFS</name>
<value>hdfs://ns</value>
</property>
<!--用来指定hadoop运行时产生文件的存放目录-->
<property>
<name>hadoop.tmp.dir</name>
<value>/opt/hadoop-2.7.1/tmp</value>
</property>
<!--执行zookeeper地址-->
<property>
<name>ha.zookeeper.quorum</name>
<value>hadoop01:2181,hadoop02:2181,hadoop03:2181</value>
</property>
</configuration>
  • vim hdfs-site.xml

下列目录需要手动创建:

/opt/hadoop-2.7.1/journal

/opt/hadoop-2.7.1/tmp/namenode

/opt/hadoop-2.7.1/tmp/datanode

<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上的存放位置,这样,namenode2可以从jn集群里获
     取最新的namenode的信息,达到热备的效果-->
<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>/opt/hadoop-2.7.1/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>
<!--配置namenode数据存放的位置,可以不配置,如果不配置,默认用的是
      core-site.xml里配置的hadoop.tmp.dir的路径-->
<property>
<name>dfs.namenode.name.dir</name>
<value>file:///opt/hadoop-2.7.1/tmp/namenode</value>
</property>
<!--配置datanode数据存放的位置,可以不配置,如果不配置,默认用的是
      core-site.xml里配置的hadoop.tmp.dir的路径-->
<property>
<name>dfs.datanode.data.dir</name>
<value>file:///opt/hadoop-2.7.1/tmp/datanode</value>
</property>
<!--配置block副本数量-->
<property>
<name>dfs.replication</name>
<value>3</value>
</property>
<!--设置hdfs的操作权限,false表示任何用户都可以在hdfs上操作文件
    生产环境是不会这样设置的-->
<property>
<name>dfs.permissions</name>
<value>false</value>
</property>
</configuration>
  • 配置mapred-site.xml

先复制一份模板并重命名 :cp mapred-site.xml.template mapred-site.xml

然后编辑: vim mapred-site.xml

<configuration>
<property>
<!--指定mapreduce运行在yarn上-->
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
</configuration>
  • vim yarn-site.xml
<configuration>
<!-- 开启YARN HA(高可用high available) -->
<property>
<name>yarn.resourcemanager.ha.enabled</name>
<value>true</value>
</property>
 <!-- 指定两个resourcemanager的名称 --> 
<property>
<name>yarn.resourcemanager.ha.rm-ids</name>
<value>rm1,rm2</value>
</property>
<!-- 配置rm1,rm2的主机 --> 
<property>
<name>yarn.resourcemanager.hostname.rm1</name>
<value>hadoop01</value>
</property>
<property>
<name>yarn.resourcemanager.hostname.rm2</name>
<value>hadoop03</value>
</property>
<!--开启yarn恢复机制-->
<property>
<name>yarn.resourcemanager.recovery.enabled</name>
<value>true</value>
</property>
<!--执行rm恢复机制实现类-->
<property>
<name>yarn.resourcemanager.store.class</name>
<value>
org.apache.hadoop.yarn.server.resourcemanager.recovery.ZKRMStateStore</value>
</property>
<!-- 配置zookeeper的地址 --> 
<property>
<name>yarn.resourcemanager.zk-address</name>
<value>hadoop01:2181,hadoop02:2181,hadoop03:2181</value>
</property>
<!-- 指定YARN HA的名称
     为yarn取一个别名,看日志可用 -->
<property>
<name>yarn.resourcemanager.cluster-id</name>
<value>yarn-ha</value>
</property>
<property>
<!--指定yarn的老大 resoucemanager的地址
     即哪一个resourcemanager是active状态-->
<name>yarn.resourcemanager.hostname</name>
<value>hadoop01</value>
</property>
<property>
<!--NodeManager获取数据的方式-->
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
</configuration>
  • vim 置slaves

配置datanode,nodemanager(存储数据和计算数据的节点信息)

hadoop01
hadoop02
hadoop03
  • vim /etc/profile

在文件末尾添加jdk和hadoop的配置信息, 并执行命令 source /etc/profile 让配置生效。

注意另外两台机器也要执行source命令,使其生效。

#JDK安装目录
JAVA_HOME=/usr/java/jdk1.8.0_181-amd64
#hadoop的安装目录
HADOOP_HOME=/opt/hadoop-2.7.1
PATH=$JAVA_HOME/bin:$HADOOP_HOME/bin:$HADOOP_HOME/sbin:$PATH
CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
export JAVA_HOME PATH CLASSPATH HADOOP_HOME

5、启动

5.1、先启动zookeeper集群

进入zookeeper安装目录 cd /opt/zookeeper-3.4.7/bin/
启动三台服务器上的zookeeper sh zkServer.sh start
全部启动后检查各自的状态 sh zkServer.sh status

5.2、格式化zookeeper

在zookeeper的leader节点上执行命令 hdfs zkfc -formatZK,作用是在zookeeper集群上生成hadoop-ha节点(ns节点)

5.3、启动分布式文件系统

下面步骤可以用一步来替代:start-dfs.sh,第一次建议一步步执行。对应的停止操作为  stop-dfs.sh

  • 启动journalnode集群

分别在三台服务器上,切换到hadoop安装目录的sbin目录,启动journalnode sh hadoop-daemon.sh start journalnode 。或者只在一台机器上执行一次命令: sh hadoop-daemons.sh start journalnode 去启动配置好的所有journalnode。

  • 格式化hadoop01节点的namenode : hadoop namenode -format
  • 启动hadoop01节点的 namenode:sh hadoop-daemon.sh start namenode

  • 把hadoop02节点的namenode配置为 standby,并启动namenode

配置为standy状态:hdfs namenode -bootstrapStandby

启动namenode:sh hadoop-daemon.sh start namenode

  • 启动datanode

分别在三台服务器上执行命令:hadoop-daemon.sh start datanode

  • 启动失败恢复进程(zkfc)

在hadoop01,hadoop02节点上执行: hadoop-daemon.sh start zkfc

5.4、启动MapReduce

  • 在hadoop01节点启动 ResourceManager(active) start-yarn.sh,该命令会启动hadoop01节点的 ResourceManager,并根据配置去启动三个节点的NodeManager。
  • 在hadoop03节点启动 Resoucemanager(standby) yarn-daemon.sh start resourcemanager

6、访问

查看文件系统:http://192.168.101.100:50070

访问yarn控制台:http://192.168.101.100:8088 

此时kill掉hadoop01节点的NameNode(active)进程,会发现hadoop02节点的NameNode由standby状态变为active状态。由此看出高可用的hdfs搭建成功。

猜你喜欢

转载自blog.csdn.net/qinshi965273101/article/details/83550514