Hive0.14数据存储优化
2015-08-08 21:53
363 查看
1.hive数据存储优化
1>对于需要经常连接查询的表一定要建立分区和桶。分区的意义在于列裁剪数据,桶的意义在于并行计算
(因为用来做桶的列通过hash后分布在各自桶里,在连接时并行进行桶与桶之间的连接即可。(ORC格式的stripes文件同样有这个功能后面讲到))
要使用以上这个特性需要在建表时构建表的分区结构和分桶结构。这个行为发生在数据存储环节。
2> hive存储文件格式介绍:
1》textfile--原生的文本存储格式,行存储,可以用bzip,gzip压缩,但是TEXTFILE在压缩后不能发挥MapReduce的并行处理能力。
2》sequencefile序列文件--行存储,hadoop提供的文件存储格式(二进制文件)。有record,block,none三种压缩格式。(可以分割,压缩默认使用block压缩格式。)
create table test2(str STRING)
STORED AS SEQUENCEFILE;
设置这两个参数:
hive.exec.compress.output=true;
io.seqfile.compression.type=BLOCK;
3》RCFile--(Row colums file)行列存储相结合的存储格式,首先按相同行在一个块上(避免分散在不同块上产生多余的扫描),然后块按列的方式存储 以方便快速的索引和存取列。(数据写入时时间代价比较大,但是查询性能有很大提升,同时也是Lazy解压)
4》ORCFile--(Optimalized Row colums File)优化过的RCFile。
相比RCFile有以下的优点:
1)一个task只输出一个文件(几个行块文件组成一个大的文件),减小碎片文件率。
2)在列块中每个列存有行索引文件方便快速定位行。
3)可以使用RecordReader并行的读多个块或多个列。
4)有多种索引文件记录行信息和列信息。
ORCFile的文件结构.
index Data文件保存每列的最大和最小值以及列的行索引。
fileFooter文件保存每个块有多少行,每列的数据类型,列上的一些聚合信息。
Stripe foooter包含文件流信息的目录
row data保存行的信息。
ORCFile的一些参数:
orc.compress=[ZLIB,NONE,SNAPPY]
orc.compress.size=262144
orc.stripe.size=268435456
orc.row.index.stride=10000
orc.create.index=true
5》自定义文件输入输出格式:
inputformat 'org.apache.hadoop.hive.contrib.fileformat.base64.Base64TextInputFormat'
outputformat 'org.apache.hadoop.hive.contrib.fileformat.base64.Base64TextOutputFormat';
3>各种文件格式数据加载,压缩比率,查询响应横向比较:
不管什么文件格式建议使用gzip压缩格式,原因是gzip在时间和空间效率上都比较平衡:
在数据加载性能方面:sequencefile优于textfile优于rcfile。
在查询效率方面:rcfile优于sequencefile优于textfile。
在存储成本方面:rcfile优于sequencefile优于textfile。
显而易见,我们不应该使用textfile这种文件格式。相反,在类似一次加载多次查询的场景,应该使用rcfile这种格式。
测试结果数据:
下表是一次CPU 的开销:
TRACE 315554: (thread=200001) org.apache.hadoop.hive.ql.io.RCFile$Reader.getCurrentRow(RCFile.java:1434) org.apache.hadoop.hive.ql.io.RCFileRecordReader.next(RCFileRecordReader.java:88)
org.apache.hadoop.hive.ql.io.RCFileRecordReader.next(RCFileRecordReader.java:39) org.apache.hadoop.hive.ql.io.CombineHiveRecordReader.doNext(CombineHiveRecordReader.java:98) org.apache.hadoop.hive.ql.io.CombineHiveRecordReader.doNext(CombineHiveRecordReader.java:42)
org.apache.hadoop.hive.ql.io.HiveContextAwareRecordReader.next(HiveContextAwareRecordReader.java:67)
1>对于需要经常连接查询的表一定要建立分区和桶。分区的意义在于列裁剪数据,桶的意义在于并行计算
(因为用来做桶的列通过hash后分布在各自桶里,在连接时并行进行桶与桶之间的连接即可。(ORC格式的stripes文件同样有这个功能后面讲到))
要使用以上这个特性需要在建表时构建表的分区结构和分桶结构。这个行为发生在数据存储环节。
2> hive存储文件格式介绍:
1》textfile--原生的文本存储格式,行存储,可以用bzip,gzip压缩,但是TEXTFILE在压缩后不能发挥MapReduce的并行处理能力。
2》sequencefile序列文件--行存储,hadoop提供的文件存储格式(二进制文件)。有record,block,none三种压缩格式。(可以分割,压缩默认使用block压缩格式。)
create table test2(str STRING)
STORED AS SEQUENCEFILE;
设置这两个参数:
hive.exec.compress.output=true;
io.seqfile.compression.type=BLOCK;
3》RCFile--(Row colums file)行列存储相结合的存储格式,首先按相同行在一个块上(避免分散在不同块上产生多余的扫描),然后块按列的方式存储 以方便快速的索引和存取列。(数据写入时时间代价比较大,但是查询性能有很大提升,同时也是Lazy解压)
create table test3(str STRING) STORED AS RCFILE;
4》ORCFile--(Optimalized Row colums File)优化过的RCFile。
相比RCFile有以下的优点:
1)一个task只输出一个文件(几个行块文件组成一个大的文件),减小碎片文件率。
2)在列块中每个列存有行索引文件方便快速定位行。
3)可以使用RecordReader并行的读多个块或多个列。
4)有多种索引文件记录行信息和列信息。
ORCFile的文件结构.
index Data文件保存每列的最大和最小值以及列的行索引。
fileFooter文件保存每个块有多少行,每列的数据类型,列上的一些聚合信息。
Stripe foooter包含文件流信息的目录
row data保存行的信息。
ORCFile的一些参数:
orc.compress=[ZLIB,NONE,SNAPPY]
orc.compress.size=262144
orc.stripe.size=268435456
orc.row.index.stride=10000
orc.create.index=true
5》自定义文件输入输出格式:
inputformat 'org.apache.hadoop.hive.contrib.fileformat.base64.Base64TextInputFormat'
outputformat 'org.apache.hadoop.hive.contrib.fileformat.base64.Base64TextOutputFormat';
3>各种文件格式数据加载,压缩比率,查询响应横向比较:
不管什么文件格式建议使用gzip压缩格式,原因是gzip在时间和空间效率上都比较平衡:
在数据加载性能方面:sequencefile优于textfile优于rcfile。
在查询效率方面:rcfile优于sequencefile优于textfile。
在存储成本方面:rcfile优于sequencefile优于textfile。
显而易见,我们不应该使用textfile这种文件格式。相反,在类似一次加载多次查询的场景,应该使用rcfile这种格式。
测试结果数据:
TextFile | ORCFile | |
存储效率(50G) | 50G | 9G |
Tablescan效率 | 80s | 40s |
mapTask数 | 175个 | 36个 |
下表是一次CPU 的开销:
rank | self | accum | count | trace | method |
20 | 0.48% | 79.64% | 65 | 315554 | org.apache.hadoop.hive.ql.io.RCFile$Reader.getCurrentRow |
28 | 0.24% | 82.07% | 32 | 315292 | org.apache.hadoop.hive.serde2.columnar.ColumnarStruct.init |
55 | 0.10% | 85.98% | 14 | 315788 | org.apache.hadoop.hive.ql.io.RCFileRecordReader.getPos |
56 | 0.10% | 86.08% | 14 | 315797 | org.apache.hadoop.hive.ql.io.RCFileRecordReader.next |
TRACE 315554: (thread=200001) org.apache.hadoop.hive.ql.io.RCFile$Reader.getCurrentRow(RCFile.java:1434) org.apache.hadoop.hive.ql.io.RCFileRecordReader.next(RCFileRecordReader.java:88)
org.apache.hadoop.hive.ql.io.RCFileRecordReader.next(RCFileRecordReader.java:39) org.apache.hadoop.hive.ql.io.CombineHiveRecordReader.doNext(CombineHiveRecordReader.java:98) org.apache.hadoop.hive.ql.io.CombineHiveRecordReader.doNext(CombineHiveRecordReader.java:42)
org.apache.hadoop.hive.ql.io.HiveContextAwareRecordReader.next(HiveContextAwareRecordReader.java:67)
相关文章推荐
- 今天带来的是一个对图书编号和价格设定程序 不是很完善希望大家给与建议进行修改
- poj2406 KMP
- 开始了他的高速功率矩阵
- 面试的算法1(C语言)(整理)(组合数 字符串倒置 最大公共串)
- Quorum/NRW机制
- 聚集索引和非聚集索引的区别
- Python学习笔记一
- 2015 Multi-University Training Contest 6
- poj - 3254 Corn Fields (状态压缩dp入门)
- 条款16:成对使用new和delete时,采取相同的形式
- Codeforces Gym 100286J Javanese Cryptoanalysis 傻逼暴力
- 杭电OJ 1002 大数相加
- 代理模式
- Hive客户端多并发问题解决方法记录
- HDOJ 5353 Average 模拟
- [POJ 2444] Partition a Matrix 暴力
- selection sort(选择排序)
- 当 MUST_CHANGE 为 ON (开)时,不能将 CHECK_POLICY 和 CHECK_EXPIRATION 选项设为 OFF (关)
- Android--编程方法之外的常识
- Android中的ViewPager和 PagerAdapter的初步理解和使用