hive出现的背景
是由facebook开发。Facebook开始构建于mysql(商用的则是甲骨文的oracle,微软的sql sever,以及ibm的db2)
hive:hive是建立在hadoop体系架构上一层sql抽象,使得数据相关人员可以使用他们最为熟悉的sql语言就可以进行海量数据的处理、分析和统计工作。
hive基本架构
hive引擎:
Driver组件:组件包括complier(编译器),Optimizer(优化器),Executor(执行器),对sql进行解析、优化、执行,然后调用底层的mr计算框架。
Metastore:元数据服务组件,存储hive的元数据
CLI:命令行接口
Thrift Server:提供JDBC和ODBC接入能力,用来进行可拓展且跨语言的服务开发。hive集成这服务,能让不同编程语言调用hive接口
JDBC就是用了让JAVA代码能更好的与数据库连接而由数据库厂商提供的接口,驱动是其实现类。Java提供访问数据库规范称为JDBC,而生产厂商提供规范的实现类称为驱动。
HWI(hive web interface):hive客户端提供一种通过网页方式访问hive。
hive通过CLI、JDBC/ODBC或者HWI接收相关的hive sql查询,并通过Driver进行编译、优化最后变成可执行的mapreduce。执行如图:
hive sql
1、hive表分为两类:内部表和外部表
内部表:即hive管理的表,hive内部表的管理即包含逻辑以及语法上的,也包含实际物理上的。删除内部表时,物理数据和文件也一并删除
外部表:管理仅仅是逻辑和语法上的,新建表仅仅是指向一个外部目录而已。删除外部表也并不物理删除外部目录,而仅仅是将引用和定义删除。
如何选择内部表和外部表?大多数,这种区别不是很明显。如果数据的所有处理都在hive中进行,那更倾向于选择内部表。如果hive和其他工具针对相同的数据集做处理,那么外部表更合适,外部表的另一种场景就是对一个数据集,关联多个schema。
2、分区和桶
hive将表划分为分区,分区可以让数据查的更快。可以进一步划分为桶,桶通常在原始数据中加入额外的结构,这些结构可以用于高效查询。
使用分桶,原因:1、为了高效查询,对这两个表进行关联的时候,可以使用map-side关联高效实现。
2、是可以高效进行抽样。
分桶原理:hive表根据字段哈希后取余数来决定数据应该放在哪个桶。
hive sql执行原理图
1、mr原理,进行shuffle时,最常用的分区方法是hash partition,即hadoop会对没个键取hash值,然后再对此hash值按照reducer任务数取模,从而得到对应的reducer,保证相同的键,分配到同一个ruducer上,同时hash函数也确保map任务的输出被均匀分配到所有的reduce任务上。
2、多表关联时,先是t1 和t2关联,其结果在和t3关联,这样实际上数据被shuffle和reduce两次,因此多表关联花费的时间更长,需要完成两次顺序reduce过程。
