IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 大数据 -> Hive 压缩和存储 -> 正文阅读

[大数据]Hive 压缩和存储

Hadoop 压缩配置

MR支持的压缩编码

压缩格式算法文件扩展名是否可切分
DEFLATEDEFLATE.deflate
GzipDEFLATE.gz
bzip2bzip2.bz2
LZOLZO.lzo
SnappySnappy.snappy

Hadoop引入了编码/解码器 :

压缩格式对应的编码/解码器
DEFLATEorg.apache.hadoop.io.compress.DefaultCodec
gziporg.apache.hadoop.io.compress.GzipCodec
bzip2org.apache.hadoop.io.compress.BZip2Codec
LZOcom.hadoop.compression.lzo.LzopCodec
Snappyorg.apache.hadoop.io.compress.SnappyCodec

压缩性能的比较:

压缩算法原始文件大小压缩文件大小压缩速度解压速度
gzip8.3GB1.8GB17.5MB/s58MB/s
bzip28.3GB1.1GB2.4MB/s9.5MB/s
LZO8.3GB2.9GB49.3MB/s74.6MB/s

压缩参数配置

mapred-site.xml :

参数默认值阶段建议
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输入压缩文件扩展名判断是否支持某种编解码器
mapreduce.map.output.compressfalsemapper输出true 启用压缩
mapreduce.map.output.compress.codecorg.apache.hadoop.io.compress.DefaultCodecmapper输出使用LZO、LZ4、snappy编解码器在此阶段压缩
mapreduce.output.fileoutputformat.compressfalsereducer输出true 启用压缩
mapreduce.output.fileoutputformat.compress.codecorg.apache.hadoop.io.compress. DefaultCodecreducer输出编解码器,如 : gzip、bzip2
mapreduce.output.fileoutputformat.compress.typeRECORDreducer输出SequenceFile输出压缩类型:NONE、BLOCK

开启Map输出阶段压缩

开启 map 输出阶段压缩可以减少 job 中 map 和 Reduce task 间数据传输量

开启 hive 中间传输数据压缩功能

set hive.exec.compress.intermediate=true;

开启 mapreduce 中 map 输出压缩功能

set mapreduce.map.output.compress=true;

设置 mapreduce 中 map 输出数据的压缩方式

set mapreduce.map.output.compress.codec=org.apache.hadoop.io.compress.SnappyCodec;

执行查询语句

select count(ename) name from emp;

开启 Reduce 输出阶段压缩

当 Hive 将输出写入到表中时,输出内容可以进行压缩 , 属性 hive.exec.compress.output 控制该功能

  • false : 输出非压缩的纯文本文件
  • true : 输出结果压缩功能

开启 hive 最终输出数据压缩功能

set hive.exec.compress.output=true;

开启 mapreduce 最终输出数据压缩

set mapreduce.output.fileoutputformat.compress=true;

设置 mapreduce 最终数据输出压缩方式

set mapreduce.output.fileoutputformat.compress.codec = org.apache.hadoop.io.compress.SnappyCodec;

设置 mapreduce 最终数据输出压缩为块压缩

set mapreduce.output.fileoutputformat.compress.type=BLOCK;

输出结果是否是压缩文件

insert overwrite local directory '/opt/module/hive-3.1.2/datas/distribute-result' select * from emp distribute by deptno sort by empno desc;

文件存储格式

Hive 支持的存储数据的格式:

  • TEXTFILE
  • SEQUENCEFILE
  • ORC
  • PARQUET

列式存储和行式存储

image-20220426152711605

左边 : 逻辑表

右边 : 第一 : 行式存储,第二 : 列式存储

行存储的特点

查询满足条件的一整行数据时,行存储只需要找到其中一个值,其余的值都在相邻地方,所以行存储查询的速度更快

列存储的特点

每个字段的数据聚集存储,在查询只需要少数几个字段时,能减少读取的数据量

每个字段的数据类型一定是相同的,列式存储有更好的设计压缩算法

  • 行存储 : TEXTFILE , SEQUENCEFILE

  • 列式存储 : ORC , PARQUET

