Linux软件安装 —— Hadoop高可用安装(集成Zookeeper)

文章目录


一、节点说明

1、相关软件

IP 主机名 部署软件
192.168.10.102 node02 jdk,hadoop,zookeeper
192.168.10.103 node03 jdk,hadoop,zookeeper
192.168.10.104 node04 jdk,hadoop,zookeeper

2、相关进程

node02 node03 node04
HDFS NameNode DFSZKFailoverController JournalNode DataNode NameNode DFSZKFailoverController JournalNode DataNode JournalNode DataNode
YARN ResourceManager NodeManager ResourceManager NodeManager NodeManager
zookeeper QuorumPeerMain QuorumPeerMain QuorumPeerMain

二、配置节点间免密登录

参考本人此篇文章:Linux软件安装 ------ SSH免密登录


三、JDK安装

参考本人此篇文章:Linux软件安装 ------ JDK安装


四、Zookeeper安装

参考本人此篇文章:Linux软件安装 ------ zookeeper集群安装


五、Hadoop安装

1、基础环境准备

(1)下载安装包

下载地址:Apache Hadoop

本文使用版本为:hadoop-3.1.3.tar.gz

(2)上传并解压
shell 复制代码
# 解压到安装目录
tar -zxvf hadoop-3.1.3.tar.gz -C /opt/module/

# 修改名称
mv hadoop-3.1.3/ hadoop
(3)创建必要的目录
shell 复制代码
mkdir -p /opt/module/hadoop/tmp
mkdir -p /opt/module/hadoop/journal
mkdir -p /opt/module/hadoop/pid
mkdir -p /opt/module/hadoop/nm-local-dir
mkdir -p /opt/module/hadoop/hdfs/name
mkdir -p /opt/module/hadoop/hdfs/data
mkdir -p /opt/module/hadoop/hdfs/namesecondary

2、hadoop配置文件

以下配置文件均在/opt/module/hadoop/etc/hadoop下

(1)配置core-site.xml
xml 复制代码
<configuration>
    <!-- 指定HDFS的nameservice为ns -->
    <property>
        <name>fs.defaultFS</name>
        <value>hdfs://ns</value>
    </property>
    
    <!-- 指定Hadoop临时目录 -->
    <property>
        <name>hadoop.tmp.dir</name>
        <value>/opt/module/hadoop/tmp</value>
    </property>
    <property>
      <name>io.file.buffer.size</name>
      <value>4096</value>
	</property>
    <!-- 指定Zookeeper集群地址 -->
    <property>
        <name>ha.zookeeper.quorum</name>
        <value>node02:2181,node03:2181,node04:2181</value>
    </property>
    
</configuration>
(2)配置hdfs-site.xml
xml 复制代码
<configuration>
    <!-- 指定副本数量 -->
    <property>
        <name>dfs.replication</name>
        <value>3</value>
    </property>
    
    <!-- 指定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>
    
    <!-- RPC通信地址 -->
    <property>
        <name>dfs.namenode.rpc-address.ns.nn1</name>
        <value>node02:8020</value>
    </property>
    <property>
        <name>dfs.namenode.rpc-address.ns.nn2</name>
        <value>node03:8020</value>
    </property>
    
    <!-- HTTP通信地址 -->
    <property>
        <name>dfs.namenode.http-address.ns.nn1</name>
        <value>node02:9870</value>
    </property>
    <property>
        <name>dfs.namenode.http-address.ns.nn2</name>
        <value>node03:9870</value>
    </property>
    
    <!-- 指定NameNode的edits元数据在JournalNode上的存放位置 -->
    <property>
        <name>dfs.namenode.shared.edits.dir</name>
        <value>qjournal://node02:8485;node03:8485;node04:8485/ns</value>
    </property>
    
    <!-- 指定JournalNode本地磁盘存放路径 -->
    <property>
        <name>dfs.journalnode.edits.dir</name>
        <value>/opt/module/hadoop/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:/opt/module/hadoop/hdfs/name</value>
    </property>
    <property>
        <name>dfs.datanode.data.dir</name>
        <value>file:/opt/module/hadoop/hdfs/data</value>
    </property>
    
   <!-- 在NN和DN上开启WebHDFS (REST API)功能,不是必须 -->
    <property>
       <name>dfs.webhdfs.enabled</name>
       <value>true</value>
    </property>
    
