目录
[Text File](#Text File)
文件格式和压缩
Hadoop压缩概述
压缩格式
压缩格式 | 算法 | 文件扩展名 | 是否可切分 |
---|---|---|---|
DEFLATE | DEFLATE | .deflate | 否 |
Gzip | DEFLATE | .gz | 否 |
bzip2 | bzip2 | .bz2 | 是 |
LZO | LZO | .lzo | 是 |
Snappy | Snappy | .snappy | 否 |
为了支持多种压缩/解压缩算法,Hadoop引入了编码/解码器:
压缩格式 | 对应的编码/解码器 |
---|---|
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 |
压缩性能比较:
压缩算法 | 原始文件大小 | 压缩文件大小 | 压缩速度 | 解压速度 |
---|---|---|---|---|
gzip | 8.3GB | 1.8GB | 17.5MB/s | 58MB/s |
bzip2 | 8.3GB | 1.1GB | 2.4MB/s | 9.5MB/s |
LZO | 8.3GB | 2.9GB | 49.3MB/s | 74.6MB/s |
Snappy压缩性能:
- 在Core i7处理器单核64位模式下,Snappy压缩速度约为250 MB/s,解压缩速度约为500 MB/s或更高。
参考链接: [snappy | A fast compressor/decompressorA fast compressor/decompressorhttp://google.github.io/snappy/]
Hive文件格式
为Hive表中的数据选择一个合适的文件格式,对提高查询性能至关重要。Hive表数据的存储格式包括text file、orc、parquet、sequence file等。
Text File
文本文件是Hive默认使用的文件格式。
创建文本文件格式的表语句如下:
sql
CREATE TABLE textfile_table
(
column_specs
)
STORED AS TEXTFILE;
ORC
1)文件格式
ORC(Optimized Row Columnar)是一种列式存储的文件格式,能够提高Hive读写数据和处理数据的性能。
与列式存储相对的是行式存储,下图是两者的对比:
如图所示左边为逻辑表,右边第一个为行式存储,第二个为列式存储。
2)结构
每个Orc文件由Header、Body和Tail三部分组成。每个stripe由Index Data、Row Data和Stripe Footer组成。Tail由File Footer和PostScript组成。
3)建表语句
sql
CREATE TABLE orc_table
(
column_specs
)
STORED AS ORC
TBLPROPERTIES (property_name=property_value, ...);
ORC文件格式支持的参数如下:
参数 | 默认值 | 说明 |
---|---|---|
orc.compress | ZLIB | 压缩格式 |
orc.compress.size | 262,144 | 每个压缩块的大小 |
orc.stripe.size | 67,108,864 | 每个stripe的大小 |
orc.row.index.stride | 10,000 | 索引步长 |
Parquet
Parquet是一个通用的列式存储文件格式。
1)文件格式
Parquet文件的基本结构由若干个Row Group和一个Footer(File Meta Data)组成。
2)结构
每个Row Group包含多个Column Chunk,每个Column Chunk包含多个Page。
3)建表语句
sql
CREATE TABLE parquet_table
(
column_specs
)
STORED AS PARQUET
TBLPROPERTIES (property_name=property_value, ...);
Parquet文件格式支持的参数如下:
参数 | 默认值 | 说明 |
---|---|---|
parquet.compression | uncompressed | 压缩格式 |
parquet.block.size | 134217728 | 行组大小 |
parquet.page.size | 1048576 | 页大小 |
压缩
Hive表数据进行压缩
1)TextFile
对于TextFile类型的表,可以通过设置以下参数确保输出结果被压缩:
sql
SET hive.exec.compress.output=true;
SET mapreduce.output.fileoutputformat.compress.codec=org.apache.hadoop.io.compress.SnappyCodec;
2)ORC
sql
CREATE TABLE orc_table
(
column_specs
)
STORED AS ORC
TBLPROPERTIES ("orc.compress"="snappy");
3)Parquet
sql
CREATE TABLE parquet_table
(
column_specs
)
STORED AS PARQUET
TBLPROPERTIES ("parquet.compression"="snappy");
计算过程中使用压缩
1)单个MR的中间结果进行压缩
sql
SET mapreduce.map.output.compress=true;
SET mapreduce.map.output.compress.codec=org.apache.hadoop.io.compress.SnappyCodec;
2)单条SQL语句的中间结果进行压缩
sql
SET hive.exec.compress.intermediate=true;
SET hive.intermediate.compression.codec=org.apache.hadoop.io.compress.SnappyCodec;