网站建设分为哪几部分,wordpress地方门户,做旅游网站平台合作入驻,国家信息企业公示网官网登录入口文章目录Hive表优化Hive表设计优化分区表结构 - 分区设计思想分桶表结构 - Join问题Hive中的索引Hive表数据优化常见文件格式TextFileSequenceFileParquetORC数据压缩存储优化 - 避免小文件生成存储优化 - 合并输入的小文件存储优化 - ORC文件索引Row Group IndexBloom Filter …
文章目录Hive表优化Hive表设计优化分区表结构 - 分区设计思想分桶表结构 - Join问题Hive中的索引Hive表数据优化常见文件格式TextFileSequenceFileParquetORC数据压缩存储优化 - 避免小文件生成存储优化 - 合并输入的小文件存储优化 - ORC文件索引Row Group IndexBloom Filter Index存储优化 - ORC矢量化查询Hive表优化
当执行查询计划时Hive会使用表的最后一级目录作为底层处理数据的输入即全表扫描。 Step1先根据表名在元数据中进行查询表对应的HDFS目录Step2然后将整个HDFS中表的目录作为底层查询的输入可以通过explain命令查看执行计划依赖的数据
Hive表设计优化
分区表结构 - 分区设计思想
设计思想根据查询需求将数据按照查询的条件(一般以时间)进行分区存储将不同分区的数据单独使用一个HDFS目录存储。分区表的构建和使用可见本专栏对应的文章。
分桶表结构 - Join问题
分桶表是按一定规则将数据划分到不同的文件中存储(分区表是分到不同目录)如果有两张表按照相同的划分规则(按照Join的关联字段)将各自的数据进行划分Join时就可以实现桶于桶之间的Join避免不必要的比较。分桶表的构建和操作相关SQL可见本专栏对应的文章。
Hive中的索引
Hive的索引与关系型数据库中的索引并不相同Hive不支持主键或外键索引。索引功能从Hive0.7开始到Hive3.0后不再支持。建立索引时Hive中会自动创建一张索引表该表记录了该字段每个值与数据实际物理位置之间的关系。当Hive中原始数据表的数据更新时索引表不会自动更新必须手动执行ALTER INDEX命令实现更新索引表整体性能较差。在实际应用中推荐使用ORC文件格式中的索引、物化视图来代替Hive Index提高查询性能。语法
创建索引
CREATE INDEX idx_user_id_login ON TABLE tb_login_part(userid) AS COMPACT WITH deferred REBUILD;构建索引通过运行一个MapReduce程序来构建索引
ALTER INDEX idx_user_id_login ON tb_login_part REBUILD;Hive表数据优化
为了提高对HDFS文件读写的性能Hive提供了多种文件存储格式TextFile、SequenceFile、ORC、Parquet等不同的文件存储格式具有不同的存储特点有的可以降低存储空间有的可以提高查询性能。Hive的文件格式在建表时指定默认是TextFile对应语法为
STORED AS file_format常见文件格式
TextFile
TextFile是Hive中默认的文件格式存储形式为按行存储。优点最简单的数据格式可以直接查看可以用任意分隔符进行分割便于共享数据可以搭配压缩一起使用。缺点耗费存储空间I/O性能较低结合压缩时Hive不进行数据切分合并不能进行并行操作查询效率低按行存储读取列的性能差。适合小量数据的存储查询一般用作第一层数据加载和测试使用。
SequenceFile
是Hadoop里用来存储序列化的键值对即二进制的一种文件格式。也可以作为MapRrduce作业的输入和输出Hive也支持这种格式。加载数据时不能直接用load因为load不经过MR程序就实现不了SequenceFile。SequenceFile使用方法
创建表
CREATE TABLE tb_sogou_seq(stime STRING,userid STRING
)ROW FORMAT DELIMITED FIELDS TERMINATED BY \tSTORED AS SEQUENCEFILE;导入数据不能直接load需要通过INSERT调用MR程序实现压缩
INSERT INTO TABLE tb_sogou_seq
SELECT * FROM tb_sogou_source;Parquet
是一种支持嵌套结构的列式存储文件格式。使用方法和SequenceFile一样不能直接load
CREATE TABLE tb_sogou_parquet(stime STRING,userid STRING
)ROW FORMAT DELIMITED FIELDS TERMINATED BY \tSTORED AS PARQUET;INSERT INTO TABLE tb_sogou_parquet
SELECT * FROM tb_sogou_source;ORC
是一种列式存储格式优点 列式存储效率非常高可压缩高效的列存取查询效率较高支持索引支持矢量化查询 缺点 加载时性能消耗较大需要通过textFile文件转化生成读取全量数据时性能较差 适合Hive中大型的存储、查询。ORC不是一个单纯的列式存储格式仍然是首先根据行组分割整个表在每一个行组内进行按列存储。ORC文件是自描述的它的元数据使用Protocol Buffers序列化并且文件中的数据尽可能地压缩以降低存储空间的消耗。用法和SequenceFile相同
CREATE TABLE tb_sogou_parquet(stime STRING,userid STRING
)ROW FORMAT DELIMITED FIELDS TERMINATED BY \tSTORED AS ORC;INSERT INTO TABLE tb_sogou_orc
SELECT * FROM tb_sogou_source;数据压缩
Hive的数据压缩实际上是MapReduce的压缩Hive的压缩就是使用了Hadoop中的压缩实现的Hadoop中支持的压缩在Hive中都可以直接使用。Hive中压缩配置
开启Hive中间传输数据压缩功能
-- 1) 开启hive中间传输数据压缩功能
SET hive.exec.compress.intermediatetrue;
-- 2) 开启mapreduce中map输出压缩功能
SET mapreduce.map.output.compresstrue;
-- 3) 设置mapreduce中map输出数据的压缩方式
SET mapreduce.map.output.compress.codecorg.apache.io.compress.SnappyCodec;开启Reduce输出阶段压缩
-- 1) 开启hive最终输出数据压缩功能
SET hive.exec.compress.outputtrue;
-- 2) 开启mapreduce最终输出数据压缩
SET mapreduce.output.fileoutputformat.compresstrue;
-- 3) 设置mapreduce最终数据输出压缩方式
SET mapreduce.output.fileoutputformat.compress.codec org.apache.hadoop.io.compress.SnappyCodec;
-- 4) 设置mapreduce最终数据输出压缩为块压缩
SET mapreduce.output.fileoutputformat.compress.typeBLOCK;配合文件存储格式使用
CREATE TABLE tb_sogou_orc_snappy
STORED AS ORC tblproperties (orc.compressSNAPPY)
AS SELECT * FROM tb_sogou_source;存储优化 - 避免小文件生成
Hive的存储本质还是HDFS由于每个小文件在HDFS中都会产生一条元数据信息HDFS不利于小文件存储且不利于MR程序的处理。MapReduce中每个小文件会启动一个MapTask计算处理导致资源的浪费。Hive可以自动判断是否是小文件如果是则自动合并小文件。参数设置
-- 如果hive程序只有maptask将MapTask产生的所有小文件进行合并
SET hive.merge.mapfilestrue;
-- 如果hive程序有Map和ReduceTask将ReduceTask产生的所以小文件进行合并
SET hive.merge.mapredfilestrue;
-- 每一个合并的文件的大小
SET hive.merge.size.per.task256000000;
-- 平均每个文件的大小如果小于这个值就会进行合并
SET hive.merge.smallfiles.avgsize16000000;存储优化 - 合并输入的小文件
数据处理时输入小文件的情况下Hive中提供一种输入类CombineHiveInputFormat用于将小文件合并以后再进行处理。参数设置
-- 设置Hive中底层MapReduce读取数据的输入类将所有文件合并为一个大文件作为输入
SET hive.input.formatorg.apache.hadoop.hive.ql.io.CombineHiveInputFormat;存储优化 - ORC文件索引
使用ORC文件时为了加快读取ORC文件中的数据内容ORC提供了两种索引机制 Row Group IndexBloom Filter Index 当数据写入数据时可以指定构建索引当用户查询数据时可以根据索引提前对数据进行过滤避免不必要的数据扫描。
Row Group Index
一个ORC文件包含一个或多个stripes(groups of row data即行组)每个stripe中包含了每个column的min/max值得索引数据当查询中有大于等于小于得操作时会根据min/max值跳过不包含在内得stripes。建立ORC表时指定参数’orc.create.index’true’之后便会建立Row Group Index向表中加载数据时对需要使用索引的字段进行排序可以提高使用效率。例
-- 1. 开启索引配置
SET hive.optimize.index.filtertrue;
-- 2. 创建表并设置构建索引
CREATE TABLE tb_sogou_orc_indexSTORED AS ORC TBLPROPERTIES(orc.create.indextrue)
AS SELECT * FROM tb_sogou_sourceDISTRIBUTE BY stimeSORT BY stime;
-- 3. 当进行范围或者等值查询(,,)时就可以基于构建的索引进行查询
SELECT COUNT(*) FROM tb_sogou_orc_index WHERE stime 12:00:00 AND stime 18:00:00;Bloom Filter Index
建表时通过表参数orc.bloom.filter.columnscolumnName…来指定为哪些字段建立BloomFilter索引在生成数据时会在每个stripe中为该字段建立BloomFilter的数据结构当查询条件中包含对该字段的等值过滤时先从BloomFilter中获取以下stripe是否包含该值如果不包含则跳过该stripe。例
-- 创建表并设置构建布隆索引
CREATE TABLE tb_sogou_orc_indexSTORED AS ORC TBLPROPERTIES
(orc.create.indextrue,orc.bloom.filter.columnsstime,userid)
AS SELECT * FROM tb_sogou_sourceDISTRIBUTE BY stimeSORT BY stime;
-- 当stime进行范围查询(,)时可以走row group indexuserid等值查询时走bloom filter index
SELECT COUNT(*) FROM tb_sogou_orc_index WHERE stime 12:00:00 AND stime 18:00:00 AND userid 123345;存储优化 - ORC矢量化查询
Hive的默认查询执行引擎一次处理一行而矢量化查询执行是一种Hive’针对ORC文件操作的特性目的是按照每批1024行读取数据并且一次性对整个记录集整合应用操作。要使用矢量化查询必须以ORC格式存储数据。矢量化查询设置;
SET hive.vectorized.execution.enabled ture;
SET hive.vectorized.execution.reduce.enabled true;