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
相关推荐
bwz999@88.com14 分钟前
联想SR5507X04安装ubuntu-24.04.4 server,采用 Linux 原生mdadm(mdraid)软 RAID+LVM分区
运维·服务器
Canicer19 分钟前
OpenClaw搭配Coze工作流实现全自动发布文章至WordPress网站!
运维·服务器
王小义笔记28 分钟前
WSL(Linux)如何安装conda
linux·运维·conda
Fairy要carry30 分钟前
面试10-Agent 团队协议的管理
运维·服务器·网络
袁庭新31 分钟前
M系列芯片Mac上通过Homebrew一键安装/卸载Nginx并上线项目全指南
运维·nginx·macos·袁庭新·袁庭新ai
IDIOT___IDIOT32 分钟前
关于 git 进行版本管理的时候 gitignore 写入忽略规则而不生效的问题
大数据·git·elasticsearch
不想看见40433 分钟前
Git 误删急救手册
大数据·git·elasticsearch
偷懒下载原神38 分钟前
【linux操作系统】信号
linux·运维·服务器·开发语言·c++·git·后端
源远流长jerry1 小时前
RDMA 传输服务详解:可靠性与连接模式的深度剖析
linux·运维·网络·tcp/ip·架构
网络工程小王1 小时前
【大数据技术详解】——Elasticsearch技术(学习笔记)
大数据·大数据技术·向量查询