拓十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

大数据入门实战:Linux操作与Hadoop伪分布式搭建实验指南

大数据入门实战:Linux操作与Hadoop伪分布式搭建实验指南

简介:这份实验报告PDF面向大数据技术入门学习者,对应《大数据技术原理与应用》课程,围绕Linux操作系统与Hadoop平台两大基础模块展开,适合高校学生完成课程实验、课后复盘或自学打底。资源共1个文件,为PDF格式,压缩包约1.92MB,内容以课程实验报告模板与实验记录为主,便于直接参考排版与撰写思路。报告覆盖Linux发展历史、Shell常用命令与快捷键、用户及文件权限管理、目录结构与文件基本操作,并延伸至Hadoop单机与伪分布式安装、core-site.xml等配置文件修改、SSH免密登录、HDFS读写与NameNode/DataNode角色、MapReduce的Map与Reduce阶段原理及简单程序编写。作者还记录了Java JDK下载、Hadoop编译与环境配置等实操中遇到的典型问题及排查过程,对理解理论与实践差距、积累排错经验有参考价值。目前已有114人学习。

1. 从一份实验报告说起:大数据入门到底该先啃哪块硬骨头

很多人一提到大数据入门,第一反应是去装 Spark、Flink,或者直接上云平台跑个 SQL 就完事。但真正在一线带过新人的人都知道,Linux 基本操作和 Hadoop 伪分布式搭建这两关过不去,后面全是空中楼阁。这份《大数据技术与应用》微课视频版配套实验报告,来自清华大学出版社肖政宏老师的课程体系,核心就干了一件事:用三个递进式实验,把 Linux 操作、Hadoop 单机/伪分布式部署、HDFS 与 MapReduce 原理串成一条可复现的动手链路。它适合谁?适合刚接触大数据、需要一份能照着敲命令、能交实验报告、能理解每一步为什么这么做的从业者或学生。不是那种翻两页就扔的 PPT 讲义,而是带着实验目的、步骤、环境说明和踩坑记录的实操文档。

2. Linux 操作实验:从 touch 到 chmod 的权限闭环

2.1 为什么大数据第一课永远是 Linux

大数据生态里绝大多数组件——Hadoop、Hive、HBase、Spark——原生运行环境都是 Linux。Windows 上虽然能跑,但路径分隔符、权限模型、Shell 脚本兼容性会带来大量额外成本。这份实验报告把 Linux 放在第一个实验,逻辑是对的:先让你熟悉命令行交互方式,再谈集群管理。

实验要求里列了四个目标:了解发展历史、掌握基本概念及操作、用户及文件权限管理、目录结构及文件基本操作。其中真正需要动手的是后两个。历史部分快速过一遍即可,重点在于理解 Linux 的“一切皆文件”设计哲学,以及为什么权限系统是后面 Hadoop 多用户环境的基础。

2.2 用户与权限:创建、删除、变更的完整命令链

实验步骤里明确要求了查看用户、创建新用户、删除用户、查看文件权限、变更文件所有者、修改文件权限。这一串操作在实际工作中对应的是集群多租户管理的最小闭环。下面是我按实验要求整理的可直接执行的命令序列:

# 查看当前系统所有用户 cat /etc/passwd # 创建新用户,并指定家目录 sudo useradd -m -s /bin/bash bigdata_user # 设置密码 sudo passwd bigdata_user # 创建用户组 sudo groupadd datagroup # 将用户加入附加组 sudo usermod -aG datagroup bigdata_user # 查看用户所属组 groups bigdata_user # 删除用户及其家目录 sudo userdel -r bigdata_user

逻辑说明:useradd -m自动创建家目录,-s指定默认 Shell。usermod -aG中的-a表示追加而不是覆盖,漏掉这个参数会把用户从其他附加组里踢出去,这是血泪经验。userdel -r会连带删除家目录和邮件池,生产环境慎用,实验环境无所谓。

