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
相关推荐
凡人叶枫4 分钟前
C++中智能指针详解(Linux实战版)| 彻底解决内存泄漏,新手也能吃透
java·linux·c语言·开发语言·c++·嵌入式开发
Hello.Reader19 分钟前
Flink 对接 Google Cloud Storage(GCS)读写、Checkpoint、插件安装与生产配置指南
大数据·flink
yuanmenghao27 分钟前
Linux 性能实战 | 第 7 篇 CPU 核心负载与调度器概念
linux·网络·性能优化·unix
qq_2975746740 分钟前
Linux 服务器 Java 开发环境搭建保姆级教程
java·linux·服务器
70asunflower1 小时前
Emulation,Simulation,Virtualization,Imitation 的区别?
linux·docker
浪子小院1 小时前
ModelEngine 智能体全流程开发实战:从 0 到 1 搭建多协作办公助手
大数据·人工智能
聆风吟º1 小时前
CANN开源项目实战指南:使用oam-tools构建自动化故障诊断与运维可观测性体系
运维·开源·自动化·cann
NPE~2 小时前
自动化工具Drissonpage 保姆级教程(含xpath语法)
运维·后端·爬虫·自动化·网络爬虫·xpath·浏览器自动化
神梦流2 小时前
GE 引擎的内存优化终局:静态生命周期分析指导下的内存分配与复用策略
linux·运维·服务器
凡人叶枫2 小时前
C++中输入、输出和文件操作详解(Linux实战版)| 从基础到项目落地,避坑指南
linux·服务器·c语言·开发语言·c++