1、HDFS 通过 REST HTTP API数据访问
1.1 HDFS常见客户端
HDFS Shell Command 的操作俗称命令行操作。命令格式类似与Linux的shell对文件的操作,举例,RPC协议
hadoop fs 命令
hdfs dfs 命令
Java API
HDFS Java API提供了java代码操作HDFS的能力,大数据开发中常用的方式
核心类FileSystem,Configuration
C API LibHDFS :用于支持C预演客户端操作HDFS,是HDFS发行版的一部分,已经预编译再软件包中
不管是什么类型的客户端都是操作访问HDFS的一种方式。如果Hadoop集群在一台主机作为客户端访问HDFS,没有Hadoop和Java环境,怎么访问呢?
1.2 理解什么是RESTful风格
WebHDFS客户端 提供了访问Restful接口,内置组件,默认开启,使集群外的客户端不用安装Hadoop和java,即可访问,不受语言限制。
WebHDFS原来是由HortonWorks开发的,后来捐给了Apache
客户端请求文件时,WebHDFS会将其重定向到dataNode
http://node1:9870,在调试模式下网络里面可以查看就是使用的这一协议客户端
使用方式
WebHDFS的文件系统schema为webhdfs://。URL格式为webhdfs://<host>:<http_port>/<path>
在restful风格中的api,相当于http url
http://<host>:<http_port>/webhdfs/v1/<path>?op=<param>
官方众多的api参考Apache Hadoop 3.3.4 – WebHDFS REST API,具有丰富的样例
疑问:数据安全怎么保障,后面学习需要了解。
初步思路:设置读写hdfs文件读写的用户,不对外,所有文件读写提交给服务端,服务端先判断用户权限,根据用户权限,使用hdfs的用户去读取或写入文件。
HttpFS
是一个提供RESTful 接口的网关的服务器,该网关支持所有HDFS文件系统操作,需要手动安装,示意图如下
启用HttpFS的方式
第一步,配置允许代理访问的主机节点,用户所属组(core-site.xml)
<property>
<name>hadoop.proxyuser.root.hosts</name>
<value>*</value>
</property>
<property>
<name>hadoop.proxyuser.root.groups</name>
<value>*</value>
</property>
配置文件同步到所有节点
启动HttpFS
#开启
hdfs --daemon start httpfs
#关闭
hdfs --daemon stop httpfs
访问地址
http://node1:14000/static/index.html
点击页面连接内容,直接访问,会提示没有权限。
在跳转的地址栏里面添加user.name=root可以访问成功。(思考:这里面有了一点权限的意思,但是还是不够严格,所有自己实现一个代理服务是较好权限解决的方式)
WebHDFS 和HttpFS之间的区别
WebHDFS内置服务,默认开启,可以直连任意一个节点。重定向到资源所在的datanode,客户端会和nn、dn交互
HttpFS代理HDFS,独立服务,手动开启也提供了restful接口,代理服务,客户端不跟HDFS直接交互
2、Hadoop 常见的文件存储格式
传统文件系统常见文件存储格式很多,例如 jpg,mp3,avi,ppt,word,txt.....
Hadoop 乃至大数据业务通常处理什么类型的数据?文本、视频、图片?文本是否只有txt格式?
可以存储各种类型的数据,是否可以存储其他类型的数据?
BIgData File View工具,跨平台桌面应用,用于查看常见的大数据二进制格式,下载地址
https://github.com/Eugene-Mark/bigdata-file-viewer
可以查看本地文件,也可以直接连接HDFS查看数据,需要对文件进行授权,才能连接成功。
2.1、掌握行式存储、列式存储文件区别
逻辑的表结构数据,以何种方式存储在磁盘上。
行式存储,同一行的数据存储在一起
列式存储,同一列的数据存储在一起
大数据查询较多,插入修改较少,选用列式存储更为适宜
2.2 掌握Hadoop支持的常见的文件存储风格
文本数据
text file格式文本格式是Hadoop生态内部和外部最常见的格式。通常按行存储,以回车符区分不同行数据,缺点不支持块级别压缩,解析开销比二进制格式高尤其是xml、json
sequence file
每条数据记录(record)都是以key:value键值对进行序列化存储(二进制格式)
相比文本格式更紧凑,支持record(行)和block(块)压缩。block就是多个记录(record)的集合。
Avro File
由hadoop 的创始人卡大爷发明的。可切分,可块压缩 ,基于行的存储格式,每个文件中都包含Json格式的schema定义,从而提高互操作性,底层将数据序列化到block中
RCFile
Hive Record Columnr File列记录文件,先划分行组,行组内部列式存储,支持压缩和切分,不支持schema扩展
ORC File
比RC File 更有效的格式默认250M划分一个条纹(stripe)包含索引、数据和页脚索引存储每列的最大值和最小值以及列中每一行的位置。有多种文件压缩方式。
Parquet File
存储模型主要是由行组(Row Group)、列块、页组成。水平方向上将数据分为行组,默认行组大小与HDFS Block块大小一致,行组中,每一个列存储在一起
底层二进制格式存储。
大数据新一代存储格式 Apache Arrow 跨语言平台,列式内存数据结构,主要用于构建数据系统,2016年2月17日成为apache顶级项目。促进了许多组件之间的通讯,缩减了通讯时候序列化和反序列化是时间。例如Spark可以使用python进程发送Arrow数据来执行用户定义的函数
2.3 掌握Hadoop常用文件压缩方式
Linux上使用gzip进行数据压缩。windows上使用zip进行数据压缩。
压缩比:压缩之前/压缩之后 ,越大越好。
压缩解压缩吞吐量:每秒能压缩解压缩多少MB的数据。吞吐量越高越好
压缩算法是偶简单、开源
是否为无损压缩,恢复效果要好
压缩后的文件是否支持split(切分)
Hadoop对文件压缩实现的接口org.apache.hadoop.io.compress.CompressionCodec接口。
bzip2,可切分,压缩比高,压缩时间长
Snappy 不可切分,压缩比一般,压缩、解压缩时间短。
1.6掌握HDFS异构存户和存储策略选择
合理使用、不能一味追求单一性能指标
3、HDFS异构存储和存储策略
HDFS异构数据存储类型。
冷、热、温、冻数据。
热数据:新生成、访问频率高的。
温数据:产生了几个月,访问频率较低
冷数据:产生了几年,几乎不会访问,或很少访问的数据。
冻数据:几乎不访问,产生时间很长的数据。
Hadoop 2.5开始支持异构存储,根据各个存储介质读写性能不同进行选择 RAM DISK(内存)、SSD(固态)、DISK(机械硬盘)默认使用、ARCHIVE(高密度存储介质,存储档案历史数据)
3.1 HDFS中声明定义了4种异构存储类型
HDFS并不具备自动监测存储设备的能力。配置属性时主动声明,配置参数
如果目录前没有带上[SSD] [DISK] [ARCHIVE] [RAM_DISK] 这4种类型中的任何一种,则默认是DISK类型 。
hdfs storagepolicies -setStoragePolicy -path <path> -policy LAZY_PERSIST
块存储指的是对HDFS文件的数据块副本存储。
对于数据的存储介质,HDFS的BlockStoragePolicySuite 定义了六种存储策略
@VisibleForTesting
public static BlockStoragePolicySuite createDefaultSuite() {
BlockStoragePolicy[] policies = new BlockStoragePolicy[16];
byte lazyPersistId = true;
policies[15] = new BlockStoragePolicy((byte)15, "LAZY_PERSIST", new StorageType[]{StorageType.RAM_DISK, StorageType.DISK}, new StorageType[]{StorageType.DISK}, new StorageType[]{StorageType.DISK}, true);
byte allssdId = true;
policies[12] = new BlockStoragePolicy((byte)12, "ALL_SSD", new StorageType[]{StorageType.SSD}, new StorageType[]{StorageType.DISK}, new StorageType[]{StorageType.DISK});
byte onessdId = true;
policies[10] = new BlockStoragePolicy((byte)10, "ONE_SSD", new StorageType[]{StorageType.SSD, StorageType.DISK}, new StorageType[]{StorageType.SSD, StorageType.DISK}, new StorageType[]{StorageType.SSD, StorageType.DISK});
byte hotId = true;
policies[7] = new BlockStoragePolicy((byte)7, "HOT", new StorageType[]{StorageType.DISK}, StorageType.EMPTY_ARRAY, new StorageType[]{StorageType.ARCHIVE});
byte warmId = true;
policies[5] = new BlockStoragePolicy((byte)5, "WARM", new StorageType[]{StorageType.DISK, StorageType.ARCHIVE}, new StorageType[]{StorageType.DISK, StorageType.ARCHIVE}, new StorageType[]{StorageType.DISK, StorageType.ARCHIVE});
byte coldId = true;
policies[2] = new BlockStoragePolicy((byte)2, "COLD", new StorageType[]{StorageType.ARCHIVE}, StorageType.EMPTY_ARRAY, StorageType.EMPTY_ARRAY);
byte providedId = true;
policies[1] = new BlockStoragePolicy((byte)1, "PROVIDED", new StorageType[]{StorageType.PROVIDED, StorageType.DISK}, new StorageType[]{StorageType.PROVIDED, StorageType.DISK}, new StorageType[]{StorageType.PROVIDED, StorageType.DISK});
return new BlockStoragePolicySuite((byte)7, policies);
}
HOT(默认策略) COLD WARM 根据冷热数据区分 ALL_SSD ONE_SSD LAZY_PERSIST 根据磁盘性质区分
列出所有的存储策略
hdfs storagepolicies -listPolicies
设置存储策略
hdfs storagepolicies -setStoragePolicy -path <path> -policy <policy>
取消存储策略
hdfs storagepolicies -unsetStoragePolicy -path <path>
获取存储策略
hdfs storagepolicies -getStoragePolicy -path<path>
3.2 案例:冷热温数据异构存储
<!-- 指定存储介质类型,在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
创建目录结构
hadoop fs -mkdir -p /data/hdfs-test/data_phase/hot
hadoop fs -mkdir -p /data/hdfs-test/data_phase/warm
hadoop fs -mkdir -p /data/hdfs-test/data_phase/cold
设置三个目录的存储策略
hdfs storagepolicies -setStoragePolicy -path /data/hdfs-test/data_phase/hot -policy HOT
hdfs storagepolicies -setStoragePolicy -path /data/hdfs-test/data_phase/warm -policy WARM
hdfs storagepolicies -setStoragePolicy -path /data/hdfs-test/data_phase/cold -policy COLD
查看策略
hdfs storagepolicies -getStoragePolicy -path /data/hdfs-test/data_phase/hot
hdfs storagepolicies -getStoragePolicy -path /data/hdfs-test/data_phase/warm
hdfs storagepolicies -getStoragePolicy -path /data/hdfs-test/data_phase/cold
数据上传
hadoop fs -put /etc/profile /data/hdfs-test/data_phase/hot
hadoop fs -put /etc/profile /data/hdfs-test/data_phase/warm
hadoop fs -put /etc/profile /data/hdfs-test/data_phase/cold
查看不同策略,块文件的存储位置
hdfs fsck /data/hdfs-test/data_phase/hot/profile -files -blocks -locations
hdfs fsck /data/hdfs-test/data_phase/warm/profile -files -blocks -locations
hdfs fsck /data/hdfs-test/data_phase/cold/profile -files -blocks -locations
3.3 HDFS内存存储策略支持 LAZY PERSIST
HDFS支持把数据写入由datanode管理的堆外内存
DataNode异步的将内存数据刷新到磁盘,减少高代价的IO。
虚拟内存盘配置
mount -t tmpfs -o size=32g tmpfs /mnt/dn-tmpfs/
内存存储介质设置
<property>
<name>dfs.datanode.data.dir</name>
<value>/grid/0,/grid/1,/grid/2,[RAM_DISK]/mnt/dn-tmpfs</value>
</property>
参数设置优化
dfs.storage.policy.enabled
是否开启异构存储,默认true开启
dfs.datanode.max.locked.memory
用于在数据节点上的内存中缓存块副本的内存量(以字节为单位)。默认情况下,此参数设置为0,这将禁用 内存中缓存。内存值过小会导致内存中的总的可存储的数据块变少,但如果超过 DataNode 能承受的最大内 存大小的话,部分内存块会被直接移出
在目录上设置存储策略
hdfs storagepolicies -setStoragePolicy -path <path> -policy LAZY_PERSIST
3.4 案例
创建数据存储目录
# 最近一年的数据存放目录
hadoop fs -mkdir -p /source/bank/transfer/log_lte1y
# 大于一年的数据存放目录
hadoop fs -mkdir -p /source/bank/transfer/log_gt1y
指定存储策略
hdfs storagepolicies -setStoragePolicy -path /source/bank/transfer/log_lte1y -policy HOT
hdfs storagepolicies -setStoragePolicy -path /source/bank/transfer/log_gt1y -policy COLD
上传数据
hdfs dfs -put /export/data/bank_record.csv /source/bank/transfer/log_lte1y/bank_record_2022_9.csv
hdfs dfs -put /export/data/bank_record.csv /source/bank/transfer/log_gt1y/bank_record_2016_9.csv
随着时间,将历史数据推送到冷数据
hdfs dfs -mv /source/bank/transfer/log_lte1y/bank_record_2022_9.csv /source/bank/transfer/log_gt1y/bank_record_2022_9.csv
查看最终存储策略
hdfs storagepolicies -getStoragePolicy -path /source/bank/transfer/log_lte1y
hdfs storagepolicies -getStoragePolicy -path /source/bank/transfer/log_gt1y
hdfs fsck /source/bank/transfer/log_lte1y/bank_record_2022_9.csv -files -blocks -locations
hdfs fsck /source/bank/transfer/log_gt1y/bank_record_2016_9.csv -files -blocks -locations
5、