Hadoop学习(大数据实验)

一、HDFS概述

1、HDFS产生背景和定义

1)HDFS产生背景

随着数据量的增加,在一个操作系统存不下所有的数据,那么久分配到更多的操作系统管理的磁盘中,但将数据分散的存储在不同的操作系统中,不便于管理和维护,迫切需要一种系统来管理多台机器上的文件,这就是分布式文件管理系统。HDFS只是分布式文件管理系统中的一种。

2)HDFS定义

HDFS(Hadoop Distributed File System)是一种分布式文件系统,用于存储和管理大规模数据集的分布式存储解决方案,通过目录树来定位文件。

HDFS适用场景:**适合一次写入,多次读出的场景。**一个文件经过创建、写入和关闭之后就不需要改变。HDFS只支持文件追加,而不支持在任意位置对文件进行修改

2、HDFS优缺点

优点

1)高容错性:数据自动保存多个副本,它能够通过增加副本的形式,提高容错性。当某一个副本丢失后,它可以根据其他节点上的副本数据自动恢复。
2)适合处理大数据

  • 数据规模:能够处理数据规模达到GB、TB甚至PB级别的数据;
  • 文件规模:能够处理百万规模以上的文件数量。

3)高可扩展性: HDFS可以轻松扩展以处理大规模数据,只需添加更多的节点即可。这种可扩展性使其适用于应对不断增长的数据量。

4)数据本地性: HDFS会在数据节点上存储数据块,这使得计算可以在数据附近进行,减少了网络传输的开销,提高了性能
缺点

1)延迟问题: HDFS通常用于批量数据处理,对于需要低延迟的实时数据访问场景不太适用。读取数据的响应时间可能会较长。做不到向Mysql那样快速相应数据。

2)无法高效的对大量小文件进行存储

对于每一个存储在HDFS文件系统中的文件,HDFS都会开销一部分内存来存储它的一些元数据(包括目录和块信息等),存储大量小文件的话,会占用NameNode大量的内存来存储文件目录和块信息。这样是不可取的,因为NameNode的内存总是有限的,太多的小文件会徒增NameNode的负担,甚至会使其崩溃。

3)不支持原子性写入操作: HDFS不支持原子性写入操作,这意味着如果多个客户端同时尝试写入同一文件,可能会导致数据不一致性。因此HDFS规定:

  • 一个文件只能同一时间只能有一个写,不允许多个线程同时写;
  • 仅支持数据追加(append),不支持文件的随机修改。

3、HDFS组成架构

HDFS主要由NameNode、DataNode、SecondaryNameNode、Client组成

1)NameNode(nn):相当于Master,它是一个管理者

—> 元数据管理:NameNode负责管理HDFS的元素据,包括文件和目录结构、文件的位置信息、文件权限和命名空间等。

—> 块映射:NameNode维护一个块到数据节点的映射表,它记录了每个数据块的副本存储在哪些数据节点上。

—> 客户端请求处理:NameNode处理客户端的文件系统请求,例如创建、删除、重命名文件或目录,以及读取文件的元数据信息。

2)DataNode(dn):相当于Slave,NameNode下达命令,DataNode执行实际操作。

—> 数据块存储:DataNode负责存储实际的数据块。他们根据NameNode的指示将数据块写入本地磁盘,并在需要时将数据块传送给客户端。

—> 块报告:DataNode周期性地向NameNode发送报告,告知NameNode它们存储了哪些块,并报告数据块的将抗状态。

—> 块复制:如果某个数据块的副本数下降到预定的阈值以下,DataNode会复制丢失的块副本,以维护数据的可靠性。

3)SecondaryNameNode(2nn):辅助恢复NameNode

—> 元数据备份:SecondaryNameNode的主要作用是定期备份NameNode元数据。需要注意的是它并非NameNode的热备。当NameNode挂掉的时候,它并不能马上替换NameNode并提供服务。它不会处理实际的文件数据,而只是备份元数据。

—> 日志合并: Secondary NameNode也负责合并HDFS事务日志(编辑日志),以帮助减小NameNode的编辑日志大小,防止过大的编辑日志导致启动时间过长。

4)Client:客户端

—> 文件切分。文件上传HDFS的时候,Client将文件切分成一个一个的Block,然后进行上传;

—> 与NameNode交互,获取文件的位置信息;

—> 与DataNode交互,读取或者写入数据;

—> Client提供一些命令来管理HDFS,比如NameNode格式化;

—> Client可以通过一些命令来访问HDFS,比如对HDFS增删查改操作;

4、HDFS文件块大小

