Hadoop完全分布集群搭建及高可用搭建

一、Hadoop完全分布式搭建(Centos 7系统)

1、关闭防火墙

systemctl stop firewalld     #关闭防火墙
systemctl start firewalld    #开启防火墙
systemctl disable firewalld  #设置开机禁用防火墙
systemctl enable firewalld   #设置开机启用防火墙
systemctl status firewalld   #查看防火墙状态

2、设置主机名

hostnamectl set-hostname master && bash  #设置主机名为master,立即生效.
hostnamectl set-hostname worker1 && bash  #设置主机名为worker1,立即生效.
hostnamectl set-hostname worker2 && bash  #设置主机名为worker2,立即生效.

3、配置主机名映射hosts文件

vim /etc/hosts          #进入hosts文件
192.168.10.100 master   #IP地址 主机名
192.168.10.101 worker1   #IP地址 主机名
192.168.10.102 worker2   #IP地址 主机名

3、设置静态IP

vim /etc/sysconfig/network-scripts/ifcfg-ens33   #进入配置IP文件

TYPE="Ethernet"
PROXY_METHOD="none"
BROWSER_ONLY="no"
BOOTPROTO="dhcp"            #改为static
DEFROUTE="yes"
IPV4_FAILURE_FATAL="no"
IPV6INIT="yes"
IPV6_AUTOCONF="yes"
IPV6_DEFROUTE="yes"
IPV6_FAILURE_FATAL="no"
IPV6_ADDR_GEN_MODE="stable-privacy"
NAME="ens33"
UUID="29eb0e94-b7d2-445a-93d9-d6755d24f55a"
DEVICE="ens33"
ONBOOT="no"                 #改为yes
IPADDR=192.168.10.100       #设置静态IP
GATEWAY=192.168.10.2        #配置网关
DNS1=192.168.10.2           #配置DNS       

systemctl restart network   #重启网络服务

4、配置jdk环境变量

vim /etc/profile   #进入环境变量配置文件

#添加以下内容--------------------
export JAVA_HOME=/opt/jdk1.8.0
export JRE_HOME=$JAVA_HOME/jre
export CLASSPATH=.:$JAVA_HOME/lib:$JRE_HOME/lib
export PATH=$PATH:$JAVA_HOME/bin
#---------------------------------

source /etc/profile   #使用source命令你个使配置文件生效

5、配置SSH免密登录

ssh-keygen -t rsa     #在主节点使用命令,一直按回车
ssh-copy-id worker1    #将公共密钥填充到另一个节点worker1上
ssh-copy-id worker2    #将公共密钥填充到另一个节点wokrer2上

ssh worker1   #验证是否免密成功
ssh worker2   #验证是否免密成功

6、配置Hadoop环境变量

vim /etc/profile   #进入环境变量配置文件

#添加以下内容--------------------
export HADOOP_HOME=/opt/hadoop3.3.6
export PATH=$PATH:$HADOOP_HOME/bin:$HADOOP_HOME/sbin
#---------------------------------

source /etc/profile   #使用source使配置文件生效

7、修改Hadoop配置文件

配置文件路径在hadoop中etc文件夹

修改hadoop-env.sh

export JAVA_HOME=/usr/local/program/jdk8    #jdk文件路径
export HDFS_NAMENODE_USER=root
export HDFS_DATANODE_USER=root
export HDFS_ZKFC_USER=root
export HDFS_JOURNALNODE_USER=root
export YARN_RESOURCEMANAGER_USER=root
export YARN_NODEMANAGER_USER=root

修改core-site.xml文件

<configuration>

<!-- 在configuration标签内添加以下内容 -->
<!-- fs.default.name已经过时了,现在一般都用fs.defaultFS-->
<!-- NameNode的地址  -->

   <property>
        <name>fs.defaultFS</name>
        <value>hdfs://master:9000</value>
   </property>

<!-- 临时文件存放位置 -->
   <property>
        <name>hadoop.tmp.dir</name>
        <value>file:/opt/app/hadoop/tmp</value>
   </property>

   <property>
         <name>hadoop.http.staticuser.user</name>
         <value>root</value>
    </property>

</configuration>

修改hdfs-site.xml

