Hive-数据分析系统
2018-09-22 本文已影响110人
一个喜欢烧砖的人
背景
为了降低大数据领域使用mepreduce的使用门槛,提高分析效率,大数据引用了对sql的支持
- mepreduce对应hive
- spark对应spark sql
sql on hadoop
目的:
- 基于计算引擎
- 基于mpp架构
hive架构
hive 对外访问
- hive对外提供了三种访问方式,包括web ui 、cli 、thrift协议
hive 后端主要由三个服务组成
- driver(驱动器) :与传统数据库的查询引擎类似,在这里指的是mepreduce或者spark等
- metastore:hive metastore是管理和储存元信息的,在hive中默认用的是derby,但是一般用的mysql
- hadoop:hive依赖于hadoop 储存用的是hdfs,分析用的mepreduce,资源用的是yarn等
metastore分为三种 部署模式
- 嵌入式模式:metestore和数据库嵌入到driver中(一般用于测试)
- 本地模式:driver和metastore运行在本地,而数据库启动在一个共享节点上
- 远程模式:metastore运行在单独的一个节点上,由其他所有服务共享 使用beeline,jdbc等方式访问(这是一种常用的生产环境下的部署模式)
(hive 的metastore里面的元数据可以直接被presto,impala等sql直接访问)
hive查询引擎(dag相比于mepreduce的优点:)
- dag避免了记住分布式文件系统交换数据带来的不必要的网络和磁盘的io
- 将重复使用的数据放在内存中加速读取效率
- 服用资源直到sql执行完毕
hive表操作
- 传统型数据库是插入时校验,而hive是计算式校验(数据合法的校验)
- hive数据表是分层的
- hive数据表的类型(临时表(只对当前session有效,如果当前session退出,则消失)、外部表(删除数据库时,只是删除了元数据)、受管理表(与元数据的生命周期是一致的,如果删除则都删除了))
- 分区表:
数据表可以按照某一个或者几个字段进一步划分多个数据分区(使用语句:partitioned by col_name),不同的分区其实在不同的目录中,这样在查询时候不同的分区会直接跳过,大大减少了不必要的磁盘io - 分桶表:
数据表或者数据分区可以按照某个字段进一步分成若干个桶,(不如语句:clustered by(userid) into 32 buckets ,这一语句将数据表按照userid 分成32个数据桶)
hive执行引擎
image.pnghive 分区表
- 查询时为了减少不必要的扫描可以采用分区表
- 为了避免产生过多的小文件,建议只对离散字段进行分区
hive实用优化
- 分区表-提高查询(partition)
- 列式存储(parquet和orc)
- 表连接优化(将大表放后面)
- 尽早的过滤数据
- 尽量原子化操作(避免复杂的语句,建议使用临时表来过渡)
- 如果要用到union into 替换成insert into(性能能提上50%)
- order by 改为 sort by (全局排序改为局部排序)
- 数据倾斜