hive相关知识简单介绍

一、hive概述

hive基于Hadoop,本质就是MR,数据以结构化的方式存储在hdfs上,通过hive以表的形式来展示数据,通过hivesql来对数据进行查询分析

二、hive的相关名词

1.derby:hive本身的原数据库,执行hive的时候会去访问相关表的元数据信息,就回去访问这个库,但是是在实际生产中hive的元数据信息都放在了MySQL上,配置信息存放在hive-site.xml中。因为如果使用derby,只能单客户端操作,不现实,所以需要迁移到MySQL上。(实际生产中hive的元数据库迁移,会在其他篇幅介绍)

2.metastore:官网解释,hive的一个服务,通过它我们可以获取到hive原数据,并且通过thrift获取原数据的方式,屏蔽了数据库访问需要驱动,url,用户名,密码等等细节。

3.driver:driver的组成分为解析器,编译器,优化器,执行器,当hive接收到一条sql时——>①解析器会去解析这条sql,转化为抽象语法树,对语法进行分析,比如表明是否存在,语法是否符合规范。。。②编译器会将语法树进行编译,生成逻辑执行计划。。。③对逻辑执行计划进行优化。。。④把逻辑计划转化为可执行的物理计划,比如所用到的执行引擎是MR或者是spark

4.hiveserver、hiveserver2:官方解释,这里hiveserver是hive上的一个服务,是一个服务端接口,使远程客户端可以执行对Hive的查询并返回结果,它主要是为了为外界提供连接hive的一个通道(比如JDBC,hue,zeppelin等,二者区别后面单独介绍),所以我理解hiveserver不会访问元数据,还是去访问的metastore,然后由metastore来访问元数据。

5.beeline:通过连接hiveserver的一个访问hive的方式,该方式后续会替代hivecli,可以连接不同的hiveserver

三、hive架构图

 

四、hive文件的压缩和存储