TextFile 格式

默认格式,数据不做压缩,磁盘开销大,数据解析开销大

可与 Gzip ( 不切分 ) 、Bzip2 使用

Orc 格式

Orc (Optimized Row Columnar) : Hive 0.11 版里引入的新存储格式

每个 Orc 文件由 n 个 stripe 组成,每个 stripe 一般为 HDFS 的块大小,每一个 stripe 包含多条记录,这些记录按照列进行独立存储,对应到 Parquet 中的 row group

Stripe 三部分组成 :

  • Index Data
  • Row Data
  • Stripe Footer

image-20220426154147806

Index Data:轻量级的 index,默认是每隔 1W 行做一个索引。索引只记录某行的各字段在 Row Data 中的 offset

Row Data:存的具体的数据,先取部分行,然后对这些行按进行存储。对每个列进行了编码,分成多个 Stream 来存储

Stripe Footer:存的各个 Stream 的类型,长度等信息

File Footer : 存的每个 Stripe 的行数,每个 Column 的数据类型信息

PostScript : 存的整个文件的压缩类型以及 FileFooter 的长度信息

读取文件 :

  • seek 到文件尾部读 PostScript ,从里面解析 File Footer 长度
  • 再读 FileFooter ,从里面解析 各个 Stripe 信息
  • 再读各个 Stripe ,即从后往前读

Parquet 格式

Parquet 文件以二进制方式存储的,所以不可以直接读取,文件中包括 : 数据和元数据 ( 自解析 )

行组( Row Group ) :每一个行组包含一定的行数,在一个 HDFS 文件中至少存储一个行组,类似 : orc 的 stripe

列块(Column Chunk):在一个行组中每一列保存在一个列块中,行组中的所有列连续的存储在这个行组文件中。一个列块中的值都是相同类型的,不同的列块可能用不同的算法进行压缩

页(Page):每一个列块有多个页 ( 最小的编码的单位 ),在同一个列块的不同页可能使用不同的编码

存储 Parquet 数据时会按照 Block 大小设置行组的大小,每个 Mapper 任务处理数据的最小单位是一个 Block ,可以把每行组由一个 Mapper 任务处理,增大任务执行并行度

Parquet 文件的格式 :

image-20220426154158532

一个 Parquet 文件的内容,一个文件中可以存储多个行组

  • Magic Code : 文件的首位 , 用于校验它是否是一个 Parquet 文件
  • Footer length : 记录了文件元数据的大小,通过该值和文件长度可以计算出元数据的偏移量
  • 文件的元数据包括 : 每一个行组的元数据信息 和 存储数据的 Schema 信息

除了文件中每个行组的元数据,每一页的开始都会存储该页的元数据,

在 Parquet 中,有三种类型的页:

  • 数据页 : 用于存储当前行组中该列的值
  • 字典页 : 存储该列值的编码字典,每一个列块中最多包含一个字典页
  • 索引页 : 用来存储当前行组下该列的索引,目前 Parquet 还不支持索引页

存储格式对比实验

从存储文件的压缩比和查询速度两个角度对比

压缩比测试

TextFile

创建表,存储数据格式为TEXTFILE

create table log_text(
track_time string,
url string,
session_id string,
referer string,
ip string,
end_user_id string,
city_id string
)
row format delimited fields terminated by '\t'
stored as textfile;

向表中加载数据

load data local inpath '/opt/module/hive-3.1.2/datas/log.data' into table log_text;

查看表中数据大小

dfs -du -h /user/hive/warehouse/log_text;

ORC

创建表,存储数据格式为ORC

create table log_orc(
track_time string,
url string,
session_id string,
referer string,
ip string,
end_user_id string,
city_id string
)
row format delimited fields terminated by '\t'
stored as orc
tblproperties("orc.compress" = "NONE");
-- 设置orc存储不使用压缩

向表中加载数据

insert into table log_orc select * from log_text;

查看表中数据大小

dfs -du -h /user/hive/warehouse/log_orc/ ;