</configuration>
(3)配置yarn-site.xml
xml 复制代码
<configuration>
    <!-- NodeManager上运行的辅助服务 -->
    <property>
        <name>yarn.nodemanager.aux-services</name>
        <value>mapreduce_shuffle</value>
    </property>
    
    <!-- 开启RM高可用 -->
    <property>
        <name>yarn.resourcemanager.ha.enabled</name>
        <value>true</value>
    </property>
    
    <!-- 指定RM的cluster id -->
    <property>
        <name>yarn.resourcemanager.cluster-id</name>
        <value>clusterrm</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>node02</value>
    </property>
    <property>
        <name>yarn.resourcemanager.hostname.rm2</name>
        <value>node03</value>
    </property>
    
    <!-- 用户通过此地址访问YARN管理界面(如查看应用状态、资源使用情况) -->
  	<property>
    	<name>yarn.resourcemanager.webapp.address</name>
    	<value>node02:8088</value>
  	</property>
    
    <!-- 指定zk集群地址 -->
    <property>
        <name>yarn.resourcemanager.zk-address</name>
        <value>node02:2181,node03:2181,node04:2181</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>
    
    <!-- 调度器类型配置:这里使用公平调度器(Fair Scheduler) -->
    <property>
        <name>yarn.resourcemanager.scheduler.class</name>
        <value>org.apache.hadoop.yarn.server.resourcemanager.scheduler.fair.FairScheduler</value>
    </property>
    <!-- 启用抢占功能 -->
    <property>
        <name>yarn.scheduler.fair.preemption</name>
        <value>true</value>
    </property>
	<!-- 下面配置用来设置集群利用率的阀值, 默认值0.8f,最多可以抢占到集群所有资源的80% -->
    <property>
        <name>yarn.scheduler.fair.preemption.cluster-utilization-threshold</name>
		<value>1.0</value>
    </property>
    
    <!-- 虚拟内存与物理内存比例 -->
	<property>
        <name>yarn.nodemanager.vmem-pmem-ratio</name>
        <value>4.2</value>
    </property>
    
    <!-- NodeManager本地目录 -->
    <property>
        <name>yarn.nodemanager.local-dirs</name>
        <value>/opt/module/hadoop/nm-local-dir</value>
    </property>
    
    <!-- 开启日志聚集功能 -->
    <property>
        <name>yarn.log-aggregation-enable</name>
        <value>true</value>
    </property>
    <!-- 设置日志保留时间为7天 -->
    <property>
        <name>yarn.log-aggregation.retain-seconds</name>
        <value>604800</value>
    </property>
    
    <!-- 环境变量的继承 -->
    <property>
        <name>yarn.nodemanager.env-whitelist</name>
        	<value>JAVA_HOME,HADOOP_COMMON_HOME,HADOOP_HDFS_HOME,HADOOP_CONF_DIR,CLASSPATH_PREPEND_DISTCACHE,HADOOP_YARN_HOME,HADOOP_MAPRED_HOME</value>
    </property>

</configuration>
xml 复制代码
<!-- 以下配置根据服务器配置进行配置 -->
<property>
    <name>yarn.scheduler.maximum-allocation-mb</name>
    <value>16384</value>
</property>
<property>
    <name>yarn.nodemanager.resource.memory-mb</name>
    <value>26214</value>
</property>
<property>
    <name>yarn.nodemanager.resource.cpu-vcores</name>
    <value>16</value>
</property>
(4)配置mapred-site.xml
xml 复制代码
<configuration>
    <property>
        <name>mapreduce.framework.name</name>
        <value>yarn</value>
    </property>
</configuration>
(5)配置workers
复制代码
node02
node03
node04

3、将hadoop分发到node03,node04

shell 复制代码
scp -r /opt/module/hadoop/ root@node03:/opt/module/
scp -r /opt/module/hadoop/ root@node04:/opt/module/

六、初始化及启动

1、环境变量配置

三节点都需要

shell 复制代码
# 编辑环境变量,创建单独文件方便管理
vim /etc/profile.d/my_env.sh

# JAVA_HOME,JDK文章中已配置,此处不配,仅做展示
export JAVA_HOME=/opt/module/jdk8
export PATH=$PATH:$JAVA_HOME/bin

# ZOOKEEPER_HOME,zookeeper文章中已配置,此处不配,仅做展示
export ZOOKEEPER_HOME=/opt/module/zookeeper
export PATH=$PATH:$ZOOKEEPER_HOME/bin

# HADOOP_HOME
export HADOOP_HOME=/opt/module/hadoop
export PATH=$PATH:$HADOOP_HOME/bin:$HADOOP_HOME/sbin
export HADOOP_CLASSPATH=$(hadoop classpath)
export HADOOP_CONF_DIR=${HADOOP_HOME}/etc/hadoop
export HADOOP_PID_DIR=/opt/module/hadoop/pid
export HADOOP_SECURE_PID_DIR=${HADOOP_PID_DIR}
export HDFS_NAMENODE_USER=root
export HDFS_DATANODE_USER=root
export HDFS_JOURNALNODE_USER=root
export HDFS_ZKFC_USER=root
export YARN_RESOURCEMANAGER_USER=root
export YARN_NODEMANAGER_USER=root

# 退出后,刷新环境变量
source /etc/profile.d/my_env.sh

2、启动zookeeper

shell 复制代码
# 在三个节点分别启动zookeeper
zkServer.sh start

# 也可以用zookeeper文章中创建的一键启停脚本,在node02上执行
zookeeper.sh start

# 查看zookeeper状态
zookeeper.sh status

3、启动hdfs

