2022-05-13 HDFS 数据存储与数据管理

知识的价值不在于占有,而在于使用。这篇文章主要讲述2022-05-13 HDFS 数据存储与数据管理相关的知识,希望能为你提供帮助。
目录HDFS REST HTTP API 

  • ??HDFS常见的客户端??
  • ??基于RESTful的HDFS API--WebHDFS??
  • ??基于RESTful的代理服务-HttpFS??
  • ??WebHDFS和HttpFS之间区别??
Hadoop常见文件存储格式
  • ??传统文件系统常见文件存储格式??
  • ??BigData File Viewer工具??
  • ??丰富的Hadoop文件存储格式??
  • ??扩展:大数据新一代存储格式Apache Arrow  ??
文件压缩格式
  • ??文件压缩测试体验??
  • ??Hadoop支持的压缩算法??
HDFS异构存储和存储策略
  • ??HDFS异构存储类型??
  • ??块存储类型选择策略???
  • ??案例:冷热温数据异构存储??
  • ??HDFS内存存储策略支持  ??

学习目标??理解什么是RESTful风格????理解HDFS语句RESTful风格的HTTP客户端????掌握行式存储,列式存储文件区别????掌握Hadoop支持的常见文件存储格式????掌握Hadoop常见文件压缩格式????掌握HDFS异构存储和存储策略选择??

HDFS常见的客户端
1.Shell Command
HDFS Shell Command的操作俗称命令行操作。
命令类似于Linux的shell对文件的操作,如ls、mkdir、rm等。
命令格式:  
hadoop fs < args>  
hdfs dfs < args>  

2.Java API 
HDFS java API提供了使用Java代码操作访问HDFS的能力。
HDFS Java API也是大数据开发中常用的HDFS操作方式。
核心类:  
FileSystem  
Configuration 
public class HDFSReadDemo
public static void main(String[] args) throws Exception
//设置客户端用户身份:root 具备在hdfs读写权限
System.setProperty("HADOOP_USER_NAME","root");
//创建Conf对象
Configuration conf = new Configuration();
//设置操作的文件系统是HDFS 默认是file:///
conf.set("fs.defaultFS","hdfs://node1:8020");
//创建FileSystem对象 其是一个通用的文件系统的抽象基类
FileSystem fs = FileSystem.get(conf);
//调用open方法读取文件
FSDataInputStream in = fs.open(new Path("/helloworld.txt"));
//创建本地文件输出流
FileOutputStream out = new FileOutputStream("D:\\\\helloworld.txt");
//IO工具类实现流对拷贝
IOUtils.copy(in,out);
//关闭连接
fs.close();




基于RESTful的HDFS API--WebHDFS
1.WebHDFS概述 
  • WebHDFS 提供了访问HDFS的RESTful接口,内置组件,默认开启。
  • WebHDFS 使得集群外的客户端可以不用安装HADOOP和JAVA环境就可以对HDFS进行访问,且客户端不受语言限制
  • WebHDFS 是HortonWorks开发的,后捐给了Apache。
  • 当客户端请求某文件时,WebHDFS会将其重定向到该资源所在的datanode。
2.WebHDFS使用 
  • 经常使用的HDFS Web UI,其文件浏览功能底层就是基于WebHDFS来操作HDFS实现的。

3.FileSystem URIs vs HTTP URLs
  • WebHDFS的文件系统schema为webhdfs://。
URL格式为:   webhdfs://< HOST> :< HTTP_PORT> /< PATH>    
效果相当于:hdfs://< HOST> :< RPC_PORT> /< PATH>
  • 在RESTful风格的API中,相应的HTTP
URL格式:   http://< HOST> :< HTTP_PORT> /webhdfs/v1/< PATH> ?op=...

4.HTTP RESTful API参数 
官方参数说明 :??https://hadoop.apache.org/docs/current/hadoop-project-dist/hadoop-hdfs/WebHDFS.html#Open_and_Read_a_File ??






5.基于HTTP RESTful API操作演示 
  • 提前安装好Postman测试工具。也可以直接在浏览器地址栏中输入测试。
  • 请求URL:http://node1.itcast.cn:9870/webhdfs/v1/?op=LISTSTATUS
  • 该操作表示要查看根目录下的所有文件以及目录,相当于 hadoop fs -ls / 


  • 读取指定文件内容。   http://node1.itcast.cn:9870/webhdfs/v1/itcast/wordcount/in/word.txt?op=OPEN& noredirect=false   其中noredirect参数用于指定是否重定向到一个datanode,在该节点可以读取文件数据。 

  基于RESTful的代理服务-HttpFS
