大数据学习笔记-HDFS(二)——数据存储与数据管理

 

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并不具备自动监测存储设备的能力。配置属性时主动声明,配置参数

 

l dfs.datanode.data.dir = [SSD] file :///grid/dn/ssdO

如果目录前没有带上SSD] [DISK] [ARCHIVE] [RAM_DISK4类型中的任何一种,则默认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、

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

天码村

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值