Parquet

创建表,存储数据格式 : parquet

create table log_parquet(
track_time string,
url string,
session_id string,
ip string,
end_user_id string,
city_id string
)
row format delimited fields terminated by '\t'
stored as parquet;

向表中加载数据

insert into table log_parquet select * from log_text;

查看表中数据大小

dfs -du -h /user/hive/warehouse/log_parquet/ ;

存储文件的对比总结:ORC > Parquet > textFile

查询速度测试

TextFile

insert overwrite local directory '/opt/module/hive-3.1.2/datas/log_text' select substring(url, 1, 4) from log_text;

ORC

insert overwrite local directory '/opt/module/hive-3.1.2/datas/log_orc' select substring(url, 1, 4) from log_orc;

Parquet

insert overwrite local directory '/opt/module/hive/datas/log_parquet' select substring(url, 1, 4) from log_parquet;

存储文件的查询速度总结:查询速度相近

存储和压缩结合

ORC 存储方式的压缩:

KeyDefaultNotes
orc.compressZLIB高压缩 (NONE, ZLIB, SNAPPY)
orc.compress.size262,144每个压缩块中的字节数
orc.stripe.size268,435,456每个条的字节数
orc.row.index.stride10,000索引项之间的行数( > 1000)
orc.create.indextrue是否创建行索引
orc.bloom.filter.columns“”创建布隆过滤器的列名的逗号分隔列表
orc.bloom.filter.fpp0.05布隆过滤器的错误率(> 0.0 & < 1.0)

ORCFile 的参数都是在 HQL 语句的 TBLPROPERTIES 字段里面出现

官网: https://cwiki.apache.org/confluence/display/Hive/LanguageManual+ORC

创建 ZLIB 压缩的 ORC 存储方式

建表语句

create table log_orc_zlib(
track_time string,
url string,
session_id string,
referer string,
ip string,
end_user_id string,
city_id string
)
row format delimited fields terminated by '\t'
stored as orc
tblproperties("orc.compress" = "ZLIB");

插入数据

insert into log_orc_zlib select * from log_text;

查看插入后数据

dfs -du -h /user/hive/warehouse/log_orc_zlib/ ;

创建 SNAPPY 压缩的 ORC 存储方式

建表语句

create table log_orc_snappy(
track_time string,
url string,
session_id string,
referer string,
ip string,
end_user_id string,
city_id string
)
row format delimited fields terminated by '\t'
stored as orc
tblproperties("orc.compress" = "SNAPPY");

插入数据

insert into log_orc_snappy select * from log_text;

查看插入后数据

dfs -du -h /user/hive/warehouse/log_orc_snappy/ ;

ZLIB 比 Snappy 压缩还小

原因 : ZLIB 采用 deflate 压缩算法。比 snappy 压缩的压缩率高

创建 SNAPPY 压缩的 parquet 存储方式

建表语句

create table log_parquet_snappy(
track_time string,
url string,
session_id string,
referer string,
ip string,
end_user_id string,
city_id string
)
row format delimited fields terminated by '\t'
stored as parquet
tblproperties("parquet.compression" = "SNAPPY");

插入数据

insert into log_parquet_snappy select * from log_text;

查看插入后数据

dfs -du -h /user/hive/watehouse/log_parquet_snappy/ ;

总结

hive 表的存储格式一般选择:

  • orc
  • parquet

压缩方式一般选择 :

  • snappy
  • lzo
  大数据 最新文章
实现Kafka至少消费一次
亚马逊云科技:还在苦于ETL?Zero ETL的时代
初探MapReduce
【SpringBoot框架篇】32.基于注解+redis实现
Elasticsearch:如何减少 Elasticsearch 集
Go redis操作
Redis面试题
专题五 Redis高并发场景
基于GBase8s和Calcite的多数据源查询
Redis——底层数据结构原理
上一篇文章      下一篇文章      查看所有文章
加:2022-05-11 16:30:44  更:2022-05-11 16:32:56 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/23 23:18:21-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码