HDFS中的文件在物理上是分块存储(Block),也就是说数据块(Data Block)是HDFS中的基本存储单位,它是一个固定大小的数据块,通常默认为128MB(在Hadoop1.x版本中默认为64MB),但可以通过配置参数(dfs.blocksize)适当修改块大小。

**注:**在选择dfs.blocksize的值时,需要根据具体的应用需求进行权衡。通常,对于大规模数据处理工作负载,较大的数据块大小(如128MB或256MB)可能更合适,因为它可以提高数据处理性能。然而,如果应用程序需要处理大量小文件,可以考虑减小数据块的大小,以最大程度地减少存储浪费和提高小文件的写入性能。根据具体的使用情况,可以调整dfs.blocksize参数的值以优化HDFS的性能和存储效率
**解释:**为什么说处理大量小文件时,数据块设置得太大会造成存储浪费呢?这是因为HDFS默认情况下不会将多个小文件内的数据合并到一个数据块内,即使小文件的实际大小小于数据块大小,HDFS也会将它们分成不同的数据块,不会将多个小文件的数据合并到一个数据块内。这样的话就会造成每个小文件都独占一个数据块,但实际上数据块内存并没有充分利用,就造成了内存浪费。
思考:为什么块大小不能设置太小,也不能设置太大?
(1)HDFS的块设置太小,会增加寻址时间,程序一直在找块的开始位置;
(2)如果块设置的太大,从磁盘传输数据的时间会明显大于定位这个块开始位置所需的时间。导致程序在处理这块数据时,会非常慢。

二、HDFS的常用Shell命令

1、基本语法

hddoop fs 具体命令或 hdfs fs 具体命令,两个是完全相同的。

2、hdfs命令大全

查看HDFS命令集可以在Hadoop目录下输入bin/hadoop fs

[chery@hadoop102 hadoop-3.1.3]$ bin/hadoop fs

[-appendToFile <localsrc> ... <dst>]
	[-cat [-ignoreCrc] <src> ...]
	[-checksum <src> ...]
	[-chgrp [-R] GROUP PATH...]
	[-chmod [-R] <MODE[,MODE]... | OCTALMODE> PATH...]
	[-chown [-R] [OWNER][:[GROUP]] PATH...]
	[-copyFromLocal [-f] [-p] [-l] [-d] [-t <thread count>] <localsrc> ... <dst>]
	[-copyToLocal [-f] [-p] [-ignoreCrc] [-crc] <src> ... <localdst>]
	[-count [-q] [-h] [-v] [-t [<storage type>]] [-u] [-x] [-e] <path> ...]
	[-cp [-f] [-p | -p[topax]] [-d] <src> ... <dst>]
	[-createSnapshot <snapshotDir> [<snapshotName>]]
	[-deleteSnapshot <snapshotDir> <snapshotName>]
	[-df [-h] [<path> ...]]
	[-du [-s] [-h] [-v] [-x] <path> ...]
	[-expunge]
	[-find <path> ... <expression> ...]
	[-get [-f] [-p] [-ignoreCrc] [-crc] <src> ... <localdst>]
	[-getfacl [-R] <path>]
	[-getfattr [-R] {-n name | -d} [-e en] <path>]
	[-getmerge [-nl] [-skip-empty-file] <src> <localdst>]
	[-head <file>]
	[-help [cmd ...]]
	[-ls [-C] [-d] [-h] [-q] [-R] [-t] [-S] [-r] [-u] [-e] [<path> ...]]
	[-mkdir [-p] <path> ...]
	[-moveFromLocal <localsrc> ... <dst>]
	[-moveToLocal <src> <localdst>]
	[-mv <src> ... <dst>]
	[-put [-f] [-p] [-l] [-d] <localsrc> ... <dst>]
	[-renameSnapshot <snapshotDir> <oldName> <newName>]
	[-rm [-f] [-r|-R] [-skipTrash] [-safely] <src> ...]
	[-rmdir [--ignore-fail-on-non-empty] <dir> ...]
	[-setfacl [-R] [{-b|-k} {-m|-x <acl_spec>} <path>]|[--set <acl_spec> <path>]]
	[-setfattr {-n name [-v value] | -x name} <path>]
	[-setrep [-R] [-w] <rep> <path> ...]
	[-stat [format] <path> ...]
	[-tail [-f] [-s <sleep interval>] <file>]
	[-test -[defsz] <path>]
	[-text [-ignoreCrc] <src> ...]
	[-touch [-a] [-m] [-t TIMESTAMP ] [-c] <path> ...]
	[-touchz <path> ...]
	[-truncate [-w] <length> <path> ...]
	[-usage [cmd ...]]

3、常用命令操作

3.1 准备工作

1)启动Hadoop集群(方便测试)

[chery@hadoop102 hadoop-3.1.3]$ sbin/start-dfs.sh
[chery@hadoop103 hadoop-3.1.3]$ sbin/start-yarn.sh

2)在Haoop根目录创建一个文件夹“IT”用于测试

[chery@hadoop102 hadoop-3.1.3]$ hadoop fs -mkdir /IT

3.2 上传

1)-moveFromLocal: 从本地剪切粘贴到HDFS(执行后本地文件被删除)

- 在本地创建一个名为“bigdata”的文本文件
[chery@hadoop102 hadoop-3.1.3]$ vim bigdata.txt
- 输入:
hello bigdata
- 剪切到HDFS下的IT目录
[chery@hadoop102 hadoop-3.1.3]$ hadoop fs -moveFromLocal ./bigdata.txt /IT

2)-copyFromLocal:从本地文件系统拷贝文件到HDFS(执行后本地文件不会删掉)

- 在本地创建一个名为“houduan”的文本文件
[chery@hadoop102 hadoop-3.1.3]$ vim houduan.txt
- 输入:
hello houduan
- 将其拷贝到HDFS下的IT目录
[chery@hadoop102 hadoop-3.1.3]$ hadoop fs -copyFromLocal ./houduan.txt /IT

3)-put:从本地文件系统推送到HDFS,等同于copyFromLocal

- 创建文本文件“qianduan”
[chery@hadoop102 hadoop-3.1.3]$ vim qianduan.txt
- 输入:
hello qianduan
- 上传
[chery@hadoop102 hadoop-3.1.3]$ hadoop fs -put ./qianduan.txt /IT

4)-appendToFile:追加一个文件到已经存在的文件末尾

- 创建一个文本文件“hadoop”
[chery@hadoop102 hadoop-3.1.3]$ vim hadoop.txt
- 输入:
hello hadoop 
- 追加到/IT/bigdata.txt文件末尾
[chery@hadoop102 hadoop-3.1.3]$ hadoop fs -appendToFile ./hadoop.txt /IT/bigdata.txt

3.3 下载

1)-copyToLocal:从HDFS拷贝到本地

- 将HDFS中/IT/bigdata.txt拷贝到本地当前目录下
[chery@hadoop102 hadoop-3.1.3]$ hadoop fs -copyToLocal /IT/bigdata.txt ./

2)-get:从HDFS拉取到本地,等同于copyToLocal

- 从HDFS拷贝bigdata.txt文件到本地当前目录并重命名
[chery@hadoop102 hadoop-3.1.3]$ hadoop fs -get /IT/bigdata.txt ./bigdata2.txt

3.4 HDFS直接操作

1)显示目录信息

[chery@hadoop102 hadoop-3.1.3]$ hadoop fs -ls /IT
Found 2 items
-rw-r--r--   3 chery supergroup         14 2023-10-05 08:25 /IT/bigdata.txt
-rw-r--r--   3 chery supergroup         14 2023-10-05 08:38 /IT/houduan.txt

2)-cat:显示文件内容

[chery@hadoop102 hadoop-3.1.3]$ hadoop fs -cat /IT/bigdata.txt
hello bigdata

3)-chgrp、chmod、chown:和Linux文件系统中的用法一致,用于修改文件权限

  • chgrp(Change Group)命令用于更改文件或目录的所属用户组。
  • chmod(Change Mode)命令用于更改文件或目录的权限。
  • chown(Change Owner)命令用于更改文件或目录的所有者。
[chery@hadoop102 hadoop-3.1.3]$ hadoop fs -chmod 777 /IT/bigdata.txt
[chery@hadoop102 hadoop-3.1.3]$ hadoop fs -chown chery:chery /IT/bigdata.txt

4)mkdir:创建路径(文件夹)

[chery@hadoop102 hadoop-3.1.3]$ hadoop fs -mkdir /Java

5)-cp:从HDFS的一个路径拷贝到HDFS另一个路径

[chery@hadoop102 hadoop-3.1.3]$ hadoop fs -cp /IT/bigdata /Java

6)-mv:在HDFS目录中移动文件

[chery@hadoop102 hadoop-3.1.3]$ hadoop fs -mv /IT/qianduan.txt /Java

7)-tail:显示一个文件的末尾1kb的数据

[chery@hadoop102 hadoop-3.1.3]$ hadoop fs -tail /Java/qianduan.txt

8)-rm:删除文件或文件夹

[chery@hadoop102 hadoop-3.1.3]$ hadoop fs -rm /IT/qianduan.txt

9)-rm -r:递归删除文件或文件夹(删除过程需要用户确认,而rm -rf不需要用户确认)

[chery@hadoop102 hadoop-3.1.3]$ hadoop fs -rm -r /IT
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值