Hadoop+Zookeeper完整分布式搭建(学习篇)

2020-01-16  本文已影响0人  OzanShareing

一.环境说明


集群环境至少需要3个节点(也就是至少3台服务器设备):1个Master,2个Slave,节点之间局域网连接,可以相互ping通,下面举例说明,配置节点IP分配如下:

Hostname IP User Password
master 172.19.69.251 root *
slave 172.19.69.252 root *
slave 172.19.69.253 root *

三个节点均使用CentOS 7.4.1708系统,为了便于维护,集群环境配置项最好使用相同用户名、用户密码、相同hadoopzookeeper目录结构。

我采用的各组件版本为:
JDKjdk1.8.0_45
Hadoophadoop-2.8.5
Zookeeperzookeeper-3.4.12

1.修改Linux主机名
2.修改IP
3.修改主机名和IP的映射关系
注意如果你们公司是租用的服务器或是使用的云主机(如华为云主机、阿里云主机等)
/etc/hosts里面要配置的是内网IP地址和主机名的映射关系
4.关闭防火墙
5.ssh免登陆
6.安装JDK,配置环境变量等

准备工作


1. 安装JDK

三台机器下载同版本JDK1.8.0_45安装

修改配置文件 vim /etc/profile,配置环境变量

export JAVA_HOME=/usr/java/jdk1.8.0_45
export PATH=$JAVA_HOME/bin:$PATH
export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tool.jar

重新加载配置文件使之生效source /etc/profile

source FileNamesource命令通常用于重新执行刚修改的初始化文档,如 .bash_profile.profile 等等

2. 修改Linux主机名

2.1 修改hosts
vim /etc/hosts
172.19.69.251 hadoop1
172.19.69.252 hadoop2
172.19.69.253 hadoop3
2.2 修改hostname
# 阿里云服务器用
hostnamectl set-hostname hadoop2

3. 集群之间ssh无密码登录

CentOS默认安装了ssh,如果没有你需要先安装ssh

集群环境的使用必须通过ssh无密码登陆来执行,本机登陆本机必须无密码登陆,主机与从机之间必须可以双向无密码登陆,从机与从机之间无限制。

3.1 开启Authentication免登陆
PasswordAuthentication yes

如果是root用户下进行操作,还要去掉 #PermitRootLogin yes注释,允许root用户登录。

3.2 生成authorized_keys

输入命令,ssh-keygen -t rsa,生成key,一直按回车。

就会在/root/.ssh生成:authorized_keysid_rsa.pubid_rsa 三个文件,为了各个机器之间的免登陆,在每一台机器上都要进行此操作。

3.3 合并公钥到authorized_keys文件

进入其中一台机器【172.19.69.251】的/root/.ssh目录,输入以下命令:

#把本机公钥合并到authorized_keys 中
cat id_rsa.pub>> authorized_keys
#把其他机器的公钥合并到authorized_keys 中
ssh root@172.19.69.252 cat ~/.ssh/id_rsa.pub>> authorized_keys
# 此处需输入其他机器的密码
ssh root@172.19.69.253 cat ~/.ssh/id_rsa.pub>> authorized_keys
#或者
ssh root@hadoop2 cat ~/.ssh/id_rsa.pub>> ~/.ssh/authorized_keys
ssh root@hadoop3 cat ~/.ssh/id_rsa.pub>> ~/.ssh/authorized_keys

#完成之后输入命令,把authorized_keys远程copy到其他机器之中
scp authorized_keys 172.19.69.252:/root/.ssh/
scp authorized_keys 172.19.69.253:/root/.ssh/

拷贝完成后,在每台机器上进行 service sshd restart 操作, 重新启动ssh服务。

在每台机器输入 ssh 172.19.69.xx,测试能否无需输入密码连接另外两台机器。

Zookeeper集群安装配置


参考上篇Zookeeper基本介绍

Zookeeper下载链接

Hadoop集群安装配置


1. 下载解压安装。

hadoop下载地址

2. 修改hadoop配置

解压安装包,并修改配置文件

[root@master apps]# tar -zxvf hadoop-2.8.5.tar.gz
[root@master apps]# mkdir hdptmp
在两台从节点上建立相同的目录(hdfs初始化的时候会用到)

配置文件位置:~/hadoop-2.8.5/etc/hadoop

2.1 hadoop-env.sh

添加JDK路径:export JAVA_HOME=

#vim hadoop-env.sh
export JAVA_HOME=jdk的安装目录
2.2 core-site.xml

修改Hadoop核心配置文件core-site.xml,这里配置的是HDFS的地址和端口号。