<configuration>

    <!-- namenode存放的位置,老版本是用dfs.name.dir -->
        <property>
                <name>dfs.namenode.name.dir</name>
                <value>/usr/hadoop3/hdfs/name</value>
        </property>

    <!-- datanode存放的位置,老版本是dfs.data.dir -->
        <property>
                <name>dfs.datanode.data.dir</name>
                <value>/usr/hadoop3/hdfs/data</value>
        </property>

    <!-- 设置副本数量 -->
        <property>
                <name>dfs.replication</name>
                <value>3</value>
        </property>

    <!-- namenode运行在哪儿节点,默认是0.0.0.0:9870,在hadoop3.x中端口从原先的50070改为了9870 -->
        <property>
                <name>dfs.namenode.http-address</name>
                 <value>master:9870</value>
        </property>
<!-- secondarynamenode(备用节点)运行在哪个节点,默认0.0.0.0:9868 -->
         <property>
                <name>dfs.namenode.secondary.http-address</name>
                <value>master:9868</value>
         </property>
</configuration>

<!--------------------------------- 其它配置权限 -------------------------------------->
<!-- 关闭文件上传权限检查 -->
<property>
	<name>dfs.permissions.enalbed</name>
    <value>false</value>
</property>

修改yarn-site.xml

<configuration>

    <!-- resourcemanager运行在哪个节点 -->
        <property>
                <name>yarn.resourcemanager.hostname</name>
                <value>master</value>
        </property>

    <!-- nodemanager获取数据的方式 -->
        <property>
                <name>yarn.nodemanager.aux-services</name>
                <value>mapreduce_shuffle</value>
        </property>

    <!-- 关闭虚拟内存检查 -->
        <property>
                <name>yarn.nodemanager.vmem-check-enabled</name>
                <value>false</value>
        </property>
</configuration>

修改mapred-site.xml

<configuration>
    
    <!-- 设置mapreduce在yarn平台上运行 -->
        <property>
                <name>mapreduce.framework.name</name>
                <value>yarn</value>
        </property>
    