权限部分,实验要求用ls -A/Al/dl/AsSh查看文件,然后变更所有者和修改权限。这里有个容易翻车的地方:ls -l显示的是权限位、链接数、所有者、所属组、大小、时间、文件名,而ls -A是显示隐藏文件但不显示.和..。组合使用ls -Al才能既看到隐藏文件又看到详细权限信息。

# 创建测试文件 touch test_file.txt # 查看详细权限 ls -Al test_file.txt # 变更文件所有者为 bigdata_user sudo chown bigdata_user test_file.txt # 变更文件所属组 sudo chgrp datagroup test_file.txt # 修改权限为 rwxr-x--- chmod 750 test_file.txt # 递归修改目录权限 chmod -R 755 /data/project

参数说明:chmod 750中,7 代表所有者读写执行,5 代表组内读和执行,0 代表其他人无权限。数字权限的每一位是 r=4、w=2、x=1 的加和。chmod -R递归处理子目录和文件,但要注意目录需要 x 权限才能进入,文件通常不需要 x 权限,所以对目录和文件混用的场景,常见做法是目录给 755、文件给 644,而不是一刀切。

2.3 目录结构与文件操作:相对路径和绝对路径的边界

实验要求理解 Linux 目录结构,熟悉/bin、/etc、/usr等目录的作用,同时掌握绝对路径和相对路径。这部分看起来简单,但实际踩坑率很高。比如在 Hadoop 配置文件中写路径时,用相对路径会导致服务启动目录不同时找不到配置文件。

# 绝对路径:从根目录开始 cd /home/bigdata_user/data # 相对路径:从当前目录开始 cd ./data cd ../config # 创建多级目录 mkdir -p /data/hadoop/tmp # 复制文件 cp source.txt /data/hadoop/tmp/ # 移动并重命名 mv old_name.txt new_name.txt # 删除文件 rm -f temp.txt # 删除目录及内容 rm -rf /data/tmp

逻辑说明:mkdir -p确保父目录不存在时自动创建,Hadoop 的tmp.dir配置经常需要这个操作。rm -rf是危险命令,实验环境里可以随便用,但生产环境执行前一定先pwd确认当前路径,再ls确认目标内容。我一般会养成习惯:敲rm -rf之前先把命令里的路径复制出来单独ls一遍。

提示:实验报告里提到的“输出图形字符”和“命令行获取帮助”属于 Shell 小技巧,man、--help、info三个渠道各有适用场景。man最全,--help最快,info适合 GNU 工具。

3. Hadoop 伪分布式搭建:从单机模式到 2.X 编译的完整路径

3.1 三种安装模式的选择逻辑

实验报告里明确列出了 Hadoop 的三种安装模式:单机模式、伪分布式模式、完全分布式模式。单机模式是本地文件系统,不启动 HDFS 和 YARN 守护进程,适合写 MapReduce 逻辑时快速调试。伪分布式模式在一台机器上模拟多节点,启动 NameNode、DataNode、ResourceManager、NodeManager 等进程,适合学习 HDFS 读写和 MapReduce 作业提交。完全分布式才是生产形态。

这份实验要求先装单机模式测试,再配伪分布式,然后还涉及 Hadoop 2.X 64 位编译。为什么需要编译?因为 Apache 官方发布的 Hadoop 2.X 二进制包默认是 32 位的,在 64 位 CentOS 上运行会报Unable to load native-hadoop library for your platform警告,虽然不影响基本功能,但涉及本地库压缩、I/O 性能时会出问题。实验报告里提到“使用 yum 安装 sun”和“编译 Hadoop2.X 64 位”,指的就是这个环节。

3.2 环境准备:用户、SSH 免密、Java 安装

实验步骤第一条就是“用户及用户组,添加用户及用户组,添加 sudo 权限”。Hadoop 不建议用 root 跑,常见做法是创建一个专用用户,比如hadoop,然后给它 sudo 权限。

