HIVE存储格式和压缩方式
文章目录
一、介绍常用的压缩算法
ZSTD
引用:https://blog.csdn.net/yizhiniu_xuyw/article/details/113811001
LZO
LZO压缩算法特点:
- 解压速度很快,并且很简单;
- 解压时不需要内存支持;
- 压缩的速度还不错;
- 压缩时只需要 64 KiB 的内存支持;
- 压缩比例可以根据需要调节,而这并不影响解压的效率,提高压缩比例自然会降低压缩速度;
- 压缩包含了很多的压缩级别,提供很多选择;
- 提供只需要 8 KiB 内存支持的压缩级别;
- 提供线程安全;
- 提供无损压缩;
SNAPPY
SNAPPY压缩算法特点:
- 快速:压缩速度达到 250 MB / 秒及以上,无需汇编代码。请参阅下面的 “性能”。
- 稳定:在过去的几年中,Snappy 已在 Google 的生产环境中压缩和解压缩了 PB 级的数据。Snappy 位流格式是稳定的,不会在版本之间更改。
- 稳健:Snappy 解压缩器的设计不会在遭到损坏或恶意输入时崩溃。
尽管 Snappy 应该相当轻便,但它主要针对 64 位 x86 兼容处理器进行了优化,并且在其他环境中运行速度可能较慢。
BZIP2
BZIP2压缩算法特点:
- 能够高效的完成文件数据的压缩。这样你就可以把硬盘中冗余繁多的文件,打包压缩整理。在网络上传送文件前,可以先用bzip2打包压缩文件,以减少传送时间,提高效率。虽然bzip2不是最快的压缩工具,但是它已经足够的快且足够的好用。
- 支持修复介质错误。当你需要从包含了一些错误数据的备份磁盘上修复或者获得含有错误数据的压缩文件中的数据时,bzip2仍能完美的解压出没有被破坏的部分。
- 和gzip的用法类似,最简单的打包压缩命令就是“bzip2 【要打包压缩的文件名】”,压缩后生成后缀名为".bz2"的压缩包。
- 这是一款轻量级的工具。 它可以运行在任何含有ANSI C编译器的32位或者64位的主机上。
二、HIVE可支持的压缩格式
HIVE的压缩格式
压缩格式 | 全类路径 |
---|---|
DEFLATE | org.apache.hadoop.io.compress.DefaultCodec |
GZIP | org.apache.hadoop.io.compress.GzipCodec |
BZIP2 | org.apache.hadoop.io.compress.BZip2Codec |
LZO | com.hadoop.compression.lzo.LzopCodec |
SNAPPY | org.apache.hadoop.io.compress.SnappyCodec |
ZSTD | org.apache.hadoop.io.compress.ZStandardCodec |
压缩可以存在很多地方,在mr任务运行时候,map端溢写到磁盘,以及reduce端从磁盘中拉取文件,都有大量的IO操作,都可以设置压缩方法。设置压缩格式的参数如下所示
HIVE配置map/reduce/all 端的压缩算法参数
参数 | 默认值 | 阶段 | 生产环境设置 |
---|---|---|---|
io.compression.codecs (在core-site.xml中配置) | org.apache.hadoop.io.compress.DefaultCodec, org.apache.hadoop.io.compress.GzipCodec, org.apache.hadoop.io.compress.BZip2Codec, org.apache.hadoop.io.compress.Lz4Codec | 输入压缩 | Hadoop使用文件扩展名判断是否支持某种编解码器 |
mapreduce.map.output.compress | false | mapper输出 | 这个参数设为true启用压缩 |
mapreduce.map.output.compress.codec | org.apache.hadoop.io.compress.DefaultCodec | mapper输出 | 使用LZO、LZ4或snappy编解码器在此阶段压缩数据 |
mapreduce.output.fileoutputformat.compress | false | reducer输出 | 这个参数设为true启用压缩 |
mapreduce.output.fileoutputformat.compress.codec | org.apache.hadoop.io.compress. DefaultCodec | reducer输出 | 使用标准工具或者编解码器,如gzip和bzip2 |
mapreduce.output.fileoutputformat.compress.type | RECORD | reducer输出 | SequenceFile输出使用的压缩类型:NONE和BLOCK |
三、HIVE的存储格式
存储格式可以分为两种:行式存储、列式存储
行式存储:
和我们平时认知的形同,一行数据就按照一行存,读取的时候也是一行一行的去读
列式存储:
行式存储是按照行为顺序进行存储,那么列式存储就是按照列为顺序进行存储。
为什么要列式存储呢?
在大数据存储上,数据量大,查询频繁,那么如果行式存储,我们每次查询数据会怎么办?举例:
co1, co2, co3, co4
data1, data2, data3, data4
size1, size2, size3, size4
如果我们要去执行一个语句
select co1, co4 from tbl;
按照行式存储,存储数据格式如下;
data1, data2, data3, data4, size1, size2, size3, size4
我们读取数据的时候要来回的跳,跳到第一个,再跳到第四个
如果按照列式存储,存储数据格式如下;
data1, size1, data2, size2, data3, size3, data4, size4
那我们读取时候,读到了哪个列,把这个列的数据顺序拿出来,然后再到下一个列,就不用像行数存储那样来回跳了。
HIVE支持的存储格式
存储类型 | 格式 |
---|---|
TEXTFILE | 行式存储 |
ORC | 列式存储 |
PARQUET | 列式存储 |
SEQUENCEFILE |
TEXTFILE
SEQUENCEFILE
SEQUENCEFILE特点:
- 支持基于记录(Record)或块(Block)的数据压缩。
- 支持splitable,能够作为MapReduce的输入分片。
- 修改简单:主要负责修改相应的业务逻辑,而不用考虑具体的存储格式。
需要一个合并文件的过程,且合并后的文件不方便查看。
ORC
PARQUET
四、测试存储格式+压缩
hive中指定存储格式和压缩的语法
CREATE [TEMPORARY] [EXTERNAL] TABLE [IF NOT EXISTS] [db_name.]table_name
[(col_name data_type [COMMENT col_comment], ... [constraint_specification])]
[COMMENT table_comment]
[PARTITIONED BY (col_name data_type [COMMENT col_comment], ...)]
[CLUSTERED BY (col_name, col_name, ...) [SORTED BY (col_name [ASC|DESC], ...)] INTO num_buckets BUCKETS]
[ROW FORMAT row_format]
[STORED AS file_format]
[LOCATION hdfs_path]
[TBLPROPERTIES (property_name=property_value, ...)]
[AS select_statement];
TEXTFILE
create table if not exists tmp_bdp.data_test (
json_cloumn string
)
row format delimited
fields terminated by '\t'
stored as textfile
tblproperties("textfile.compress"="NONE");
查看表详情
# Storage Information
SerDe Library: org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe
InputFormat: org.apache.hadoop.mapred.TextInputFormat
OutputFormat: org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat
Compressed: No
Num Buckets: -1
Bucket Columns: []
Sort Columns: []
插入数据,查看表大小
hadoop fs -du -s -h /path/
170G
修改压缩方式为lzo
ALTER TABLE tmp_bdp.data_test SET TBLPROPERTIES ('orc.compress'='LZO');
修改存储方式为ORC
ALTER TABLE tmp_bdp.data_test SET FILEFORMAT ORC;
查看格式是否改变
SerDe Library: org.apache.hadoop.hive.ql.io.orc.OrcSerde
InputFormat: org.apache.hadoop.hive.ql.io.orc.OrcInputFormat
OutputFormat: org.apache.hadoop.hive.ql.io.orc.OrcOutputFormat
Compressed: No
Num Buckets: -1
Bucket Columns: []
Sort Columns: []
格式+压缩 | 文件大小 |
---|---|
textfile+lzo | |
orc+lzo | 85.0G |
orc+snappy | 86.2G |
orc+tszd | 56.8G |
parquet+lzo | 89.4G |
parquet+snappy | 87.1G |
parquet+zstd | 52.8G |