(一) 知识储备
(测试版本为基于Ambari2.5.1的hive1.2.1000)
1、压缩格式
执行命令:set io.compression.codecs;查看目前hive已加载的编解码器
GzipCodec:压缩后的文件不支持split,压缩后为.gz文件
DefaultCodec:压缩后文件为.deflate文件
SnappyCodec:压缩后的文件不支持split,压缩后为.snappy压缩文件
实际使用时需要综合考虑CPU资源和磁盘I/O开销,压缩率高的CPU开销大
- 压缩对比:
- 选择
中间数据压缩
- 对中间数据进行压缩可以减少job中map到reduce间的数据传输量,官方说这个阶段选择一个CPU开销比较低的编/解码器比较重要(暂未搞懂为什么)。
- hive.exec.compress.intermediate:默认该值为false,设置为true为激活中间数据压缩功能。
- 然后设置编/解码器:set
hive.intermediate.compression.codec=org.apache.Hadoop.io.compress.SnappyCodec; - 也可以如下图所示,直接设置map输出结果压缩实现,如set mapred.map.output.compression.codec=org.apache.Hadoop.io.compress.SnappyCodec来代替set hive.intermediate.compression.codec这个语句
最终输出结果压缩
set hive.exec.compress.output=true
set mapred.output.compression.codec=org.apache.hadoop.io.compress.SnappyCodec
2存储格式
因浏览器异常退出,大量的心血没有及时保存。。。心痛,没有再重写
因浏览器异常退出,大量的心血没有及时保存。。。心痛,没有再重写
过段时间把这个不合格的博客删掉
(i)常见存储格式
1.Textfile
2. SequenceFile
3. RCFile
4. ORCFile
5. Parquet
6. Avro
7. 自定义格式
Textfile:
- Hive数据表的默认格式,存储方式:行存储。
- 数据不做压缩,磁盘开销大,数据解析开销大。 可结合Gzip、Bzip2使用(系统自动检查,执行查询时自动解压),但使用这种方式,Hive不会对数据进行切分, 从而无法对数据进行并行操作。
- 在反序列化过程中,必须逐个字符判断是不是分隔符和行结束符,因此反序列化开销会比SequenceFile高几十倍。
SequenceFile
- SORTED AS SEQUENCEFILE进行指定
- SequenceFile支持三种压缩选择:NONE,RECORD,BLOCK。默认Record,不过BLOCK的压缩性能最好且可分割,一般建议使用BLOCK压缩
- 可以在mapred.xml或者hive-site.xml文件中配置;也可以在查询语句之前进行配置
RCFile
- 行列存储
- 不支持任意方式的数据写操作,仅提供一种追加接口,这是因为底层的 HDFS当前仅仅支持数据追加写文件尾部。
ORCFile
- RCFile的优化版
- 数据按行分块 每块按照列存储
- 适合hadoop生态系统的任何项目,无论选择什么样的处理框架、数据模型和编程语言
- https://cwiki.apache.org/confluence/display/Hive/LanguageManual+ORC
Parquet
- 已经是Apache的顶级项目:http://parquet.apache.org/
- 适合hadoop生态系统的任何项目,无论选择什么样的处理框架、数据模型和编程语言
Avro
- 自定义格式
编程实现Inputformat和Outputformat来自定义输入输出格式。
stored as
inputformat ‘jar…’
outputformat ‘jar…’
以下的两种方式都是可行的(只要版本不是太低,0.14以上)
(ii)实际使用时的设置
(二) 综合案列
参考(排名不分先后):
《HIive编程指南》
http://blog.csdn.net/xsdxs/article/details/53152599
http://www.cnblogs.com/skyl/p/4740301.html
http://www.cnblogs.com/zlslch/p/6103760.html