# 创建 hadoop 用户 sudo useradd -m -s /bin/bash hadoop sudo passwd hadoop # 添加 sudo 权限 sudo usermod -aG wheel hadoop # 切换到 hadoop 用户 su - hadoop

接下来是 SSH 免密登录。伪分布式模式下,Hadoop 的启动脚本需要通过 SSH 连接到本机来启动各个守护进程,如果不配免密,每次启动都要输密码,脚本会卡住。

# 生成密钥对 ssh-keygen -t rsa -P '' -f ~/.ssh/id_rsa # 将公钥追加到授权文件 cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys # 设置权限 chmod 700 ~/.ssh chmod 600 ~/.ssh/authorized_keys # 测试免密登录 ssh localhost

参数说明:-P ''表示空密码短语,实验环境可以这样,生产环境建议设置密码短语并用 ssh-agent 管理。chmod 700和600是 SSH 的强制要求,权限过大会拒绝加载密钥。

Java 安装部分,实验报告提到“不知道该如何下载 java jdk”,这是很多新人的真实痛点。CentOS 6.6 环境下,常见做法是用 yum 安装 OpenJDK,或者手动下载 Oracle JDK 解压配置环境变量。

# 查看已安装的 Java java -version # 用 yum 安装 OpenJDK 1.7 sudo yum install -y java-1.7.0-openjdk-devel # 或者手动解压 JDK tar -zxvf jdk-7u55-linux-x64.tar.gz -C /usr/local/

环境变量配置:

# 编辑 ~/.bashrc export JAVA_HOME=/usr/local/jdk1.7.0_55 export HADOOP_HOME=/usr/local/hadoop-2.6.0 export PATH=$PATH:$JAVA_HOME/bin:$HADOOP_HOME/bin:$HADOOP_HOME/sbin

逻辑说明:JAVA_HOME必须指向 JDK 根目录,不是bin目录。HADOOP_HOME同理。PATH里加上sbin是为了能直接执行start-dfs.sh、stop-yarn.sh这些脚本。

3.3 配置文件修改与 HDFS 格式化

实验报告要求修改core-site.xml,这是 Hadoop 的核心配置文件。伪分布式模式下,最关键的是指定 HDFS 的默认文件系统地址。

<!-- core-site.xml --> <configuration> <property> <name>fs.defaultFS</name> <value>hdfs://localhost:9000</value> </property> <property> <name>hadoop.tmp.dir</name> <value>/home/hadoop/hadoopdata/tmp</value> </property> </configuration>

参数说明:fs.defaultFS告诉客户端 NameNode 的 RPC 地址,localhost:9000是伪分布式的常见配置。hadoop.tmp.dir是 Hadoop 临时目录,默认在/tmp下,重启系统可能被清空,导致 NameNode 元数据丢失,所以必须改到一个持久化路径。

hdfs-site.xml需要配置副本数,伪分布式只有一台 DataNode,副本数必须设为 1,否则会一直报副本不足。

<!-- hdfs-site.xml --> <configuration> <property> <name>dfs.replication</name> <value>1</value> </property> <property> <name>dfs.namenode.name.dir</name> <value>/home/hadoop/hadoopdata/namenode</value> </property> <property> <name>dfs.datanode.data.dir</name> <value>/home/hadoop/hadoopdata/datanode</value> </property> </configuration>

格式化 HDFS 是启动前的必要步骤,但只能执行一次。重复格式化会导致 NameNode 和 DataNode 的 clusterID 不一致,DataNode 无法启动。

# 格式化 HDFS hdfs namenode -format # 启动 HDFS start-dfs.sh # 查看进程 jps

jps应该看到 NameNode、DataNode、SecondaryNameNode 三个进程。如果 DataNode 没起来,常见原因是重复格式化或者hadoop.tmp.dir权限不对。

