1.Hive 数据存储


    Hive支持的存储数的格式主要有:TEXTFILE 、SEQUENCEFILE、ORC、PARQUET。


    TEXTFILE和SEQUENCEFILE的存储格式都是基于行存储的;ORC和PARQUET是基于列式存储的。


1.1 列式存储和行式存储基本介绍


    • 行存储的特点:查询满足条件的一整行数据的时候,列存储则需要去每个聚集的字段找到对应的每个列的值,行存储只需要找到其中一个值,其余的值都在相邻地方,所以此时行存储查询的速度更快。


    • 列存储的特点:因为每个字段的数据聚集存储,在查询只需要少数几个字段的时候,能大大减少读取的数据量;每个字段的数据类型一定是相同的,列式存储可以针对性的设计更好的设计压缩算法。


1.2 Hive 数据存储


1.2.1 行存储


    基于 Hadoop 系统行存储结构的优点在于快速数据加载和动态负载的高适应能力,但是, 行存储不支持快速查询,当查询仅仅针对多列表中的少数几列时,它不能跳过不必要的列读取。同时,由于行存储混合着不同数据值的列,行存储不容易获得一个极高的压缩比,即空间利用率不易大幅提高,尽管通过熵编码和利用列相关性能够获得一个较好的压缩比,但是 复杂数据存储实现会导致解压开销增大。


1.2.2 列存储


    列存储在查询时列存储能够避免读不必要的列,并且压缩一个列中的相似数据能够达到较高的压缩比。


1.2.3 存储方式的选择 


    在数据仓库的搭建中,我们选择列存储方式。


    对于列式存储范式,有三种存储格式可以选择:ORC,PARQUET。


若论对 Hive(以 MapReduce 为执行引擎)的支持 Orc 是最好的,但是若论对 Spark 等 Hadoop 生态圈中更多的技术框架,Parquet 的支持是最好的,而 Spark 作为 Hive 的执 行引擎时性能非常好,因以我们这里毫无疑问地选择了 Parquet。


 


2.Hive 数据压缩




hive 并行度设置 hive 行数_hive


    由于我们的存储格选用了 Parquet,在压缩格式方面 Parquet 支持 Snappy 和 Gzip,Gzip 的压缩比更高但解压缩的速度较慢,我们选择 Snappy。下面有具体参数进行分析示例:


2.1  Hadoop源码编译支持的压缩编码



hive 并行度设置 hive 行数_hive_02


    为了支持多种压缩/解压缩算法,Hadoop引入了编码/解码器,如下表所示:



hive 并行度设置 hive 行数_hive 并行度设置_03


    压缩性能的比较:



hive 并行度设置 hive 行数_Hive_04


 


2.2 压缩参数配置:


    要在Hadoop中启用压缩,可以配置如下参数(mapred-site.xml文件中):



hive 并行度设置 hive 行数_mapreduce_05


 


2.3 开启Map输出阶段压缩


    开启map输出阶段压缩可以减少job中map和Reduce task间数据传输量。具体配置如下:


案例实操:

1.开启hive中间传输数据压缩功能
hive (default)>set hive.exec.compress.intermediate=true;
2.开启mapreduce中map输出压缩功能
hive (default)>set mapreduce.map.output.compress=true;
3.设置mapreduce中map输出数据的压缩方式
hive (default)>set mapreduce.map.output.compress.codec=org.apache.hadoop.io.compress.SnappyCodec;
4.执行查询语句
hive (default)> select count(ename) name from emp;

2.4 开启Reduce输出阶段压缩


    当Hive将输出写入到表中时,输出内容同样可以进行压缩。属性 hive.exec.compress.output控制着这个功能。用户可能需要保持默认设置文件中的默认值false,这样默认的输出就是非压缩的纯文本文件了。用户可以通过在查询语句或执行脚本中设置这个值为true,来开启输出结果压缩功能。


案例实操:

1.开启hive最终输出数据压缩功能
hive (default)>set hive.exec.compress.output=true;
2.开启mapreduce最终输出数据压缩
hive (default)>set mapreduce.output.fileoutputformat.compress=true;
3.设置mapreduce最终数据输出压缩方式
hive (default)> set mapreduce.output.fileoutputformat.compress.codec = org.apache.hadoop.io.compress.SnappyCodec;
4.设置mapreduce最终数据输出压缩为块压缩
hive (default)> set mapreduce.output.fileoutputformat.compress.type=BLOCK;
5.测试一下输出结果是否是压缩文件
hive (default)> insert overwrite local directory '/opt/module/datas/distribute-result' select * from emp distribute by deptno sort by empno desc;


 


2.5 存储和压缩结合


在实际的项目开发当中, hive 表的数据存储格式一般选择: orc parquet 。压缩方式一般选择 snappy lzo


 


3.Hive 执行引擎


    • Hive 的执行引擎包括 MapReduce、Spark 和 Tez。


    • 就性能而言,MapReduce 性能最差, Tez 与 spark 接近,但论社区的活跃程度和技术 的成熟度来说 Tez 是不如 Spark 的,因此我们选择 spark。


    • Spark 目前也有两大分支,即 SparkCore(RDD)和 SparkSQL(DataFrame/DataSet), 对于这两个分支性能上也有很大差异的。


    • 经过测试,SparkCore 的性能是 MapReduce 的两倍左右,而 SparkSQL 的性能是 SparkCore 的两倍左右,数据量越大,上述的性能差异会越明显,因此 Hive 数据仓库的执 行引擎确定为 SparkSQL。