1.HttpFS概述 
  • HttpFS 是一个提供RESTful 接口的网关的服务器,该网关支持所有HDFS文件系统操作。
  • 对于文件CURD的操作全部提交给HttpFS服务进行中转,然后由HttpFS去跟HDFS集群交互。
  • HttpFS是一个独立于HDFS的服务,若使用需要手动安装。 

2.HttpFS工作原理 
  • HttpFS本身是Java Web应用程序。使用内置的Jetty服务器对外提供服务。
  • HttpFS是一个独立于HDFS的服务。本质上是一个代理服务。
  • HttpFS API的底层通过是映射到HDFS的HTTP RESTful API调用实现的。
  • HttpFS默认端口号为14000。 
3.HttpFS配置--Step1 
  • 配置允许通过代理访问的主机节点、用户所属组。(core-site.xml)
  • 表示root用户可以在任意host主机节点上代表任意group组的用户。
  • *表示所有。
< property>
< name> hadoop.proxyuser.root.hosts< /name>
< value> *< /value>
< /property>
< property>
< name> hadoop.proxyuser.root.groups< /name>
< value> *< /value>
< /property>

4.HttpFS配置--Step2 
同步配置文件到集群中其他节点,并重启HDFS集群。 
cd /export/server/hadoop-3.1.4/etc/hadoop
scp core-site.xml node2:/export/server/hadoop-3.1.4/etc/hadoop/
scp core-site.xml node3:/export/server/hadoop-3.1.4/etc/hadoop/
hdfs --daemon start httpfs


5.HttpFS默认服务
 

6.HttpFS访问指定用户身份 
自测访问: ?" target="_blank">?http://node1.itcast.cn:14000/webhdfs/v1?op=LISTSTATUS???

自测访问:  ??http://node1.itcast.cn:14000/webhdfs/v1?user.name=root& op=LISTSTATUS???


WebHDFS和HttpFS之间区别
区别一:

区别二:
  • 使用内置的WebHDFS REST API操作访问 
http://node1.itcast.cn:9870/webhdfs/v1/?op=LISTSTATUS  
端口由dfs.namenode.http-address指定。默认值9870。 
  • 使用HttpFS web Server 服务操作访问 
http://node1.itcast.cn:14000/webhdfs/v1?user.name=root& op=LISTSTATUS  
端口:14000 



传统文件系统常见文件存储格式
1.常见的文件格式有很多种,例如:JPEG文件用来存储图片、MP3文件用来存储音乐、DOC文件用来存储WORD文档。


