欢迎投稿

今日深度:

Hive(4)Hive中的文件,

Hive(4)Hive中的文件,


文章目录

      • 文件压缩
        • 1 压缩模式
          • 1.为什么要压缩
          • 2.压缩模式评价
          • 3.可分割
        • 2 压缩算法
          • 1.压缩算法
          • 2.Hadoop编码/解码
          • 3.设置压缩模式参数
          • 4.Hadoop压缩
        • 3 文件存储格式
          • 1.行式存储
          • 2.列式存储
        • 4 Hive中的文件
      • 文件类型
        • 1 textfile
        • 2 sequencefile
        • 3 RCFILE
        • 4 ORCFILE
        • 5 Parquet
        • 6 AVRO
        • 文件存储情况

文件压缩

1 压缩模式

1.为什么要压缩

在Hive中对中间数据或最终数据做压缩,是提高数据吞吐量和性能的一种手段。对数据做压缩,可以大量减少磁盘的存储空间,比如基于文本的数据文件,可以将文件压缩40%或更多。同时压缩后的文件在磁盘间传输和I/O也会大大减少;当然压缩和解压缩也会带来额外的CPU开销,但是却可以节省更多的I/O和使用更少的内存开销。

2.压缩模式评价
  • 压缩比
    压缩比越高,压缩后文件越小,所以压缩比越高越好。
  • 压缩时间
    越快越好
  • 已经压缩的格式文件是否可以再分割
    可以分割的格式允许单一文件由多个Mapper程序处理,可以更好的并行化。
3.可分割

考虑存储在HDFS中的未压缩的文件,其大小为1GB,HDFS的块大小为128M,所以该文件将被存储为8块,将此文件用作输入的MapReduce作业会创建1个输入分片(split,也叫“分块”。对于block,我们统一称为“块”)每个分片都被作为一个独立map任务的输入单独进行处理。

2 压缩算法

1.压缩算法

  • 常见的压缩格式
2.Hadoop编码/解码

3.设置压缩模式参数
  • Hive中间数据压缩

    hive.exec.compress.intermediate
    设置为true为激活中间数据压缩功能,在这个阶段,优先选择一个低CPU开销的算法

    mapred.map.output.compression.codec
    具体的压缩算法的配置参数,SnappyCodec比较适合在这种场景中编解码器,该算法会带来很好的压缩性能和较低的CPU开销

  • Hive最终数据压缩

    hive.exec.compress.output
    用户可以对最终生成的Hive表的数据通常也需要压缩

    mapred.output.compression.codec
    将hive.exec.compress.output参数设置成true后,然后选择一个合适的编解码器,如选择SnappyCodec

io.compression.codecs 为整体的io方式
而mapred.map.output.compression.codec为map的输出编码
mapred.output.compress为mapreduce结束后的编码

4.Hadoop压缩
  • 配置压缩参数

mapreduce.output.fileoutputformat.compress
用于输出

mapreduce.map.output.compress
用于Mapper程序中间输出

mapreduce.output.fileoutputformat.compress.codec
为输出配置默认的编码解码器

mapreduce.map.output.compress.codec
Mapper程序中间输出配置默认的编码解码器

  • 配置压缩方式
    1. 打开压缩用于输出,在配置时添加下面几行:
Configuration cond = new Configuration();
Jon job = new Job(conf);
FileOutput.setCompressOutput(job,true);
FileOutput.setOutputCompressionClass(job,GzipCodec.class);
//使用Snappy的编码解码器
FileOutputFormat.setOutputCompressionClass(job,SnappyCodec.class)
  1. 打开压缩用于Mapper程序的中间输出,在配置时我们添加下面的几行
Configuration conf = new Configuration();
conf.setBoolean("mapreduce.map.output.compress",true);
conf.setClass("mapreduce.map.output.compress.codec",GzipCodec.class,CompressionCodec.class);
FileOutput.setCompressOutput(job,true);
FileOutput.setOutputCompressionClass(job,GzipCodec.class);
Job job = new Job(conf)

3 文件存储格式

1.行式存储

查询满足条件的一整行数据的时候,列存储则需要去每个聚集的字段找到对应的每个列的值,行存储只需要找到其中一个值,其余的值都在相邻地方,所以此时行存储查询的速度更快

  • HDFS块内行存储
2.列式存储

因为每个字段的数据聚集存储,在查询只需要少数几个字段的时候,能大大减少读取的数据量;每个字段的数据类型一定是相同的,列式存储可以针对性的设计更好的设计压缩算法

  • HDFS块内列存储

4 Hive中的文件

  • TEXTFILE
    Hive默认格式,数据不做压缩,磁盘开销大,数据解析开销大。
    可结合Gzip、Bzip2、Snappy等使用(系统自动检查,执行查询时自动解压),但使用这种方式,hive不会对数据进行切分,从而无法对数据进行并行操作
  • SEQUENCEFILE
    SequenceFile是Hadoop API 提供的一种二进制文件,它将数据以<key,value>的形式序列化到文件中。这种二进制文件内部使用Hadoop 的标准的Writable 接口实现序列化和反序列化。它与Hadoop API中的MapFile 是互相兼容的。Hive 中的SequenceFile 继承自Hadoop API 的SequenceFile,不过它的key为空,使用value 存放实际的值, 这样是为了避免MR 在运行map 阶段的排序过程

