大数据Hadoop运维应用实践------双NameNode高可用Hadoop集群架构(上)
https://blog.csdn.net/xiaochenXIHUA/article/details/162849636
一、Hadoop集群中的基础配置文件解析
Hadoop集群设置
https://hadoop.apache.org/docs/current3/hadoop-project-dist/hadoop-common/ClusterSetup.html
1.1、core-site.xml文件
| core-site.xml属性 |
说明 |
| fs.defaultFS |
指定全局访问HDFS文件系统的URI,在HA集群中,此值必须和hdfs-site.xml中的dfs.nameservices配置值一致。 URI格式规范:hdfs://主机名:RPC端口 |
| hadoop.tmp.dir |
**路径默认是NameNode、DataNode、JournalNode等存放临时数据的公共目录。**用户也可以自己单独指定这三类节点的目录。 官方警告:不要使用默认/tmp!系统定时清理会销毁HDFS元数据。 |
| ha.zookeeper.quorum |
是ZooKeeper集群的地址和端口。 注意,数量一定是奇数,且不少于三个节点。 |
| fs.trash.interval |
回收站保留过期时间(存活周期)。 在文件从HDFS永久删除前,用户可以自由地把文件从该目录下移出来并立即还原。 * 默认值:0(0 代表关闭回收站,删除文件直接永久清除) * 含义:用户执行 hdfs dfs -rm 删除文件后,文件会移入 /user/${user}/.Trash,在回收站中最多保留多久。 * 逻辑:设为 1440 = 24×60,代表文件在回收站存放 24 小时,超时自动永久删除。 关键特性: 1. 只对客户端删除操作生效;NameNode 后台不会主动扫描清理,需要 checkpoint 机制配合; 2. 若值 = 0:Trash 功能禁用,删除直接落地; 3. 单位:分钟。 |
| fs.trash.checkpoint.interval |
回收站扫描 checkpoint 间隔(清理轮询周期) * 默认值:0 * 强制约束:必须小于 fs.trash.interval,建议为其 1/10~1/6,否则配置失效 * 含义:NameNode 后台多久执行一次回收站扫描,判断哪些文件已超过 trash.interval 并彻底删除。 * 逻辑:后台定时巡检 .Trash 目录,对比文件移入回收站的时间,超过保留时长则永久清理(如:设置120分钟)。 * 单位:分钟。 |
1.2、hdfs-site.xml文件
| hdfs-site.xml属性 |
说明 |
| dfs.nameservices |
指定一个逻辑上的HDFS集群服务名,这个服务名是自定义的。 当外界访问HDFS集群时,入口就是这个服务名。用户不必关心当前是哪台服务器在提供服务,只要访问这个服务名就可以了。 |
| dfs.ha.namenodes.bigdata |
指定两个NameNode的唯一标识,名字随便起,相互不重复即可。在HDFS集群管理中会用到。 |
| dfs.namenode.rpc-address.bigdata.nn1 |
指定nn1的RPC地址。 |
| dfs.namenode.rpc-address.bigdata.nn2 |
指定nn2的RPC地址。 |
| dfs.namenode.http-address.bigdata.nn1 |
指定nn1的http地址。 |
| dfs.namenode.http-address.bigdata.nn2 |
指定nn2的http地址。 |
| dfs.namenode.shared.edits.dir |
指定集群的两个NameNode共享edits文件目录时,使用的JournalNode集群的信息。 |
| dfs.ha.automatic-failover.enabled.bigdata |
指定bigdata服务是否启动故障自动恢复功能(即当NameNode出故障时,是否自动切换到另一台NameNode)。 true表示自动切换。 |
| dfs.client.failover.proxy.provider.bigdata |
配置失败自动切换实现方式,指定bigdata服务出故障时,哪个java类负责执行故障切换。 |
| dfs.journalnode.edits.dir |
指定JournalNode集群在对NameNode的元数据目录进行共享时,数据在本地磁盘存储的路径。 |
| dfs.replication |
指定DataNode存储数据块的副本数量。 默认值是3个,我们现在有3个DataNode,该值不大于3即可。 |
| dfs.ha.fencing.methods |
配置隔离机制,一旦需要NameNode切换,使用shell方式进行操作。 |
| dfs.namenode.name.dir |
用于确定将HDFS文件系统的元信息保存在什么目录下。 如果这个参数设置为多个目录,那么这些目录下都保存着元信息的镜像备份。推荐多个磁盘路径存放元数据【建议每个路径都使用独立磁盘,最好是使用raid1】。 |
| dfs.datanode.data.dir |
用于确定将HDFS文件系统的数据存储在本地磁盘哪个目录下。 我们可以将这个参数设置为多个磁盘分区上的不同目录,即可将HDFS数据分布在多个不同磁盘分区上,推荐多个磁盘路径存放元数据【建议每个路径都使用独立磁盘,最好是使用raid1】。 |
| dfs.block.size |
设置hdfs数据块大小,这里设置的是每个块128M。 |
| dfs.permissions |
表示是否在HDFS中开启权限检查,true表示开启,false表示关闭,生产环境建议开启。 |
| dfs.namenode.acls.enabled |
表示是否对HDFS开启acl规则;true表示开启,false表示关闭,生产环境建议开启。 |
| dfs.permissions.supergroup |
指定超级用户组。仅能设置一个,默认是supergroup。 |
| dfs.hosts |
指定一个文件,文件的内容是主机名,一行一个主机,表示可与NameNode连接的datanode主机地址【扩容就在这里添加】。 |
| dfs.hosts.exclude |
指定一个文件,文件的内容是主机名,一行一个主机,表示不允许与NameNode连接的主机地址【缩容就在这里添加】。 |
1.3、mapred-site.xml文件
| mapred-site.xml属性 |
说明 |
| mapreduce.framework.name |
指定运行MapReduce的环境是yarn,与Hadoop1.x版本截然不同的地方。 |
| mapreduce.jobhistory.address |
指定MapReduce JobHistory Server地址(端口 10020); MR 客户端提交、读取历史元数据使用。 |
| mapreduce.jobhistory.webapp.address |
指定MapReduce JobHistory Server Web UI地址; 浏览器查看 MR 历史作业 Web 页面(19888 端口),排查 Map/Reduce 执行细节、Counter、失败日志。 |
| mapreduce.jobhistory.done-dir |
默认 ${hadoop.tmp.dir}/mapred/history/done,hadoop.tmp.dir 是临时目录,系统 / 定时任务会自动清理,历史日志永久丢失,无法满足审计需求;必须指定独立持久化 HDFS 目录,避免系统自动清理删除历史日志;多租户 / 数仓集群审计合规硬性要求。 |
| mapreduce.jobhistory.intermediate-done-dir |
默认 ${hadoop.tmp.dir}/mapred/history/done_intermediate,``hadoop.tmp.dir 是临时目录,系统 / 定时任务会自动清理,历史日志永久丢失,无法满足审计需求; 存放正在完成但未归档的临时历史文件,必须独立 HDFS 路径,防止 tmp 清理丢失中间记录。 |
| mapreduce.jobhistory.cleaner.enable |
默认 true(建议显式声明);生产必须开启自动清理,防止 HDFS 历史文件无限膨胀。开启历史日志自动清理后台线程;关闭则所有 MR 历史文件永久留存 HDFS,持续占用存储空间。 |
| mapreduce.jobhistory.cleaner.max-age-ms |
历史文件保留时长,生产统一管控存储周期(单位:毫秒;1天=24*60*60*1000=86400000); 默认值:-1(代表永不自动删除); 说明:历史日志文件最大保留时长,单位毫秒;超过该时间的历史归档文件会被 JHS 清理线程自动删除。 |
| mapreduce.map.memory.mb |
* 默认:1024 * 作用:Map 容器向 YARN 申请总内存(包含 JVM 堆 + 堆外) |
| mapreduce.map.java.opts |
配套 Map JVM 堆,必须小于 mapreduce.map.memory.mb(预留堆外内存) |
| mapreduce.reduce.memory.mb |
* 默认:1024 * Reduce 阶段 shuffle 聚合消耗更多内存,生产必须放大 |
| mapreduce.reduce.java.opts |
Reduce JVM 启动参数,堆内存低于容器总内存 |
| mapreduce.task.io.sort.mb |
默认 100MB,Map 本地排序缓冲区;过小会产生大量溢写文件,磁盘 IO 暴涨、作业变慢 官方建议生产调整至 200~400MB(不超过 Map 内存 1/3) |
| mapreduce.map.output.compress |
生产集群必须开启 Map 输出压缩,大幅降低 Shuffle 网络 IO 与磁盘占用;默认关闭(false);生产环境配置true |
| mapreduce.map.output.compress.codec |
压缩方式,值可配置为【org.apache.hadoop.io.compress.SnappyCodec】 |
| mapreduce.reduce.shuffle.parallelcopies |
默认 5,Shuffle 阶段并行拉取 Map 数据,生产调大提升 Reduce 拉取速度。 |
1.4、yarn-site.xml文件
| yarn-site.xml属性 |
说明 |
| yarn.resourcemanager.hostname |
指定ResourceManager的主机地址 |
| yarn.resourcemanager.scheduler.address |
指定ResourceManager对ApplicationMaster暴露的访问地址(端口:8030),ApplicationMaster通过该地址向RM申请资源、释放资源等。 |
| yarn.resourcemanager.resource-tracker.address |
指定ResourceManager对NodeManager暴露的地址(端口:8031)。NodeManager通过该地址向RM汇报心跳,领取任务等。 |
| yarn.resourcemanager.address |
指定ResourceManager对客户端暴露的地址(端口:8032)。客户端通过该地址向RM提交应用程序,杀死应用程序等。 |
| yarn.resourcemanager.admin.address |
指定ResourceManager对管理员暴露的访问地址(端口:8033)。管理员通过该地址向RM发送管理命令等。 |
| yarn.resourcemanager.webapp.address |
指定ResourceManager对外web ui地址(端口8088)。用户可通过该地址在浏览器中查看集群各类信息。 |
| yarn.nodemanager.aux-services |
指定NodeManager上运行的附属服务。需配置成mapreduce_shuffle,才可运行MapReduce。也可同时配置为spark_ shuffle,这样yarn就支持mr和spark两种计算框架了。 |
| yarn.nodemanager.aux-services.mapreduce_shuffle.class |
指定 NodeManager 上运行 Shuffle 服务的 Java 实现类。 值为:org.apache.hadoop.mapred.ShuffleHandler |
| yarn.nodemanager.local-dirs |
指定Yarn应用的中间结果数据存储目录,建议配置多个磁盘,平衡IO。 |
| yarn.nodemanager.log-dirs |
指定Yarn应用日志的本地存储目录,建议配置多个磁盘,平衡IO。 |
| yarn.application.classpath |
指定了Job运行时需要用到的各种jar包。如果需要自定义jar包的话,可以把jar文件上传到各个服务器上,然后再把路径添加到此参数下面即可。 |
| yarn.nodemanager.resource.memory-mb |
这个配置指定NodeManager可以使用的最大物理内存。 注意:该参数是不可修改的,一旦设置,整个运行过程中不可动态修改。另外,该参数的默认值是8192MB,即使你的机器内存不够8192MB,YARN也会按照这些内存来使用。这是非常重要的一个资源配置参数。 |
| yarn.nodemanager.resource.cpu-vcores |
指定NodeManager可以使用的虚拟CPU个数。非常重要的一个资源配置参数。 |
1.5、hadoop-env.sh文件
hadoop-env.sh 是 Hadoop 环境变量全局配置脚本,所有 Hadoop 守护进程(NameNode、DataNode、ResourceManager、NodeManager、Jps、MapReduce 任务等)启动时都会加载该文件。
核心职责:
- 指定 Java 路径、JVM 参数、堆内存;
- 定义 Hadoop 运行用户、日志目录、PID 存放目录;
- 配置 SSH、本地库、Hadoop 运行模式、环境扩展;
- 区分 HDFS/YARN/MR 各组件独立 JVM 启动参数;
- 控制调试日志、GC 日志、进程启动权限。
#hadoop-env.sh推荐配置示例
# ========== 必须配置 ==========
export JAVA_HOME=/opt/openjdk/default
# ========== 推荐配置(生产环境必备) ==========
export HADOOP_LOG_DIR=/data/bigdata/hadoop/logs
export HADOOP_PID_DIR=/data/bigdata/hadoop/pids
export HADOOP_CONF_DIR=/etc/hadoop/conf
# ========== 可选配置(按需开启) ==========
# 全局堆内存上限
# export HADOOP_HEAPSIZE_MAX=2g
# 单独配置NameNode内存(示例,根据服务器内存调整)
# export HDFS_NAMENODE_OPTS="-Xmx4g -XX:+UseG1GC"
# export HDFS_DATANODE_OPTS="-Xmx2g"
# 守护进程运行用户(你用hadoop用户启动则配置)
export HDFS_NAMENODE_USER=hadoop
export HDFS_DATANODE_USER=hadoop
export HDFS_SECONDARYNAMENODE_USER=hadoop
export YARN_RESOURCEMANAGER_USER=hadoop
export YARN_NODEMANAGER_USER=hadoop
export MAPRED_HISTORYSERVER_USER=hadoop
二、hadoop集群服务器安装部署hadoop
2.1、下载hadoop与准备配置文件
#下载hadoop与准备配置文件
#1-下载hadoop3.4.3
wget https://dlcdn.apache.org/hadoop/common/hadoop-3.4.3/hadoop-3.4.3.tar.gz -c -P /etc/ansible/roles/files
#2-将下载好的hadoop3.4.3解压复制一份etc文件出来,然后安装如上《Hadoop集群中的基础配置文件解析内容》修改
tar -zxvf hadoop-3.4.3.tar.gz
cd hadoop-3.4.3/
cp -rp etc ../
cd ../
ls -al
2.1.1、配置【core-site.xml】
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<configuration>
<property>
<name>fs.defaultFS</name>
<value>hdfs://bigdata</value>
</property>
<property>
<name>hadoop.tmp.dir</name>
<value>/var/tmp/hadoop-${user.name}</value>
</property>
<property>
<name>ha.zookeeper.quorum</name>
<value>slave001,slave002,slave003</value>
</property>
<property>
<name>fs.trash.interval</name>
<value>1440</value>
</property>
<property>
<name>fs.trash.checkpoint.interval</name>
<value>120</value>
</property>
</configuration>
2.1.2、配置【hdfs-site.xml】
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<configuration>
<!-- HA命名服务 -->
<property>
<name>dfs.nameservices</name>
<value>bigdata</value>
</property>
<!-- 两个NN逻辑标识 -->
<property>
<name>dfs.ha.namenodes.bigdata</name>
<value>nn1,nn2</value>
</property>
<!-- NN RPC地址 -->
<property>
<name>dfs.namenode.rpc-address.bigdata.nn1</name>
<value>namenodemaster:9000</value>
</property>
<property>
<name>dfs.namenode.rpc-address.bigdata.nn2</name>
<value>yarnserver:9000</value>
</property>
<!-- NN WebUI地址 -->
<property>
<name>dfs.namenode.http-address.bigdata.nn1</name>
<value>namenodemaster:50070</value>
</property>
<property>
<name>dfs.namenode.http-address.bigdata.nn2</name>
<value>yarnserver:50070</value>
</property>
<!-- QJM JournalNode集群地址 -->
<property>
<name>dfs.namenode.shared.edits.dir</name>
<value>qjournal://slave001:8485;slave002:8485;slave003:8485/bigdata</value>
</property>
<!-- 开启自动故障转移 -->
<property>
<name>dfs.ha.automatic-failover.enabled.bigdata</name>
<value>true</value>
</property>
<!-- HA客户端切换代理类 -->
<property>
<name>dfs.client.failover.proxy.provider.bigdata</name>
<value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>
</property>
<!-- JournalNode本地数据目录 -->
<property>
<name>dfs.journalnode.edits.dir</name>
<value>/data/hadoop/dfs/jn</value>
</property>
<!-- 副本数 -->
<property>
<name>dfs.replication</name>
<value>2</value>
</property>
<!-- 脑裂隔离:SSH隔离(修正语法,移除多余主机) -->
<property>
<name>dfs.ha.fencing.methods</name>
<value>sshfence</value>
</property>
<!-- ssh私钥文件,所有节点免密互通 -->
<property>
<name>dfs.ha.fencing.ssh.private-key-files</name>
<value>/home/hadoop/.ssh/id_rsa</value>
</property>
<!-- ssh连接超时独立参数 -->
<property>
<name>dfs.ha.fencing.ssh.connect-timeout</name>
<value>5000</value>
</property>
<!-- 跳过主机密钥校验 -->
<property>
<name>dfs.ha.fencing.ssh.opts</name>
<value>-o StrictHostKeyChecking=no</value>
</property>
<!-- DN传输并发线程 -->
<property>
<name>dfs.datanode.max.transfer.threads</name>
<value>4096</value>
</property>
<!-- NN元数据双磁盘存储 -->
<property>
<name>dfs.namenode.name.dir</name>
<value>file:///data/hadoop/dfs/name,file:///data1/hadoop/dfs/name</value>
<final>true</final>
</property>
<!-- DN数据多盘存储 -->
<property>
<name>dfs.datanode.data.dir</name>
<value>file:///data/hadoop/dfs/data,file:///data1/hadoop/dfs/data</value>
<final>true</final>
</property>
<!-- HDFS块大小128M -->
<property>
<name>dfs.block.size</name>
<value>134217728</value>
</property>
<!-- 权限与ACL控制 -->
<property>
<name>dfs.permissions</name>
<value>true</value>
</property>
<property>
<name>dfs.namenode.acls.enabled</name>
<value>true</value>
</property>
<property>
<name>dfs.permissions.supergroup</name>
<value>supergroup</value>
</property>
<!-- DataNode黑白名单 -->
<property>
<name>dfs.hosts</name>
<value>/etc/hadoop/conf/hosts</value>
</property>
<property>
<name>dfs.hosts.exclude</name>
<value>/etc/hadoop/conf/hosts-exclude</value>
</property>
<!-- 补充优化参数(可选) -->
<!-- DN心跳超时 -->
<property>
<name>dfs.namenode.heartbeat.recheck-interval</name>
<value>300000</value>
</property>
<property>
<name>dfs.heartbeat.interval</name>
<value>3</value>
</property>
<!-- 安全模式退出阈值 -->
<property>
<name>dfs.safemode.threshold.pct</name>
<value>0.99f</value>
</property>
</configuration>
2.1.3、配置【mapred-site.xml】
<?xml version="1.0"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<configuration>
<!-- 1. 分布式运行框架 必配 -->
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
<!-- 2. JobHistory 历史服务全套(生产审计、日志追溯刚需) -->
<property>
<name>mapreduce.jobhistory.address</name>
<value>yarnserver:10020</value>
</property>
<property>
<name>mapreduce.jobhistory.webapp.address</name>
<value>yarnserver:19888</value>
</property>
<property>
<name>mapreduce.jobhistory.done-dir</name>
<value>/mr-history/done</value>
</property>
<property>
<name>mapreduce.jobhistory.intermediate-done-dir</name>
<value>/mr-history/tmp</value>
</property>
<property>
<name>mapreduce.jobhistory.cleaner.enable</name>
<value>true</value>
</property>
<property>
<name>mapreduce.jobhistory.cleaner.max-age-ms</name>
<value>2592000000</value>
</property>
</configuration>
2.1.4、配置【yarn-site.xml】
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<configuration>
<property>
<name>yarn.resourcemanager.hostname</name>
<value>yarnserver</value>
</property>
<property>
<name>yarn.resourcemanager.scheduler.address</name>
<value>yarnserver:8030</value>
</property>
<property>
<name>yarn.resourcemanager.resource-tracker.address</name>
<value>yarnserver:8031</value>
</property>
<property>
<name>yarn.resourcemanager.address</name>
<value>yarnserver:8032</value>
</property>
<property>
<name>yarn.resourcemanager.admin.address</name>
<value>yarnserver:8033</value>
</property>
<property>
<name>yarn.resourcemanager.webapp.address</name>
<value>yarnserver:8088</value>
</property>
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
<property>
<name>yarn.nodemanager.aux-services.mapreduce_shuffle.class</name>
<value>org.apache.hadoop.mapred.ShuffleHandler</value>
</property>
<property>
<name>yarn.nodemanager.local-dirs</name>
<value>file:///data/hadoop/yarn/local,file:///data1/hadoop/yarn/local</value>
</property>
<property>
<name>yarn.nodemanager.log-dirs</name>
<value>file:///data/hadoop/yarn/logs,file:///data1/hadoop/yarn/logs</value>
</property>
<property>
<name>yarn.application.classpath</name>
<value>
$HADOOP_CONF_DIR,
$HADOOP_COMMON_HOME/*,$HADOOP_COMMON_HOME/lib/*,
$HADOOP_HDFS_HOME/*,$HADOOP_HDFS_HOME/lib/*,
$HADOOP_MAPRED_HOME/*,$HADOOP_MAPRED_HOME/lib/*,
$HADOOP_YARN_HOME/*,$HADOOP_YARN_HOME/lib/*,
$HADOOP_HOME/share/hadoop/common/*, $HADOOP_COMMON_HOME/share/hadoop/common/lib/*,
$HADOOP_HOME/share/hadoop/hdfs/*, $HADOOP_HOME/share/hadoop/hdfs/lib/*,
$HADOOP_HOME/share/hadoop/mapreduce/*, $HADOOP_HOME/share/hadoop/mapreduce/lib/*,
$HADOOP_HOME/share/hadoop/yarn/*, $HADOOP_YARN_HOME/share/hadoop/yarn/lib/*,
$HIVE_HOME/lib/*, $HIVE_HOME/lib_aux/*
</value>
</property>
<!-- NodeManager总资源 适配4核8G机器 -->
<property>
<name>yarn.nodemanager.resource.memory-mb</name>
<value>6144</value>
</property>
<property>
<name>yarn.nodemanager.resource.cpu-vcores</name>
<value>4</value>
</property>
<!-- 容器资源调度上下限 -->
<property>
<name>yarn.scheduler.minimum-allocation-mb</name>
<value>1024</value>
</property>
<property>
<name>yarn.scheduler.maximum-allocation-mb</name>
<value>6144</value>
</property>
<property>
<name>yarn.scheduler.minimum-allocation-vcores</name>
<value>1</value>
</property>
<property>
<name>yarn.scheduler.maximum-allocation-vcores</name>
<value>4</value>
</property>
<!-- 虚拟内存限制,避免容器被系统OOM杀死 -->
<property>
<name>yarn.nodemanager.vmem-pmem-ratio</name>
<value>2.1</value>
</property>
<!-- AM失败自动重试2次 -->
<property>
<name>yarn.resourcemanager.am.max-attempts</name>
<value>2</value>
</property>
<!-- 磁盘健康检测,单盘占用超90%/剩余不足1G自动禁用 -->
<property>
<name>yarn.nodemanager.disk-health-checker.min-healthy-disks</name>
<value>1</value>
</property>
<property>
<name>yarn.nodemanager.disk-health-checker.max-disk-utilization-per-disk-percentage</name>
<value>90</value>
</property>
<property>
<name>yarn.nodemanager.disk-health-checker.min-free-space-per-disk-mb</name>
<value>1024</value>
</property>
<!-- 日志聚合配置 -->
<property>
<name>yarn.log-aggregation-enable</name>
<value>true</value>
</property>
<property>
<name>yarn.log-aggregation.retain-seconds</name>
<value>2592000</value>
</property>
<property>
<name>yarn.log.server.url</name>
<value>http://yarnserver:19888/jobhistory/logs</value>
</property>
</configuration>
2.1.5、将配置好的hadoop配置文件内容打包
#将配置好的hadoop配置文件内容打包,并放置到指定目录下
cd /etc/ansible/roles/files/etc
mv hadoop conf
tar -zcvf conf.tar.gz conf
mv conf.tar.gz /etc/ansible/roles/files
2.2、给hadoop集群服务器正式安装部署hadoop
2.2.1、给hadoop集群服务器正式部署hadoop
#给hadoop集群服务器正式安装部署hadoop
#1-编写部署hadoop的脚本
cd /data/ansible-script/
vi set_hadoop.yml
#2-【set_hadoop.yml】文件的完整内容
- name: "给hadoop集群服务器安装部署hadoop"
hosts: hadoop
remote_user: root
gather_facts: true
vars:
bigdatadir: /data/bigdata
hadoopconfigfile: /etc/hadoop
ansibledir: /etc/ansible
hadoop_version: "3.4.3"
hadoop_tar_name: "hadoop-{{ hadoop_version }}"
hadoop_install_path: "{{ bigdatadir }}/{{ hadoop_tar_name }}"
hadoop_home: "{{ bigdatadir }}/hadoop/current"
jdk_home: /opt/openjdk/default
hadoop_cluster_hosts: "{{ groups['hadoop'] }}"
tasks:
# 0. 前置环境检查
- name: 0-检查JDK环境是否存在
stat:
path: "{{ jdk_home }}/bin/java"
register: jdk_check
failed_when: not jdk_check.stat.exists
tags: [env, precheck]
- name: 0-关闭SELinux与防火墙
block:
- name: 0.1-临时关闭SELinux(setenforce 0)
shell: |
if [[ $(getenforce) != "Disabled" ]];then
setenforce 0
fi
changed_when: false
- name: 0.2-永久关闭SELinux(修改/etc/selinux/config)
lineinfile:
path: /etc/selinux/config
regexp: '^SELINUX='
line: 'SELINUX=disabled'
state: present
- name: 0.3-停止并开机禁用firewalld
service:
name: firewalld
state: stopped
enabled: false
tags: [env, firewall]
- name: 1-创建hadoop运行用户
user:
name: hadoop
state: present
shell: /bin/bash
create_home: true
home: /home/hadoop
tags: [user]
- name: 2-创建bigdata根目录
file:
path: "{{ bigdatadir }}"
mode: '0755'
state: directory
owner: root
group: root
- name: 2.1-创建hadoop根目录
file:
path: "{{ bigdatadir }}/hadoop"
mode: '0755'
state: directory
owner: hadoop
group: hadoop
- name: 2.2-创建hadoop配置根目录
file:
path: "{{ hadoopconfigfile }}"
mode: '0755'
state: directory
owner: root
group: root
- name: 3-本地同步Hadoop压缩包至远程节点
synchronize:
src: "{{ ansibledir }}/roles/files/{{ hadoop_tar_name }}.tar.gz"
dest: "{{ bigdatadir }}/"
mode: push
archive: true
checksum: true
compress: true
delegate_to: localhost
tags: [install, sync]
- name: 3.1-解压Hadoop安装包
unarchive:
src: "{{ bigdatadir }}/{{ hadoop_tar_name }}.tar.gz"
dest: "{{ bigdatadir }}"
creates: "{{ hadoop_install_path }}"
mode: '0755'
remote_src: true
tags: [install]
- name: 3.2-创建hadoop current软链接
file:
src: "{{ hadoop_install_path }}"
path: "{{ hadoop_home }}"
state: link
force: true
owner: hadoop
group: hadoop
tags: [install]
- name: 4-递归授权hadoop安装目录归属
file:
path: "{{ hadoop_install_path }}"
owner: hadoop
group: hadoop
recurse: true
tags: [permission]
- name: 4.1-删除hadoop压缩包
file:
path: "{{ bigdatadir }}/{{ hadoop_tar_name }}.tar.gz"
state: absent
tags: [install]
- name: 5-解压自定义hadoop配置文件
unarchive:
src: "{{ ansibledir }}/roles/files/conf.tar.gz"
dest: "{{ hadoopconfigfile }}"
#creates: "{{ hadoopconfigfile }}/conf/core-site.xml"
remote_src: false
tags: [config]
- name: 6-递归授权配置目录归属
file:
path: "{{ hadoopconfigfile }}/conf"
owner: hadoop
group: hadoop
recurse: true
tags: [permission]
- name: 7-写入hadoop用户环境变量到.bash_profile
lineinfile:
path: /home/hadoop/.bash_profile
insertafter: EOF
line: "{{ item.value }}"
state: present
backrefs: false
with_items:
- { value: "export HADOOP_HOME={{ hadoop_home }}" }
- { value: "export HADOOP_MAPRED_HOME=${HADOOP_HOME}" }
- { value: "export HADOOP_COMMON_HOME=${HADOOP_HOME}" }
- { value: "export HADOOP_HDFS_HOME=${HADOOP_HOME}" }
- { value: "export HADOOP_YARN_HOME=${HADOOP_HOME}" }
- { value: "export HADOOP_CONF_DIR={{ hadoopconfigfile }}/conf" }
- { value: "export HTTPFS_CATALINA_HOME=${HADOOP_HOME}/share/hadoop/httpfs/tomcat" }
- { value: "export CATALINA_BASE=${HTTPFS_CATALINA_HOME}" }
- { value: "export HTTPFS_CONFIG={{ hadoopconfigfile }}/conf" }
- { value: "export HADOOP_LOG_DIR={{ bigdatadir }}/hadoop/logs" }
- { value: "export HADOOP_PID_DIR={{ bigdatadir }}/hadoop/pids" }
- { value: "export PATH=$PATH:$HADOOP_HOME/bin:$HADOOP_HOME/sbin" }
- name: 8-创建日志、PID、HDFS数据目录并授权
file:
path: "{{ item }}"
mode: '0770'
state: directory
owner: hadoop
group: hadoop
with_items:
- "{{ bigdatadir }}/hadoop/logs"
- "{{ bigdatadir }}/hadoop/pids"
- "{{ bigdatadir }}/hadoop/data/hdfs/namenode"
- "{{ bigdatadir }}/hadoop/data/hdfs/datanode"
tags: [dir]
- name: 9-hadoop用户环境变量校验
shell: su - hadoop -c 'source /home/hadoop/.bash_profile && echo $HADOOP_HOME'
register: env_check
changed_when: false
tags: [env, verify]
- name: 打印HADOOP_HOME校验结果
debug:
msg: "{{ env_check.stdout_lines }}"
tags: [verify]
#3-执行脚本
ansible-playbook set_hadoop.yml
#4-验证
vi check_hadoop.yml
#【check_hadoop.yml】文件完整内容
- name: 批量校验Hadoop部署结果
hosts: hadoop
remote_user: root
tasks:
- name: 1. 校验hadoop用户环境变量
shell: su - hadoop -c 'source /home/hadoop/.bash_profile && echo $HADOOP_HOME && hadoop version | head -1'
register: hadoop_env_check
changed_when: false
- name: 打印HADOOP_HOME与版本
debug:
msg: "{{ hadoop_env_check.stdout_lines }}"
- name: 2. 校验关键目录存在
stat:
path: "{{ item }}"
loop:
- /data/bigdata/hadoop/current
- /etc/hadoop/conf/core-site.xml
- /data/bigdata/hadoop/logs
register: dir_stat
- name: 打印目录校验结果
debug:
msg: "{{ item.stat.path }} 存在={{ item.stat.exists }}"
loop: "{{ dir_stat.results }}"
- name: 3. 校验hadoop安装目录属主
shell: ls -ld /data/bigdata/hadoop/current
register: dir_owner
changed_when: false
- name: 打印目录权限归属
debug:
msg: "{{ dir_owner.stdout }}"
#5-若执行有问题则需要清理
ansible hadoop -m shell -a "rm -rf /data/bigdata/hadoop*"
ansible hadoop -m shell -a "rm -rf /etc/hadoop"
2.2.2、给hadoop集群服务器配置ssh免密互信
#给hadoop集群服务器配置ssh免密互信
#1-编写服务器配置ssh免密互信
cd /data/ansible-script/
vi set_ssh_nopwd_trust.yml
#2-【set_ssh_nopwd_trust.yml】文件的完整内容
# ===================== Play 1:生成密钥 + 收集所有公钥 =====================
- name: 1-生成hadoop用户ssh密钥并收集公钥
hosts: hadoop
remote_user: root
gather_facts: false
vars:
hadoop_cluster_hosts: "{{ groups['hadoop'] }}"
tasks:
- name: 1.1-创建控制机临时公钥存放目录
file:
path: /tmp/hadoop_pub_keys
state: directory
mode: '0755'
delegate_to: localhost
run_once: true
tags: [ssh]
- name: 1.2-生成hadoop用户密钥
shell: |
su - hadoop -c '
mkdir -p /home/hadoop/.ssh
chmod 700 /home/hadoop/.ssh
if [ ! -f /home/hadoop/.ssh/id_ed25519 ];then
ssh-keygen -t ed25519 -N "" -f /home/hadoop/.ssh/id_ed25519
fi
'
args:
executable: /bin/bash
tags: [ssh]
- name: 1.3-修正 .ssh 目录权限
file:
path: /home/hadoop/.ssh
owner: hadoop
group: hadoop
mode: '0700'
state: directory
tags: [ssh]
- name: 1.4-拉取节点公钥至控制机临时目录
fetch:
src: /home/hadoop/.ssh/id_ed25519.pub
dest: /tmp/hadoop_pub_keys/{{ inventory_hostname }}.pub
flat: true
tags: [ssh]
# ===================== Play 2:统一分发全部公钥 =====================
- name: 2-推送集群所有公钥到各节点authorized_keys
hosts: hadoop
remote_user: root
gather_facts: false
vars:
hadoop_cluster_hosts: "{{ groups['hadoop'] }}"
tasks:
- name: 2.1-清空原有authorized_keys避免脏数据
file:
path: /home/hadoop/.ssh/authorized_keys
state: absent
tags: [ssh]
- name: 2.2-写入集群全部节点公钥
authorized_key:
user: hadoop
key: |
{% for host in hadoop_cluster_hosts %}
{{ lookup('file', '/tmp/hadoop_pub_keys/' + host + '.pub', errors='strict') }}
{% endfor %}
state: present
tags: [ssh]
- name: 2.3-强制修正authorized_keys权限
file:
path: /home/hadoop/.ssh/authorized_keys
owner: hadoop
group: hadoop
mode: '0600'
tags: [ssh]
#3-执行
ansible-playbook set_ssh_nopwd_trust.yml
#4-验证【在hadoop集群任意服务器执行】
su - hadoop
ls -al ~/.ssh/
cat ~/.ssh/authorized_keys
ssh hadoop@namenodemaster
ssh hadoop@yarnserver
ssh hadoop@slave001
ssh hadoop@slave002
ssh hadoop@slave003
#5-若执行有问题则需要清理【清除hadoop用户下的整个.ssh目录】
ansible hadoop -m shell -a "rm -rf /home/hadoop/.ssh"
三、启动双Namenode高可用Hadoop集群
3.1、启动双Namenode高可用Hadoop集群准备
#启动双Namenode高可用Hadoop集群准备【zookeeper、journalnode】
#1-先启动zookeeper集群【仅在 slave001\slave002\slave003 节点操作】
#先查看zookeeper的运行状态【若结果显示包含"ZooKeeper JMX enabled by default"则表示启动】
/data/bigdata/zookeeper/current/bin/zkServer.sh status
#若没有运行在启动zookeeper服务
/data/bigdata/zookeeper/current/bin/zkServer.sh start
#2-在namenode节点【仅在 namenodemaster 节点操作】
#2.1-切换到hadoop用户下
su - hadoop
#2.2-格式化 HA 架构依赖的 ZooKeeper 集群,在 ZK 中创建 HDFS HA 所需持久化目录 / 数据【仅首次搭建 HA 时执行一次,重复执行会清空 HA 状态,线上切勿随意执行】。
#执行如下命令后包含(ha.ActiveStandbyElector: Successfully created /hadoop-ha/bigdata in ZK.)则表示成功
hdfs zkfc -formatZK
#3-启动JournalNode集群【仅在 slave001\slave002\slave003 节点执行】
#3.1-启动journalnode
su - hadoop
hdfs --daemon start journalnode
jps
#3.2-查看启动日志确认是否正常启动了journalnode
cd $HADOOP_LOG_DIR
pwd
ls -l hadoop-hadoop-journalnode-slave*
tail -200f hadoop-hadoop-journalnode-slave001.log
#3.3-解决启动journalnode失败,报错"Failed to start JournalNode. Cannot create directory: /data/hadoop/dfs/jn"方法
sudo mkdir -p /data/hadoop/dfs/jn
sudo chown -R hadoop:hadoop /data/hadoop
sudo chmod 700 /data/hadoop/dfs/jn
#3.4-清理残留 pid(避免冲突)【清理完成后再启动journalnode】
hdfs --daemon stop journalnode
find /data/bigdata/hadoop/current -name journalnode.pid -delete
3.2、启动双Namenode高可用Hadoop集群
3.2.1、格式化并启动主节点namenodemaster
#启动双Namenode高可用Hadoop集群【主节点namenodemaster】
#1-格式化主节点NameNode服务【仅在 namenodemaster 节点操作】【只能执行一次,不然会把已有的数据全部清空】
su - hadoop
hdfs namenode -format -clusterId bigdataserver
#注意:若执行如上命令格式化主节点NameNode服务后面显示"/data/hadoop/dfs/name has been successfully formatted./data1/hadoop/dfs/name has been successfully formatted."则表示成功!!!
#注意1:若执行如上命令格式化主节点NameNode服务报错"Cannot create directory /data/hadoop/dfs/name/current"解决方法如下:
mkdir -p /data/hadoop/dfs/name
chown -R hadoop:hadoop /data/hadoop
chmod -R 755 /data/hadoop
#文件夹创建好后再次执行格式化主节点NameNode服务命令
#注意2:若执行如上命令格式化主节点NameNode服务报错"Cannot create directory /data1/hadoop/dfs/name/current"解决方法如下:
mkdir -p /data1/hadoop/dfs/name
chown -R hadoop:hadoop /data1/hadoop
chmod -R 755 /data1/hadoop
#文件夹创建好后再次执行格式化主节点NameNode服务命令
#2-启动主节点NameNode服务
su - hadoop
hdfs --daemon start namenode
ps -ef | grep namenode
netstat -antlp
jps
#3-启动ZooKeeper FailoverController(zkfc)服务【该服务先在哪台节点启用那个就是主节点】
#然后在浏览器访问:IP:50070(界面显示【active】表示启用的主节点、【standby】表示备用)
hdfs --daemon start zkfc
3.2.2、格式化并启动备用主节点yarnserver
#启动双Namenode高可用Hadoop集群【备用主节点yarnserver】
#1-检查hdfs-site.xml中配置的数据多盘路径是否存在【不存在则创建】
ls -ld /data/hadoop/dfs/name
ls -ld /data1/hadoop/dfs/name
mkdir -p /data/hadoop/dfs/name
chown -R hadoop:hadoop /data/hadoop
chmod -R 755 /data/hadoop
mkdir -p /data1/hadoop/dfs/name
chown -R hadoop:hadoop /data1/hadoop
chmod -R 755 /data1/hadoop
#2-NameNode主、备节点同步元数据【hadoop用户下操作】
su - hadoop
hdfs namenode -bootstrapStandby
#3-启动备用节点的NameNode服务【hadoop用户下操作】
su - hadoop
hdfs --daemon start namenode
ps -ef | grep namenode
netstat -antlp
jps
#4-启动ZooKeeper FailoverController(zkfc)服务【该服务先在哪台节点启用那个就是主节点】
#然后在浏览器访问:IP:50070(界面显示【active】表示启用的主节点、【standby】表示备用)
hdfs --daemon start zkfc
#5-启动resourcemanager服务
yarn --daemon start resourcemanager
jps
ps -ef | grep resourcemanager
netstat -antlp
#6-启动historyserver服务
mapred --daemon start historyserver
jps
3.2.3、启动存储节点DataNode服务
#启动存储节点DataNode服务【仅在 slave001\slave002\slave003 节点的hadoop用户下操作】
#1-检查hdfs-site.xml中配置的数据多盘路径是否存在【不存在则创建】
ls -ld /data/hadoop/dfs/name
ls -ld /data1/hadoop/dfs/name
sudo mkdir -p /data/hadoop/dfs/name
sudo chown -R hadoop:hadoop /data/hadoop
sudo chmod -R 755 /data/hadoop
sudo mkdir -p /data1/hadoop/dfs/name
sudo chown -R hadoop:hadoop /data1/hadoop
sudo chmod -R 755 /data1/hadoop
#2-启动存储节点DataNode服务【在hadoop用户下操作】
su - hadoop
hdfs --daemon start datanode
#注意:若执行如上的启动存储节点DataNode服务命令报错,首先查看日志定位
cd $HADOOP_LOG_DIR
ll
tail -100f $HADOOP_LOG_DIR/hadoop-hadoop-datanode-slave001.log
#3-查看启动的DataNode服务
jps
ps -ef | grep datanode
netstat -antlp
#4-在浏览器访问主备namenode节点:IP:50070(界面显示【active】表示启用的主节点、【standby】表示备用;Summary下的存储能够正常显示数据则表示datanode正常启动了)
#5-启动nodemanager服务【启动完成后访问备namenode节点:IP:8088(前提是备用节点的resourcemanager
启动了)】
yarn --daemon start nodemanager
jps
ps -ef | grep nodemanager
netstat -antlp
3.3、分布式计算与主备节点切换测试
#分布式计算与主备namenode节点切换测试
#1-分布式计算测试【在任意节点(如slave001)执行】然后就可以在浏览器查看备用节点(IP:19888查看历史记录信息了)
su - hadoop
hadoop jar $HADOOP_HOME/share/hadoop/mapreduce/hadoop-mapreduce-examples-3.4.3.jar pi 20 1000000
#2-主备namenode节点切换测试
#直接在namenodemaster节点将namenode服务杀死,然后在浏览器查看备用节点的【IP:50070】的状态是否为active,而原来的namenodemaster节点的【IP:50070】状态是否为standby
jps
kill -9 namenode的PID
四、配置双NameNode高可用Hadoop集群的服务
4.1、配置zookeeper服务开机自启
#配置zookeeper服务开机自启
#1-创建zookeeper服务【slave001、slave002、slave003 都需要配置】
vi /etc/systemd/system/zookeeper.service
#【/etc/systemd/system/zookeeper.service】文件完整内容
[Unit]
Description=Apache ZooKeeper 3.9.5 Distributed Coordination Service
Documentation=https://zookeeper.apache.org/doc/r3.9.5/
After=network.target remote-fs.target
Requires=network.target remote-fs.target
[Service]
Type=simple
User=hadoop
Group=hadoop
WorkingDirectory=/data/bigdata/zookeeper/current
# 官方前台启动指令(适配 systemd 进程管理)
ExecStart=/data/bigdata/zookeeper/current/bin/zkServer.sh start-foreground
# 官方停止指令
ExecStop=/data/bigdata/zookeeper/current/bin/zkServer.sh stop
Restart=on-failure
RestartSec=5
TimeoutStartSec=30
TimeoutStopSec=30
# 限制权限,符合生产安全规范
PrivateTmp=true
ProtectSystem=full
ProtectHome=true
[Install]
WantedBy=multi-user.target
#2-启动zookeeper服务并设置开机自启
systemctl daemon-reload
systemctl start zookeeper.service
systemctl status zookeeper.service
systemctl enable zookeeper.service
# 查看日志(systemd 日志)
journalctl -u zookeeper -f
4.2、配置journalnode服务开机自启
#配置journalnode服务开机自启
#1-创建journalnode服务【仅在 slave001\slave002\slave003 节点操作】
vi /etc/systemd/system/hadoop-hdfs-journalnode.service
#【/etc/systemd/system/hadoop-hdfs-journalnode.service】文件完整内容
[Unit]
Description=Apache Hadoop 3.4.3 HDFS JournalNode (QJM HA EditLog Storage)
Documentation=https://hadoop.apache.org/docs/r3.4.3/
# 启动依赖:仅依赖网络,JournalNode是NN前置依赖,无需等待NN
After=network-online.target syslog.target
Wants=network-online.target
[Service]
# --daemon双fork后台运行,必须forking模式
Type=forking
User=hadoop
Group=hadoop
# 1:1复刻hadoop用户.bash_profile全部环境变量
Environment="JAVA_HOME=/opt/openjdk/default"
Environment="HADOOP_HOME=/data/bigdata/hadoop/current"
Environment="HADOOP_MAPRED_HOME=/data/bigdata/hadoop/current"
Environment="HADOOP_COMMON_HOME=/data/bigdata/hadoop/current"
Environment="HADOOP_HDFS_HOME=/data/bigdata/hadoop/current"
Environment="HADOOP_YARN_HOME=/data/bigdata/hadoop/current"
Environment="HADOOP_CONF_DIR=/etc/hadoop/conf"
Environment="HADOOP_LOG_DIR=/data/bigdata/hadoop/logs"
Environment="HADOOP_PID_DIR=/data/bigdata/hadoop/pids"
# 官网原生标准启停命令,无二次封装、无自定义脚本
ExecStart=/data/bigdata/hadoop/current/bin/hdfs --daemon start journalnode
ExecStop=/data/bigdata/hadoop/current/bin/hdfs --daemon stop journalnode
ExecReload=/data/bigdata/hadoop/current/bin/hdfs --daemon restart journalnode
# PID路径严格匹配HADOOP_PID_DIR自动生成规则
PIDFile=/data/bigdata/hadoop/pids/hadoop-hadoop-journalnode.pid
# 生产官方推荐文件句柄、进程数上限
LimitNOFILE=65535
LimitNPROC=65535
# 进程异常自动重启策略
Restart=on-failure
RestartSec=5s
PrivateTmp=true
[Install]
# 多用户运行级别开机自启
WantedBy=multi-user.target
#2-启动journalnode服务并开机自启
systemctl daemon-reload
#停止手动启动的 JournalNode,避免端口 / 进程冲突
su - hadoop -c "/data/bigdata/hadoop/current/bin/hdfs --daemon stop journalnode"
systemctl start hadoop-hdfs-journalnode
systemctl status hadoop-hdfs-journalnode
#查看日志(systemd 日志)
systemctl enable hadoop-hdfs-journalnode
#实时跟踪journalnode服务日志
tail -f /data/bigdata/hadoop/logs/hadoop-hadoop-journalnode-*.log
4.3、配置namenode服务开机自启
#配置namenode服务开机自启
#1-创建namenode服务【namenodemaster、yarnserver 节点操作】
vi /etc/systemd/system/hadoop-hdfs-namenode.service
#【/etc/systemd/system/hadoop-hdfs-namenode.service】文件的完整内容
[Unit]
Description=Apache Hadoop 3.4.3 HDFS NameNode
Documentation=https://hadoop.apache.org/docs/r3.4.3/
After=network-online.target syslog.target
Wants=network-online.target
[Service]
Type=forking
User=hadoop
Group=hadoop
# 导入hadoop用户全部环境变量(匹配.bash_profile)
Environment="JAVA_HOME=/opt/openjdk/default"
Environment="HADOOP_HOME=/data/bigdata/hadoop/current"
Environment="HADOOP_MAPRED_HOME=/data/bigdata/hadoop/current"
Environment="HADOOP_COMMON_HOME=/data/bigdata/hadoop/current"
Environment="HADOOP_HDFS_HOME=/data/bigdata/hadoop/current"
Environment="HADOOP_YARN_HOME=/data/bigdata/hadoop/current"
Environment="HADOOP_CONF_DIR=/etc/hadoop/conf"
Environment="HADOOP_LOG_DIR=/data/bigdata/hadoop/logs"
Environment="HADOOP_PID_DIR=/data/bigdata/hadoop/pids"
# 官方标准启停命令
ExecStart=/data/bigdata/hadoop/current/bin/hdfs --daemon start namenode
ExecStop=/data/bigdata/hadoop/current/bin/hdfs --daemon stop namenode
ExecReload=/data/bigdata/hadoop/current/bin/hdfs --daemon restart namenode
# 对应你实际生成的pid文件路径
PIDFile=/data/bigdata/hadoop/pids/hadoop-hadoop-namenode.pid
# 资源文件句柄、进程数调优(生产官方推荐)
LimitNOFILE=65535
LimitNPROC=65535
# 异常自动重启策略
Restart=on-failure
RestartSec=5s
PrivateTmp=true
[Install]
WantedBy=multi-user.target
#2-启动namenode服务并开机自启
systemctl daemon-reload
#停止当前手动启动的 namenode(避免端口冲突)
su - hadoop -c "/data/bigdata/hadoop/current/bin/hdfs --daemon stop namenode"
systemctl start hadoop-hdfs-namenode
systemctl status hadoop-hdfs-namenode
systemctl enable hadoop-hdfs-namenode
#查看日志(systemd 日志)
journalctl -u hadoop-hdfs-namenode -f
4.4、配置zkfc服务开机自启
#配置zkfc服务开机自启
#1-创建zkfs服务【namenodemaster、yarnserver 节点操作】
vi /etc/systemd/system/hadoop-hdfs-zkfc.service
#【/etc/systemd/system/hadoop-hdfs-zkfc.service】文件的完整内容
[Unit]
Description=Apache Hadoop 3.4.3 HDFS ZK Failover Controller (ZKFC)
Documentation=https://hadoop.apache.org/docs/r3.4.3/
# 依赖网络、ZooKeeper可访问、NameNode优先启动
After=network-online.target syslog.target hadoop-hdfs-namenode.service
Wants=network-online.target hadoop-hdfs-namenode.service
[Service]
# --daemon为fork后台模式,必须forking
Type=forking
User=hadoop
Group=hadoop
# 完整继承hadoop用户.bash_profile所有环境变量
Environment="JAVA_HOME=/opt/openjdk/default"
Environment="HADOOP_HOME=/data/bigdata/hadoop/current"
Environment="HADOOP_MAPRED_HOME=/data/bigdata/hadoop/current"
Environment="HADOOP_COMMON_HOME=/data/bigdata/hadoop/current"
Environment="HADOOP_HDFS_HOME=/data/bigdata/hadoop/current"
Environment="HADOOP_YARN_HOME=/data/bigdata/hadoop/current"
Environment="HADOOP_CONF_DIR=/etc/hadoop/conf"
Environment="HADOOP_LOG_DIR=/data/bigdata/hadoop/logs"
Environment="HADOOP_PID_DIR=/data/bigdata/hadoop/pids"
# 官方原生ZKFC启停命令,无自定义脚本
ExecStart=/data/bigdata/hadoop/current/bin/hdfs --daemon start zkfc
ExecStop=/data/bigdata/hadoop/current/bin/hdfs --daemon stop zkfc
ExecReload=/data/bigdata/hadoop/current/bin/hdfs --daemon restart zkfc
# 与你实际生成的zkfc pid文件严格对应
PIDFile=/data/bigdata/hadoop/pids/hadoop-hadoop-zkfc.pid
# 生产官方推荐文件句柄/进程数限制
LimitNOFILE=65535
LimitNPROC=65535
# 进程异常自动重启策略
Restart=on-failure
RestartSec=5s
PrivateTmp=true
[Install]
# 多用户模式开机自启
WantedBy=multi-user.target
#2-启动zkfs服务并开机自启
systemctl daemon-reload
#先停止手动启动的 ZKFC(避免端口 / 进程冲突)
su - hadoop -c "/data/bigdata/hadoop/current/bin/hdfs --daemon stop zkfc"
systemctl start hadoop-hdfs-zkfc
systemctl status hadoop-hdfs-zkfc
systemctl enable hadoop-hdfs-zkfc
#查看日志(systemd 日志)
journalctl -u hadoop-hdfs-zkfc -f
#实时跟踪 ZKFC 日志
tail -f /data/bigdata/hadoop/logs/hadoop-hadoop-zkfc-*.log
4.5、配置datanode服务开机自启
#配置datanode服务开机自启
#1-创建datanode服务【仅在 slave001\slave002\slave003 节点】
vi /etc/systemd/system/hadoop-hdfs-datanode.service
#【/etc/systemd/system/hadoop-hdfs-datanode.service】文件完整内容
[Unit]
Description=Apache Hadoop 3.4.3 HDFS DataNode
Documentation=https://hadoop.apache.org/docs/r3.4.3/
# 依赖网络、NameNode就绪后再启动DataNode
After=network-online.target syslog.target hadoop-hdfs-namenode.service
Wants=network-online.target hadoop-hdfs-namenode.service
[Service]
# --daemon为fork后台运行,必须forking模式
Type=forking
User=hadoop
Group=hadoop
# 1:1复刻hadoop用户.bash_profile全部环境变量
Environment="JAVA_HOME=/opt/openjdk/default"
Environment="HADOOP_HOME=/data/bigdata/hadoop/current"
Environment="HADOOP_MAPRED_HOME=/data/bigdata/hadoop/current"
Environment="HADOOP_COMMON_HOME=/data/bigdata/hadoop/current"
Environment="HADOOP_HDFS_HOME=/data/bigdata/hadoop/current"
Environment="HADOOP_YARN_HOME=/data/bigdata/hadoop/current"
Environment="HADOOP_CONF_DIR=/etc/hadoop/conf"
Environment="HADOOP_LOG_DIR=/data/bigdata/hadoop/logs"
Environment="HADOOP_PID_DIR=/data/bigdata/hadoop/pids"
# 官网原生启停命令,无二次封装
ExecStart=/data/bigdata/hadoop/current/bin/hdfs --daemon start datanode
ExecStop=/data/bigdata/hadoop/current/bin/hdfs --daemon stop datanode
ExecReload=/data/bigdata/hadoop/current/bin/hdfs --daemon restart datanode
# PID路径严格匹配HADOOP_PID_DIR生成规则
PIDFile=/data/bigdata/hadoop/pids/hadoop-hadoop-datanode.pid
# 生产环境官方推荐文件句柄、进程数上限
LimitNOFILE=65535
LimitNPROC=65535
# 进程异常自动重启策略
Restart=on-failure
RestartSec=5s
PrivateTmp=true
[Install]
WantedBy=multi-user.target
#2-启动datanode服务并开机自启
systemctl daemon-reload
#停止手动启动的 DataNode,避免端口冲突
su - hadoop -c "/data/bigdata/hadoop/current/bin/hdfs --daemon stop datanode"
systemctl start hadoop-hdfs-datanode
systemctl enable hadoop-hdfs-datanode
#查看日志(systemd 日志)
journalctl -u hadoop-hdfs-datanode -f
#实时跟踪datanode日志
tail -f /data/bigdata/hadoop/logs/hadoop-hadoop-datanode-*.log
4.6、配置nodemanager服务开机自启
#配置nodemanager服务开机自启
#1-创建nodemanager服务【仅在 slave001\slave002\slave003 节点操作】
vi /etc/systemd/system/hadoop-yarn-nodemanager.service
#【/etc/systemd/system/hadoop-yarn-nodemanager.service】文件的完整内容
[Unit]
Description=Apache Hadoop 3.4.3 YARN NodeManager
Documentation=https://hadoop.apache.org/docs/r3.4.3/
# 依赖网络、HDFS DataNode、ResourceManager就绪后再启动NM
After=network-online.target syslog.target hadoop-hdfs-datanode.service hadoop-yarn-resourcemanager.service
Wants=network-online.target hadoop-hdfs-datanode.service hadoop-yarn-resourcemanager.service
[Service]
# --daemon后台fork进程,必须forking模式
Type=forking
User=hadoop
Group=hadoop
# 1:1复刻hadoop用户.bash_profile全部环境变量
Environment="JAVA_HOME=/opt/openjdk/default"
Environment="HADOOP_HOME=/data/bigdata/hadoop/current"
Environment="HADOOP_MAPRED_HOME=/data/bigdata/hadoop/current"
Environment="HADOOP_COMMON_HOME=/data/bigdata/hadoop/current"
Environment="HADOOP_HDFS_HOME=/data/bigdata/hadoop/current"
Environment="HADOOP_YARN_HOME=/data/bigdata/hadoop/current"
Environment="HADOOP_CONF_DIR=/etc/hadoop/conf"
Environment="HADOOP_LOG_DIR=/data/bigdata/hadoop/logs"
Environment="HADOOP_PID_DIR=/data/bigdata/hadoop/pids"
# 官网原生标准启停命令,无二次封装
ExecStart=/data/bigdata/hadoop/current/bin/yarn --daemon start nodemanager
ExecStop=/data/bigdata/hadoop/current/bin/yarn --daemon stop nodemanager
ExecReload=/data/bigdata/hadoop/current/bin/yarn --daemon restart nodemanager
# PID路径严格匹配HADOOP_PID_DIR自动生成规则
PIDFile=/data/bigdata/hadoop/pids/hadoop-hadoop-nodemanager.pid
# 生产环境官方推荐文件句柄、进程数上限
LimitNOFILE=65535
LimitNPROC=65535
# 进程异常自动重启策略
Restart=on-failure
RestartSec=5s
PrivateTmp=true
[Install]
WantedBy=multi-user.target
#2-启动nodemanager服务并开机自启
systemctl daemon-reload
#停止手动启动的 NodeManager,避免端口 / 进程冲突
su - hadoop -c "/data/bigdata/hadoop/current/bin/yarn --daemon stop nodemanager"
systemctl start hadoop-yarn-nodemanager
systemctl status hadoop-yarn-nodemanager
systemctl enable hadoop-yarn-nodemanager
#查看日志(systemd 日志)
journalctl -u hadoop-yarn-nodemanager -f
#实时跟踪nodemanager日志
tail -f /data/bigdata/hadoop/logs/hadoop-hadoop-nodemanager-*.log
4.7、配置resourcemanager服务并开机自启
#配置resourcemanager服务并开机自启
#1-创建resourcemanager服务【仅在 yarnserver 节点操作】
vi /etc/systemd/system/hadoop-yarn-resourcemanager.service
#【/etc/systemd/system/hadoop-yarn-resourcemanager.service】文件完整内容
[Unit]
Description=Apache Hadoop 3.4.3 YARN ResourceManager
Documentation=https://hadoop.apache.org/docs/r3.4.3/
# 启动依赖顺序:网络就绪 → HDFS NameNode就绪后再启动RM
After=network-online.target syslog.target hadoop-hdfs-namenode.service
Wants=network-online.target hadoop-hdfs-namenode.service
[Service]
# --daemon双fork后台运行,必须使用forking模式
Type=forking
User=hadoop
Group=hadoop
# 1:1复刻hadoop用户.bash_profile全部环境变量
Environment="JAVA_HOME=/opt/openjdk/default"
Environment="HADOOP_HOME=/data/bigdata/hadoop/current"
Environment="HADOOP_MAPRED_HOME=/data/bigdata/hadoop/current"
Environment="HADOOP_COMMON_HOME=/data/bigdata/hadoop/current"
Environment="HADOOP_HDFS_HOME=/data/bigdata/hadoop/current"
Environment="HADOOP_YARN_HOME=/data/bigdata/hadoop/current"
Environment="HADOOP_CONF_DIR=/etc/hadoop/conf"
Environment="HADOOP_LOG_DIR=/data/bigdata/hadoop/logs"
Environment="HADOOP_PID_DIR=/data/bigdata/hadoop/pids"
# 官网原生标准启停命令,无二次封装、无自定义启停脚本
ExecStart=/data/bigdata/hadoop/current/bin/yarn --daemon start resourcemanager
ExecStop=/data/bigdata/hadoop/current/bin/yarn --daemon stop resourcemanager
ExecReload=/data/bigdata/hadoop/current/bin/yarn --daemon restart resourcemanager
# PID路径严格匹配HADOOP_PID_DIR自动生成规则
PIDFile=/data/bigdata/hadoop/pids/hadoop-hadoop-resourcemanager.pid
# 生产环境官方推荐文件句柄、进程数上限
LimitNOFILE=65535
LimitNPROC=65535
# 进程异常自动重启策略
Restart=on-failure
RestartSec=5s
PrivateTmp=true
[Install]
# 多用户运行级别开机自启
WantedBy=multi-user.target
#2-启动resourcemanager服务并开机自启
systemctl daemon-reload
#停止手动启动的 ResourceManager,避免端口 / 进程冲突
su - hadoop -c "/data/bigdata/hadoop/current/bin/yarn --daemon stop resourcemanager"
systemctl start hadoop-yarn-resourcemanager
systemctl status hadoop-yarn-resourcemanager
systemctl enable hadoop-yarn-resourcemanager
#查看日志(systemd 日志)
journalctl -u hadoop-yarn-resourcemanager -f
#实时跟踪resourcemanager服务日志
tail -f /data/bigdata/hadoop/logs/hadoop-hadoop-resourcemanager-*.log
4.8、配置historyserver服务并开机自启
#配置historyserver服务并开机自启
#1-创建historyserver服务【仅在 yarnserver 节点操作】
vi /etc/systemd/system/hadoop-mapred-historyserver.service
#【/etc/systemd/system/hadoop-mapred-historyserver.service】文件完整内容
[Unit]
Description=Apache Hadoop 3.4.3 MapReduce JobHistory Server
Documentation=https://hadoop.apache.org/docs/r3.4.3/
# 启动依赖顺序:网络就绪 → HDFS NameNode → YARN ResourceManager 优先启动
After=network-online.target syslog.target hadoop-hdfs-namenode.service hadoop-yarn-resourcemanager.service
Wants=network-online.target hadoop-hdfs-namenode.service hadoop-yarn-resourcemanager.service
[Service]
# --daemon为fork后台驻留,必须forking模式
Type=forking
User=hadoop
Group=hadoop
# 1:1复刻hadoop用户.bash_profile全部环境变量
Environment="JAVA_HOME=/opt/openjdk/default"
Environment="HADOOP_HOME=/data/bigdata/hadoop/current"
Environment="HADOOP_MAPRED_HOME=/data/bigdata/hadoop/current"
Environment="HADOOP_COMMON_HOME=/data/bigdata/hadoop/current"
Environment="HADOOP_HDFS_HOME=/data/bigdata/hadoop/current"
Environment="HADOOP_YARN_HOME=/data/bigdata/hadoop/current"
Environment="HADOOP_CONF_DIR=/etc/hadoop/conf"
Environment="HADOOP_LOG_DIR=/data/bigdata/hadoop/logs"
Environment="HADOOP_PID_DIR=/data/bigdata/hadoop/pids"
# 官网原生标准启停命令,无二次封装
ExecStart=/data/bigdata/hadoop/current/bin/mapred --daemon start historyserver
ExecStop=/data/bigdata/hadoop/current/bin/mapred --daemon stop historyserver
ExecReload=/data/bigdata/hadoop/current/bin/mapred --daemon restart historyserver
# PID路径严格匹配HADOOP_PID_DIR自动生成规则
PIDFile=/data/bigdata/hadoop/pids/hadoop-hadoop-historyserver.pid
# 生产官方推荐文件句柄、进程数上限
LimitNOFILE=65535
LimitNPROC=65535
# 进程异常自动重启策略
Restart=on-failure
RestartSec=5s
PrivateTmp=true
[Install]
WantedBy=multi-user.target
#2-启动historyserver服务并开机自启
systemctl daemon-reload
#停止手动启动的 HistoryServer,避免端口 / 进程冲突
su - hadoop -c "/data/bigdata/hadoop/current/bin/mapred --daemon stop historyserver"
systemctl start hadoop-mapred-historyserver
systemctl status hadoop-mapred-historyserver
systemctl enable hadoop-mapred-historyserver
#查看日志(systemd 日志)
journalctl -u hadoop-mapred-historyserver -f
#实时跟踪historyserver服务日志
tail -f /data/bigdata/hadoop/logs/hadoop-hadoop-historyserver-*.log