简介:面向大数据课程入门学习者,这份实验一文档围绕“熟悉Linux与Hadoop操作”展开,重点覆盖Linux虚拟机安装、常用Shell命令及Hadoop 3.1.3伪分布式环境搭建,适合在Windows下借助VirtualBox完成配套实验的读者。文档先说明实验目的与平台选择,再以命令实操形式演示cd、ls、mkdir、rmdir、cp、mv、rm、cat、tac、more、head、tail、grep、tar等用法,并在Hadoop部分给出伪分布式安装、WordCount验证及HDFS常用Shell操作要点。资源包共1个docx文件,整体约289KB,内容组织从环境准备到命令练习再到Hadoop部署,层次清晰,便于边看边操作。目前已有977人学习下载,可作为课前预习、课上对照和课后复习的参考材料,也为后续大数据实验奠定扎实基础。
1. 熟悉 Linux 操作和 Hadoop 操作:大数据实验的第一道门槛
很多同学以为大数据实验的第一关是写 MapReduce 代码,真正卡人的其实是环境:Windows 上跑不出 Hadoop 的最佳性能,Linux 命令不熟连解压安装都费劲,伪分布式起不来后面全是空谈。这个实验就是把三件事一次性解决——装 Linux 虚拟机、练熟常用 Linux 命令、把 Hadoop 伪分布式环境跑通。它适合手头只有一台普通电脑、没有现成集群的初学者,也适合想在动手写代码之前把 HDFS 基本操作补一遍的从业者。整个实验不涉及高深理论,却是后续所有大数据实验的地基,值得花半天时间从头到尾敲一遍。
2. Linux 命令实操:从 cd 到 tar 的常用命令与易错点
这一章的命令量最大,也是后面操作 Hadoop 的前置技能。很多新手在装好虚拟机后第一件事就是瞎敲,敲错了几条命令就误以为自己环境没装好。实际上,这 17 组命令只需要分四类去记:目录切换、内容查看、文件管理、压缩查找,每一类记住两三个高频参数就够了,不用背。
2.1 目录操作:cd、ls、mkdir、rmdir
实验要求先掌握目录切换,下面这组命令正好对应实验手册里 1~4 步:
cd /usr/local cd .. cd ~ ls -al /usr cd /tmp mkdir a mkdir -p a1/a2/a3/a4 rmdir a rmdir -p a1/a2/a3/a4 ls /tmpcd 不带参数直接敲,会回到当前用户的主文件夹,cd .. 是回到上一级目录,cd ~ 也可以回到主文件夹,三者等价。ls 加上 -al 能显示隐藏文件和权限信息,这是排查问题最常用的组合,后面看 Hadoop 目录权限时还会用到。
mkdir 和 rmdir 是这一节最容易翻车的地方。mkdir 默认只能创建单层目录,直接 mkdir a1/a2/a3/a4 会报错提示没有那个文件或目录,必须加 -p 才能递归创建多级目录。rmdir 只能删除空目录,非空的目录它会明确提示目录不为空。这里用 rmdir -p 删除多级空目录,删除完后用 ls /tmp 确认结果,顺便检验刚才的创建操作是否成功。
2.2 文件内容查看:cat、tac、more、head、tail
查看文件内容是 Linux 下最频繁的操作,实验要求用五种命令看同一个 ~/.bashrc,目的不是背命令,而是让读者理解它们各自的适用场景。
cat ~/.bashrc tac ~/.bashrc more ~/.bashrc head -n 20 ~/.bashrc head -n -50 ~/.bashrc tail -n 20 ~/.bashrc tail -n +50 ~/.bashrccat 适合小文件,一次性输出全部内容;tac 是 cat 的反向拼写,把每一行倒序输出,注意它是行倒序,不是字符倒序,文本行内部的字符顺序不变。more 适合长文件,一页一页往下翻,空格翻页、q 退出,但它只能往下翻,不能回翻,所以后来 more 慢慢被 less 取代。
head 和 tail 是取文件片段的利器。head -n 20 显示前 20 行,head -n -50 表示从开头显示到倒数第 50 行之前,也就是不显示最后 50 行。tail -n 20 显示最后 20 行,tail -n +50 表示从第 50 行开始显示到文件末尾。这两个命令在排错时特别有用,比如看 Hadoop 日志,通常先 tail -n 100 抓最后一段报错,再 head -n 20 看一眼启动参数,配合起来定位问题比直接打开整个日志高效得多。
2.3 文件与目录管理:cp、mv、rm、touch、chown、find
这一节是文件操作的核心,也是后面安装 Hadoop 时天天要用的命令。
cp ~/.bashrc /usr/bashrc1 cd /tmp mkdir test cp -r /tmp/test /usr/ mv /usr/bashrc1 /usr/test/ mv /usr/test /usr/test2 rm /usr/test2/bashrc1 rm -r /usr/test2 touch /tmp/hello ls -l /tmp/hello touch -d "5 days ago" /tmp/hello ls -l /tmp/hello sudo chown root /tmp/hello ls -l /tmp/hello find ~ -name ".bashrc"cp 复制目录必须加 -r,否则报错提示"省略目录",这是新手最常见的报错之一,后面复制 Hadoop 配置文件时同样适用。mv 既能移动也能改名,mv 文件 目录是移动,mv 旧名 新名是改名,实验里先把 bashrc1 移进 test 目录,再把 test 改名为 test2,一次演示了两种用法。
rm 删除文件不需要参数,删除目录要加 -r,也就是递归删除。我先删文件再删目录,避免出现"目录非空删不掉"的提示。touch 的主要作用是创建空文件,ls -l 能看到时间戳,touch -d "5 days ago" 直接把文件时间改成 5 天前,这是模拟日志时间时常用的技巧。
chown 修改文件属主需要 root 权限,所以这里加了 sudo,执行后属主从普通用户变成 root。find 的写法是 find 起始路径 -name 文件名,注意主文件夹下的隐藏文件也能被找出来,找出 .bashrc 后马上就能做下一节的内容查看。
2.4 压缩、查找与环境变量:tar、grep 与 JAVA_HOME 配置
最后这组命令会直接用在后面的 Hadoop 安装上,尤其是 tar 打包和解压。
sudo mkdir /test cd / sudo tar -zcvf test.tar.gz test sudo tar -zxvf test.tar.gz -C /tmp grep examples ~/.bashrc vim ~/.bashrctar 的 -z 表示 gzip 压缩、-c 是打包、-v 显示过程、-f 指定文件名,所以 -zcvf 是"打包并压缩成 tar.gz";解压时用 -x 替换 -c,-C /tmp 指定解压到 /tmp 目录,不写 -C 就解压到当前目录。后面 Hadoop 安装包也是同一套命令,把文件名换掉就能用。
grep 从文件里搜索字符串,基本格式是 grep 关键词 文件路径,配合管道可以过滤命令输出,这在看日志时天天用。接下来的环境变量配置是这一章的收尾,也是最重要的部分:
vim ~/.bashrc export JAVA_HOME=/usr/lib/jvm/java-8-openjdk-amd64 export PATH=$PATH:$JAVA_HOME/bin source ~/.bashrc echo $JAVA_HOME用 vim 打开 ~/.bashrc,在最底部追加两行。JAVA_HOME 的路径取决于 JDK 实际安装位置,可以先执行 update-alternatives --list java 或 whereis java 确认前缀路径,再填进去,照抄别人的路径很可能对不上。改完后必须 source ~/.bashrc 让配置立即生效,否则要重新登录终端。echo $JAVA_HOME 验证变量值,能打印出路径说明配置成功。
这一节里 PATH=$PATH:$JAVA_HOME/bin 的意思是保留原有 PATH 再追加新目录,顺序不能写反。后面 Hadoop 的环境变量也是同样的套路,只是把 JAVA_HOME 换成 HADOOP_HOME,理解了这一行,后面就顺理成章。
3. Hadoop 伪分布式安装:单机模拟集群的原理与配置流程
3.1 为什么选伪分布式:一个进程一个守护进程
很多读者没有真实集群,不等于学不了 Hadoop。伪分布式的本质是在一台 Linux 机器上同时跑起 NameNode、DataNode、SecondaryNameNode 三个守护进程,每个进程各管各的事,从外部看就是一个微缩版集群。
这种模式最大的价值在于进程边界和真实集群完全一致。NameNode 管理元数据、DataNode 存数据块、SecondaryNameNode 辅助合并编辑日志,这些职责在伪分布式里一个不少。所以实验手册把 3.1.3 固化成标准版本,因为 3.x 之后 HDFS 的 Web 端口从旧的 50070 换成了 9870,很多网上教程还在写旧端口,照抄容易踩坑。
3.2 安装前准备:JDK、解压与环境变量
Hadoop 是 Java 写的,第一步必须先有 JDK,装完后用 java -version 确认版本无误,再继续下面操作。
java -version sudo tar -zxf hadoop-3.1.3.tar.gz -C /usr/local sudo mv /usr/local/hadoop-3.1.3 /usr/local/hadoop sudo chown -R 当前用户名 /usr/local/hadooptar 解压到 /usr/local 后,目录名是 hadoop-3.1.3,统一改成 hadoop,后面所有配置路径都好写,不用每次都带版本号。chown 把整个安装目录的所有权给当前用户,因为 Hadoop 必须以普通用户运行,用 root 跑会出现权限相关的奇怪问题。
解压完成后编辑 ~/.bashrc,追加 Hadoop 的环境变量:
export HADOOP_HOME=/usr/local/hadoop export PATH=$PATH:$HADOOP_HOME/bin:$HADOOP_HOME/sbin export HADOOP_CONF_DIR=$HADOOP_HOME/etc/hadoop source ~/.bashrc hadoop versionHADOOP_HOME 是安装根目录,PATH 里加上 bin 和 sbin 是为了能直接敲 hdfs、start-dfs.sh 这类命令,不用写全路径。hadoop version 能打印版本号说明环境变量生效。这里和上一章的 JAVA_HOME 是同一套路,理解了一个另一个就通了。
3.3 修改配置文件:core-site.xml 与 hdfs-site.xml 的关键参数
Hadoop 的配置文件在 /usr/local/hadoop/etc/hadoop 目录下,伪分布式只需要改两个文件。第一个是 core-site.xml:
<!-- core-site.xml --> <configuration> <property> <name>fs.defaultFS</name> <value>hdfs://localhost:9000</value> </property> <property> <name>hadoop.tmp.dir</name> <value>/opt/module/hadoop-3.1.3/data</value> </property> </configuration>fs.defaultFS 指定 HDFS 的访问入口,伪分布式用 hdfs://localhost:9000 就够了,改成机器名反而容易引发后面的主机名解析问题。hadoop.tmp.dir 是数据目录,NameNode 的元数据、DataNode 的数据块都放在这个路径下。这个路径是后面踩坑的关键,先记下来。
第二个是 hdfs-site.xml:
<!-- hdfs-site.xml --> <configuration> <property> <name>dfs.replication</name> <value>1</value> </property> </configuration>dfs.replication 是副本数。真实集群默认是 3,因为数据分散在多台机器上。伪分布式只有一台 DataNode,如果不改成 1,每个数据块要复制三份,机器会一直做副本复制,文件状态长期显示 under-replicated,磁盘压力也不小。
3.4 免密登录、格式化与启动验证
启动 HDFS 之前还差两步:SSH 免密登录和 NameNode 格式化。
ssh-keygen -t rsa -P "" -f ~/.ssh/id_rsa cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys chmod 0600 ~/.ssh/authorized_keys ssh localhost伪分布式里 NameNode 会用 SSH 协议去启动本机的 DataNode,如果每次都要求输密码,start-dfs.sh 会卡在密码输入上。三行命令生成密钥、把公钥追加进 authorized_keys、收紧权限,最后 ssh localhost 验证一下,能直接登录进去就说明免密配置生效。
格式化是初始化元数据目录,命令是:
hdfs namenode -format start-dfs.sh jpsstart-dfs.sh 启动三个进程,jps 用来列出当前 Java 进程。正常情况下能看到 NameNode、DataNode、SecondaryNameNode 三个名字,一个不多一个不少。jps 输出里缺任何一个,都说明启动有问题,先去看对应日志而不是重复格式化——这个经验在第五章展开讲。
4. 常用的 Hadoop 操作:HDFS 目录创建、上传与复制
4.1 启动 Hadoop 并创建用户目录
HDFS 启动后,接下来练习用 hdfs dfs 这套命令操作分布式文件系统。实验的第一步是给 hadoop 用户创建专属目录。
su hadoop start-dfs.sh hdfs dfs -mkdir -p /user/hadoop hdfs dfs -ls /有了 -p 参数,mkdir 会自动创建路径上缺失的父目录,这个习惯在 HDFS 里同样实用。创建完后 ls / 会看到 user 目录。注意 HDFS 的目录操作和上一章 Linux 命令长得很像,但两者完全不同——ls 看的是分布式文件系统,不是本地磁盘,这也是实验把这两部分前后衔接的原因。
4.2 上传文件到 HDFS:put 与查看
本地文件进 HDFS 用 put 命令,这是整个实验里最核心的 HDFS 写操作。实验要求在 /user/hadoop 下建 test 目录,然后把 ~/.bashrc 传进去。
hdfs dfs -mkdir /user/hadoop/test hdfs dfs -put ~/.bashrc /user/hadoop/test/ hdfs dfs -ls /user/hadoop/testput 的用法是 put 本地路径 HDFS路径,目标路径要写到目录级别,文件会自动保留原文件名。ls 确认上传结果,能看到文件大小和副本数。如果文件状态显示 under-replicated,多半是上一章那个 dfs.replication 没改成 1 的后遗症,别急着删文件,先把配置改过来再重新上传。
4.3 从 HDFS 取回数据:get 与常用命令表
反向操作是用 get 把 HDFS 上的数据拿回本地,这一步验证数据流向是双向的。
hdfs dfs -get /user/hadoop/test /usr/local/hadoop/ ls -l /usr/local/hadoop/testget 会复制整个 test 目录到本地路径下,包括里面上传的 .bashrc。这里容易搞混的是参数顺序:get 后面第一个参数是 HDFS 路径,第二个是本地路径,和 put 正好相反,两行命令对照着记才不会弄反。
下面这张表是后续实验里最常用的一组 HDFS 命令,建议保存下来随时对照:
| 命令 | 作用 |
|---|---|
| hdfs dfs -ls /path | 查看目录列表 |
| hdfs dfs -mkdir -p /path | 递归创建目录 |
| hdfs dfs -put 本地文件 hdfs路径 | 上传文件到 HDFS |
| hdfs dfs -get hdfs路径 本地路径 | 从 HDFS 下载到本地 |
| hdfs dfs -cat /path/file | 查看文件内容 |
| hdfs dfs -rm -r /path | 递归删除目录 |
| hdfs dfs -cp 源路径 目标路径 | HDFS 内部复制 |
这些命令和 Linux 原生命令的用法高度相似,但底层完全不同,操作对象是 HDFS 上的数据块。实际跑实验时,把这张表贴在编辑器旁边对照敲,比死记快很多。命令写错了也不用慌,HDFS 的报错信息通常会把"路径不存在"或"文件已存在"讲得很清楚,看提示改就行。
5. 避坑:Datanode 无法启动等五个高频故障
这一章写的是实验里最容易卡住的五个问题,前两个和进程起不来有关,后三个看起来是状态异常,根因其实都在配置上。
5.1 LiveNode 为 0、Datanode 起不来:clusterId 不一致
现象:访问 9870 端口,页面显示 LiveNode 数量为 0;jps 输出里只有 NameNode、SecondaryNameNode、ResourceManager 等四五个进程,唯独少了 DataNode。
原因:这是整个实验里最常见的翻车。安装过程中每多跑一次 hdfs namenode -format,NameNode 就会生成一个新的 clusterId 并写进它的元数据,而 DataNode 本地记录的 clusterId 还是旧的,启动时发现两边对不上,直接拒绝注册,表现为进程消失。
解决:在 core-site.xml 找到 hadoop.tmp.dir 配置的路径,删除整个数据目录,然后重新格式化、重启集群。如果之前用的是 /opt/module/hadoop-3.1.3/data,就执行:
rm -rf /opt/module/hadoop-3.1.3/data hdfs namenode -format stop-all.sh start-all.sh删除后 NameNode 和 DataNode 的 clusterId 会重新一致,jps 里就能看到 DataNode,LiveNode 变回 1。注意 stop-all.sh 和 start-all.sh 的顺序不能反,格式化前先停集群,否则会有进程占用端口导致格式化失败。
5.2 start-dfs.sh 反复要求输密码:SSH 免密未配置
现象:start-dfs.sh 执行到一半停下来,提示输入密码,输完一次又提示一次,脚本始终走不完。
原因:NameNode 通过 SSH 启动本机 DataNode,没有配置免密登录,系统就会打断脚本交互。这个坑在换过用户后格外容易出现,因为 SSH 配置是按用户隔离的,谁执行 start-dfs.sh 就需要谁的密钥,配置在别的用户下不生效。
解决:用执行 Hadoop 命令的同一用户生成密钥并放入 authorized_keys,配置好后先 ssh localhost 验证,能免密进入再跑 start-dfs.sh。不要图省事配置 root 的免密然后用 root 启动,后面文件属主会乱。
5.3 文件显示 under-replicated:伪分布式副本数没改
现象:put 文件后,ls 显示文件已上传,但 Web 页面上文件一直处于 under-replicated 状态,过很久也不消失,日志里不断报副本复制失败。
原因:dfs.replication 保持默认的 3,而伪分布式只有一台 DataNode,块副本永远凑不齐三份,NameNode 一直等待复制,文件就一直处于副本不足的状态。
解决:把 hdfs-site.xml 里的 dfs.replication 改成 1,重启 HDFS,再重新 put 文件。已经存在的文件可以不管,新建文件生效即可。这个现象不影响单机实验的运行,但看起来像故障,容易让人反复折腾,早点改配置能省很多时间。
5.4 9870 页面打不开或卡住:主机名解析问题
现象:jps 显示进程全在,本地 curl 也能通,但浏览器访问 9870 端口迟迟加载不出页面,或者访问后页面里主机名显示成奇怪的短名。
原因:部分教程把 fs.defaultFS 配成了机器名而不是 localhost,浏览器解析不了内网机器名,或者 /etc/hosts 里没有对应条目。NameNode 启动时把机器名写进了元数据,Web 页面按这个名字跳转,浏览器自然进不去。
解决:最简单的方式是配置里统一用 localhost,访问时也用 http://localhost:9870。如果要配机器名,需要在 /etc/hosts 加上一行 IP 和机器名的映射,两边的写法保持一致,否则就会出现 NameNode 自己能访问、浏览器进不去的情况。
5.5 格式化不是后悔药:数据目录的连锁反应
现象:格式化后重启集群,发现 HDFS 上之前 put 的文件全没了,甚至 NameNode 起不来,日志提示目录已存在或权限异常。
原因:格式化本质是清空元数据并重建,不是无损重置。NameNode 格式化会清空 hadoop.tmp.dir 下的 name 子目录,所有 HDFS 上的文件记录一并消失,同时又不会主动删除 data 子目录,导致 DataNode 的旧数据块和新的元数据对不上。
解决:如果需要彻底重置,按 5.1 的方式删除整个数据目录再格式化。如果只是想重启集群,应该用 stop-all.sh 加 start-all.sh,不要顺手就 format。这个教训可以记成一句话:格式化不是后悔药,它会把实验成果一起清掉,动手前先想清楚是真的需要重置,还是只是重启。
6. 跑通 WordCount 验证集群:从进程检查到输出核对
装好 Hadoop 只看进程还不够,真正能证明集群可用的是跑一个可执行作业。实验手册里最后一步是运行自带 WordCount 实例,这也是我判断一套环境能不能用的标准动作。
验证分三步,第一步先确认进程和端口:
jps hdfs dfsadmin -reportjps 期望看到 NameNode、DataNode、SecondaryNameNode,dfsadmin -report 能看到 LiveNode 为 1 和集群总容量。这两条过了,只能说明 HDFS 活着,MapReduce 计算链路还没验证。
第二步跑 WordCount。3.1.3 的示例 jar 在安装目录的 share/hadoop/mapreduce 下:
hadoop jar /usr/local/hadoop/share/hadoop/mapreduce/hadoop-mapreduce-examples-3.1.3.jar \ wordcount /user/hadoop/test /user/hadoop/wordcount_output输入目录用前面已经 put 进去的 /user/hadoop/test,输出目录必须是不存在的路径,Job 会自己创建,如果目录已经存在会直接报错。运行过程中能看到 map 100% 和 reduce 100%,这两个进度出现就说明 MapReduce 链路通了。
第三步核对结果,用 cat 看输出文件:
hdfs dfs -cat /user/hadoop/wordcount_output/part-r-00000输出里每一行是单词和出现次数的组合,看到这个结果就说明 NameNode、DataNode、MapReduce 整条链路全通。从那以后,我每次搭完环境都强制走一遍这个流程:jps 看进程、dfsadmin -report 看 LiveNode、跑一次 WordCount 看输出,三分钟就能把环境问题暴露干净。这个习惯帮我省掉了无数个作业跑了半天才发现集群压根没起来的夜晚,希望帮到你。
本文还有配套的精品资源,点击获取