HDFS入门
1 文件操作
1.1 命令行交互
1.1.1 概述
一个通用的命令格式如下:
hdfs [OPTIONS] SUBCOMMAND [SUBCOMMAND OPTIONS] SUBCOMMAND:Admin Commands、Client Commands、Daemon Commands。
同时HDFS Shell CLI 支持操作多种文件系统,包括本地文件系统(file:///)、分布式文件系统(hdfs ://nn :8020),具体的操作区别在于URL前缀,同时如果不指定前缀,那么默认会走fs.defaultFS属性所设置的节点。
1.1.2 传统命令的三者区别
- hadoop dfs 只能操作HDFS文件系统(包括与Local FS间的操作),不过已经Deprecated
- hdfs dfs 只能操作HDFS文件系统相关(包括与Local FS间的操作),常用
- hadoop fs 可操作任意文件系统,不仅仅是hdfs文件系统,使用范围更广
1.1.3 帮助
hadoop fs -help
1.1.4 几个重要的命令
创建目录
hadoop fs -mkdir [-p] <path>
# path 为待创建目录 -p 会沿着路径创建去目录,用于连续创建多级目录
查看指定目录
hadoop fs -ls [-h] [-R] <path>
# -h 显示文件size,
# -R 递归查看指定目录及其子目录
上传文件到指定目录
# 命令一
hadoop fs -put [-f][-p] <localsrc> <dst>
# 其中 -f 可覆盖文件,如果已经存在同名文件
# -p 保留访问和修改的时间,所有权和权限
# localsrc 本地文件系统 dst目标文件系统
# 命令二:
hadoop fs -moveFromLocal <localsrc> ... <dst>
命令一与命令二的区别仅仅在于命令二上传文件后会导致源文件丢失,而命令一不会。
查看文件内容
hadoop fs -cat <src>
# 用于读取指定文件全部内容,显示在控制台 -- 大文件尽量不要用
hadoop fs -head <file>
# 用于查看指定文件前 1KB 的内容
hadoop fs -tail [-f] <file>
# 用于查看指定文件后 1KB 的内容, -f 可以动态显示文件追加的内容
文件下载
hadoop fs -get [-f] [-p] <src> ... <localdst>
# 下载文件到本地文件系统指定目录,localdst必须是目录
# -f 覆盖目标文件(已存在下)
# -p 保留访问和修改时间,所有权和权限。
合并下载
hadoop fs -getmerge [-nl] [-skip-empty-file] <src> <localdst>
# 下载多个文件合并到本地文件系统的一个文件中。
# -nl选项表示在每个文件末尾添加换行符
文件拷贝
hadoop fs -cp [-f] <src> ... <dst>
# -f 覆盖目标文件(已存在下)
文件数据追加
hadoop fs -appendToFile <localsrc> ... <dst>
# 将所有给定本地文件的内容追加到给定dst文件。
# dst如果文件不存在,将创建该文件。
# 如果<localSrc>为-,则输入为从标准输入中读取。
查看HDFS磁盘空间
hadoop fs -df [-h] [<path> ...]
# 显示文件系统的容量,可用空间和已用空间 ,-h 和前文作用一致,用于显示Size
查看文件使用的空间量
hadoop fs -du [-s] [-h] <path> ...
# -s:表示显示指定路径文件长度的汇总摘要,而不是单个文件的摘要。
# -h:选项将以“人类可读”的方式格式化文件大小
文件移动
hadoop fs -mv <src> ... <dst>
# 移动文件到指定文件夹下
# 可以使用该命令移动数据,重命名文件的名称
修改文件副本个数
hadoop fs -setrep [-R] [-w] <rep> <path> ...
# 修改指定文件的副本个数。
# -R表示递归 修改文件夹下及其所有
# -w 客户端是否等待副本修改完毕。
下面是文件系统操作文档地址;
https://hadoop.apache.org/docs/r3.1.4/hadoop-project-dist/hadoop-common/FileSystemShell.html
1.2 Java API 交互
1.2.1 环境配置
@Before
public void connect()
{
conf = new Configuration();
conf.set("fs.defaultFS","hdfs://10.211.55.6:8020");
try {
fs = FileSystem.get(conf);
} catch (IOException e) {
e.printStackTrace();
}
}
1.2.2 解决权限问题
System.setProperty("HADOOP_USER_NAME", "root");
1.2.3 上传文件
@Test
public void upload(){
Path source = new Path("/Users/haorantian/Desktop/临时文件夹/2022上学期微原接口试卷期末考试(56卷).pdf");
Path target = new Path("/source");
try {
fs.copyFromLocalFile(source,target);
} catch (IOException e) {
e.printStackTrace();
}
}
1.2.4 文件删除
@Test
public void delete(){
Path target = new Path("/source/2022上学期微原接口试卷期末考试(56卷).pdf");
try {
fs.deleteOnExit(target);
} catch (IOException e) {
e.printStackTrace();
}
}
1.3 Web 交互
本人干Java的,对别的不感兴趣。
官方文档链接附上:https://hadoop.apache.org/docs/current/hadoop-project-dist/hadoop-hdfs/WebHDFS.html#Create_and_Write_to_a_File
2 文件存储
2.1 Text File
- 文本格式是Hadoop生态系统内部和外部的最常见格式。通常按行存储,以回车换行符区分不同行数据。
- 最大缺点是,它不支持块级别压缩,因此在进行压缩时会带来较高的读取成本。
- 解析开销一般会比二进制格式高,尤其是XML 和JSON,它们的解析开销比Textfile还要大。
- 易读性好。
2.2 Sequence File
- Sequence File,每条数据记录(record)都是以key、value键值对进行序列化存储(二进制格式)。
- 序列化文件与文本文件相比更紧凑,支持record级、block块级压缩。压缩的同时支持文件切分。
- 通常把Sequence file作为中间数据存储格式。例如:将大量小文件合并放入到一个Sequence File中。
2.3 Avro File
- Apache Avro是与语言无关的序列化系统,由Hadoop创始人 Doug Cutting开发
- Avro是基于行的存储格式,它在每个文件中都包含JSON格式的schema定义,从而提高了互操作性并允许schema的变化(删除列、添加列)。 除了支持可切分以外,还支持块压缩。
- Avro是一种自描述格式,它将数据的schema直接编码存储在文件中,可以用来存储复杂结构的数据。
- Avro直接将一行数据序列化在一个block中.
- 适合于大量频繁写入宽表数据(字段多列多)的场景,其序列化反序列化很快。
2.4 RCFile
- Hive Record Columnar File(记录列文件),这种类型的文件首先将数据按行划分为行组,然后在行组内部将数据存储在列中。很适合在数仓中执行分析。且支持压缩、切分
- 但不支持schema扩展,如果要添加新的列,则必须重写文件,这会降低操作效率。
2.5 ORC File
- ORC File(Optimized Row Columnar)提供了比RC File更有效的文件格式。它在内部将数据划分为默认大小为250M的Stripe。每个条带均包含索引,数据和页脚。索引存储每列的最大值和最小值以及列中每一行的位置。
- 它并不是一个单纯的列式存储格式,仍然是首先根据Stripe分割整个表,在每一个Stripe内进行按列存储。
- ORC有多种文件压缩方式,并且有着很高的压缩比。文件是可切分(Split)的。
- ORC文件是以二进制方式存储的,所以是不可以直接读取。
2.6 Parquet File
- Parquet是面向分析型业务的列式存储格式,由Twitter和Cloudera合作开发,2015年5月从Apache的孵化器里毕业成为Apache顶级项目。
- Parquet文件是以二进制方式存储的,所以是不可以直接读取的,文件中包括该文件的数据和元数据,因此Parquet格式文件是自解析的。
- 支持块压缩。
2.7 Apache Arrow
- Apache Arrow是一个跨语言平台,是一种列式内存数据结构,主要用于构建数据系统。
- Apache Arrow在2016年2月17日作为顶级Apache项目引入。
优势:
- Arrow促进了许多组件之间的通信。
- 极大的缩减了通信时候序列化、反序列化所浪费的时间。
Arrow如何提升数据移动性能?
- 利用Arrow作为内存中数据表示的两个过程可以将数据从一种方法“重定向”到另一种方法,而无需序列化或反序列化。 例如,Spark可以使用Python进程发送Arrow数据来执行用户定义的函数。
- 无需进行反序列化,可以直接从启用了Arrow的数据存储系统中接收Arrow数据。 例如,Kudu可以将Arrow数据直接发送到Impala进行分析。
- Arrow的设计针对嵌套结构化数据(例如在Impala或Spark Data框架中)的分析性能进行了优化。
3 文件压缩
压缩格式 | 工具 | 算法 | 文件扩展名 | 是否可切分 | 对应的编码解码器 |
---|---|---|---|---|---|
DEFLATE | 无 | DEFLATE | .deflate | 否 | org.apache.hadoop.io.compress.DefaultCodec |
Gzip | gzip | gzip | .gz | 否 | org.apache.hadoop.io.compress.GzipCodec |
bzip2 | bzip2 | bzip2 | .bz2 | 是 | org.apache.hadoop.io.compress.BZip2Codec |
LZO | lzop | LZO | .lzo | 是(切分点索引) | com.hadoop.compression.lzo.LzopCodec |
LZ4 | 无 | LZ4 | .lz4 | 否 | org.apache.hadoop.io.compress.Lz4Codec |
Snappy | 无 | Snappy | .snappy | 否 | org.apache.hadoop.io.compress.SnappyCodec |
4 异构存储
4.1 存储策略
- HOT:用于存储和计算。流行且仍用于处理的数据将保留在此策略中。所有副本都存储在DISK中。
COLD:仅适用于计算量有限的存储。不再使用的数据或需要归档的数据从热存储移动到冷存储。所有副本都存储在ARCHIVE中。 - WARM:部分热和部分冷。热时,其某些副本存储在DISK中,其余副本存储在ARCHIVE中。
- All_SSD:将所有副本存储在SSD中。
- One_SSD:用于将副本之一存储在SSD中。其余副本存储在DISK中。
- Lazy_Persist:用于在内存中写入具有单个副本的块。首先将副本写入RAM_DISK,然后将其延迟保存在DISK中。
列出所有存储策略
hdfs storagepolicies -listPolicies
设置存储策略
hdfs storagepolicies -setStoragePolicy -path <path> -policy <policy>
取消存储策略
hdfs storagepolicies -unsetStoragePolicy -path <path>
获取存储策略
hdfs storagepolicies -getStoragePolicy -path <path>
4.2 设置盘符
Hadoop并不是智能的,需要用户自己设置DISK、RAM等等。
cd /export/server/hadoop-3.1.4/etc/hadoopvim hdfs-site.xml
<property>
<name>dfs.datanode.data.dir</name>
<value>[DISK]file://${hadoop.tmp.dir}/dfs/data,[ARCHIVE]file://${hadoop.tmp.dir}/dfs/data/archive</value>
</property>
scp -r hdfs-site.xml node2:$PWD
scp -r hdfs-site.xml node3:$PWD
4.3 内存存储策略
- 对目标文件目录设置 StoragePolicy 为 LAZY_PERSIST 的内存存储策略 。
- 客户端进程向 NameNode 发起创建/写文件的请求 。
- 客户端请求到具体的 DataNode 后 DataNode 会把这些数据块写入 RAM 内存中,同时启动异步线程服务将内存数据持久化写到磁盘上 。
- 内存的异步持久化存储是指数据不是马上落盘,而是懒惰的、延时地进行处理 。
4.3.1 配置虚拟内存盘
mount -t tmpfs -o size=1g tmpfs /mnt/dn-tmpfs/
之后在配置文件中设置 [RAM_DISK]
4.3.2 参数设置
- dfs.storage.policy.enabled
是否开启异构存储,默认true开启 - dfs.datanode.max.locked.memory
用于在数据节点上的内存中缓存块副本的内存量(以字节为单位)。默认情况下,此参数设置为0,这将禁用 内存中缓存。内存值过小会导致内存中的总的可存储的数据块变少,但如果超过 DataNode 能承受的最大内 存大小的话,部分内存块会被直接移出 。