Header通过头文件格式

Block-Compressed SequenceFile格式

  • RCFILE
    RCFile是Hive推出的一种专门面向列的数据格式。 它遵循“先按行划分,再垂直划分”的设计理念。

    RCFile结合行存储查询的快速和列存储节省空间的特点:首先,RCFile保证同一行的数据位于同一节点,因此元组重构的开销很低;其次,像列存储一样,RCFile能够利用列维度的数据压缩,并且能跳过不必要的列读取
  • ORCFILE(0.11以后出现)
    hive/spark都支持这种存储格式,它存储的方式是采用数据按照行分块,每个块按照列存储,其中每个块都存储有一个索引。特点是数据压缩率非常高
  • PAEQUET
    Parquet也是一种行式存储,同时具有很好的压缩性能;同时可以减少大量的表扫描和反序列化的时间
  • 磁盘空间占用大小比较
    orc < parquet < textfile

    这个大小趋势适用于较大的数据,在数据量较小的情况下,可能会出现与之相悖的结论

  • 查询语句运行时间大小比较
    orc < parquet < textfile

    这个大小趋势适用于较大的数据,在数据量较小的情况下,可能会出现与之相悖的结论

  1. 总结
  • TextFile默认格式,加载速度最快,可以采用Gzip进行压缩,压缩后的文件无法split,即并行处理
  • SequenceFile压缩率最低,查询速度一般,将数据存放到sequenceFile格式的hive表中,这时数据就会压缩存储。三种压缩格式NONE,RECORD,BLOCK。是可分割的文件格式
  • RCfile压缩率最高,查询速度最快,数据加载最慢
  • 相比TEXTFILE和SEQUENCEFILE,RCFILE由于列式存储方式,数据加载时性能消耗较大,但是具有较好的压缩比和查询响应。数据仓库的特点是一次写入、多次读取,因此,整体来看,RCFILE相比其余两种格式具有较明显的优势
  • 在hive中使用压缩需要灵活的方式,如果是数据源的话,采用RCFile+bz或RCFile+gz的方式,这样可以很大程度上节省磁盘空间;而在计算的过程中,为了不影响执行的速度,可以浪费一点磁盘空间,建议采用RCFile+snappy的方式,这样可以整体提升hive的执行速度。至于lzo的方式,也可以在计算过程中使用,只不过综合考虑(速度和压缩比)还是考虑snappy适宜

文件类型

  • 文件格式说明
    常见的hive文件存储格式包括以下几类:TEXTFILE、SEQUENCEFILE、RCFILE、ORC。其中TEXTFILE为默认格式,建表时默认为这个格式,导入数据时会直接把数据文件拷贝到hdfs上不进行处理。SequenceFile、RCFile、ORC格式的表不能直接从本地文件导入数据,数据要先导入到TextFile格式的表中,然后再从TextFile表中用insert导入到SequenceFile、RCFile表中。
    创建一个非压缩的表存储数据
hive> create database day0325;
OK
Time taken: 2.53 seconds
hive> use day0325;
OK
Time taken: 0.175 seconds
//创建表
hive> create table student(
    > id int,
    > name string,
    > age int)
    > row format delimited fields terminated by '\t'
    > stored as textfile;
OK
Time taken: 1.682 seconds
//源数据
[yao@master data]$ cat student1.txt
1001	shiny	23
1002	cendy	22
1003	angel	23
1009	ella	21
1012	eva	24
//加载数据
hive> load data local inpath '/home/yao/data/student1.txt' into table student;
Loading data to table day0325.student
Table day0325.student stats: [numFiles=1, totalSize=67]
OK
Time taken: 4.314 seconds

1 textfile

  • DEFLATE压缩
//创建表
hive> create table student_delfate(
    > id int,
    > name string,
    > age int)
    > row format delimited fields terminated by '\t'
    > stored as textfile;
OK
Time taken: 0.228 seconds
//设置压缩类型
hive> set hive.exec.compress.output=true;		//打开压缩功能
hive> set mapred.output.compress=true;			//设置输出最终模式为压缩
hive> set mapred.output.compression.codec=org.apache.hadoop.io.compress.DefaultCodec;		//设置以Default为压缩格式

//不能再用load等方式加载数据,只能以insert的方式加载数据
hive> insert overwrite table student_delfate select * from student;	
//查看结果		
hive> dfs -ls /user/hive/warehouse/day0325.db/student_delfate;
Found 1 items
-rwxr-xr-x   1 yao supergroup         64 2019-03-25 15:55 /user/hive/warehouse/day0325.db/student_delfate/000000_0.deflate
hive> dfs -cat /user/hive/warehouse/day0325.db/student_delfate/000000_0.deflate;
x3400⭎Ɍ«Ⲳ䰴00ዎ̋

www.htsjk.Com true http://www.htsjk.com/hive/33394.html NewsArticle Hive(4)Hive中的文件, 文章目录 文件压缩 1 压缩模式 1.为什么要压缩 2.压缩模式评价 3.可分割 2 压缩算法 1.压缩算法 2.Hadoop编码/解码 3.设置压缩模式参数 4.Hadoop压缩 3 文件存储格式...
相关文章
    暂无相关文章
评论暂时关闭