<!-- 配了上面这个下面这个也得配, 不然跑mapreduce会找不到主类。MR应用程序的CLASSPATH-->
        <property>
                <name>mapreduce.application.classpath</name>
                <value>/opt/hadoop3.3.6/share/hadoop/mapreduce/*:/opt/hadoop-3.3.6/share/hadoop/mapreduce/lib/*</value>
        </property>
</configuration>

修改workers

vim workers

# 删掉里面的localhost,添加以下内容,你的两个从节点的ip映射
worker1
worker2

8、分发文件


# 分发jdk,$PWD:获取当前所在目录的绝对路径
scp -r jdk1.8.0_162 root@worker1:$PWD
scp -r jdk1.8.0_162 root@worker2:$PWD
# 分发hadoop
scp -r hadoop-3.3.3 root@worker1:$PWD
scp -r hadoop-3.3.3 root@worker2:$PWD
# 分发/etc/hosts
scp /etc/hosts root@worker1:/etc/
scp /etc/hosts root@worker2:/etc/
# 分发/etc/profile
scp /etc/profile root@worker1:/etc/
scp /etc/profile root@worker2:/etc/

# 然后在两个从节点上执行 source /etc/profile

9、格式化namenode

hdfs namenode -format

10、启动集群并测试

# 启动hadoop
start-all.sh
# 查看进程
jps

主节点进程

ResourceManager
NodeManager
Jps
DataNode
SecondaryNameNode
NameNode

从节点

DataNode
NodeManager

从节点

DataNode
NodeManager

二、Hadoop安装zookeeper(Centos 7系统)

1、安装zookeeper

tar -zxvf apache-zookeeper-3.7.0-bin.tar.gz

2、配置环境变量

export ZK_HOME=/opt/zookeeper
export PATH=$PATH:$JAVA_HOME/bin:$HADOOP_HOME/bin:$HADOOP_HOME/sbin:$ZK_HOME/bin

3、更改文件名字zoo.cfg

cd conf                      #进入zookeep的conf文件夹
mv zoo-sample.cfg zoo.cfg    #将zoo-sample.cfg改名为zoo.cfg

4、修改zoo.cfg配置文件

# The number of milliseconds of each tick
tickTime=2000
# The number of ticks that the initial 
# synchronization phase can take
initLimit=10
# The number of ticks that can pass between 
# sending a request and getting an acknowledgement
syncLimit=5
# the directory where the snapshot is stored.
# do not use /tmp for storage, /tmp here is just 
# example sakes.
dataDir=D:\\zookeeper\\data
# the port at which the clients will connect
clientPort=2181
# the maximum number of client connections.
# increase this if you need to handle more clients
#maxClientCnxns=60
#
# Be sure to read the maintenance section of the 
# administrator guide before turning on autopurge.
#
# http://zookeeper.apache.org/doc/current/zookeeperAdmin.html#sc_maintenance
#
# The number of snapshots to retain in dataDir
#autopurge.snapRetainCount=3
# Purge task interval in hours
# Set to "0" to disable auto purge feature
#autopurge.purgeInterval=1

## Metrics Providers
#
# https://prometheus.io Metrics Exporter
#metricsProvider.className=org.apache.zookeeper.metrics.prometheus.PrometheusMetricsProvider
#metricsProvider.httpPort=7000
#metricsProvider.exportJvmInfo=true

#server.1 = 主机ip(主机映射名):A:B
#server.2 = 主机ip(主机映射名):A:B
#server.3 = 主机ip(主机映射名):A:B
server.1 = 主机ip(主机映射名):2888:3888
server.2 = 主机ip(主机映射名):2888:3888
server.3 = 主机ip(主机映射名):2888:3888

配置文件相关说明

tickTime:这个时间是作为 Zookeeper 服务器之间或客户端与服务器之间维持心跳的时间间隔,也就是每个 tickTime 时间就会发送一个心跳。

initLimit:LF初始通信时限,集群中的follower服务器(F)与leader服务器(L)之间初始连接时能容忍的最多心跳数(tickTime的数量)。

syncLimit:LF同步通信时限,集群中的follower服务器与leader服务器之间请求和应答之间能容忍的最多心跳数(tickTime的数量)。

dataDir:顾名思义就是 Zookeeper 保存数据的目录,默认情况下,Zookeeper 将写数据的日志文件也保存在这个目录里。

clientPort:客户端连接端口,这个端口就是客户端连接 Zookeeper 服务器的端口,Zookeeper 会监听这个端口,接受客户端的访问请求

autopurge.snapRetainCount:保留数量。

autopurge.purgeInterval:清理时间间隔,单位:小时。

server.N = YYY:A:B,其中N表示服务器编号,YYY表示服务器的IP地址,A为LF通信端口,表示该服务器与集群中的leader交换的信息的端口。B为选举端口,表示选举新leader时服务器间相互通信的端口(当leader挂掉时,其余服务器会相互通信,选择出新的leader)。一般来说,集群中每个服务器的A端口都是一样,每个服务器的B端口也是一样。但是当所采用的为伪集群时,IP地址都一样,只能时A端口和B端口不一样。

5、创建myid文件

#在dataDir=D:\\zookeeper\\data文件下创建myid

vim myid

#在myid中填写数字序号,序号和zoo.cfg中server序号相同

6、分发zookeeper

scp -r /opt/zookeeper/ root@worker1:/opt/
scp -r /opt/zookeeper/ root@worker2:/opt/

7、zookeeper基本命令

zkServe.sh start        #开启zookeeper服务
zkServer.sh status      #关闭zookeeper服务

三、Hadoop高可用搭建(Centos 7系统)

1、修改配置文件

修改core-site.xml

<configuration>
    
   <!-- 在ha模式中指定hdfs集群的逻辑名称:把多个NameNode的地址组装成一个集群 -->
    <property>
        <name>fs.defaultFS</name>
        <value>hdfs://my-hdfs</value>
    </property>
    
     <!-- 声明hadoop工作目录:hadoop运行时产生文件的存储目录 -->
   <property>
        <name>hadoop.tmp.dir</name>
        <value>file:/opt/app/hadoop/tmp</value>
   </property>
    
     <!-- 配置HDFS网页登录使用的静态用户:Root-->
    <property>
        <name>hadoop.http.staticuser.user</name>
        <value>root</value>
    </property>
    
     <!-- 指定zookeeper集群的地址:zkfc要连接的zkServer地址,用于管理hdfs集群 -->
    <property>
        <name>ha.zookeeper.quorum</name>
        <value>master:2181,worker1:2181,worker2:2181</value>
    </property>
</configuration>

修改hdfs-site.xml

<configuration>
    
    <!-- 指定逻辑名称,自动寻找NameNode节点 -->
    <property>
        <name>dfs.nameservices</name>
        <value>my-hdfs</value>
    </property>
    
    <!-- 把定义的逻辑名称指向各个namenode的别名,即集群中NameNode节点 -->
    <property>
        <name>dfs.ha.namenodes.my-hdfs</name>
        <value>nn1,nn2</value>
    </property>
    
    <!-- NameNode RPC通信地址 -->
    <property>
        <name>dfs.namenode.rpc-address.my-hdfs.nn1</name>
        <value>master:8020</value>
    </property>
    <property>
        <name>dfs.namenode.rpc-address.my-hdfs.nn2</name>
        <value>worker1:8020</value>
    </property>
    
    <!-- 指定namenode别名对应的IP地址即NameNode连接地址:NameNode的http通信地址-->
    <property>
        <name>dfs.namenode.http-address.my-hdfs.nn1</name>
        <value>master:9870</value>
    </property>
    <property>
        <name>dfs.namenode.http-address.my-hdfs.nn2</name>
        <value>worker1:9870</value>
    </property>
    
    <!-- 配置JournalNode集群的地址,指定编辑日志的共享目录 -->
    <property>
        <name>dfs.namenode.shared.edits.dir</name>
        <value>qjournal://master:8485;worker1:8485;worker2:8485/my-hdfs</value>
    </property>
    
    <!-- 指定JouralNode节点存放编辑日志的存储路径 -->
    <property>
        <name>dfs.journalnode.edits.dir</name>
        <value>/usr/local/program/hadoop/datas/qjm</value>
    </property>
    
    <!-- namenode存放的位置,老版本是用dfs.name.dir -->
        <property>
                <name>dfs.namenode.name.dir</name>
                <value>/usr/hadoop3/hdfs/name</value>
        </property>

    <!-- datanode存放的位置,老版本是dfs.data.dir -->
        <property>
                <name>dfs.datanode.data.dir</name>
                <value>/usr/hadoop3/hdfs/data</value>
        </property>
    
    <!-- 开启自动故障转移功能: client用于确定哪个NameNode为Active -->
    <property>
        <name>dfs.client.failover.proxy.provider.my-hdfs</name>
        <value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>
    </property>
    
    <!-- 指定ha出现故障时的隔离方法 -->
    <property>
        <name>dfs.ha.fencing.methods</name>
        <value>sshfence</value>
        <value>shell(true)</value>
    </property>
    
    <!-- 指定隔离主机的私钥路径(主备节点间相互免密钥,指定私匙地址)-->
    <property>
        <name>dfs.ha.fencing.ssh.private-key-files</name>
        <value>/root/.ssh/id_rsa</value>
    </property>
    
    <!-- 开启自动故障转移功能 -->
    <property>
        <name>dfs.ha.automatic-failover.enabled</name>
        <value>true</value>
    </property>
    
    <!--副本数量,默认3个-->
    <property>
        <name>dfs.replication</name>
        <value>3</value>
    </property>
    
    <!-- secondarynamenode(备用节点)运行在哪个节点,默认0.0.0.0:9868 -->
         <property>
                <name>dfs.namenode.secondary.http-address</name>
                <value>master:9868</value>
         </property>
</configuration>

修改mapred-stie.xml

<configuration>
    
    <!-- 指定MapReduce程序运行在Yarn上 -->
    <property>
        <name>mapreduce.framework.name</name>
        <value>yarn</value>
    </property>
    
    <!-- 配了上面这个下面这个也得配, 不然跑mapreduce会找不到主类。MR应用程序的CLASSPATH-->
     <property>
             <name>mapreduce.application.classpath</name>
             <value>/opt/hadoop3.3.6/share/hadoop/mapreduce/*:/opt/hadoop-3.3.6/share/hadoop/mapreduce/lib/*</value>
     </property>
    
    <!-- 指定mapreduce jobhistory地址:历史服务器端地址 -->
    <property>
        <name>mapreduce.jobhistory.address</name>
        <value>master:10020</value>
    </property>
    
    <!-- 任务历史服务器的web地址 -->
    <property>
        <name>mapreduce.jobhistory.webapp.address</name>
        <value>master:19888</value>
    </property>
    
    <!-- 配置运行过的日志存放在hdfs上的存放路径 -->
    <property>
        <name>mapreduce.jobhistory.done-dir</name>
        <value>/history/done</value>
    </property>
    
    <!-- 配置正在运行中的日志在hdfs上的存放路径 -->
    <property>
        <name>mapreudce.jobhistory.intermediate.done-dir</name>
        <value>/history/done/done_intermediate</value>
    </property>
    
    <!--以下必须配置,否则运行MapReduce会提示检查是否配置-->
	<property>
		<name>yarn.app.mapreduce.am.env</name>
		<value>HADOOP_MAPRED_HOME=/usr/local/program/hadoop</value>
	</property>
	<property>
		<name>mapreduce.map.env</name>
		<value>HADOOP_MAPRED_HOME=/usr/local/program/hadoop</value>
	</property>
	<property>
		<name>mapreduce.reduce.env</name>
		<value>HADOOP_MAPRED_HOME=/usr/local/program/hadoop</value>
	</property>
</configuration>

修改yarn-site.xml文件

<configuration>
    <!-- 开启resourcemanager(RM)高可用 -->
    <property>
        <name>yarn.resourcemanager.ha.enabled</name>
        <value>true</value>
    </property>
    <!-- 指定RM的cluster id -->
    <property>
        <name>yarn.resourcemanager.cluster-id</name>
        <value>my-hdfs</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>master</value>
    </property>
    <property>
        <name>yarn.resourcemanager.hostname.rm2</name>
        <value>worker1</value>
    </property>
    
    <!-- YARN资源管理器(ResourceManager)的Web用户界面的地址 -->
    <property>
        <name>yarn.resourcemanager.webapp.address.rm1</name>
        <value>master:8088</value>
    </property>
    <property>
        <name>yarn.resourcemanager.webapp.address.rm2</name>
        <value>worker1:8088</value>
    </property>
    
    <!-- 指定zk集群地址 -->
    <property>
        <name>yarn.resourcemanager.zk-address</name>
        <value>master:2181,worker1:2181,worker2:2181</value>
    </property>
     <!-- 指定MR走shuffle -->
    <property>
        <name>yarn.nodemanager.aux-services</name>
        <value>mapreduce_shuffle</value>
    </property>
    
    <!-- 开启日志聚合 -->
    <property>
        <name>yarn.log-aggregation-enable</name>
        <value>true</value>
    </property>
     <!-- 设置日志聚集服务器地址 -->
    <property>
        <name>yarn.log.server.url</name>
        <value>http://master:19888/jobhistory/logs</value>
    </property>
    <!-- 设置日志保留时间 -->
    <property>
        <name>yarn.log-aggregation.retain-seconds</name>
        <value>86400</value>
    </property>
    
    <!-- 启用自动恢复 -->
    <property>
        <name>yarn.resourcemanager.recovery.enabled</name>
        <value>true</value>
    </property>
    <!-- 指定resourcemanager的状态信息存储在zookeeper集群上 -->
    <property>
        <name>yarn.resourcemanager.store.class</name>
        <value>org.apache.hadoop.yarn.server.resourcemanager.recovery.ZKRMStateStore</value>
    </property>
        <!-- 关闭虚拟内存检查 -->
        <property>
                <name>yarn.nodemanager.vmem-check-enabled</name>
                <value>false</value>
        </property>
</configuration>

2、分发文件


# 分发hadoop配置好的文件
scp -r /opt/hadoop/ root@worker1:/opt/
scp -r /opt/hadoop/ root@worker2:/opt/

3、第一次启动顺序

启动zookeeper

zkServer.sh start    #三个节点都要启动
zkServer.sh status   #查看状态受否正常

4、启动JournalNode

hdfs --daemon start journalnode   #三个节点都要启动

5、格式化namenode

hdfs namenode -format    #格式化namenode,主节点格式化
#格式化前清除目录数据,data文件,name文件

6、格式化ZKFC,启动ZKFC

hdfs zkfc -formatZK   #格式化ZKFC,主节点格式化
hdfs --daemon start zkfc   #启动ZKFC,主节点启动

7、启动namenode

hdfs --daemon start namenode   #主节点启动

8、启动副节点namenode

hdfs namenode -bootstrapStandby    #副节点启动namenode,同步namenode

9、启动其他节点

start-all.sh

3、其次启动顺序

hdfs --daemon start zkfc   #主节点启动
zkServer.sh start          #三个节点都要启动
start-all.sh start         #主节点启动

4、查看节点个数

主节点

[root@node001 hadoop]# jps
18946 QuorumPeerMain
25123 NameNode
26628 DFSZKFailoverController
26182 DataNode
27368 ResourceManager
27561 NodeManager
24666 JournalNode
27965 Jps

副节点

[root@node002 hadoop]# jps
26515 Jps
25939 NameNode
21860 QuorumPeerMain
26055 DataNode
26217 DFSZKFailoverController
26398 NodeManager
25247 JournalNode

其它节点

[root@node003 hadoop]# jps
28421 NodeManager
27783 DataNode
28727 Jps
24650 QuorumPeerMain
27583 JournalNode