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
相关推荐
G皮T2 小时前
【Elasticsearch】审计日志(二):Compliance settings(合规性审计设置)
大数据·elasticsearch·搜索引擎·全文检索·kibana·审计·审计日志
-大头.2 小时前
GIT教程系列(共3篇)-----第三篇:Git高级技巧与专业配置完全指南
大数据·git·elasticsearch
熊猫钓鱼>_>2 小时前
【开源鸿蒙跨平台开发先锋训练营】[Day 3] React Native for OpenHarmony 实战:网络请求集成与高健壮性列表构建
大数据·人工智能·react native·华为·开源·harmonyos·智能体
翼龙云_cloud2 小时前
腾讯云渠道商:新手怎么在腾讯云 CVM 搭建 Ghost 博客?
运维·云计算·腾讯云
roman_日积跬步-终至千里2 小时前
【Hadoop】HDFS Router-based Federation:解决 NameNode 扩展性问题的联邦方案
大数据·hadoop·hdfs
查拉图斯特拉面条2 小时前
Git推送完全指南:从首次推送到冲突解决
大数据·git·elasticsearch
头发还没掉光光2 小时前
Linux网络之TCP协议
linux·运维·开发语言·网络·网络协议·tcp/ip
尼古拉斯·纯情暖男·天真·阿玮2 小时前
实验七 防火墙与入侵防护实验
linux·服务器·网络
lytao1232 小时前
Docker磁盘空间自动化清理实战
运维·服务器·docker·自动化