hive和hadoop 数据压缩与存储格式选择

概述
为什么会出现需要对文件进行压缩? 
在Hadoop中,文件需要存储、传输、读取磁盘、写入磁盘等等操作,而文件的大小,直接决定了这些这些操作的速度。

压缩在大数据中的使用

为什么需要压缩?

1) 存储

2) 网络/磁盘IO 

常见压缩方式、压缩比、压缩解压缩时间、是否可切分

原文件:1403M

Snappy 压缩:701M,压缩时间:6.4s,解压时间:19.8s,不可切分

LZ4 压缩:693M,压缩时间:6.4s,解压时间:2.36s,不可切分

LZO 压缩:684M,压缩时间:7.6s,解压时间:11.1s,带序号可切分

GZIP 压缩:447M,压缩时间:85.6s,解压时间:21.8s,不可切分

BZIP2:压缩:390M,压缩时间:142.3s,解压时间:62.5s,可切分

总结:压缩比和压缩时间成反比,压缩比越小,耗费时间越大

两个矛盾:

耗费CPU、时间与存储空间、传输速度、IO的矛盾 
压缩比与压缩、解压缩时间的矛盾 
ps:追求合适场景使用合适方式

 

1)为什么压缩

2) 如何选择压缩

3)压缩率大概是多少

4)如何在MR中使用压缩

5)如何在hive中使用压缩(hive-site.xml 层面,执行SQL层面,个人推荐SQL层次使用压缩)

 

图解MapReduce

hadoop压缩的主要作用是什么 hadoop默认压缩格式_数据压缩

1.第一次传入压缩文件,应选用可以切片的压缩方式,否则整个文件将只有一个Map执行

2.第二次压缩应选择压缩解压速度快的压缩方式

3.第三次压缩有两种场景分别是:一.当输出文件为下一个job的输入,选择可切分的压缩方式例如:BZip2。二.当输出文件直接存到HDFS,选择压缩比高的压缩方式。

 

hive参数
hive.exec.compress.output 设置是否压缩
mapreduce.output.fileoutputformat.compress.codec 设置压缩Reduce类型输出
hive.intermediate.compression.codec 设置中间Map压缩类型
可选类型:
org.apache.hadoop.io.compress.DefaultCodec
org.apache.hadoop.io.compress.GzipCodec
org.apache.hadoop.io.compress.BZip2Codec
com.hadoop.compression.lzo.LzoCodec
org.apache.hadoop.io.compress.Lz4Codec
org.apache.hadoop.io.compress.SnappyCodec
 定义压缩方式的选择
1)  写进相关配置文件中
core-site.xml   
 <property>
 <name>io.compression.codecs</name>
 <value>
 org.apache.hadoop.io.compress.GzipCodec,
 org.apache.hadoop.io.compress.DefaultCodec,
 org.apache.hadoop.io.compress.BZip2Codec,
 org.apache.hadoop.io.compress.SnappyCodec
 </value>
 </property>  mapred-site.xml   switch+codec
 <property>
 <name>mapreduce.output.fileoutputformat.compress</name>
 <value>true</value>
 </property> <property>
 <name>mapreduce.output.fileoutputformat.compress.codec</name>
 <value>org.apache.hadoop.io.compress.BZip2Codec</value>
 </property> 2)  第二种方式 在 hive 客户端代码层实现
mapreduce.map.output.fileoutputformat.compress
SET hive.exec.compress.output=true;
 SET mapreduce.output.fileoutputformat.compress.codec=org.apache.hadoop.io.compress.BZip2Codec; create table page_views_bzip2
 ROW FORMAT DELIMITED FIELDS TERMINATED BY "\t"
 as select * from page_views; create table page_views_snappy
 ROW FORMAT DELIMITED FIELDS TERMINATED BY "\t"
 as select * from page_views;===存储格式在hive 中应用=== 
 file_format:
  :
  | SEQUENCEFILE
  | TEXTFILE -- (Default, depending on hive.default.fileformat configuration)
  | RCFILE    -- (Note: Available in Hive 0.6.0 and later)
  | ORC    -- (Note: Available in Hive 0.11.0 and later)
  | PARQUET? -- (Note: Available in Hive 0.13.0 and later)
  | AVRO    -- (Note: Available in Hive 0.14.0 and later)
  | INPUTFORMAT input_format_classname OUTPUTFORMAT output_format_classname

 行式存储
 1)一行记录的所有记录字段都存放在一个block中
 2)多列加载
 3)压缩比
 
 列式存储
 1)只加载需要的列
 2) 更高的压缩比
 缺点:重构

 
 总结:
 1) 磁盘IO、网络IO
 2) 节省空间
 -->> 提高查询性能(向量化)

 
数据存储
 * 按行存储数据
  SEQUENCEFILE /TEXTFILE
 * 按列存储数据
  RC/ORC/PARQUET/AVRO

1、创建存储类型为textfile的hive表

create table page_views(
 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/datas/page_views.data' into table page_views ;

2、创建存储类型为orc的hive表

 https://cwiki.apache.org/confluence/display/Hive/LanguageManual+ORC 官方相关文档

File formats are specified at the table (or partition) level. You can specify the ORC file format with HiveQL statements such as these:
CREATE TABLE ... STORED AS ORC
 ALTER TABLE ... [PARTITION partition_spec] SET FILEFORMAT ORC
 SET hive.default.fileformat=Orc
 The parameters are all placed in the TBLPROPERTIES (see Create Table). They are:

文件格式数据不能直接导入到seq或是RC或是orc ,

必须要先讲文本格式数据导入到textfile表中,再insert into 到seq/rc/orc 表中

RC三种创建/使用方式:

1, STORED AS ORC;
 2, ROW FORMAT SERDE 'org.apache.hadoop.hive.ql.io.orc.OrcSerde' with serdeproperties('serialization.null.format' = '') STORED AS ORC;
 3, ROW FORMAT DELIMITED NULL DEFINED AS '' STORED AS ORC;create table page_views_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 ;导入数据:
insert into table page_views_orc select * from page_views ;

3、创建存储类型为parquet的hive表

create table page_views_parquet(
 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 ;导入数据
insert into table page_views_parquet select * from page_views ;

===存储格式在Hadoop 中应用=== 

hadoop压缩的主要作用是什么 hadoop默认压缩格式_数据压缩_02

hadoop压缩的主要作用是什么 hadoop默认压缩格式_hadoop压缩的主要作用是什么_03

hadoop压缩的主要作用是什么 hadoop默认压缩格式_hive_04