注意:实验报告里提到“无法启动 Hadoop”“无法连接到 Hadoop”,多数情况是 SSH 免密没配好、Java 环境变量没生效、或者防火墙没关。CentOS 6.6 默认开启 iptables,伪分布式环境下建议先service iptables stop并chkconfig iptables off。

4. HDFS 与 MapReduce:读写流程和编程模型的实际边界

4.1 HDFS 架构与读写操作的关键参数

实验报告对 HDFS 的描述是:Master 和 Slave 结构,分为 NameNode、Secondary NameNode 和 DataNode 三种角色。NameNode 管理文件系统命名空间和元数据,DataNode 存储实际数据块,Secondary NameNode 定期合并 fsimage 和 edits 日志,不是 NameNode 的热备。

HDFS 读操作:客户端调用FileSystem.open()打开文件,NameNode 返回数据块位置信息,客户端直接连接 DataNode 读取数据。写操作:客户端调用DistributedFileSystem.create()创建文件,NameNode 在命名空间中创建条目,客户端将数据写入 DataNode 管道,管道中的 DataNode 依次复制数据块。

实验环境说明里写了:CentOS 6.6 64 位,单核,1G 内存,JDK 1.7.0_55,Hadoop 1.1.2。这个配置在当年是标准教学环境,但 1G 内存跑 Hadoop 1.1.2 的伪分布式会比较吃力,常见做法是把mapred-site.xml里的mapred.child.java.opts调小,比如-Xmx200m。

# 创建测试目录 hdfs dfs -mkdir -p /user/hadoop/input # 上传本地文件到 HDFS hdfs dfs -put /home/hadoop/test.txt /user/hadoop/input/ # 查看 HDFS 文件列表 hdfs dfs -ls /user/hadoop/input/ # 查看文件内容 hdfs dfs -cat /user/hadoop/input/test.txt # 从 HDFS 下载文件 hdfs dfs -get /user/hadoop/input/test.txt /home/hadoop/output/

参数说明:-mkdir -p递归创建目录,-put上传本地文件,-get下载到本地。HDFS 命令和 Linux Shell 命令很像,但操作的是分布式文件系统,路径是 HDFS 路径而不是本地路径。

4.2 MapReduce 编程模型:Map 和 Reduce 的中间发生了什么

实验报告对 MapReduce 的描述比较精炼:提交计算作业后,框架拆分成 Map 任务分配到不同节点,Map 处理输入数据的一部分,生成中间文件,Reduce 汇总 Map 输出并输出最终结果。

Map 过程的细节:每个输入分片让一个 Map 任务处理,默认以 HDFS 块大小(Hadoop 1.X 默认 64M)为一个分片。Map 输出先放在环形内存缓冲区,默认 100M,由io.sort.mb控制。缓冲区快满时(默认 80%,由io.sort.spill.percent控制),在本地文件系统创建溢出文件,将数据写入。

Reduce 过程:Reduce 接收不同 Map 任务传来的数据,每个 Map 传来的数据都是有序的。数据量小时直接存内存,缓冲区大小由mapred.job.shuffle.input.buffer.percent控制。超过一定比例(由mapred.job.shuffle.merge.percent决定)则合并后溢写到磁盘。

这些参数在 Hadoop 2.X 里部分改名了,比如io.sort.mb变成了mapreduce.task.io.sort.mb,io.sort.spill.percent变成了mapreduce.map.sort.spill.percent。实验报告基于 Hadoop 1.1.2,所以用的是旧参数名。如果照着实验报告在 Hadoop 2.6.0 上跑,需要做参数名映射。

4.3 测试例子:从编写代码到查看结果的完整链路

实验报告里的 MapReduce 测试例子步骤是:编写代码、编译代码、打包编译文件、解压气象数据并上传到 HDFS、运行程序、查看结果。这是一个典型的气象数据分析作业,通常是统计每年最高气温。

