Hive0.14数据存储优化

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)

转载于:https://www.cnblogs.com/hortonworks/p/6388194.html

你可能感兴趣的:(Hive0.14数据存储优化)