介绍
本实验将继续探讨 HDFS,这是 Hadoop 的主要组件之一。学习本实验将帮助你理解 HDFS 的工作原理和基本操作,以及在 Hadoop 软件架构中访问 WebHDFS 的方法。
本实验将继续探讨 HDFS,这是 Hadoop 的主要组件之一。学习本实验将帮助你理解 HDFS 的工作原理和基本操作,以及在 Hadoop 软件架构中访问 WebHDFS 的方法。
顾名思义,HDFS(Hadoop Distributed File System)是 Hadoop 框架中的一个分布式存储组件,具有容错性和可扩展性。
HDFS 可以作为 Hadoop 集群的一部分使用,也可以作为一个独立的通用分布式文件系统。例如,HBase 是基于 HDFS 构建的,而 Spark 也可以将 HDFS 作为数据源之一。学习 HDFS 的架构和基本操作对于特定集群的配置、优化和故障诊断将有很大帮助。
HDFS 是 Hadoop 应用程序使用的分布式存储,既是数据的来源,也是数据的目的地。HDFS 集群主要由 NameNodes(管理文件系统元数据) 和 DataNodes(存储实际数据) 组成。其架构如下图所示,展示了 NameNodes、DataNodes 和 Clients 之间的交互模式:
此图引用自 Hadoop 官方网站。
HDFS 介绍总结:
理解这些关于 HDFS 的关键点将有助于有效地配置、优化和诊断 Hadoop 集群。
在开发初期,HDFS 被设计为以跨节点、高可靠性的方式在大型集群中存储非常大的文件。如前所述,HDFS 以块的形式存储文件。具体来说,它将每个文件存储为一系列块。除了最后一个块外,文件中的所有块大小相同。
此图引用自 Hadoop 官方网站。
HDFS 数据复制与高可用性:
以下是扩展阅读的一些资料:
在编写任务代码之前,你应该先切换到 hadoop
用户。双击打开桌面上的 Xfce
终端,并输入以下命令。hadoop
用户的密码是 hadoop
,切换用户时需要输入:
su - hadoop
labex:~/ $ su - hadoop
hadoop:~$
提示:hadoop
用户的密码是 hadoop
在使用 HDFS 之前,需要先初始化 Namenode。此操作可以类比为格式化磁盘,因此在 HDFS 上存储数据时请谨慎使用此命令。
否则,请在本节中重新启动实验。使用“默认环境”并通过以下命令初始化 HDFS:
/home/hadoop/hadoop/bin/hdfs namenode -format
提示:上述命令将格式化 HDFS 文件系统,运行此命令前需要删除 HDFS 数据目录。
因此,你需要停止与 Hadoop 相关的服务并删除 Hadoop 数据:
stop-all.sh
rm -rf ~/hadoopdata
当你看到以下消息时,表示初始化已完成:
2024-03-01 11:16:10,439 INFO common.Storage: Storage directory /home/hadoop/hadoopdata/hdfs/namenode has been successfully formatted.
由于 HDFS 是一个构建在本地磁盘之上的分层 分布式存储系统,在使用 HDFS 之前,你需要将数据导入其中。
准备文件的第一种也是最方便的方法是使用 Hadoop 的配置文件作为示例。
首先,你需要启动 HDFS 守护进程:
/home/hadoop/hadoop/sbin/start-dfs.sh
查看服务状态:
hadoop:~$ jps
8341 SecondaryNameNode
7962 NameNode
8474 Jps
8107 DataNode
创建一个目录并复制数据,在终端中输入以下命令:
cd /home/hadoop
mkdir sample_data
cp -r /home/hadoop/hadoop/etc/hadoop/* sample_data/
列出目录内容:
hadoop:~$ ls /home/hadoop/sample_data/
capacity-scheduler.xml kms-log4j.properties
configuration.xsl kms-site.xml
...
任何对 HDFS 的操作都以 hdfs dfs
开头,并辅以相应的操作参数。最常用的参数是 put
,其用法如下,可以在终端中输入:
/home/hadoop/hadoop/bin/hdfs dfs -put /home/hadoop/sample_data/hadoop-policy.xml /policy.xml
列出目录内容:
hadoop:~$ hdfs dfs -ls /policy.xml
-rw-r--r-- 1 hadoop supergroup 11765 2024-03-01 11:37 /policy.xml
命令的最后一部分 /policy.xml
表示存储在 HDFS 中的文件名为 policy.xml
,路径为 /
(根目录)。如果你想继续使用之前的文件名,可以直接指定路径 /
。
如果需要上传多个文件,可以连续指定本地目录的文件路径,并以 HDFS 目标存储路径结尾:
/home/hadoop/hadoop/bin/hdfs dfs -mkdir -p /user/hadoop
/home/hadoop/hadoop/bin/hdfs dfs -put /home/hadoop/sample_data/httpfs-env.sh /home/hadoop/sample_data/mapred-env.sh /user/hadoop
列出目录内容:
hadoop:~$ hdfs dfs -ls /user/hadoop
Found 2 items
-rw-r--r-- 1 hadoop supergroup 1484 2024-03-01 11:42 /user/hadoop/httpfs-env.sh
-rw-r--r-- 1 hadoop supergroup 1764 2024-03-01 11:42 /user/hadoop/mapred-env.sh
对于指定路径相关的参数,规则与 Linux 系统中的规则相同。你可以使用通配符(如 *.sh
)来简化操作。
同样地,你可以使用 -ls
参数列出指定目录中的文件:
/home/hadoop/hadoop/bin/hdfs dfs -ls /user/hadoop
此处列出的文件可能会因实验环境的不同而有所变化。
如果你需要查看文件的内容,可以使用 cat
参数。最容易想到的是直接在 HDFS 上指定文件路径。如果你需要将本地目录与 HDFS 上的文件进行比较,可以分别指定它们的路径。但需要注意的是,本地目录需要以 file://
指示符开头,并辅以文件路径(例如 /home/hadoop/.bashrc
,不要忘记前面的 /
)。否则,此处指定的任何路径都将默认被识别为 HDFS 上的路径:
/home/hadoop/hadoop/bin/hdfs dfs -cat file:///home/hadoop/.bashrc /user/hadoop/mapred-env.sh
输出如下:
hadoop:~$ hdfs dfs -cat file:///home/hadoop/.bashrc /user/hadoop/mapred-env.sh
## ~/.bashrc: executed by bash(1) for non-login shells.
## see /usr/share/doc/bash/examples/startup-files (in the package bash-doc)
## for examples
## If not running interactively, don't do anything
case $- in
...
如果你需要将文件复制到另一个路径,可以使用 cp
参数:
/home/hadoop/hadoop/bin/hdfs dfs -cp /user/hadoop/mapred-env.sh /user/hadoop/copied_file.txt
同样地,如果你需要移动文件,可以使用 mv
参数。这与 Linux 文件系统命令格式基本相同:
/home/hadoop/hadoop/bin/hdfs dfs -mv /user/hadoop/mapred-env.sh /moved_file.txt
使用 lsr
参数列出当前目录的内容,包括子目录的内容。输出如下:
hdfs dfs -lsr /
如果你想在 HDFS 上的文件中追加一些新内容,可以使用 appendToFile
参数。并且,在指定要追加的本地文件路径时,可以指定多个路径。最后一个参数将是追加的目标文件。该文件必须存在于 HDFS 上,否则会报错:
echo 1 >> a.txt
echo 2 >> b.txt
/home/hadoop/hadoop/bin/hdfs dfs -appendToFile a.txt b.txt /user/hadoop/mapred-env.sh
你可以使用 tail
参数查看文件尾部的内容(文件的末尾部分),以确认追加是否成功:
/home/hadoop/hadoop/bin/hdfs dfs -tail /user/hadoop/mapred-env.sh
查看 tail
命令的输出:
hadoop:~$ echo 1 >> a.txt
echo 2 >> b.txt
hdfs dfs -appendToFile a.txt b.txt /user/hadoop/mapred-env.sh
hadoop:~$ hdfs dfs -tail /user/hadoop/mapred-env.sh
1
2
如果你需要删除文件或目录,可以使用 rm
参数。该参数还可以伴随 -r
和 -f
,它们的含义与 Linux 文件系统命令 rm
中的含义相同:
/home/hadoop/hadoop/bin/hdfs dfs -rm /moved_file.txt
文件 moved_file.txt
的内容将被删除,命令将返回以下输出 'Deleted /moved_file.txt'
在前面的内容中,我们已经学习了如何在 HDFS 中创建目录。实际上,如果你需要一次性创建多个目录,可以直接指定多个目录的路径作为参数。-p
参数表示如果父目录不存在,则会自动创建它:
/home/hadoop/hadoop/bin/hdfs dfs -mkdir -p /user/hadoop/dir1 /user/hadoop/dir2/sub_dir1
如果你想查看某个文件或目录占用了多少空间,可以使用 du
参数:
/home/hadoop/hadoop/bin/hdfs dfs -du /user/hadoop/
输出如下:
hadoop:~$ hdfs dfs -du /user/hadoop/
1764 1764 /user/hadoop/copied_file.txt
0 0 /user/hadoop/dir1
0 0 /user/hadoop/dir2
1484 1484 /user/hadoop/httpfs-env.sh
4 4 /user/hadoop/mapred-env.sh
在上一节中,我们主要介绍了 HDFS 中的文件和目录操作。如果某个应用程序(如 MapReduce)计算完成并生成了记录结果的文件,你可以使用 get
参数将其导出到 Linux 系统的本地目录中。
这里的第一个路径参数指的是 HDFS 中的路径,最后一个路径指的是保存在本地目录中的路径:
/home/hadoop/hadoop/bin/hdfs dfs -get /user/hadoop/mapred-env.sh /home/hadoop/exported_file.txt
如果导出成功,你可以在本地目录中找到该文件:
cd ~
ls
输出如下:
a.txt b.txt exported_file.txt hadoop hadoopdata sample_data
每个 NameNode 或 DataNode 内部都运行着一个 Web 服务器,用于显示集群当前状态等基本信息。在默认配置中,NameNode 的主页是 http://localhost:9870/
。它列出了 DataNodes 和集群的基本统计信息。
打开一个网页浏览器,在地址栏中输入以下内容:
http://localhost:9870/
你可以在 Summary 中看到当前“集群”中活跃的 DataNode 节点数量:
Web 界面还可以用于浏览 HDFS 内部的目录和文件。在顶部的菜单栏中,点击“Utilities”下的“Browse the file system”链接:
现在我们已经介绍了一些 WebHDFS 的基本操作。更多说明可以在 WebHDFS 的文档中找到。本实验已接近尾声。按照习惯,我们仍然需要关闭 Hadoop 集群:
/home/hadoop/hadoop/sbin/stop-yarn.sh
/home/hadoop/hadoop/sbin/stop-dfs.sh
hadoop:~$ jps
11633 Jps
本实验介绍了 HDFS 的架构。同时,我们从命令行学习了基本的 HDFS 操作命令,然后转向了 HDFS 的 Web 访问模式,这将帮助 HDFS 作为外部应用程序的真实存储服务运行。
本实验没有列出任何在 WebHDFS 中删除文件的场景。你可以自行查阅文档。更多功能隐藏在官方文档中,因此请确保保持阅读文档的兴趣。
以下是扩展阅读的材料: