大数据Hadoop运维应用实践——双NameNode高可用Hadoop集群架构(下)

大数据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/donehadoop.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 任务等)启动时都会加载该文件。

核心职责:

  1. 指定 Java 路径、JVM 参数、堆内存;
  2. 定义 Hadoop 运行用户、日志目录、PID 存放目录;
  3. 配置 SSH、本地库、Hadoop 运行模式、环境扩展;
  4. 区分 HDFS/YARN/MR 各组件独立 JVM 启动参数;
  5. 控制调试日志、GC 日志、进程启动权限。
bash 复制代码
#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与准备配置文件

bash 复制代码
#下载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】

bash 复制代码
<?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】

bash 复制代码
<?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】

bash 复制代码
<?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】

bash 复制代码
<?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配置文件内容打包

bash 复制代码
#将配置好的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

bash 复制代码
#给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免密互信

bash 复制代码
#给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集群准备

bash 复制代码
#启动双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

bash 复制代码
#启动双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

bash 复制代码
#启动双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服务

bash 复制代码
#启动存储节点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、分布式计算与主备节点切换测试

bash 复制代码
#分布式计算与主备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服务开机自启

bash 复制代码
#配置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服务开机自启

bash 复制代码
#配置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服务开机自启

bash 复制代码
#配置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服务开机自启

bash 复制代码
#配置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服务开机自启

bash 复制代码
#配置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服务开机自启

bash 复制代码
#配置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服务并开机自启

bash 复制代码
#配置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服务并开机自启

bash 复制代码
#配置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
相关推荐
在水一缸1 小时前
深度解析 GPT-5.6:大模型架构演进与复杂任务实战指南
大数据·人工智能·gpt·架构·大模型·架构演进·gpt-5.6
无忧智库2 小时前
智慧电厂:引领发电行业新革命(PPT)
大数据·人工智能
小果因子实验室2 小时前
量化研究--编写第一个回测算法策略研究
大数据·区块链
chenyulin45453 小时前
企业微信API二次开发:万级并发回调下的极致幂等性设计与防重放架构实战
大数据·人工智能·安全·架构·企业微信
BizObserver4 小时前
传统制造企业官网升级:2026数字化品牌阵地建设与服务商能力评估
大数据·人工智能·制造
leoZ2314 小时前
Git 集成实战完全指南(三):自动化 Commit 与 PR
大数据·git·elasticsearch
TDengine (老段)5 小时前
TDengine 函数完整参考 — 聚合、时序、字符串、时间、数学
大数据·数据库·物联网·时序数据库·iot·tdengine·涛思数据
初晴融雪-快雪时晴5 小时前
动产与不动产全景分析:从法律定义到资产配置
大数据·人工智能
AC赳赳老秦5 小时前
时间开销自动统计:OpenClaw 记录工作任务时长、分析时间分配、给出优化建议
java·大数据·开发语言·python·自动化·deepseek·openclaw