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 数据压缩
由于我们的存储格选用了 Parquet,在压缩格式方面 Parquet 支持 Snappy 和 Gzip,Gzip 的压缩比更高但解压缩的速度较慢,我们选择 Snappy。下面有具体参数进行分析示例:
2.1 Hadoop源码编译支持的压缩编码
为了支持多种压缩/解压缩算法,Hadoop引入了编码/解码器,如下表所示:
压缩性能的比较:
2.2 压缩参数配置:
要在Hadoop中启用压缩,可以配置如下参数(mapred-site.xml文件中):
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。