shell 复制代码
# 创建ZOOKEEPER中hadoop-ha命名空间,任意ZOOKEEPER节点执行,此处node02
hdfs zkfc -formatZK

# 启动journalnode,在node02,node03,node04分别执行如下命令
hadoop-daemon.sh start journalnode

# 初始化NameNode节点,任意一个NameNode节点,仅需要初始化一个,此处node02
hdfs namenode -format ns
# 启动当前NameNode,此处node02
hadoop-daemon.sh start namenode

# 在另一个NameNode节点执行同步元数据,此处node03
hdfs namenode -bootstrapStandby
# 启动当前NameNode,此处node03
hadoop-daemon.sh start namenode

# 在两个NameNode节点node02,node03启动zookeeper协同
hadoop-daemon.sh start zkfc

# 启动datanode,在node02,node03,node04分别执行如下命令
hadoop-daemon.sh start datanode

此处因为第一次启动,涉及NameNode初始化,步骤相对多一点,后续启停步骤如下:

shell 复制代码
###################### 一般步骤 ######################
# 启动journalnode,在node02,node03,node04分别执行如下命令
hadoop-daemon.sh start journalnode

# 启动NameNode,两个NameNode节点node02,node03
hadoop-daemon.sh start namenode

# 启动zookeeper协同,两个NameNode节点node02,node03
hadoop-daemon.sh start zkfc

# 启动datanode,在node02,node03,node04分别执行如下命令
hadoop-daemon.sh start datanode

# 停止为上述相同节点相反步骤依次执行

###################### 一键启停(官方提供) ######################
# 启动hdfs集群
start-dfs.sh

# 停止hdfs集群
stop-dfs.sh

4、启动yarn集群

shell 复制代码
###################### 一般步骤 ######################
# 启动resourcemanager,两个resourcemanager节点node02,node03
yarn-daemon.sh start resourcemanager

### 启动nodemanager,在node02,node03,node04分别执行如下命令
yarn-daemon.sh start nodemanager

###################### 一键启停(官方提供) ######################
# 启动hdfs集群
start-yarn.sh

# 停止hdfs集群
stop-yarn.sh

七、集群验证

1、Web UI访问

(1)HDFS NameNode UI:

(2)YARN ResourceManager UI:

2、 功能测试

shell 复制代码
# 1. 创建HDFS目录
hdfs dfs -mkdir /test
hdfs dfs -mkdir /input

# 2. 上传文件测试
echo "Hello Hadoop HA Cluster" > test.txt
hdfs dfs -put test.txt /test/

# 3. 查看文件
hdfs dfs -ls /test
hdfs dfs -cat /test/test.txt

# 4. 运行MapReduce测试
# 创建测试文件
echo "apple orange banana apple orange" > word.txt
echo "hadoop spark hive hadoop" >> word.txt
hdfs dfs -put word.txt /input/

# 运行WordCount示例,版本号以自己的版本为准
hadoop jar $HADOOP_HOME/share/hadoop/mapreduce/hadoop-mapreduce-examples-3.1.3.jar wordcount /input/word.txt /output/

# 查看结果
hdfs dfs -cat /output/part-r-00000

3、故障转移测试

shell 复制代码
# 1. 查看当前Active NameNode
hdfs haadmin -getServiceState nn1
hdfs haadmin -getServiceState nn2

# 2. 手动故障转移
hdfs haadmin -transitionToStandby nn1
hdfs haadmin -transitionToActive nn2

# 3. 模拟故障(杀死Active NameNode进程)
# 找到Active NameNode的进程ID并kill

# 4. 观察自动故障转移
# 大约30秒后,Standby NameNode会自动切换为Active
相关推荐
玫瑰互动GEO15 分钟前
腾讯AnswerBit(GEO优化监测平台)技术拆解:UI自动化如何采集真实AI回答
大数据·人工智能·ui·ai·自动化·geo优化
Titan202421 分钟前
网络基础:传输层协议知识梳理
linux·服务器·网络
一叶龙洲26 分钟前
Ubuntu从图标到卸载应用
linux·windows·ubuntu
KIZIFLOW北泽五金31 分钟前
液压系统压力损失怎么降?成因分析与减损实操方案
运维·自动化·新媒体运营·产品运营·流量运营·用户运营·内容运营
介拙36 分钟前
Zabbix 7.0 从装到告警触发,我踩了这些坑
运维
爱吃提升40 分钟前
VMware虚拟机迁移系统磁盘完整教程(VMware Workstation17)
linux·运维·服务器
2401_8685347843 分钟前
网规备考_5.4 防火墙及访问控制技术
linux·网络协议
wuminyu1 小时前
Linux内核线程调度与虚拟线程调度机制系统级深度剖析
java·linux·c语言·jvm·c++
诸葛李1 小时前
linux 配置
linux·运维·服务器
zhuhai_xigedian1 小时前
源网荷储一体化柜的经济效益优化功能实现机制
大数据·运维·人工智能·重构·能源