简介:本资源为大数据实验系列第一课的配套实验文档,面向刚接触大数据的高校学生与自学者,帮助其搭建后续实验所需的基础环境。内容围绕Linux虚拟机安装、常用Linux命令与Hadoop伪分布式安装三大模块展开,覆盖cd、ls、mkdir、cp、mv、rm、cat、tac等命令的实操练习,以及Hadoop 3.1.3伪分布式环境搭建与WordCount实例验证,并延伸至HDFS目录创建、文件复制与查看等常用操作。资源包内含1个docx文档,约289KB,结构清晰,按实验目的、实验平台、实验内容和要求逐层推进,便于对照操作与复盘。目前已有974人学习,适合作为大数据入门阶段的环境配置与命令练习参考,为后续集群与分布式实验打下基础。
1. 大数据实验第一课:为什么你的 Linux 命令总在 Hadoop 集群上翻车
很多人第一次做大数据实验,觉得“熟悉 Linux 操作和 Hadoop 操作”就是走个过场——敲几个ls、cd,再跑一遍hadoop fs -ls就算完事。但真正进到集群里,你会发现一个反直觉的现象:单机 Linux 玩得再溜的人,第一次碰 Hadoop 也可能连文件都传不上去。原因不在于命令难,而在于 Linux 的本地文件系统和 HDFS 的分布式文件系统是两套逻辑,权限模型、路径语义、执行身份全都不一样。
这个实验的核心目标,是让你建立“两套系统并行操作”的肌肉记忆:左手 Linux 管本地目录、进程、权限,右手 Hadoop 管 HDFS 路径、YARN 任务、MapReduce 作业。适合刚接触大数据平台的学生和转行工程师,也适合那些“能跑通 WordCount 但说不清数据到底存哪”的从业者。接下来我会按真实实验流程,把每一步的命令、参数、报错和排查都拆开讲,你照着做就能在自己的实验环境里复现。
2. Linux 操作底座:从登录到权限,把实验环境先摸清楚
2.1 实验环境的最小认知:你是谁、你在哪、你有什么权限
做任何大数据实验之前,先确认三件事:当前用户是谁、工作目录在哪、对目标路径有没有写权限。很多“Hadoop 命令报错”追到根上,其实是 Linux 权限没配对。
# 查看当前用户身份和所属组 whoami id # 查看当前工作目录的绝对路径 pwd # 查看当前目录下所有文件(含隐藏文件)的详细信息 ls -la # 查看磁盘挂载情况,确认实验数据盘挂在哪 df -hwhoami输出当前有效用户名,id会额外显示 uid、gid 和所属附加组。ls -la里的-l是长格式,-a是显示以.开头的隐藏文件,这两个参数组合是排查“文件明明存在却读不到”的第一手段。df -h用人类可读单位显示各挂载点容量,实验环境里常见/data单独挂一块盘,HDFS 的 DataNode 数据目录往往就指向那里。
提示:如果
whoami显示的不是你预期的实验账号,后面所有 HDFS 操作都可能因为“执行身份不对”而失败。先su - 实验账号切换,再继续。
2.2 文件与目录操作:实验数据准备的标准动作
大数据实验通常需要先准备本地样本数据,再上传到 HDFS。本地这一侧的操作必须熟练到不用想。
# 创建实验目录结构 mkdir -p ~/lab/data ~/lab/output ~/lab/scripts # 生成一个测试文本文件,写入若干行内容 cat > ~/lab/data/sample.txt << 'EOF' hello hadoop hello hdfs hello mapreduce big data experiment EOF # 复制文件并重命名,模拟数据备份 cp ~/lab/data/sample.txt ~/lab/data/sample_backup.txt # 移动文件到输出目录 mv ~/lab/data/sample_backup.txt ~/lab/output/ # 查看文件内容 cat ~/lab/data/sample.txt # 统计文件行数、单词数、字节数 wc -l ~/lab/data/sample.txt wc -w ~/lab/data/sample.txtmkdir -p的-p表示递归创建,父目录不存在也不会报错。cat > file << 'EOF'是 here-document 写法,适合在脚本里批量生成测试数据。wc -l统计行数,wc -w统计单词数,这两个命令在验证 MapReduce 输出时经常用来做快速比对。
2.3 权限与属主:HDFS 上传失败的隐形杀手
Linux 权限分读(r)、写(w)、执行(x),分别对应数字 4、2、1。实验里最常见的翻车场景是:本地文件属主是 root,你用普通账号跑hadoop fs -put,HDFS 那边虽然能写,但本地读取阶段就被拒了。
# 查看文件权限和属主 ls -l ~/lab/data/sample.txt # 修改文件权限为 644(属主读写,同组和其他人只读) chmod 644 ~/lab/data/sample.txt # 修改文件属主和属组(需要 sudo 或 root) sudo chown 实验账号:实验账号 ~/lab/data/sample.txt # 递归修改目录权限 chmod -R 755 ~/lab/scriptschmod 644是文件的标准权限:属主可读写,其他人只读。chmod 755是目录和可执行脚本的标准权限:属主可读写执行,其他人可读可执行。chown改属主,chgrp改属组,chown user:group可以一次改两个。递归操作加-R,但要对目录用,别对单个文件用。
注意:实验环境里不要随意
chmod 777。虽然能快速绕过权限问题,但会掩盖真正的配置错误,后面 HDFS 的权限检查会让你更困惑。
2.4 进程与日志查看:实验环境卡住时先看什么
Hadoop 是多个 Java 进程组成的系统,NameNode、DataNode、ResourceManager、NodeManager 各自独立。实验里“命令没反应”或“作业一直卡住”,第一步永远是看进程和日志。
# 查看所有 Java 进程 jps # 查看指定进程的详细信息 ps -ef | grep -i hadoop # 实时查看日志文件末尾内容 tail -f ~/lab/logs/hadoop.log # 查看日志最后 100 行 tail -n 100 ~/lab/logs/hadoop.log # 在日志中搜索关键字 grep -i "error" ~/lab/logs/hadoop.logjps是 JDK 自带的 Java 进程查看工具,输出比ps更干净,直接列出 JVM 进程和主类名。ps -ef | grep是通用进程过滤,-ef显示所有进程的全格式信息。tail -f的-f是 follow,持续输出新追加的日志行,排查实时问题时必用。grep -i忽略大小写,搜 error、warn、exception 都靠它。
3. Hadoop 操作上手:HDFS 命令与 MapReduce 作业的完整链路
3.1 HDFS 命令体系:和 Linux 像但不一样
HDFS 命令用hadoop fs或hdfs dfs开头,后面跟的子命令和 Linux 很像,但操作的是分布式文件系统。新手最容易混的是“本地路径”和“HDFS 路径”的区分:不带file://前缀的路径默认按 HDFS 解析。
# 查看 HDFS 根目录 hadoop fs -ls / # 在 HDFS 上创建实验目录 hadoop fs -mkdir -p /user/实验账号/lab/data # 查看 HDFS 目录的权限和属主 hadoop fs -ls -R /user/实验账号/lab # 从本地上传文件到 HDFS hadoop fs -put ~/lab/data/sample.txt /user/实验账号/lab/data/ # 查看 HDFS 上的文件内容 hadoop fs -cat /user/实验账号/lab/data/sample.txt # 从 HDFS 下载文件到本地 hadoop fs -get /user/实验账号/lab/data/sample.txt ~/lab/output/hdfs_sample.txt # 删除 HDFS 上的文件 hadoop fs -rm /user/实验账号/lab/data/sample.txt # 递归删除 HDFS 目录 hadoop fs -rm -r /user/实验账号/lab/output-mkdir -p递归创建 HDFS 目录,父目录不存在会自动建。-put是本地到 HDFS,-get是 HDFS 到本地,方向别搞反。-ls -R递归列出,等价于 Linux 的ls -R。-rm -r递归删除,删目录必须加-r,否则报错。-cat直接把 HDFS 文件内容打到终端,小文件验证时很方便。
提示:HDFS 的默认工作目录是
/user/当前用户名,但很多实验环境没自动建这个目录。第一次用-put报“no such file or directory”,先-mkdir -p建好目标路径。
3.2 把本地数据送进 HDFS:路径、权限、覆盖三个参数
上传数据是实验里最高频的操作,也是报错最集中的地方。核心就三个点:源路径对不对、目标路径存不存在、同名文件要不要覆盖。
# 确认本地源文件存在且有读权限 ls -l ~/lab/data/sample.txt # 确认 HDFS 目标目录存在 hadoop fs -ls /user/实验账号/lab/data/ # 上传并覆盖同名文件(-f 强制覆盖) hadoop fs -put -f ~/lab/data/sample.txt /user/实验账号/lab/data/ # 上传整个本地目录到 HDFS hadoop fs -put ~/lab/data /user/实验账号/lab/input # 验证上传结果 hadoop fs -ls /user/实验账号/lab/data/ hadoop fs -du -h /user/实验账号/lab/data/-put -f的-f表示如果目标已存在则覆盖,不加会报“File exists”。-put传目录时,会把目录本身复制到目标路径下。-du -h显示 HDFS 路径下各文件的大小,-h是人类可读单位,用来确认数据真的传上去了。
3.3 跑通第一个 MapReduce 作业:WordCount 的完整命令
WordCount 是大数据实验的“Hello World”,但很多人只是复制命令,没搞清每个参数的含义。下面按标准流程走一遍。
# 准备输入数据到 HDFS hadoop fs -mkdir -p /user/实验账号/lab/wordcount/input hadoop fs -put ~/lab/data/sample.txt /user/实验账号/lab/wordcount/input/ # 确认输入文件在 HDFS 上 hadoop fs -ls /user/实验账号/lab/wordcount/input/ # 提交 WordCount 作业 hadoop jar $HADOOP_HOME/share/hadoop/mapreduce/hadoop-mapreduce-examples-*.jar \ wordcount \ /user/实验账号/lab/wordcount/input \ /user/实验账号/lab/wordcount/output # 查看作业输出 hadoop fs -ls /user/实验账号/lab/wordcount/output/ hadoop fs -cat /user/实验账号/lab/wordcount/output/part-r-00000hadoop jar提交作业,第一个参数是 jar 包路径,$HADOOP_HOME是 Hadoop 安装目录的环境变量。wordcount是示例 jar 里的主类名。后面两个参数分别是 HDFS 输入路径和输出路径。输出路径必须不存在,否则作业直接失败——这是 MapReduce 的保护机制,防止覆盖上次结果。part-r-00000是 Reduce 任务的输出文件,r表示 reduce 阶段产出。
注意:如果
$HADOOP_HOME没设置,用echo $HADOOP_HOME确认。为空的话,先export HADOOP_HOME=/你的/hadoop/安装路径,再重试。
3.4 YARN 资源查看:作业卡住时先看队列和容器
MapReduce 作业提交后由 YARN 调度,作业卡住、失败、跑得慢,都要看 YARN 的资源状态。
# 查看 YARN 节点列表 yarn node -list # 查看所有应用(包括运行中和已完成的) yarn application -list -appStates ALL # 查看指定应用的状态 yarn application -status application_1234567890_0001 # 查看 YARN 队列信息 yarn queue -status defaultyarn node -list显示集群里所有 NodeManager 节点及其状态,节点数为 0 说明 DataNode 或 NodeManager 没起来。yarn application -list -appStates ALL列出所有应用,-appStates可以过滤 RUNNING、FINISHED、FAILED 等状态。yarn application -status看单个应用的详细状态和诊断信息,作业失败时这里会给出原因。
4. 避坑与排查:实验里最容易翻车的 5 个场景
4.1 坑一:hadoop fs -put报“No such file or directory”
现象:本地文件明明存在,ls能看到,但hadoop fs -put就是报找不到文件。
原因:HDFS 命令里的路径默认按 HDFS 解析,如果你写的是本地相对路径,Hadoop 会去 HDFS 上找,自然找不到。另一种情况是目标 HDFS 目录不存在,-put不会自动创建父目录。
解决:本地路径写绝对路径或确认当前目录,HDFS 目标路径先用-mkdir -p建好。命令改成hadoop fs -put /home/实验账号/lab/data/sample.txt /user/实验账号/lab/data/,两边都用绝对路径最稳。
4.2 坑二:WordCount 输出目录已存在导致作业失败
现象:作业提交后立刻失败,日志里写“Output directory already exists”。
原因:MapReduce 规定输出路径必须不存在,防止误覆盖已有结果。第一次跑完没删输出目录,第二次跑就撞上了。
解决:每次重跑前删掉输出目录,hadoop fs -rm -r /user/实验账号/lab/wordcount/output。或者换一个带时间戳的输出路径,比如output_$(date +%s)。
4.3 坑三:jps看不到 NameNode 或 DataNode
现象:jps只显示 Jps 自己,Hadoop 相关进程一个都没有。
原因:Hadoop 没启动,或者启动脚本执行失败。常见的是配置文件里路径写错、Java 环境变量没配、端口被占用。
解决:先看启动日志,cat $HADOOP_HOME/logs/hadoop-*-namenode-*.log,搜 ERROR 和 Exception。确认JAVA_HOME在hadoop-env.sh里配对了。端口冲突用netstat -tlnp | grep 端口号查。
4.4 坑四:HDFS 上传文件后权限不对,其他用户读不了
现象:A 用户上传的文件,B 用户hadoop fs -cat报权限拒绝。
原因:HDFS 有独立的权限模型,默认继承上传者的用户身份和 umask。如果上传时没指定权限,文件可能是 644 但属主是 A,B 不在同组就只读不了。
解决:上传时用-chmod指定权限,或上传后用hadoop fs -chmod 644 /path/file修改。跨用户共享的数据,建议统一放到一个公共目录并设 755。
4.5 坑五:作业跑得极慢,一直卡在 map 或 reduce 阶段
现象:WordCount 小文件跑了几分钟还没完,YARN 界面显示容器一直在分配。
原因:资源不够。实验环境内存小,默认的 map/reduce 容器内存可能超过节点可用内存,YARN 分配不到容器就一直等。
解决:调小容器内存,在mapred-site.xml里设mapreduce.map.memory.mb和mapreduce.reduce.memory.mb为 512 或 1024。或者提交作业时用-D临时指定:hadoop jar ... -D mapreduce.map.memory.mb=512。
5. 进阶技巧:用一条管道命令验证 HDFS 数据完整性
实验做到后面,你会有大量“上传完不知道对不对”的时刻。与其反复-cat和-ls,不如用 Linux 管道把 HDFS 命令和本地校验工具串起来,一条命令完成比对。
# 本地文件的行数和 HDFS 文件的行数比对 echo "本地行数: $(wc -l < ~/lab/data/sample.txt)" echo "HDFS行数: $(hadoop fs -cat /user/实验账号/lab/data/sample.txt | wc -l)" # 本地文件的 MD5 和 HDFS 文件的 MD5 比对 local_md5=$(md5sum ~/lab/data/sample.txt | awk '{print $1}') hdfs_md5=$(hadoop fs -cat /user/实验账号/lab/data/sample.txt | md5sum | awk '{print $1}') echo "本地MD5: $local_md5" echo "HDFS MD5: $hdfs_md5" [ "$local_md5" = "$hdfs_md5" ] && echo "一致" || echo "不一致,需要重新上传"wc -l < file只输出行数,不显示文件名,方便放进$()里做变量。md5sum计算文件内容摘要,awk '{print $1}'取第一列即哈希值。hadoop fs -cat把 HDFS 文件内容流式输出到标准输出,管道给md5sum就能算 HDFS 侧的摘要。两边一致说明传输完整,不一致就重新-put -f。
这个技巧的价值在于:它把“HDFS 操作”和“Linux 文本处理”真正串起来了。你不需要额外装工具,也不需要写脚本,一条管道就能完成校验。我自己的习惯是,每次-put之后都跑一遍行数比对,大文件再加 MD5。这个动作花不了几秒,但能省掉后面“作业结果不对,回头查数据”的大量时间。
还有一个容易被忽略的点:HDFS 的-cat对大文件会一次性输出全部内容,如果文件几个 GB,终端会卡死。这时候用hadoop fs -cat file | head -n 100只看前 100 行,或者hadoop fs -tail file看末尾。校验大文件用hadoop fs -checksum直接读 HDFS 的校验和,比-cat | md5sum更高效。
# 查看 HDFS 文件的校验和 hadoop fs -checksum /user/实验账号/lab/data/sample.txt # 只查看 HDFS 文件前 100 行 hadoop fs -cat /user/实验账号/lab/data/sample.txt | head -n 100 # 查看 HDFS 文件末尾 1KB hadoop fs -tail /user/实验账号/lab/data/sample.txt-checksum输出 HDFS 内部维护的校验信息,适合大文件快速验证。-tail默认显示最后 1KB,排查日志类文件时比-cat更实用。这几个命令组合起来,基本覆盖了实验里所有“数据对不对”的验证需求。
我踩过最深的坑,是早期做实验时只信-ls的文件大小,觉得大小一样就没问题。结果有一次文本编码在传输中被改了,大小没变但内容变了,WordCount 结果怎么都不对。从那以后,行数比对成了我的固定动作。希望帮到你。
本文还有配套的精品资源,点击获取