多彩编程 多彩编程MZPH · CODE BLOG
ARTICLE DETAIL

文章详情

深耕前端与后端开发技术的一线实战笔记与踩坑复盘。

Hadoop伪分布式搭建与Linux命令实战:从环境配置到WordCount全流程

Hadoop伪分布式搭建与Linux命令实战:从环境配置到WordCount全流程 简介大数据实验系列开篇之作面向刚接触大数据、需要搭建Linux与Hadoop实验环境的读者系统梳理了实验一「熟悉常用的 Linux 操作和 Hadoop 操作」的核心要点。文档共1个docx文件压缩包仅289KB适合快速查阅与打印。内容涵盖实验目的、实验平台、实验内容与要求、知识点总结及实验结果反馈重点讲解VirtualBox安装Ubuntu虚拟机、cd/ls/mkdir/cp/mv/rm/cat/tac等常用Linux命令以及Hadoop 3.1.3伪分布式环境搭建与Shell操作。尤为实用的是文档按命令逐一给出切换目录、查看文件、压缩解压、配置Java环境变量等操作要求并附有HDFS用户目录创建与文件操作指引可直接作为课堂实验报告或课前预习的参考模板。已有973人学习下载适合高校大数据课程初学者快速上手。1. 实验一为什么值得认真做从“会敲命令”到“能排查任务”很多人在大数据学习路线里把这一实验当成“走流程”——启动虚拟机、敲几个ls、cd再跑到/usr/local/hadoop下执行两下start-dfs.sh看到jps出来几个进程就交差。但把话说透这个实验真正训练的不是记住命令而是建立“分布式系统操作直觉”。你在实验里对 Linux 进程、文件权限、日志位置产生的体感直接决定后面跑 Hive、Spark 时任务失败能不能靠less翻日志、top看负载、ps -ef | grep找进程来自救。我面试过不少自称熟悉 Hadoop 的候选人问“NameNode 挂了你怎么查”时一半人答不出logs/hadoop-*.log在哪。这一章的定位是让你在 32GB 内存、4 核 CPU 的笔记本上把伪分布式 Hadoop 从解压到跑通 MapReduce 的最小路径走一遍从头建立文件、进程、日志三个黑匣子的排查能力。2. 常用 Linux 操作文件、权限与进程是实验里的最短路径2.1 为什么实验环境首选 Linux不是偏见是 Hadoop 的运行时依赖Hadoop 的 shell 脚本、启动器和守护进程都基于 bash 和 POSIX 语义编写Windows 下跑需要 Cygwin 和额外配环境变量时不时冒出路径分隔符、换行符的玄学问题。所以实验一里“熟悉 Linux 操作”不是额外负担而是 Hadoop 运行的先决条件。常见做法是在 VMware 或 VirtualBox 里装 CentOS 7.9 或 Ubuntu Server 22.04也可以用 WSL2 直接起一个 Ubuntu 发行版后者更省内存。但要注意WSL2 的 systemd 默认关闭Hadoop 用start-dfs.sh拉起进程不走 systemd基本没影响我见过不少同学在 WSL2 里跑通全程。另一个选择是 Docker 起一个 hadoop 镜像但实验目的是熟悉命令Docker 会把底层操作藏起来反而不利于理解所以第一遍别用容器。安装好系统后先做三件事创建普通用户、配 sudo、把/etc/hosts改成固定主机名。这三件事直接关系后面 SSH 免密和 Hadoop 启动是否顺利。创建用户的命令如下# 创建 bigdata 用户并加入 wheel 组获得 sudo 权限 useradd bigdata passwd bigdata usermod -aG wheel bigdata # 修改 hostnameHadoop 集群里主机名不能带下划线 hostnamectl set-hostname node1 # 确认 hosts 映射保证 ssh 不会解析到陌生地址 cat /etc/hosts EOF 192.168.88.10 node1 EOF这里有个参数选择细节wheel组是 RHEL/CentOS 系的 sudo 授权组Ubuntu 系要用sudo组。如果你的机器重启后 IP 变了hosts文件里写死内网 IP 会失配Hadoop 启动时会报UnknownHostException排查思路是优先看hostname和/etc/hosts是否一致而不是先去改core-site.xml。这个坑在每次虚拟机从挂起恢复后最容易出现属于高频踩坑点。2.2 必须形成肌肉记忆的 12 个命令文件、检索、进程、磁盘先说文件。ls -lh看大小、du -sh看目录占用这两个命令在排查磁盘写满时是大数据运维里的救命稻草。Hadoop 的 NameNode 如果磁盘写满会直接进入安全模式并拒绝服务很多同学第一反应是重启服务其实先df -h看一眼根分区水位就能定位。检索方面grep加-r递归、加-n显示行号配合--color高亮是翻日志的基本姿势。例如 NameNode 起不来第一件事就是# 先看进程在不在 jps # 进程不在翻日志 grep -n ERROR\|Exception /usr/local/hadoop/logs/*namenode*.log | tail -30磁盘和内存的排查命令也值得提前练。df -h看文件系统水位free -h看内存余量top看 CPU 和负载。Hadoop 伪分布式在资源不足的虚拟机里表现很典型启动时jps里进程全在但一跑 MapReduce 就反复 container 被杀。这时候top按内存排序看到java进程 RSS 超过 2GB基本可以断定是内存不够而不是配置错误。进程操作方面ps -ef | grep java是验证守护进程是否残留的常规手法kill -9是最后的后悔药——如果 NameNode 进入奇怪状态先jps找到 PID 再杀比stop-all.sh来得干脆。文件权限是另一个必修课。Hadoop 的 DataNode 以启动用户身份写数据目录如果你用 root 解压并启动了 Hadoop下次用普通用户启动会报 Permission denied。所以整条实验路径建议全程用同一个普通用户操作不要混用 root 和普通用户。命令上只需要记住chown -R bigdata:bigdata /usr/local/hadoop和chmod 755就够用了。2.3 用最小命令验证环境网络、SSH、JDK 三连检Hadoop 伪分布式依赖 SSH 免密登录本地用户这个配置容易被忽略跑start-dfs.sh时会卡在要求输入密码的环节然后进程起了一半状态很尴尬。做法是生成密钥并分发到本机# 生成免密密钥一路回车即可 ssh-keygen -t rsa -b 4096 # 分发到本机 authorized_keys cat ~/.ssh/id_rsa.pub ~/.ssh/authorized_keys chmod 600 ~/.ssh/authorized_keys # 验证能免密 ssh 到自己就算成功 ssh node1 hostname这里有个值得说明的细节chmod 600是必须的SSH 对authorized_keys的权限很敏感如果权限是 644sshd 会出于安全策略拒绝使用该密钥文件。另外ssh node1 hostname这一条命令同时验证了 SSH 免密和 hosts 解析两条链路比分开测效率高。JDK 版本验证也很关键Hadoop 3.x 要求 JDK 8 或 11装成 JDK 17 会在启动时报UnsupportedClassVersionErrorjava -version echo $JAVA_HOMEJAVA_HOME没配会导致 Hadoop 脚本找不到java命令报错信息是JAVA_HOME is not set and could not be found。这个报错在实验里出现频率极高很多人会反复重装 Hadoop其实只是没有在/etc/profile里加导出语句。配好之后source /etc/profile再重开终端验证一次比什么都靠得住。把这几个命令练熟实验一大半的坑已经避开了。3. Hadoop 伪分布式搭建从解压到 jps 全绿的整套命令3.1 版本选型与目录规划为什么我建议 Hadoop 3.3.x 配 JDK 8伪分布式只跑单机选版本要考虑的不是集群特性而是教程覆盖度和踩坑可查性。目前常见做法是 Hadoop 3.3.x 配 JDK 8这是网上最主流的组合报错时搜到的解决方案最多。Hadoop 3.2 以下版本和 JDK 8 的兼容性没问题但教程少Hadoop 3.4 搭配 JDK 8 也可以跑但生态组件适配信息滞后。为了实验顺利3.3.6 这类版本比较稳妥。目录规划上我一般统一放/usr/local/hadoop数据目录放/data/hadoop。把安装目录和数据目录分开的好处是升级 Hadoop 时不需要迁移原有数据排查磁盘占用时一眼分清是安装包还是数据。下载选择官方 tar.gz 包后解压命令是# 下载 hadoop 3.3.6 的 tar.gz 包后解压到 /usr/local tar -zxvf hadoop-3.3.6.tar.gz -C /usr/local mv /usr/local/hadoop-3.3.6 /usr/local/hadoop # 创建数据目录 mkdir -p /data/hadoop/tmp mkdir -p /data/hadoop/name mkdir -p /data/hadoop/data # 目录所有权给当前用户 chown -R bigdata:bigdata /usr/local/hadoop /data/hadoop解压后第一件事不是改配置而是确认hadoop命令能跑。执行hadoop version如果提示找不到命令说明HADOOP_HOME和PATH还没设置。这里必须提一个我见过的翻车现场直接修改/etc/profile写死HADOOP_HOME/usr/local/hadoop但没有把export写全导致子 shell 里$HADOOP_HOME是空的。正确写法应该把export和PATH追加一起完成。# 编辑 /etc/profile追加以下内容 export HADOOP_HOME/usr/local/hadoop export PATH$PATH:$HADOOP_HOME/bin:$HADOOP_HOME/sbin export HADOOP_CONF_DIR$HADOOP_HOME/etc/hadoop # 生效并验证 source /etc/profile hadoop version3.2 四个核心配置文件的参数说明从默认值到伪分布式必改项伪分布式只需要改四个文件core-site.xml、hdfs-site.xml、mapred-site.xml、yarn-site.xml。每个文件的配置项不多但每个参数的含义要清楚实验一的考点往往就在这些参数上。先看core-site.xml里面fs.defaultFS是文件系统的默认地址伪分布式填hdfs://localhost:9000这个 9000 端口是 NameNode 的 RPC 通信端口之后所有客户端操作都会连它configuration property namefs.defaultFS/name valuehdfs://localhost:9000/value /property property namehadoop.tmp.dir/name value/data/hadoop/tmp/value /property /configurationhadoop.tmp.dir是最容易被忽略的参数。Hadoop 默认的临时目录在/tmp下系统重启会被清空导致 NameNode 元数据丢失。把它指定到/data/hadoop/tmp后NameNode 的dfs/name和 DataNode 的dfs/data默认都会建在这个目录下重启虚拟机也不怕丢元数据了。这是实验里少有的“提前踩坑”配置建议第一次启动前就改掉。hdfs-site.xml里dfs.replication设成 1因为单节点存 3 份副本是浪费dfs.namenode.name.dir和dfs.datanode.data.dir明确指定元数据和数据块目录方便后续清理和排查configuration property namedfs.replication/name value1/value /property property namedfs.namenode.name.dir/name value/data/hadoop/name/value /property property namedfs.datanode.data.dir/name value/data/hadoop/data/value /property /configuration这里要说明一个细节如果启动后重新格式化 NameNode但 DataNode 的dfs/data目录里保留了旧的VERSION文件启动时会出现clusterID不一致的报错。解决方法是格式化前把 name 和 data 目录都清空这是格式化元数据时的标准操作实验里经常遇到。mapred-site.xml和yarn-site.xml决定计算框架走 YARN 还是本地模式。伪分布式要跑 MapReduce 作业必须指定 YARN 作为资源调度框架否则作业会退化成本地跑体验不到真正的分布式调度流程configuration property namemapreduce.framework.name/name valueyarn/value /property /configurationYARN 的配置里yarn.nodemanager.resource.memory-mb和yarn.scheduler.maximum-allocation-mb是两个需要手动调的参数。虚拟机的默认内存如果只有 2GBYARN 的默认 8GB 内存上限会把 NodeManager 压垮。我一般把这两个值调成 1024 和 2048给系统留出余量configuration property nameyarn.nodemanager.resource.memory-mb/name value1024/value /property property nameyarn.scheduler.maximum-allocation-mb/name value2048/value /property /configuration3.3 格式化与启动顺序错了就是血泪教训配置改完后第一次启动 Hadoop 前必须格式化 NameNode。格式化的作用是生成空的元数据相当于给文件系统做了初始化hdfs namenode -format这里核心不是命令本身而是执行时机。很多人会遇到这个场景Hadoop 已经启动过DataNode 写入了数据然后你改了配置想重新格式化格式化完成后启动DataNode 报Incompatible clusterIDs。原因就是格式化生成了新的 clusterID而 DataNode 数据目录里还记着旧的 clusterID。所以在实验期间如果你要重新格式化务必执行rm -rf /data/hadoop/name/* rm -rf /data/hadoop/data/* hdfs namenode -format这组命令就是给集群吃后悔药但方向要对先清空数据目录再格式化否则会越搞越乱。格式化完成后用start-dfs.sh和start-yarn.sh启动集群或者直接用start-all.sh一次性启动。我建议第一步分开启动因为报错时能更快定位是 HDFS 还是 YARN 的问题start-dfs.sh start-yarn.sh启动完成后输入jps检查进程。伪分布式正常应该看到 5 个进程NameNode、DataNode、SecondaryNameNode、ResourceManager、NodeManager。少任何一个都说明启动链路有问题需要回到日志去看。进程全绿不代表集群可用还要用 Web UI 验证——HDFS 的界面在http://localhost:9870YARN 的在http://localhost:8088这是伪分布式最常见的两个管理入口。4. HDFS 操作常用命令与 4 个必踩的坑4.1 命令行操作 HDFSput、get、cat、rm 是高频四件套HDFS 的命令行工具和 Linux 命令很像但前缀是hdfs dfs。实验里最高频的四个操作是文件上传、下载、查看和删除。在做这些操作之前先确认文件系统状态hdfs dfsadmin -report能看到 DataNode 的在线状态和磁盘容量如果这里显示 DataNode 为 0说明进程在线但注册失败下面的所有文件操作都会报连接异常。# 查看根目录 hdfs dfs -ls / # 创建实验目录 hdfs dfs -mkdir -p /user/bigdata/input # 上传本地文件到 HDFS hdfs dfs -put /usr/local/hadoop/README.txt /user/bigdata/input/ # 查看文件内容 hdfs dfs -cat /user/bigdata/input/README.txt | head -20 # 下载到本地 hdfs dfs -get /user/bigdata/input/README.txt /tmp/readme_from_hdfs.txt # 删除文件rm 和 -skipTrash 的差别要注意 hdfs dfs -rm /user/bigdata/input/README.txtrm和rm -skipTrash的差别是重点默认rm只把文件移到 HDFS 的回收站不真正释放空间如果你做实验反复清理目录会发现磁盘空间越来越少。加上-skipTrash才是真正删除。-put上传时如果目标目录不存在会报错所以先mkdir是对的。这几个命令对应的都是后续跑 MapReduce 时的数据准备阶段必须用熟。4.2 副本机制实验从fsck里看到数据冗余的成本HDFS 的副本机制只靠看书是很难理解的做一次实验就清楚了。把dfs.replication设成 1 后上传一个文件并检查块信息hdfs fsck /user/bigdata/input/README.txt -files -blocks -locations这个命令会输出文件的块数量和每个块所在的 DataNode。因为我们是伪分布式只有一个 DataNode所以每块只在一个节点上。如果想看副本效果可以临时把dfs.replication改成 2重启集群后重新上传文件fsck里就能看到两个DatanodeInfoWithAddedStorage条目。虽然第二个副本还是落在同一个节点但你能直观理解副本是“按块”冗余的而不是“按文件”冗余。这个知识点在面试里容易被问到HDFS 的副本粒度是 block不是文件。4.3 坑 1put时目标路径写错导致客户端假死现象hdfs dfs -put一个 200MB 的文件命令卡住不返回CtrlC 也杀不掉。原因客户端在写文件时DataNode 回调出错但客户端在等待确认本质是写管道中断。伪分布式里最常见的原因是磁盘写满或数据目录权限不对。解决先df -h看磁盘再用jps确认 DataNode 在线然后hdfs dfsadmin -report看 DataNode 是否正常注册。通常清掉/tmp下的大文件就能恢复。4.4 坑 2rm删除后空间没释放dfs -du还是显示占用现象删除了大量实验文件但hdfs dfs -du -s -h /显示的空间占用几乎没有变化。原因回收站机制文件被移到/user/bigdata/.Trash目录没有真正删除。解决执行hdfs dfs -rm -skipTrash /user/bigdata/input/README.txt或者直接清空回收站hdfs dfs -expunge。做实验时如果频繁上传下载建议直接养成交作业时用-skipTrash的习惯。4.5 坑 3get到本地时报File does not exist但文件明明在现象hdfs dfs -get /user/bigdata/input/README.txt /tmp/报错但-ls能看到文件。原因路径尾部多了一个/或者本地目录/tmp/不存在。HDFS 客户端对路径解析很严格尾部斜杠会被当成新路径。解决去掉尾部斜杠先mkdir -p /tmp再执行。这个坑属于典型的命令习惯问题在 Linux 里司空见惯的写法在 HDFS 里反而会翻车。4.6 坑 4上传文件后 DataNode 进程崩溃jps里进程消失现象put大文件过程中jps里 DataNode 消失日志显示Disk Out of Space。原因DataNode 数据目录所在分区被写满这是伪分布式最容易被忽略的问题——HDFS 默认会占满整个磁盘。解决df -h确认分区水位清理本地文件释放空间然后hdfs datanode -format重置 DataNode 数据目录后重启。这里要强调DataNode 格式化是对当前节点数据的毁灭性操作伪分布式无所谓但如果是小集群这种操作必须先和数据负责人确认。5. 常见问题排查5 条高概率翻车记录5.1 NameNode 启动失败日志提示java.io.IOException: NameNode is not formatted现象执行start-dfs.sh后jps看不到 NameNode日志里报NameNode is not formatted。原因新解压的 Hadoop 没有执行hdfs namenode -formatNameNode 找不到元数据。解决执行hdfs namenode -format后重新start-dfs.sh。但要注意如果之前已经启动过一次先清空 name 和 data 目录再格式化避免 clusterID 冲突。5.2 DataNode 起不来日志里全是Incompatible clusterIDs现象格式化后启动NameNode 正常DataNode 反复退出日志报Incompatible clusterIDs。原因DataNode 的dfs/data目录里还保留着上次格式化的 VERSION 文件里面的 clusterID 和新的 NameNode 不一致。解决rm -rf /data/hadoop/data/current后重启 DataNode。如果你还改了dfs.namenode.name.dir的路径连带把 name 目录也清一遍再格式化。5.3jps全部在线但 Web UI 打不开现象jps显示 5 个进程全在但浏览器访问http://localhost:9870超时。原因最常见的是防火墙拦截CentOS 默认 firewalld 会挡掉 9870 和 8088 端口。其次是虚拟机的端口映射没做如果 Hadoop 装在虚拟机里宿主机访问需要 NAT 端口转发。解决CentOS 上执行systemctl stop firewalld并systemctl disable firewalld。虚拟机网络用桥接模式让宿主机和虚拟机在同一网段直接访问虚拟机 IP。如果是云服务器、实验机安全组也要放行 9870 和 8088。5.4 跑 WordCount 时任务卡在ACCEPTED一直进不了RUNNING现象提交作业后YARN 界面显示ACCEPTED但状态一直不变日志里出现Received SHUTDOWN signal from ResourceManager。原因NodeManager 的可用内存不足yarn.nodemanager.resource.memory-mb设得太大而机器物理内存本身就只有 2GB。解决调小 YARN 内存参数我一般设yarn.nodemanager.resource.memory-mb1024yarn.scheduler.maximum-allocation-mb2048同时把mapreduce.map.memory.mb和mapreduce.reduce.memory.mb都调到 512。重启 YARN 后重新提交。5.5 SSH 免密失效start-dfs.sh提示输入密码现象start-dfs.sh执行到 SecondaryNameNode 启动时卡住提示输入 yes/no 密码或者直接报Permission denied (publickey,password)。原因authorized_keys权限错误或者~/.ssh目录本身权限是 775。SSH 要求.ssh目录权限不超过 700authorized_keys不超过 600。解决按下面的顺序修复chmod 700 ~/.ssh chmod 600 ~/.ssh/authorized_keys ssh-keygen -t rsa -b 4096 cat ~/.ssh/id_rsa.pub ~/.ssh/authorized_keys ssh node1 hostnamessh node1 hostname能免密返回就说明链路正常。很多人在start-dfs.sh卡住是因为主机名解析和本机 IP 不一致ssh localhost和ssh node1都要测一遍。6. 进阶验证用 WordCount 把实验一真正跑通并留下检查点实验一做到jps全绿只能说明服务进程起来了还不能证明“Hadoop 操作”是熟练的。我习惯用一个 WordCount 作业来给实验一收尾因为它是 MapReduce 框架里最小的闭环输入分片、Map 处理、Shuffle 排序、Reduce 聚合每一步都能从日志里找到痕迹这是对你在前面章节里学的所有命令的一次串场验证。先准备输入文件mkdir -p /tmp/wordcount_input echo hello hadoop hello world /tmp/wordcount_input/input1.txt echo hello linux hello bigdata /tmp/wordcount_input/input2.txt然后上传到 HDFS 并提交作业。这里要记住作业的输入路径必须指向 HDFS本地路径会让提交直接失败或按本地模式跑完体验不到 YARN 的调度过程作业即使跑完也不算数。我见不少人在这一步直接写hadoop jar指向本地文件以为省事结果在分布式环境里完全跑不通。正确做法是# 上传输入目录到 HDFS hdfs dfs -mkdir -p /user/bigdata/wordcount/input hdfs dfs -put /tmp/wordcount_input/* /user/bigdata/wordcount/input/ # 提交作业输出目录必须是 HDFS 里不存在的路径 hadoop jar /usr/local/hadoop/share/hadoop/mapreduce/hadoop-mapreduce-examples-3.3.6.jar \ wordcount \ /user/bigdata/wordcount/input \ /user/bigdata/wordcount/output输出目录如果已经存在作业会直接报org.apache.hadoop.mapred.FileAlreadyExistsException所以下一次跑之前要记得先删掉旧输出。作业跑完后用下面的命令验证结果hdfs dfs -cat /user/bigdata/wordcount/output/part-r-00000 | sort -k2 -nr | head -5这时候你做的每一件事都映射到前面学过的知识点-put对应上传文件hadoop jar对应配置的mapreduce.framework.nameyarn-cat对应读取 HDFS 文件。从 WordCount 的输出里你还能从 YARN 的 Web UI 或者logs/userlogs目录里找到每个 container 的日志路径这又是下一个实验要用的排查技能。做完这个作业整个实验一从“服务能启动”升级到了“作业能跑通”这种验证习惯应该带到每个实验里——光会启动不算数能产出结果才算。我给你留一个具体建议把实验一里用过的命令整理成一个 markdown 文件按“环境准备 → 启动服务 → 文件上传下载 → 作业提交 → 日志排查”分类后面每个实验开始前先照着跑一遍五分钟内让环境回到可用的状态。这比死记硬背强太多。希望帮到你。本文还有配套的精品资源点击获取
返回列表