什么是HDFS
Hadoop附带了一个名为HDFS的分布式文件系统。在HDFS中,数据分布在多台机器上,并进行了复制,以确保其对故障的耐用性和并行应用的高可用性。
它具有成本效益,因为它使用廉价的硬件。它涉及块、数据节点和节点名称的概念。
在哪里可以使用HDFS
- 非常大的文件: 文件应该是几百兆字节、几十吉字节甚至更大。
- 流式数据访问: 读取整个数据集所需的时间比读取第一个数据的延迟更重要。HDFS基于一次写入,多次读取的模式构建。
- 廉价硬件: 它可以在廉价硬件上运行。
不适合使用HDFS的场景
- 低延迟数据访问: 需要非常短的时间来访问第一个数据的应用程序不应使用HDFS,因为它更注重整个数据而不是获取第一个记录所需的时间。
- 大量的小文件: 名称节点将文件的元数据存储在内存中,如果文件的大小很小,则名称节点的内存花费很多,这是不可行的。
- 多次写入: 当需要多次写入时,不应使用HDFS。
HDFS的概念
- 块: 一个块是可以读取或写入的最小数据单元。默认情况下,HDFS块大小为128MB,可以进行配置。HDFS中的文件被分割成块大小的块,作为独立单元存储。与文件系统不同,如果HDFS中的文件小于块大小,则不会占用完整块大小,即在HDFS中以128MB块大小存储的5MB文件仅占用5MB的空间。HDFS块大小设置较大,以减小搜索成本。
- 名称节点: HDFS以主从模式工作,其中名称节点作为主节点工作。名称节点是HDFS的控制器和管理器,它了解HDFS中所有文件的状态和元数据;元数据信息包括文件权限、块的名称和位置。元数据很小,因此存储在名称节点的内存中,以便更快地访问数据。此外,HDFS集群被多个客户端同时访问,所以所有这些信息都由单台机器处理。它执行文件系统操作,如打开、关闭、重命名等。
- 数据节点: 它们按照客户端或名称节点的指示存储和检索块。它们定期向名称节点报告它们正在存储的块列表。数据节点是廉价硬件,同时也负责块的创建、删除和复制,如名称节点所述。
HDFS数据节点和名称节点的图像:
HDFS读取图像:
HDFS写入镜像:
所有的元数据都存储在名称节点中,这非常重要。如果名称节点失败,文件系统将无法使用,因为我们无法知道如何根据数据节点中的块重建文件。为了克服这个问题,引入了辅助名称节点的概念。
辅助名称节点: 它是一个独立的物理机器,作为名称节点的帮助器。它执行定期的检查点。它与名称节点通信并对元数据进行快照处理,有助于最小化停机时间和数据丢失。
启动HDFS
首先要格式化HDFS,然后以分布式模式启动。以下是命令:
格式化:$ hadoop namenode -format
启动:$ start-dfs.sh
HDFS基本文件操作
- 将数据从本地文件系统放入HDFS
- 首先,在HDFS中创建一个文件夹,用于从本地文件系统中放置数据。
$ hadoop fs -mkdir /user/test
- 将名为”data.txt”的文件从本地文件夹”/usr/home/Desktop”复制到HDFS文件夹”/user/test”。
$ hadoop fs -copyFromLocal /usr/home/Desktop/data.txt /user/test
- 显示HDFS文件夹的内容。
$ Hadoop fs -ls /user/test
- 从HDFS复制数据到本地文件系统
$ hadoop fs -copyToLocal /user/test/data.txt /usr/bin/data_copy.txt
- 比较这两个文件,查看它们是否相同
$ md5 /usr/bin/data_copy.txt /usr/home/Desktop/data.txt
递归删除
hadoop fs -rmr <arg>
示例:
hadoop fs -rmr /user/sonoo/
HDFS其他命令
以下用于命令中:
“<path>
“表示任何文件或目录名称。
“<path>...
“表示一个或多个文件或目录名称。
“<file>
“表示任何文件名。
“<src>
“和”<dest>
“是有向操作中的路径名。
“<localSrc>
“和”<localDest>
“是一个本地文件系统上的路径。
put <localSrc><dest>
将本地文件或目录(由localSrc标识)复制到DFS中的dest位置。
copyFromLocal <localSrc><dest>
与-put命令相同。
copyFromLocal <localSrc><dest>
与-put命令相同。
moveFromLocal <localSrc><dest>
将本地文件或目录(由localSrc标识)复制到HDFS中的dest位置,并在成功后删除本地副本。
get [-crc] <src><localDest>
将HDFS中由src标识的文件或目录复制到本地文件系统路径localDest。
cat <filen-ame>
在标准输出中显示filename的内容。
moveToLocal <src><localDest>
类似于-get命令,在成功后删除HDFS中的复制。
setrep [-R] [-w] rep <path>
将路径为path的文件的目标副本数设置为rep。(实际副本数会随时间逐渐接近目标副本数)
touchz <path>
在路径path处创建一个包含当前时间戳的文件。如果路径已经存在一个文件,并且大小不为0,则操作失败。
test -[ezd] <path>
如果路径path存在、长度为零或为一个目录,则返回1;否则返回0。
stat [format] <path>
打印有关路径path的信息。format是一个字符串,可以接受块大小(%b)、文件名(%n)、块大小(%o)、副本数(%r)和修改日期(%y,%Y)。