// 简化的 Map 类 public class MaxTempMapper extends Mapper<LongWritable, Text, Text, IntWritable> { @Override protected void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException { String line = value.toString(); String year = line.substring(0, 4); int temp = Integer.parseInt(line.substring(10, 14)); context.write(new Text(year), new IntWritable(temp)); } }

逻辑说明:Mapper的四个泛型参数是输入键、输入值、输出键、输出值。这里输入键是行偏移量,输入值是文本行,输出键是年份,输出值是温度。context.write将结果传递给 Reduce 阶段。

// 简化的 Reduce 类 public class MaxTempReducer extends Reducer<Text, IntWritable, Text, IntWritable> { @Override protected void reduce(Text key, Iterable<IntWritable> values, Context context) throws IOException, InterruptedException { int max = Integer.MIN_VALUE; for (IntWritable val : values) { max = Math.max(max, val.get()); } context.write(key, new IntWritable(max)); } }

编译和打包:

# 编译 javac -classpath $HADOOP_HOME/hadoop-core-1.1.2.jar -d classes MaxTempMapper.java MaxTempReducer.java MaxTempDriver.java # 打包 jar -cvf maxtemp.jar -C classes/ . # 上传气象数据到 HDFS hdfs dfs -mkdir -p /user/hadoop/weather hdfs dfs -put weather_data.txt /user/hadoop/weather/ # 运行 MapReduce 作业 hadoop jar maxtemp.jar MaxTempDriver /user/hadoop/weather /user/hadoop/output # 查看结果 hdfs dfs -cat /user/hadoop/output/part-r-00000

参数说明:-classpath指定 Hadoop 核心 jar 包路径,-d classes指定编译输出目录。hadoop jar命令会自动把当前 Hadoop 类路径加入作业的 classpath。输出目录必须不存在,否则作业会报Output directory already exists。

5. 避坑与排查:实验报告里没写但一定会遇到的问题

5.1 DataNode 启动失败:重复格式化的后果

现象:start-dfs.sh后jps只看到 NameNode 和 SecondaryNameNode,没有 DataNode。

原因:多次执行hdfs namenode -format,导致 NameNode 的 clusterID 和 DataNode 的 clusterID 不一致。DataNode 启动时校验失败,自动退出。

解决:删除hadoop.tmp.dir下的所有数据,重新格式化一次,然后启动。如果 DataNode 数据目录和 NameNode 数据目录分开配置,两个目录都要清空。

5.2 SSH 免密登录不生效:权限和 known_hosts 的坑

现象:ssh localhost仍然提示输入密码,或者提示Host key verification failed。

原因:.ssh目录权限不是 700,或者authorized_keys权限不是 600。另一种情况是首次 SSH 连接时known_hosts没有记录,交互式提示被脚本跳过导致失败。

解决:严格设置权限,并在脚本中加-o StrictHostKeyChecking=no参数。实验环境可以这样,生产环境不建议关闭主机密钥检查。

5.3 Hadoop 启动脚本报 JAVA_HOME not set

现象:执行start-dfs.sh时提示JAVA_HOME is not set。

原因:hadoop-env.sh里的JAVA_HOME没有显式配置,脚本不会自动继承 Shell 的环境变量。

解决:编辑$HADOOP_HOME/etc/hadoop/hadoop-env.sh,找到export JAVA_HOME=那一行,改成实际的 JDK 路径。这个坑在 Hadoop 2.X 和 3.X 里都存在,因为启动脚本用的是非交互式 Shell,不会加载.bashrc。

5.4 MapReduce 作业卡在 map 0% reduce 0%

现象:作业提交后一直卡在 map 0% reduce 0%,没有任何进展。

原因:伪分布式环境下,YARN 的资源管理器没有正确启动,或者mapred-site.xml里mapreduce.framework.name没有设为yarn。Hadoop 1.X 用的是 JobTracker 和 TaskTracker,Hadoop 2.X 用的是 YARN,配置不匹配就会卡住。

