Hive 组成
- 元数据:描述数据的数据
- 内部执行流程 :
- 解析器(解析器SQL语句)
- 编译器(把SQL语句编译成MapReduce程序)
- 优化器(优化MapRedue程序)
- 执行器(将MapReduce程序运行的结果提交到HDFS)
- 处理引擎 MR:MapReduce
Hive 与 Mysql 的区别
- 除了语法接近 ,其他都不一样
- 数据量 : 数据量越大 Hive 优势大 ,数据量小,mysql
- 速度:数据量越大 Hive越快,数据量小 mysql 越快
- 查询:Hive 海量数据查询,mysql 小数据量的增删改查
内部表 与 外部表的 区别
- 未被external修饰的是内部表(managed table),被external修饰的为外部表(external table)
- 删除内部表 会直接删除元数据(metadata)及存储数据
- 删除外部表 仅仅会删除元数据,HDFS上的文件并不会被删除;
- 对内部表的修改会将修改直接同步给元数据,而对外部表的表结构和分区进行修改,则需要修复(MSCK REPAIR TABLE table_name;)
- 怎么使用????
- 只有自己临时使用的 创建内部表,绝大多数场景都是外部表。
4个By
order by :全局排序 把所有数据汇总到一个 mr 进行排序,导致 数据倾斜 ,一般情况下很少使用
sort by : 排序
distribute by : 分区 分区 加 排序
Cluster by
order By(全局排序) :一个reducer,执行一个job。Total Job=1,可以在运行日志中看到:number of reucers=1.用在select语句的后面。
sort By(分区内排序):每个reducer内部进行排序,对全局结果集来说不是排序。随机分区,防止数据倾斜。①设置reduce个数。set mapreduce.job.reducers=3;②查看reduce个数。set mapreduce.job.reducers;
distribute By(分区排序):类似于map中的partition,进行分区,结合sort By使用,使用时多配置reduce进行处理。
cluster By():当distribute By 和sort By字段相同时,可以使用cluster By的形式。排序只能倒序排序,不可指定
系统函数
- 日期函数,时间:日、周、月
- date_add 、date_sub、next_day、 last_day、get_json_object
自定义函数
- UDF(User-Defined-Function) 一进一出 : 一行进来 一行出去
- 定义类 继承UDF,重写 evaluate 方法
- UDAF(User-Defined Aggregation Function) >>聚合函数,多进一处
- UDTF(User-Defined Table-Generating Functions) >>一进多出
- 定义类 继承 G....UDTF ,重写里面三个 方面 ,初始化(定义返回值名称,校验返回值类型)、close、process
- 打包 上传HDFS=》 在 hive 客户端创建 ,重换 jar 直接替换掉
窗口函数
- rank
- over
- topn
优化
- mapjoin 默认打开 不要关闭
- 行列过滤 join where ==》 where 子查询 join
- 采用分区 : 每天一分区
- 分桶 : 对数据量不太清楚的前提下,进行join后 会有数据倾斜的 风险,所以我们先分桶采样 将 key 打散 解决数据倾斜
- 小文件 :CombineHiveInpuformat 计算任务的时候将小文件合并到一起 统一切片
- Jvm 重用
- merge 合并:如果是maponly 任务 默认打开,实现功能为 如果产生了超过16mb的小文件 他会将这些小文件开始合并为 256mb 的一个文件
- 如果是MapReduce 任务 ,如果会产生小文件,需要把这个功能打开
- 压缩 : map snappy reduce 的中间位置 设置 snappy 压缩 提高传输效率
- 采用 列式 存储
- 查询时 : select name from u 查询某列 提速快
- 在 map阶段 提前进行 Combiner 前提条件是 不影响业务逻辑
- 可以换 引擎 : hive 底层引擎默认采用 mr , mr 是基于磁盘的,计算速度相对讲慢, 那么我们可以换为 tez,spark 这种 基于内存计算的 引擎 ,这样就会 快很多 。
数据倾斜
- 帖子: http://www.jianshu.com/p/2181e00d74dc
- 类型导致 数据倾斜