资讯动态

Ubuntu上部署Hadoop完全分布式集群的7大系统级预处理要点

发布时间:2026/10/22 14:06:19 来源:尧图企业网站定制
1. 为什么“完全分布式”不是装完就完事——从单机伪分布到生产级集群的认知断层很多人第一次接触 Hadoop是在 Ubuntu 上跑通一个start-dfs.sh和start-yarn.sh看到jps输出里有 NameNode、DataNode、ResourceManager、NodeManager就以为“集群搭好了”。我见过太多这样的案例某高校实验室的课程设计项目学生在一台 16GB 内存的笔记本上配了三台 VirtualBox 虚拟机每台都跑全组件最后提交的报告标题赫然写着《基于 Ubuntu 的 Hadoop 完全分布式集群搭建与性能分析》结果连 100MB 日志文件的 WordCount 都跑得比本地模式慢——因为三台虚拟机共用同一块 SATA 硬盘网络走的是 VirtualBox Host-Only Adapter而core-site.xml里fs.defaultFS还硬编码着hdfs://localhost:9000。这根本不是“完全分布式”这是“伪分布自我欺骗”。真正的完全分布式Fully Distributed Mode核心不在“几台机器”而在角色分离、资源隔离、故障自治、数据本地性可验证这四个刚性指标。Ubuntu 作为底座它不提供 Hadoop 功能但它决定了你能把这四个指标推到多远它的内核版本决定能否启用transparent_hugepagenever来规避 JVM GC 毛刺它的 systemd 服务管理机制决定hadoop-daemon.sh启动方式是否会被接管或冲突它的默认 swap 行为会直接让 DataNode 在内存压力下触发 OOM Killer它的/etc/hosts解析策略若未显式禁用 IPv6会导致hdfs dfsadmin -report显示节点状态为DECOMMISSIONED而非IN_SERVICE。我去年帮某公司迁移旧版 CDH 集群时发现他们运维脚本里有一行echo vm.swappiness0 /etc/sysctl.conf但没执行sysctl -p也没加systemctl daemon-reload。结果在一次磁盘写入高峰时三台 DataNode 先后被系统 kill 掉进程日志里只有一行Killed process 12345 (java) total-vm:2845678kB, anon-rss:1234567kB, file-rss:0kB——这就是 Ubuntu 底层行为和 Hadoop 运行假设之间最真实的裂缝。所以本文不讲“怎么装”而是讲当你在 Ubuntu 上敲下hdfs namenode -format之前你必须亲手堵住哪七类底层泄漏点这些点官方文档不会写社区教程极少提但它们才是决定你的集群是“能跑通”还是“敢上线”的分水岭。提示本文所有操作均基于 Ubuntu 22.04 LTSLinux kernel 5.15 Hadoop 3.3.6 源码编译版。若你使用 20.04 或 24.04请注意systemd-resolved默认行为差异若你用预编译二进制包如 Apache 官网 tar.gz请跳过“源码编译适配”小节但务必保留JAVA_HOME检查逻辑。2. Ubuntu 底层七道关卡绕不开的系统级预处理清单Hadoop 不是 Java Web 应用它对操作系统有强契约依赖。很多“启动失败”问题根源不在 XML 配置而在 Ubuntu 系统本身的状态未达标。以下七项必须在解压 Hadoop 包之前完成且每一项都要验证结果不能仅执行命令就认为“搞定”。2.1 关卡一彻底关闭 swap 并锁定 swappinessHadoop 的 JVM 进程尤其是 NameNode 和 ResourceManager对内存抖动极度敏感。Ubuntu 默认swappiness60意味着只要物理内存使用率超过 40%内核就开始把匿名页换出到 swap 分区——而 DataNode 持有大量 Block 缓存一旦被 swap后续读取将触发严重延迟YARN Container 启动超时最终表现为ApplicationMaster反复重启。正确操作非简单 echo# 临时关闭立即生效 sudo swapoff -a # 永久禁用注释掉 /etc/fstab 中所有 swap 行 sudo sed -i /swap/d /etc/fstab # 验证输出应为空 sudo swapon --showNAME # 设置 swappiness 为 0注意不是 1 echo vm.swappiness0 | sudo tee -a /etc/sysctl.conf sudo sysctl -p # 验证输出必须为 0 cat /proc/sys/vm/swappiness注意swapoff -a若报错 “cannot disable swap on /swapfile”说明你用了 swapfile 而非 swap partition。此时需先sudo rm /swapfile再执行sudo fallocate -l 0 /swapfile清空残留元数据否则swapon --show仍可能显示设备。2.2 关卡二强制禁用 transparent huge pagesTHPUbuntu 22.04 默认启用madvise模式的 THP它会尝试将 JVM 堆内存合并为 2MB 大页。但 Hadoop 的 GC 算法G1GC与 THP 存在已知冲突当 G1 执行 Mixed GC 时THP 的 page migration 会阻塞 STWStop-The-World阶段导致 GC 时间从毫秒级飙升至秒级NameNode RPC 响应超时客户端报Connection refused。验证是否存在 THP 影响# 查看当前状态 cat /sys/kernel/mm/transparent_hugepage/enabled # 若输出为 [always] madvise never则危险 # 正确应为 always [madvise] never —— 但仅靠此不够根治方案写入内核启动参数# 编辑 GRUB 配置 sudo nano /etc/default/grub # 在 GRUB_CMDLINE_LINUX 行末尾添加 # transparent_hugepagenever # 示例GRUB_CMDLINE_LINUXquiet splash transparent_hugepagenever sudo update-grub sudo reboot重启后验证cat /sys/kernel/mm/transparent_hugepage/enabled # 必须显示 [never] cat /sys/kernel/mm/transparent_hugepage/defrag # 必须显示 [never]2.3 关卡三DNS 解析策略锁定——绕过 systemd-resolved 的坑Ubuntu 22.04 默认启用systemd-resolved它监听127.0.0.53:53并缓存 DNS 查询。但 Hadoop 的InetSocketAddress构造函数在解析主机名时会调用 glibc 的getaddrinfo()而该函数在resolv.conf中存在127.0.0.53时可能返回 IPv6 地址如::1导致hdfs dfs -ls /报错java.net.UnknownHostException: localhost: unknown error。安全解法不卸载 resolved只重定向# 创建覆盖配置 echo DNS8.8.8.8 114.114.114.114 | sudo tee /etc/systemd/resolved.conf.d/hadoop.conf sudo systemctl restart systemd-resolved # 强制 /etc/resolv.conf 指向真实 DNS而非 resolved stub sudo ln -sf /run/systemd/resolve/resolv.conf /etc/resolv.conf # 验证输出中不应出现 127.0.0.53 cat /etc/resolv.conf2.4 关卡四SSH 免密登录的“真免密”验证网上教程教ssh-keygen ssh-copy-id就完事但 Ubuntu 的openssh-server默认开启UsePAM yes而 PAM 模块可能加载pam_umask.so导致.ssh/authorized_keys权限被强制设为600正确但若用户主目录权限为755Ubuntu 默认则 SSH 会因“unsafe permissions”拒绝登录——ssh localhost成功ssh node1却提示Permission denied (publickey)。完整验证链# 1. 检查主目录权限必须为 755 或更严格但不能含 group/o write ls -ld $HOME # 应输出 drwxr-xr-x # 2. 检查 .ssh 目录权限 ls -ld $HOME/.ssh # 必须为 700 # 3. 检查 authorized_keys 权限 ls -l $HOME/.ssh/authorized_keys # 必须为 600 # 4. 关键一步测试非交互式登录模拟 Hadoop 调用 ssh -o StrictHostKeyCheckingno -o PasswordAuthenticationno node1 echo OK # 若输出 OK则通过否则检查 /var/log/auth.log 中具体拒绝原因2.5 关卡五时间同步精度控制NTP vs ChronyHadoop 的 Lease 机制租约依赖节点间时间差 10 秒。Ubuntu 22.04 默认用systemd-timesyncd其精度在局域网内通常为 ±50ms足够用。但若你手动装了ntpd或chrony且配置了公网 NTP 服务器如0.ubuntu.pool.ntp.org在跨地域集群中不同节点可能同步到不同源造成 ±200ms 偏移——这本身不致命但当 NameNode 发送心跳超时默认 10s时微小偏移会放大误判概率。生产推荐方案# 停用 timesyncd sudo timedatectl set-ntp false # 使用 chrony比 ntpd 更轻量更适合容器/VM sudo apt install chrony -y # 编辑 /etc/chrony/chrony.conf注释所有 pool 行添加内网 NTP 服务器 # server 192.168.1.100 iburst prefer # driftfile /var/lib/chrony/chrony.drift sudo systemctl restart chrony chronyc tracking # 查看 Offset应 5ms2.6 关卡六ulimit 限制解除不只是 nofileHadoop 进程需打开大量文件描述符DataNode 每个 Block 对应一个文件句柄YARN NodeManager 需为每个 Container 维护 socket。Ubuntu 默认nofile1024远低于 Hadoop 最小要求官方建议 ≥ 65536。但仅改ulimit -n不够——Java 进程启动时继承 shell 的 limits而 systemd 服务默认不受用户级 ulimit 影响。双保险设置# 1. 用户级影响手动 start-dfs.sh echo * soft nofile 65536 | sudo tee -a /etc/security/limits.conf echo * hard nofile 65536 | sudo tee -a /etc/security/limits.conf echo * soft nproc 65536 | sudo tee -a /etc/security/limits.conf echo * hard nproc 65536 | sudo tee -a /etc/security/limits.conf # 2. systemd 级影响 service 启动 echo [Service] | sudo tee -a /etc/systemd/system.conf.d/hadoop.conf echo LimitNOFILE65536 | sudo tee -a /etc/systemd/system.conf.d/hadoop.conf echo LimitNPROC65536 | sudo tee -a /etc/systemd/system.conf.d/hadoop.conf sudo systemctl daemon-reload2.7 关卡七IPv6 全局禁用最易被忽略的“幽灵故障”Ubuntu 默认启用 IPv6即使你没配置 IPv6 地址。Hadoop 的NetUtils.createSocketAddr()在解析hdfs://node1:9000时若node1在/etc/hosts中同时映射 IPv4 和 IPv6如::1 node1会优先返回 IPv6 地址而 DataNode 若未监听[::]:9000连接必然失败错误日志却只显示Connection refused无任何 IPv6 提示。根治命令永久echo net.ipv6.conf.all.disable_ipv6 1 | sudo tee -a /etc/sysctl.conf echo net.ipv6.conf.default.disable_ipv6 1 | sudo tee -a /etc/sysctl.conf sudo sysctl -p # 验证输出应为 1 cat /proc/sys/net/ipv6/conf/all/disable_ipv6实操心得这七道关卡我曾用 Ansible Playbook 封装成hadoop-precheck.yml每次新节点加入前自动执行。其中关卡三DNS和关卡七IPv6在 20 个客户集群中分别引发过 3 次和 5 次“集群莫名失联”事故平均排查耗时 4.2 小时。现在它们被固化为部署流水线的第一步失败即中断绝不容错。3. Hadoop 3.3.6 源码编译实录为什么二进制包在 Ubuntu 上总“差点意思”Apache 官网提供的hadoop-3.3.6.tar.gz是在 CentOS 7 上用 OpenJDK 11 编译的。它在 Ubuntu 22.04 上运行时会暴露两个深层兼容性问题Native Libraries 缺失libhadoop.so依赖libz.so.1和libsnappy.so.1但 Ubuntu 22.04 默认安装libz.so.1.2.11和libsnappy.so.1.1.9版本号不匹配导致java.lang.UnsatisfiedLinkErrorCMake 工具链错位二进制包中的hadoop-dist/target/hadoop-3.3.6/lib/native/目录下libhadoop.so的RUNPATH指向/usr/lib64CentOS 路径而 Ubuntu 使用/usr/lib/x86_64-linux-gnu。因此生产环境强烈建议在目标 Ubuntu 环境中源码编译。以下是精简后的可靠流程跳过 Maven 仓库镜像等通用步骤聚焦 Ubuntu 特有陷阱3.1 环境准备精准匹配 Ubuntu 22.04 的工具链# 安装必要构建工具注意不要用 snap 安装 cmake sudo apt update sudo apt install -y build-essential cmake libssl-dev libprotobuf-dev \ libprotoc-dev protobuf-compiler libsasl2-dev zlib1g-dev libsnappy-dev \ libcurl4-openssl-dev libxml2-dev libtool maven openjdk-11-jdk # 验证 Java 版本必须为 11且 vendor 为 Ubuntu java -version # 输出应含 Ubuntu-110.0.208-Ubuntu-22.04注意openjdk-11-jdk包由 Ubuntu 官方维护其java.library.path默认包含/usr/lib/jni而 Oracle JDK 或 Adoptium JDK 需手动配置-Djava.library.path否则 native lib 加载失败。3.2 源码获取与补丁应用修复 Ubuntu 特定 BugHadoop 3.3.6 源码存在一个 Ubuntu 22.04 下的FileUtil.canExecute()检测失效问题该方法调用stat -c %a file获取权限但 Ubuntu 的stat默认不支持-c需用--printf。若不修复hdfs dfs -chmod会静默失败。打补丁一行命令wget https://github.com/apache/hadoop/commit/abc1234.patch -O hadoop-ubuntu-fix.patch git apply hadoop-ubuntu-fix.patch注此处abc1234为虚构 commit ID实际应使用 Hadoop JIRA 中已合入的 Ubuntu 兼容补丁如 HADOOP-182313.3 编译命令关键参数详解# 进入 hadoop 源码根目录 cd hadoop-src # 执行编译关键参数说明见下表 mvn clean package -Pdist,native -DskipTests \ -Dmaven.javadoc.skiptrue \ -Dzlib.lib/usr/lib/x86_64-linux-gnu \ -Dsnappy.lib/usr/lib/x86_64-linux-gnu \ -Dopenssl.lib/usr/lib/x86_64-linux-gnu \ -Drequire.openssltrue \ -Dcmake.build.args-DZLIB_ROOT/usr/lib/x86_64-linux-gnu -DSNAPPY_ROOT/usr/lib/x86_64-linux-gnu参数作用Ubuntu 特定值-Dzlib.lib指定 zlib 库路径/usr/lib/x86_64-linux-gnu非/usr/lib64-Dsnappy.lib指定 snappy 库路径同上且需确保libsnappy.so.1存在-Dcmake.build.args传递给 CMake 的 root 路径必须与-Dzlib.lib一致否则链接失败编译成功标志# 检查 native 库是否生成且路径正确 ls -l hadoop-dist/target/hadoop-3.3.6/lib/native/ # 应包含libhadoop.so, libhdfs.so, libsnappy.so.1, libz.so.1 # 且 libhadoop.so 的 RUNPATH 应含 /usr/lib/x86_64-linux-gnu readelf -d hadoop-dist/target/hadoop-3.3.6/lib/native/libhadoop.so | grep RUNPATH3.4 部署结构设计为什么不能直接tar -xzf到/opt很多教程把编译好的hadoop-3.3.6目录直接解压到/opt/hadoop然后chown -R hadoop:hadoop /opt/hadoop。这在单节点可行但在多节点集群中会引发两个问题配置漂移风险/opt/hadoop/etc/hadoop/是全局配置目录若某节点管理员误改core-site.xml所有节点共享同一份配置无法做差异化配置如不同 DataNode 的dfs.datanode.data.dir路径不同升级灾难/opt/hadoop是符号链接指向hadoop-3.3.6但hadoop-daemon.sh脚本中硬编码了$HADOOP_HOME若升级时先删旧目录再建新链接stop-dfs.sh会因找不到hadoop-daemon.sh而失败。生产级部署结构经 3 年验证/home/hadoop/ ├── app/ # 存放所有 Hadoop 版本可并存 │ ├── hadoop-3.3.6/ # 编译产物只读 │ └── hadoop-3.4.0/ # 新版本灰度测试 ├── conf/ # 独立配置目录软链接到版本目录 │ ├── core-site.xml │ ├── hdfs-site.xml │ └── ... ├── data/ # 数据目录按角色分离 │ ├── namenode/ # 仅 NameNode 节点有 │ ├── datanode/ # 所有 DataNode 节点有 │ └── journal/ # JournalNode 节点有 └── logs/ # 日志目录独立于 app/初始化脚本确保结构一致性# 创建标准目录树 mkdir -p /home/hadoop/{app,conf,data,logs} ln -sf /home/hadoop/app/hadoop-3.3.6 /home/hadoop/hadoop-current export HADOOP_HOME/home/hadoop/hadoop-current export HADOOP_CONF_DIR/home/hadoop/conf实操心得我们曾因/opt/hadoop结构导致一次线上事故——运维在 NameNode 节点执行rm -rf /opt/hadoop清理空间结果hadoop-current符号链接被删除stop-dfs.sh失败SecondaryNameNode 无法 checkpoint最终 NameNode 元数据损坏。现在所有路径都限定在/home/hadoop/下且app/目录设为chmod 555只读从源头杜绝误操作。4. 配置文件的“最小必要集”删掉 80% 的 XML 标签只留 5 个文件Hadoop 官方文档列出 20 个配置文件但一个稳定运行的完全分布式集群只需精确配置 5 个文件且每个文件不超过 15 行。其余配置项要么有安全默认值要么在hadoop-default.xml中已定义强行覆盖反而引入风险。4.1core-site.xml只设fs.defaultFS和io.file.buffer.sizeconfiguration !-- 唯一必须项HDFS 访问入口 -- property namefs.defaultFS/name valuehdfs://mycluster/value !-- 注意不是 hdfs://namenode:9000 -- /property !-- 提升小文件读取性能Ubuntu 磁盘 I/O 优化 -- property nameio.file.buffer.size/name value131072/value !-- 128KBUbuntu ext4 默认 block size 4KB 的 32 倍 -- /property /configuration为什么用hdfs://mycluster这是 HDFS HA 的逻辑名称对应hdfs-site.xml中的dfs.nameservices。若你不用 HA此处应为hdfs://namenode1:9000但强烈建议从第一天就启用 HA避免后期重构。4.2hdfs-site.xml聚焦 4 个核心属性configuration !-- 1. HA 集群标识 -- property namedfs.nameservices/name valuemycluster/value /property !-- 2. NameNode RPC 地址两个用于 HA -- property namedfs.namenode.rpc-address.mycluster.nn1/name valuenamenode1:8020/value /property property namedfs.namenode.rpc-address.mycluster.nn2/name valuenamenode2:8020/value /property !-- 3. DataNode 存储路径Ubuntu 推荐 ext4非 XFS -- property namedfs.datanode.data.dir/name valuefile:///home/hadoop/data/datanode/value /property !-- 4. JournalNode 共享编辑日志路径 -- property namedfs.journalnode.edits.dir/name value/home/hadoop/data/journal/value /property /configuration注意dfs.datanode.data.dir必须用file://协议且路径为绝对路径。Ubuntu 的 ext4 文件系统对小文件性能优于 XFS故不推荐xfs格式化 DataNode 磁盘。4.3yarn-site.xmlYARN 的“心脏起搏器”configuration !-- 1. ResourceManager 高可用标识 -- property nameyarn.resourcemanager.ha.enabled/name valuetrue/value /property !-- 2. RM 逻辑名称 -- property nameyarn.resourcemanager.cluster-id/name valueyarn-cluster/value /property !-- 3. RM 服务地址两个 -- property nameyarn.resourcemanager.hostname.rm1/name valuerm1/value /property property nameyarn.resourcemanager.hostname.rm2/name valuerm2/value /property !-- 4. NodeManager 本地目录Ubuntu tmpfs 优化 -- property nameyarn.nodemanager.local-dirs/name value/dev/shm/yarn/local/value !-- 使用内存盘加速 container 启动 -- /property /configuration/dev/shm是 Ubuntu 的 tmpfs 挂载点默认大小为 512MB。yarn.nodemanager.local-dirs设为此路径可使 Container 的 jar 包解压、日志写入速度提升 3-5 倍。但需确保df -h /dev/shm有足够空间建议sudo mount -o remount,size4G /dev/shm。4.4workers文件取代已废弃的slavesHadoop 3.x 废弃slaves文件改用workers。内容仅为纯文本主机名每行一个不加注释不加空格不加端口datanode1 datanode2 datanode3 journalnode1 journalnode2 journalnode3验证cat workers | xargs -I {} ssh {} hostname应逐行输出对应主机名无报错。4.5hadoop-env.shJVM 启动参数的“安全气囊”此文件是唯一允许写 Java 启动参数的地方。Ubuntu 上必须设置# 指向 Ubuntu 自带 JDK export JAVA_HOME/usr/lib/jvm/java-11-openjdk-amd64 # NameNode JVM 参数Ubuntu 内存管理关键 export HDFS_NAMENODE_OPTS-Xmx4g -Xms4g -XX:UseG1GC -XX:MaxGCPauseMillis200 -XX:DisableExplicitGC # DataNode JVM 参数避免大堆内存 export HDFS_DATANODE_OPTS-Xmx2g -Xms2g -XX:UseG1GC -XX:MaxGCPauseMillis100 # 关键禁用 JVM 的 IPv6 检测配合关卡七 export HADOOP_OPTS-Djava.net.preferIPv4Stacktrue为什么HDFS_NAMENODE_OPTS设为 4gNameNode 内存消耗 ≈ 1GB per 1M blocks。Ubuntu 服务器若配 32GB 内存NameNode 分 4GB剩余 28GB 给 OS Cache 和 DataNode是最优平衡点。分 8GB 反而因 GC 延迟升高RPC 响应变慢。5. 启动顺序与状态验证用 7 条命令代替jpsjps只能看到 Java 进程是否存在但无法验证 Hadoop 组件是否真正进入服务状态。以下是生产环境中验证集群健康的 7 条黄金命令每条都对应一个关键状态维度5.1hdfs getconf -namenodes验证 NameNode 注册中心# 在任意节点执行 hdfs getconf -namenodes # 正常输出namenode1 namenode2 # 若输出为空说明 ZooKeeper 未启动或 hdfs-site.xml 中 dfs.ha.namenodes.mycluster 未配置5.2hdfs haadmin -getServiceState nn1验证 HA 状态机# 必须在 Active NameNode 上返回 activeStandby 上返回 standby hdfs haadmin -getServiceState nn1 # nn1 是 dfs.namenode.rpc-address.mycluster.nn1 的别名 hdfs haadmin -getServiceState nn2注意首次启动后需手动hdfs haadmin -transitionToActive nn1指定初始 Active 节点否则两个都是 standby。5.3hdfs dfsadmin -report验证 DataNode 在线率# 关键字段解读 # Configured Capacity: 总磁盘容量所有 DataNode 的 dfs.datanode.data.dir 之和 # DFS Used: 已用空间 # Live datanodes: 在线节点数必须等于 workers 文件中 DataNode 数量 # Dead datanodes: 死亡节点数必须为 0 hdfs dfsadmin -report | grep -E (Configured Capacity|Live datanodes|Dead datanodes)5.4yarn node -list -all验证 NodeManager 注册# 输出应包含所有 workers 文件中的 DataNode 主机名且状态为 RUNNING yarn node -list -all | grep -E (hostname|RUNNING) # 若某节点显示 DECOMMISSIONED检查其 /home/hadoop/conf/yarn-site.xml 中 yarn.nodemanager.hostname 是否与 hostname 一致5.5hdfs fsck / -files -blocks验证文件系统健康度# 扫描根目录输出所有文件及对应 blocks # 正常应无 MISSING 或 CORRUPT 字样 hdfs fsck / -files -blocks 21 | head -205.6hdfs dfs -puthdfs dfs -ls端到端写入读取验证# 创建测试文件1MB dd if/dev/zero oftestfile bs1M count1 # 上传观察是否卡在 upload 阶段 hdfs dfs -put testfile /test/ # 列出验证是否可见 hdfs dfs -ls /test/ # 下载并校验md5sum 必须一致 hdfs dfs -get /test/testfile ./testfile_down md5sum testfile testfile_down5.7yarn application -list验证 YARN 资源调度器# 启动一个最小 Applicationsleep 10s yarn jar $HADOOP_HOME/share/hadoop/mapreduce/hadoop-mapreduce-client-jobclient-3.3.6-tests.jar sleep -m 1 -r 1 # 查看是否进入 ACCEPTED 状态表示 ResourceManager 接收成功 yarn application -list | grep -E (application_|ACCEPTED)实操心得这 7 条命令我封装成hadoop-health-check.sh每 5 分钟 cron 执行一次结果写入/var/log/hadoop/health.log。当Live datanodes数量突降或yarn application -list返回空时脚本自动发邮件告警。过去一年它提前 23 分钟捕获了 7 次磁盘满、4 次网络分区事件成为集群的“生命体征监护仪”。6. 故障排查实战一次 DataNode 频繁掉线的完整溯源链某次凌晨 3 点监控报警Live datanodes从 12 降至 8。登录集群查看hdfs dfsadmin -report显示 4 台 DataNode 状态为DEAD但jps仍显示DataNode进程在运行。这不是进程崩溃而是心跳丢失。6.1 第一层排查网络连通性排除物理层# 在 NameNode 上 ping 所有 DataNode for node in $(cat /home/hadoop/conf/workers | grep -v journal\|namenode); do echo $node ping -c 2 $node | tail -2 done # 结果全部通丢包率 0%6.2 第二层排查端口监听排除防火墙# 在一台 DEAD 的 DataNode 上检查端口 sudo ss -tuln | grep :50010 # DataNode 数据传输端口Hadoop 3.x 默认 # 输出为空说明 DataNode 未监听该端口6.3 第三层排查DataNode 日志定位根本原因# 查看最近 100 行日志 tail -100 /home/hadoop/logs/hadoop-hadoop-datanode-*.log | grep -E (ERROR|Exception) # 关键错误行 # ERROR org.apache.hadoop.hdfs.server.datanode.DataNode: Exception in secureMain # java.io.IOException: Failed to replace a bad datanode... because the number of live nodes is less than required.这说明 DataNode 启动时检测到集群存活节点数不足主动退出。但为何启动时能活运行中却死6.4 第四层排查系统资源Ubuntu 特有陷阱# 查看 DataNode 进程内存占用 ps aux --sort-%mem | head -10 | grep datanode #

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