<configuration> 
 <!-- 指定 hdfs的 nameservice为 ns -->  
 <property>      
      <name>fs.defaultFS</name>      
      <value>hdfs://ns</value>      
 </property>  
 <!--指定hadoop数据临时存放目录-->  
 <property>  
      <name>hadoop.tmp.dir</name>  
      <value>/apps/hdptmp</value>  
 </property>     
 <!--指定zookeeper地址-->  
 <property>  
      <name>ha.zookeeper.quorum</name>  
      <value>master.hadoop:2181,slave1.hadoop:2181,slave2.hadoop:2181</value>  
 </property>  
</configuration>
2.3 hdfs-site.xml

修改HadoopHDFS的配置,配置的备份方式默认为3

<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>master.hadoop:9000</value>  
    </property>  
    <!-- nn1的http通信地址 -->  
    <property>  
        <name>dfs.namenode.http-address.ns.nn1</name>  
        <value>master.hadoop:50070</value>  
    </property>  
    <!-- nn2的RPC通信地址 -->  
    <property>  
        <name>dfs.namenode.rpc-address.ns.nn2</name>  
        <value>slave1.hadoop:9000</value>  
    </property>  
    <!-- nn2的http通信地址 -->  
    <property>  
        <name>dfs.namenode.http-address.ns.nn2</name>  
        <value>slave1.hadoop:50070</value>  
    </property>  
    <!-- 指定NameNode的元数据在JournalNode上的存放位置 -->  
    <property>  
         <name>dfs.namenode.shared.edits.dir</name>  
         <value>qjournal://master.hadoop:8485;slave1.hadoop:8485;slave2.hadoop:8485/ns</value>  
    </property>  
    <!-- 指定JournalNode在本地磁盘存放数据的位置 -->  
    <property>  
          <name>dfs.journalnode.edits.dir</name>  
          <value>/apps/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
                shell(/bin/true)
            </value>  
    </property>  
    <!-- 使用隔离机制时需要ssh免登陆 -->  
    <property>  
            <name>dfs.ha.fencing.ssh.private-key-files</name>  
            <value>/root/.ssh/id_rsa</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>      
    <property>      
       <name>dfs.ha.fencing.ssh.connect-timeout</name>      
       <value>10000</value>      
    </property>   
    <property>
        <name>dfs.permissions</name>
        <value>false</value>
    </property>
</configuration>
2.4 mapred-site.xml

修改HadoopMapReduce的配置文件,配置的是JobTracker的地址和端口。

<configuration>
    <property>
        <name>mapreduce.framework.name</name>
        <value>yarn</value>
    </property>
</configuration>
2.5 配置yarn-site.xml文件
<configuration>
  
  <!-- 以下为YARN HA的配置-->
  <!-- 开启YARN HA -->
  <property>
    <name>yarn.resourcemanager.ha.enabled</name>
    <value>true</value>
  </property>
 
  <!-- 启用自动故障转移 -->
  <property>
    <name>yarn.resourcemanager.ha.automatic-failover.enabled</name>
    <value>true</value>
  </property>
 
  <!-- 指定YARN HA的名称 -->
  <property>
    <name>yarn.resourcemanager.cluster-id</name>
    <value>yarncluster</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>master.hadoop</value>
  </property>
  <property>
    <name>yarn.resourcemanager.hostname.rm2</name>
    <value>slave1.hadoop</value>
  </property>
  <!-- 配置zookeeper的地址 -->
  <property>
    <name>yarn.resourcemanager.zk-address</name>
    <value>master.hadoop:2181,slave1.hadoop:2181,slave2.hadoop:2181</value>
  </property>
  <property>      
    <name>yarn.nodemanager.aux-services</name>      
    <value>mapreduce_shuffle</value>      
 </property> 
</configuration>
2.6 修改slaves文件
[root@master /]# vi slaves
master.hadoop
slave1.hadoop
slave2.hadoop
2.7 配置hadoop环境变量
[root@master /]# vi /etc/profile
#set hadoop enviroment
export HADOOP_HOME=/apps/hadoop-2.8.0/
export PATH=$PATH:$JAVA_HOME/bin:$JRE_HOME/bin:$HADOOP_HOME/bin:$HADOOP_HOME/sbin
#生效
[root@master /]# source /etc/profile

注意:三台机器上都进行相同的配置,都放在相同的路径下。

2.8 远程复制
使用scp命令进行从本地到远程的文件传输操作:
scp -r /usr/local/hadoop slave1:/usr/local/hadoop 
scp -r /usr/local/hadoop slave2:/usr/local/hadoop

3. 启动hadoop集群

进入master~/hadoop目录,执行以下操作:

格式化文件系统:

$ bin/hadoop namenode -format

第一次启动前操作,以后无需操作!!!