①压缩:Gzip 优点--1.压缩解压速度快 , 压缩率高 , hadoop本身支持。2.处理压缩文件时方便 , 和处理文本一样。3.大部分linux 系统自带 Gzip 命令 , 使用方便

                       缺点--不支持切片

                       使用场景--1.文件压缩后在130M以内 (一个块大小) , 都可以使用 GZip 压缩(因为Gzip唯一的缺点是不能切片)

                       总结--不需要切片的情况下 可以使用

            BZip2  优点--1.压缩率高(高于Gzip)。2.可以切片。3.hadoop自带 使用方便

                       缺点--压缩解压速度超级慢

                       使用场景--1.不要求压缩速率 ,但是对压缩率有要求的情况下 比如备份历史记录 , 备份文件。2.输出的文件较大 , 处理后的数据需要减少磁盘存储并且以后使用数据的情况较少 (解压 / 压缩的情况较少)。3.对于单个文件 较大 ,又想压缩减少磁盘空间 , 并且兼容之前的应用程序的情况。

                        总结--对于压缩解压速度没有要求的情况下

             Lzo     优点--1.压缩解压速度比较快 , 压缩率也可以。2.支持切片 是hadoop 比较流行的压缩格式。3.可以在linux 下安装 lzo命令 使用方便

                        缺点--1.压缩率比Gzip低一些。2.hadoop 本身不支持, 需要自己安装。3.使用Lzo 格式的文件时需要做一些特殊处理(为了支持 Split 需要建立索引 , 还需要家将 InputFormat 指定为Lzo 格式

                        使用场景--1.压缩以后还大于 200M 的文件 , 且文件越大 Lzo 的优势越明显。2.原因很简单 , 四种压缩方式 只有BZip2 , Gzip 支持切片 , 然后 BZip2 你懂的 , 速度贼慢 , 只能用于特定的场景, 所以 Lzo 是比较经常用的。

                        总结--压缩后文件还是比较大 需要切片的情况下 推荐使用。

           Snappy 优点--高压缩解压速度 , 压缩率还可以

                        缺点--1.不能切片。2.压缩率比Gzip小。3.hadoop本身不支持 需要安装

                        使用场景--1.当Mapeduce的Map阶段输出的数据比较大的时候 , 作为Map到Reduce的中间数据的压缩格式。2.作为一个MapReduce作业的输出和另一个MapReduce的输入。

                        总结--因为压缩率不怎么样 还不能切片 , 所以在一般的作为输入文件压缩时可以用 GZip 和 Lzo 都比Snappy

②存储:Textfile--默认存储格式,当不设定的时候是以文本的形式存储,但是会有问题。1.占用空间大。2.如果某些需要制定分隔符和换行符,通常为\t、\n。3.如果在某个字段中存在2中的特殊字符,那么同步后的数据会出现问题,数据会乱,多

               SequenceFile--二进制文件格式,基本上很少有人用,这里不细说了

               RCFile--行列存储相结合的存储方式,先将数据按行进行分块再按列式存储,也很少人用

               ORC--是对rcf的优化,列式存储,主流存储格式,压缩效果也好

               Parquet--也是列式存储,也可以选择、

               Avro--一个数据序列化系统,设计用于支持大批量数据交换的应用。它的主要特点有:支持二进制序列化方式,可以便捷,快速地处理大量数据;动态语言友好,Avro提供的机制使动态语言可以方便地处理Avro数据。可以参考,没有用过

③hive表制定压缩和存储

https://cwiki.apache.org/confluence/display/Hive/LanguageManual+DDL#LanguageManualDDL-CreateTable

map和reduce数据压缩参数

set hive.exec.compress.intermediate=true;

set mapred.map.output.compression.codec=org.apache.hadoop.io.compress.SnappyCodec;

set hive.exec.compress.output=true;;

set mapred.output.compression.codec=org.apache.hadoop.io.compress.SnappyCodec;

具体参数参考如下:

Deflate    org.apache.hadoop.io.compress.DeflateCodec
gzip         org.apache.hadoop.io.compress.GzipCodec
bzip2       org.apache.hadoop.io.compress.BZip2Codec
LZO         com.hadoop.compression.lzo.LzopCodec
Lz4          org.apache.hadoop.io.compress.Lz4Codec
Snappy   org.apache.hadoop.io.compress.SnappyCodec

五、map和reduce

map的个数是由切片大小和文件数量决定的

场景:1.某个表的hdfs路径下的文件个数是1个,大小为280M,切片大小为256M,那么map个数为2,一个是256M,一个是24M。2.某个表的hdfs路径下的文件个数是2个,大小分别为280M,20M,那么个map个数为3,256M,24M,20M。

参数:

-- 每个Map最大输入大小 set mapred.max.split.size=128000000;

-- 一个节点上split的至少的大小 set mapred.min.split.size.per.node=100000000;

-- 一个交换机下split的至少的大小 set mapred.min.split.size.per.rack=100000000;

-- 执行Map前进行小文件合并 set hive.input.format=org.apache.hadoop.hive.ql.io.CombineHiveInputFormat;

reduce的数量是由map的数据量大小决定的

计算公式:hive.exec.reducers.bytes.per.reducer(每个reduce任务处理的数据量,默认为1000^3=1G) 
                  hive.exec.reducers.max(每个任务最大的reduce数,默认为999)
                  计算reducer数的公式很简单N=min(参数2,总输入数据量/参数1)

场景:select pt,count(1) from popt_tbaccountcopy_mes where pt = '2012-07-04' group by pt; 
            /group/p_sdo_data/p_sdo_data_etl/pt/popt_tbaccountcopy_mes/pt=2012-07-04 总大小为9G多,因此这句有10个reduce

参数:

set hive.exec.reducers.bytes.per.reducer=500000000; (500M)这样的话,这个场景就有20个reduce

set mapred.reduce.tasks = 15;直接写死reduce个数为15。

注意:这里set mapred.reduce.tasks代表reduce个数的同时,也代表了输出在hdfs上的文件个数,这两个是一样的

六、hive参数作用及设置方式

hive参数列表

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值