解决:确认mapred-site.xml里mapreduce.framework.name值为yarn,yarn-site.xml里yarn.nodemanager.aux-services值为mapreduce_shuffle。然后start-yarn.sh,用jps确认 ResourceManager 和 NodeManager 都在。

5.5 编译 Hadoop 2.X 64 位时 Maven 依赖下载失败

现象:执行mvn package -Pdist,native -DskipTests -Dtar时大量依赖下载失败。

原因:默认 Maven 中央仓库网络不稳定,或者本地 Maven 版本与 Hadoop 源码要求不匹配。

解决:配置国内镜像仓库,确认 Maven 版本在 3.0 以上,JDK 版本与 Hadoop 源码要求一致。编译 Hadoop 2.6.0 需要 JDK 1.7 和 Maven 3.0+,以及 protobuf 2.5.0。protobuf 版本不对是最常见的编译失败原因。

6. 进阶技巧:用 Docker 复现实验环境并验证 HDFS 读写

实验报告里的环境是 CentOS 6.6 + JDK 1.7 + Hadoop 1.1.2/2.6.0,这套组合在物理机上复现越来越麻烦,尤其是 CentOS 6 已经停止维护,yum 源需要额外配置。我现在的习惯是用 Docker 把整个实验环境封成一个镜像,随时起随时删,不用污染宿主机。

# 拉取 CentOS 6 基础镜像 docker pull centos:6.6 # 启动容器并映射端口 docker run -it --name hadoop-lab -p 50070:50070 -p 8088:8088 centos:6.6 /bin/bash

进入容器后,按实验报告的步骤安装 JDK、配置 SSH、解压 Hadoop、修改配置文件。关键点是容器内的localhost和宿主机的localhost不是一回事,SSH 免密要在容器内重新生成密钥对。

# 容器内安装 OpenSSH yum install -y openssh-server openssh-clients ssh-keygen -t rsa -P '' -f ~/.ssh/id_rsa cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys chmod 700 ~/.ssh && chmod 600 ~/.ssh/authorized_keys # 启动 sshd /usr/sbin/sshd

验证 HDFS 读写是否正常,最直接的方法是跑一个put和get的往返测试,然后用hdfs fsck检查文件块状态。

# 上传文件 hdfs dfs -put /etc/hosts /user/hadoop/test/ # 检查文件块状态 hdfs fsck /user/hadoop/test/hosts -files -blocks -locations # 下载文件并比对 hdfs dfs -get /user/hadoop/test/hosts /tmp/hosts_from_hdfs diff /etc/hosts /tmp/hosts_from_hdfs

hdfs fsck的输出会显示文件有多少个块、每个块在哪些 DataNode 上、副本数是否满足。伪分布式下副本数设为 1,所以每个块只有一个副本,fsck不会报副本不足。如果输出里出现MISSING或CORRUPT,说明 DataNode 数据目录有问题,需要检查dfs.datanode.data.dir的磁盘空间和权限。

另一个实用技巧是用hdfs dfsadmin -report查看集群整体状态,包括总容量、已用容量、DataNode 数量和状态。这个命令在排查“为什么 HDFS 写不进去”时特别有用,因为磁盘满了或者 DataNode 掉线都会导致写入失败。

# 查看 HDFS 集群报告 hdfs dfsadmin -report # 查看特定目录的配额和使用情况 hdfs dfs -count -q /user/hadoop

参数说明:-count -q会显示目录的配额、剩余配额、命名空间配额和内容摘要。-report显示的是集群级别的汇总信息。这两个命令配合使用,能快速定位是目录级别的问题还是集群级别的问题。

从那以后我每次搭 Hadoop 实验环境,都强制走一遍“格式化一次、启动后 jps 确认、fsck 验证、put/get 往返测试”这四步,确认环境真的可用再开始跑作业。希望帮到你。

本文还有配套的精品资源,点击获取

返回列表