然后启动hadoop

$ sbin/start-all.sh

验证:通过jps能看到NodeManagerNameNodeSecondaryNameNodeResourceManagerDataNode这几个进程。

启动集群

1. 启动ZooKeeper(三台机器一台一台的启动)

~/zookeeper/bin/zkServer.sh start
[root@master /]# zkServer.sh start
ZooKeeper JMX enabled by default
Using config: /apps/zookeeper-3.4.12/bin/../conf/zoo.cfg
Starting zookeeper ... STARTED

2.启动journalnode(三台一台一台启动)

[root@master /]# hadoop-daemon.sh start journalnode
starting journalnode, logging to /apps/hadoop-2.8.5/logs/hadoop-root-journalnode-master.hadoop.out
[root@master /]# 

3.启动hdfs

[root@master /]# start-dfs.sh 
Starting namenodes on [master.hadoop slave1.hadoop]
slave1.hadoop: starting namenode, logging to /apps/hadoop-2.8.0/logs/hadoop-root-namenode-slave1.hadoop.out
master.hadoop: starting namenode, logging to /apps/hadoop-2.8.0/logs/hadoop-root-namenode-master.hadoop.out
slave2.hadoop: starting datanode, logging to /apps/hadoop-2.8.0/logs/hadoop-root-datanode-slave2.hadoop.out
master.hadoop: starting datanode, logging to /apps/hadoop-2.8.0/logs/hadoop-root-datanode-master.hadoop.out
slave1.hadoop: starting datanode, logging to /apps/hadoop-2.8.0/logs/hadoop-root-datanode-slave1.hadoop.out
Starting journal nodes [master.hadoop slave1.hadoop slave2.hadoop]
slave2.hadoop: journalnode running as process 1870. Stop it first.
slave1.hadoop: journalnode running as process 2842. Stop it first.
master.hadoop: journalnode running as process 45029. Stop it first.
Starting ZK Failover Controllers on NN hosts [master.hadoop slave1.hadoop]
slave1.hadoop: starting zkfc, logging to /apps/hadoop-2.8.0/logs/hadoop-root-zkfc-slave1.hadoop.out
master.hadoop: starting zkfc, logging to /apps/hadoop-2.8.0/logs/hadoop-root-zkfc-master.hadoop.out
[root@master /]# 

4.启动yarn

[root@master /]# start-yarn.sh 
starting yarn daemons
starting resourcemanager, logging to /apps/hadoop-2.8.0/logs/yarn-root-resourcemanager-master.hadoop.out
slave1.hadoop: starting nodemanager, logging to /apps/hadoop-2.8.0/logs/yarn-root-nodemanager-slave1.hadoop.out
slave2.hadoop: starting nodemanager, logging to /apps/hadoop-2.8.0/logs/yarn-root-nodemanager-slave2.hadoop.out
master.hadoop: starting nodemanager, logging to /apps/hadoop-2.8.0/logs/yarn-root-nodemanager-master.hadoop.out
[root@master /]#

5.启动单个结点的yarn进程(因为yarn的两个resourcemanager不会同时启动,必须手动启动另一台上的resourcemanager

slave1.hadoop上启动

[root@slave1 ~]# yarn-daemon.sh start resourcemanager
starting resourcemanager, logging to /apps/hadoop-2.8.0/logs/yarn-root-resourcemanager-slave1.hadoop.out
[root@slave1 ~]# jps
3489 Jps
2931 NameNode
2709 QuorumPeerMain
2842 JournalNode
3131 DFSZKFailoverController
3451 ResourceManager
3276 NodeManager
3005 DataNode
[root@slave1 ~]# 

到此集群搭建完成!!!!!!!!!!!!!!!!!

~/hadoop/sbin/start-all.sh

测试高可用


访问 http://slave1.hadoop:50070/

访问 http://master.hadoop:50070/

接下来是一台宕机(关闭slave1.hadoop上的namenode进程)杀掉2931进程

[root@slave1 ~]# jps
2931 NameNode
2709 QuorumPeerMain
3733 Jps
2842 JournalNode
3131 DFSZKFailoverController
3451 ResourceManager
3276 NodeManager
3005 DataNode
[root@slave1 ~]# kill -9 2931
[root@slave1 ~]# jps
2709 QuorumPeerMain
3753 Jps
2842 JournalNode
3131 DFSZKFailoverController
3451 ResourceManager
3276 NodeManager
3005 DataNode
[root@slave1 ~]# 

然后访问 http://slave1.hadoop:50070/(无响应)

访问http://master.hadoop:50070/ (变成active)

高可用集群搭建完毕

上一篇下一篇

猜你喜欢

热点阅读