这一篇博文是【大数据技术●降龙十八掌】系列文章的其中一篇,点击查看目录:大数据技术●降龙十八掌
Hive中的文件格式常见的有:textfile文件格式、sequencefile二进制序列化文件格式、rcfile、orc、parquet。hive表的文件格式一般是在创建表时用stored as语句声明,如:
create table demo_textfile
(
id int,
name string
)
stored as textfile;
其中textfile和sequencefile是以行存储数据的,rcfile、orc、parquet是列式存储的。
存储方式 | 文件格式 | 输入输出格式 | |
---|---|---|---|
行式存储 | textfile | InputFormat | org.apache.hadoop.mapred.TextInputFormat |
OutputFormat | org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat | ||
sequencefile | InputFormat | org.apache.hadoop.mapred.SequenceFileInputFormat | |
OutputFormat | org.apache.hadoop.hive.ql.io.HiveSequenceFileOutputFormat | ||
列式存储 | rcfile | InputFormat | org.apache.hadoop.hive.ql.io.RCFileInputFormat |
OutputFormat | org.apache.hadoop.hive.ql.io.RCFileOutputFormat | ||
orc | InputFormat | org.apache.hadoop.hive.ql.io.orc.OrcInputFormat | |
OutputFormat | org.apache.hadoop.hive.ql.io.orc.OrcInputFormat | ||
parquet | InputFormat | org.apache.hadoop.hive.ql.io.parquet.MapredParquetInputFormat | |
OutputFormat | org.apache.hadoop.hive.ql.io.parquet.MapredParquetOutputFormat |
创建表的时候也可以自定义其他的文件格式,用自定义文件格式时需要制定InputFormat、OutputFormat和SerDe
Hive最终是转为MapReduce程序来执行的,而MapReduce的性能瓶颈在于网络IO和磁盘IO,要解决性能瓶颈,最主要的是减少数据量,对数据进行压缩是个好的方式。
压缩虽然是减少了数据量,但是压缩过程要消耗CPU的,但是在Hadoop中,往往性能瓶颈不在于CPU,CPU压力并不大,所以压缩充分利用了比较空闲的CPU。
压缩格式 | 是否可拆分 | 是否自带 | 压缩率 | 速度 | 是否hadoop自带 |
---|---|---|---|---|---|
gzip | 否 | 是 | 很高 | 比较快 | 是 |
lzo | 是 | 是 | 比较高 | 很快 | 否,要安装 |
snappy | 否 | 是 | 比较高 | 很快 | 否,要安装 |
bzip2 | 是 | 否 | 最高 | 慢 | 是 |
各个压缩格式对应的类:
压缩格式 | 类 |
---|---|
Zlib | org.apache.hadoop.io.compress.DefaultCodec |
Gzip | org.apache.hadoop.io.compress.GzipCodec |
Bzip2 | org.apache.hadoop.io.compress.BZip2Codec |
Lzo | org.apache.hadoop.io.compress.lzo.LzoCodec |
Lz4 | org.apache.hadoop.io.compress.Lz4Codec |
Snappy | org.apache.hadoop.io.compress.SnappyCodec |
在Hadoop的mapred-site.xml配置文件中的配置。
参数 | 备注 |
---|---|
mapreduce.map.output.compress | map输出是否启用压缩 |
mapreduce.map.output.compress.codec | map输出采用压缩方式 |
mapreduce.output.fileoutputformat.compress | 是否启用reduce输出压缩 |
mapreduce.output.fileoutputformat.compress.codec | reduce压缩方式 |
mapreduce.output.fileoutputformat.compress.type | 压缩级别:NONE, RECORD(行级别), BLOCK(块级别) |
在Hive中,只有当属性hive.exec.compress.intermediate设置为true,以上hadoop设置的压缩才生效。如果Hive SQL被翻译成多个MapReduce时,这个属性不单单控制MapReduce中map的输出结果压缩,也控制着job之间的输出输入的压缩。
<property>
<name>hive.exec.compress.intermediatename>
<value>truevalue>
<description>
This controls whether intermediate files produced by Hive between multiple map-reduce jobs are compressed.
The compression codec and other options are determined from Hadoop config variables mapred.output.compress*
description>
property>
Hive是将SQL转化为MapReduce任务要经过解释、编译。
Hive解释器是将Hive SQL语句转换为抽象语法树AST,过程 分为解析和生成语法树两个步骤。
Antlr是一种语言识别工具,可以用来构造领域语言,使用Antlr构造特定的语言需要编写一个语法文件,定义词法和语法替换规则。
Hive使用Antlr实现SQL的词法和语法解析,完成词法分析、语法分析、语义定义、中间代码生成的过程。Hive中有五个文件记录着词法规则和语法规则:
词法规则文件:HiveLexer.g。
语法规则文件:SelectClauseParser.g、FormClauseParser.g、IdentifiersParser.g、HiveParser.g。
在词法和语法解析的同时,Antlr生成一个抽象语法树。
Hive编译器是将抽象语法树编译为逻辑执行计划。
抽象语法树是比较复杂的,不够结构化,不方便直接翻译为MapReduce程序,所以Hive编译器会将抽象语法树再进一步抽象和结构化为逻辑执行计划。
Hive优化器是对逻辑执行计划进行优化。
大部分逻辑层优化器通过变换OperatorTree,合并操作符,达到减少MapReduce Job,减少Shuffle数据量的目的。
名称 | 作用 |
---|---|
② SimpleFetchOptimizer | 优化没有GroupBy表达式的聚合查询 |
② MapJoinProcessor | MapJoin,需要SQL中提供hint,0.11版本已不用 |
② BucketMapJoinOptimizer | BucketMapJoin |
② GroupByOptimizer | Map端聚合 |
① ReduceSinkDeDuplication | 合并线性的OperatorTree中partition/sort key相同的reduce |
① PredicatePushDown | 谓词前置 |
① CorrelationOptimizer | 利用查询中的相关性,合并有相关性的Job,HIVE-2206 |
ColumnPruner | 字段剪枝 |
上表中带①符号的,优化目的都是尽量将任务合并到一个Job中,以减少Job数量,带②的优化目的是尽量减少shuffle数据量。
Hive执行器是调用底层的框架,执行优化好的逻辑执行计划。
编译器将操作树切分为一个Task链(DAG),执行器会顺序执行其中的所有Task,如果Task链不存在依赖关系时,可以采用并发执行的方式进行Job执行。