?BigData File Viewer工具
  • 一个跨平台(Windows,MAC,Linux)桌面应用程序,用于查看常见的大数据二进制格式,例如Parquet,ORC,AVRO等。支持本地文件系统,HDFS,AWS S3等。
    • github地址:https://github.com/Eugene-Mark/bigdata-file-viewer 
    3.BigData File Viewer用法 
    • 从官网发布页面下载可运行的jar或自己从源代码进行构建。
    • 调用 java -jar BigdataFileViewer-1.2.1-SNAPSHOT-jar-with-dependencies.jar运行
    • 通过“文件”-> “打开”打开二进制格式的文件
    • 通过“文件”-> “另存为”-> “ CSV”转换为CSV文件 

    丰富的Hadoop文件存储格式
    1.行式存储、列式存储
    • 行式存储(Row-Based):同一行数据存储在一起。
    • 列式存储(Column-Based):同一列数据存储在一起。 

    • 优缺点 
    1. 行存储的写入是一次性完成,消耗的时间比列存储少,并且能够保证数据的完整性,缺点是数据读取过程中会产生冗余数据,如果只有少量数据,此影响可以忽略; 数量大可能会影响到数据的处理效率。行适合插入、不适合查询。  
    2. 列存储在写入效率、保证数据完整性上都不如行存储,它的优势是在读取过程,不会产生冗余数据,这对数据完整性要求不高的大数据处理领域,比如互联网,犹为重要。列适合查询,不适合插入。 
    a)Text File 
    • 文本格式是Hadoop生态系统内部和外部的最常见格式。通常按行存储,以回车换行符区分不同行数据。
    • 最大缺点是,它不支持块级别压缩,因此在进行压缩时会带来较高的读取成本。
    • 解析开销一般会比二进制格式高,尤其是XML 和JSON,它们的解析开销比Textfile还要大。
    • 易读性好

    b)Sequence File 
    • Sequence File,每条数据记录(record)都是以key、value键值对进行序列化存储(二进制格式)。
    • 序列化文件与文本文件相比更紧凑,支持record级、block块级压缩。压缩的同时支持文件切分。
    • 通常把Sequence file作为中间数据存储格式。例如:将大量小文件合并放入到一个Sequence File中。 
    b)Sequence File--record 、block 
    • record就是一个kv键值对。其中数据保存在value中。 可以选择是否针对value进行压缩。
    • block就是多个record的集合。block级别压缩性能更好。 


    c)Avro File 
    • Apache Avro是与语言无关的序列化系统,由Hadoop创始人 Doug Cutting开发
    • Avro是基于行的存储格式,它在每个文件中都包含JSON格式的schema定义,从而提高了互操作性并允许schema的变化(删除列、添加列)。 除了支持可切分以外,还支持块压缩。
    • Avro是一种自描述格式,它将数据的schema直接编码存储在文件中,可以用来存储复杂结构的数据。
    • Avro直接将一行数据序列化在一个block中.
    • 适合于大量频繁写入宽表数据(字段多列多)的场景,其序列化反序列化很快。

    d)RCFile 
    • Hive Record Columnar File(记录列文件),这种类型的文件首先将数据按行划分为行组,然后在行组内部将数据存储在列中。很适合在数仓中执行分析。且支持压缩、切分
    • 但不支持schema扩展,如果要添加新的列,则必须重写文件,这会降低操作效率。 

    【2022-05-13 HDFS 数据存储与数据管理】e)ORC File 
    • ORC File(Optimized Row Columnar)提供了比RC File更有效的文件格式。它在内部将数据划分为默认大小为250M的Stripe。每个条带均包含索引,数据和页脚。索引存储每列的最大值和最小值以及列中每一行的位置。
    • 它并不是一个单纯的列式存储格式,仍然是首先根据Stripe分割整个表,在每一个Stripe内进行按列存储。
    • ORC有多种文件压缩方式,并且有着很高的压缩比。文件是可切分(Split)的。
    • ORC文件是以二进制方式存储的,所以是不可以直接读取。 

    f)Parquet File 
    • Parquet是面向分析型业务的列式存储格式,由Twitter和Cloudera合作开发,2015年5月从Apache的孵化器里毕业成为Apache顶级项目。
    • Parquet文件是以二进制方式存储的,所以是不可以直接读取的,文件中包括该文件的数据和元数据,因此Parquet格式文件是自解析的。
    • 支持块压缩。 
    f)Parquet File--结构 
    • Parquet 的存储模型主要由行组(Row Group)、列块(Column Chuck)、页(Page)组成。
    • 在水平方向上将数据划分为行组,默认行组大小与 HDFS Block 块大小对齐,Parquet 保证一个行组会被一个 Mapper 处理。行组中每一列保存在一个列块中,一个列块具有相同的数据类型,不同的列块可以使用不同的压缩。Parquet 是页存储方式,每一个列块包含多个页,一个页是最小的编码的单位,同一列块的不同页可以使用不同的编码方式。
    • 文件的首位都是该文件的Magic Code,用于校验它是否是一个Parquet文件。


    扩展:大数据新一代存储格式Apache Arrow 
    1.Arrow简介 
    • Apache Arrow是一个跨语言平台,是一种列式内存数据结构,主要用于构建数据系统。
    • Apache Arrow在2016年2月17日作为顶级Apache项目引入。 

    • Arrow促进了许多组件之间的通信。
    • 极大的缩减了通信时候序列化、反序列化所浪费的时间。 

    2.Arrow如何提升数据移动性能 
    • 利用Arrow作为内存中数据表示的两个过程可以将数据从一种方法“重定向”到另一种方法,而无需序列化或反序列化。 例如,Spark可以使用python进程发送Arrow数据来执行用户定义的函数。
    • 无需进行反序列化,可以直接从启用了Arrow的数据存储系统中接收Arrow数据。 例如,Kudu可以将Arrow数据直接发送到Impala进行分析。
    • Arrow的设计针对嵌套结构化数据(例如在Impala或Spark Data框架中)的分析性能进行了优化。 


    文件压缩测试体验
    1.压缩算法优劣指标 
    • 压缩比
    原先占100份空间的东西经压缩之后变成了占20份空间,那么压缩比就是5,显然压缩比越高越好。
    • 压缩/解压缩吞吐量(时间)
      每秒能压缩或解压缩多少MB的数据。吞吐量也是越高越好。
    • 压缩算法实现是否简单、开源
    • 是否为无损压缩。恢复效果要好。
    • 压缩后的文件是否支持split(切分) 
    Hadoop支持的压缩算法
    1.Hadoop支持的压缩算法
    • Haodop对文件压缩均实现org.apache.hadoop.io.compress.CompressionCodec接口。
    • 所有的实现类都在org.apache.hadoop.io.compress包下。 
     
    2.Hadoop支持的压缩对比  ?
    ?压缩格式
    工具
    算法
    文件扩展名
    是否可切分
    对应的编码解码器
    DE

      推荐阅读