1. hive文件格式
hive支持的存储格式:
hive支持的存储格式包括TextFile、SequenceFile、RCFile、Avro Files、ORC Files、Parquet。
TextFile:
Hive默认格式,数据不做压缩,磁盘开销大,数据解析开销大。
可结合Gzip、Bzip2、Snappy等使用(系统自动检查,执行查询时自动解压),但使用这种方式,hive不会对数据进行切分,从而无法对数据进行并行操作。
SequenceFile:
SequenceFile是Hadoop API 提供的一种二进制文件,它将数据以的形式序列化到文件中。这种二进制文件内部使用Hadoop 的标准的Writable 接口实现序列化和反序列化。它与Hadoop API中的MapFile 是互相兼容的。Hive 中的SequenceFile 继承自Hadoop API 的SequenceFile,不过它的key为空,使用value 存放实际的值, 这样是为了避免MR 在运行map 阶段的排序过程。
SequenceFile的文件结构图:
Header通用头文件格式:
SEQ 3BYTE
Nun 1byte数字
keyClassName
ValueClassName
compression (boolean)指明了在文件中是否启用压缩
blockCompression (boolean,指明是否是block压缩)
compression codec
Metadata 文件元数据
Sync 头文件结束标志
Block-Compressed SequenceFile格式
RCFile
RCFile是Hive推出的一种专门面向列的数据格式。 它遵循“先按列划分,再垂直划分”的设计理念。当查询过程中,针对它并不关心的列时,它会在IO上跳过这些列。需要说明的是,RCFile在map阶段从 远端拷贝仍然是拷贝整个数据块,并且拷贝到本地目录后RCFile并不是真正直接跳过不需要的列,并跳到需要读取的列, 而是通过扫描每一个row group的头部定义来实现的,但是在整个HDFS Block 级别的头部并没有定义每个列从哪个row group起始到哪个row group结束。所以在读取所有列的情况下,RCFile的性能反而没有SequenceFile高。
2. 大数据开发工程师Hive(Hive如何进行优化)
1数据存储及压缩优化
针对hive中表的存储格式通常有textfile和orc,压缩格式一般使用snappy。相比于 textfile格式存储,orc占有更少的存储。因为hive底层使用MR计算架构,数据流是hdfs到磁盘再到hdfs,而且会有很多次IO读写操作,所以使用orc数据格式和snappy压缩策略可以降低IO读写,还能降低网络传输量,这样在一定程度上可以节省存储空间,还能提升hql的执行效率;
2 Hive Job优化
①调节Jvm参数,重用Jvm;
②合理设置Map个数;
③合理设置Rece个数;
3 Sql语法优化
① 建表优化 :
1) Hive创建表的时候,可以建分区表,分桶表;
2) Hive创建表的时候,可以指定数据存储格式:TextFile、SequenceFile、RCfile 、ORCfile;
② 查询时优化 :
1) 列裁剪,在查询时只读取需要的列,避免全列扫描,不要使用select * from table;
2) 分区裁剪:在查询时只读取需要分区的数据,避免全表扫描;
3) 开启谓词下推:set hive.optimize.ppd = true,默认是true:
a. 将Sql语句中的where谓词逻辑都尽可能提前执行,减少下游处理的数据量;
4) 大哪陵表join小表:
a. 开启MapJoin:set hive.auto.convert.join=true:
b. MapJoin是将Join双方比较小的那个表直接分发到各个Map进程的内存亩弊中,在 Map进程中进行Join操作, 这样就不用进行Rece步骤 ,从而提高了速度( 大表left join小表才有效 ,小表left join大表会失效);
5) 大表join大表:
a. SMB Join :Sort Merge Bucket Join(数据不仅分桶了,而且每个桶数据是排好序了);
b. 开启SMB Join之后,底层是根据两个表join字段进行分桶存储,这样迅缓族的话,两张表就变为了基于桶之间join关联查询,而不是基于整张表的join,减少了笛卡尔积;
6) 少用in,用left semi join替代in:
a. 原始写法:select a.id, a.name from a where a.id in (select b.id from b);
b. 用join改写:select a.id, a.name from a join b on a.id = b.id;
c. left semi join改写:select a.id, a.name from a left semi join b on a.id = b.id;
7) 用union all代替union,因为union all不需要去重,也不需要排序,效率高于union;
(每天1小题,进步1点点)