影响hive效率的原因有数据倾斜,数据冗余,job或I/O过多、MR的分配不合理。
在查询时增加where dt='xxx’条件,可以指定扫描一个分区,加快查询速度。
分桶:默认规则Hash散列,一个分桶中会有不同的值,一个相同的值都在一个分桶里。
CREATE TABLE ods.test( NAME string, CODE string, STATUS string ) PARTITIONED by (dt string) --按时间分区 CLUSTERED BY (NAME) SORTED BY (CODE) INTO 64 BUCKETS --分桶语句 ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t' LINES TERMINATED BY '\n' STORED AS orc ;CLUSTERED BY (NAME) 表示按照NAME来分桶 SORTED BY (CODE) 按照CODE桶内排序 INTO 64 BUCKETS 进入64个桶。
使用方式: 获取第三个桶全部数据:
select * from ods.test tablesample(bucket 3 out of 64);获取第三个桶一半数据:
select * from ods.test tablesample(bucket 3 out of 128);TextFile: 1、存储方式:行存储。 2、每一行都是一条记录,每行都以\n结尾,数据不做压缩时,磁盘开销比较大,数据解析开销也比较大。 3、可以结合Gzip、Bzip2等压缩一起使用。
Sequence File: 1、一种Hadoop API 提供的二进制文件,有使用方便、可分割、压缩的特点 2、支持三种压缩选择:NONE、RECORD、BLOCK,RECORD压缩率低,一般建议使用BLOCK压缩。
RC File: 1、存储方式:数据按行分块,每块按照列存储,有利于数据的压缩(一条记录都在同一个块里) 2、RCFile 对于性能提升不大,但是能节省一些存储空间
ORC File: 1、存储方式:数据按行分块,每块按列存储。属于RC File的一种升级版,性能有较大幅度提升,而且数据可以压缩存储,压缩快,快速列存取。 2、ORC File会在列上创建索引,加快查询速度。
Parquet File: 1、存储方式:列式存储 2、Parquet File对于大型查询类型是高效的,对于扫描特定列查询,Parquet特别有用。Parquet一般使用Snappy、Gzip压缩。默认Snappy。 3、Parquet支持Impala查询引擎
在选择表的文件存储格式时,尽量采用Parquet或ORC,不仅降低存储量还能优化查询、压缩、关联的性能。
MapReduce传输时减少数据量,可以提升性能,那么为了减少数据量就需要选择合适的压缩算法,选择压缩算法需要看压缩比率,解压缩的速度,和是否可以拆分。
压缩格式是否可拆分压缩率速度gzip否高较快lzo是较高快snappy否较高快bzip2是最高慢是否选择压缩有两点: 1、计算密集型,不压缩,否则会增加CPU的开销 2、网络密集型的,选择压缩,减少数据量。
各个压缩方式的对应的Class类:
压缩格式类gziborg.apache.hadoop.io.compress.GzipCodeclzoorg.apache.hadoop.io.compress.lzo.LzoCodecsnappyorg.apache.hadoop.io.compress.SnappyCodecbzip2org.apache.hadoop.io.compress.Bzip2Codec压缩的使用:
##job输出文件按照block以xxx的方式进行压缩 ##默认值是false set mapreduce.output.fileoutputformat.compress=true ##默认值是Record set mapreduce.output.fileoutputformat.compress.type=BLOCK ##默认值是org.apache.hadoop.io.compress.DefaultCodec set mapreduce.output.fileoutputformat.compress.codec=org.apache.hadoop.io.compress.xxxCodec ##Map输出结果以xxx进行压缩 set mapred.map.output.compress=true ##默认值是org.apache.hadoop.io.compress.DefaultCodec set mapreduce.map.output.compress.codec=org.apache.hadoop.io.compress.xxxCodec ##对hive输出结果和中间都进行压缩 set hive.exec.compress.output=true ##默认值是false,不压缩 set hive.exec.compress.intermediate=true ##默认值是false,为true时MR设置的压缩才启用