您的位置:首页 > 其它

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解压)

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)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: