Hive--可执行SQL的Hadoop数据仓库管理工具
Hive是一个基于HDFS的数据仓库软件,可理解为数据库管理工具;Hive的功能主要有:
1. 支持使用SQL对分布式存储的大型数据集进行读、写、管理,将SQL转化成MapReduce任务执行;
2. 将数据结构映射到已存储的数据中,即将存储在HDFS上结构化的文件内容定义成Hive的外部表。
3. Hive提供了命令行的操作工具和JDBC的开发接口。
我们知道HBase也是基于HDFS的数据库,两者之间有何异同点呢?简言之,Hive和HBase都是Hadoop集群下的工具(bi),Hive是对MapReduce的优化(使用SQL操作MR),而HBase则是HDFS数据存储的大管家。
Hive | HBase | |
出发点 | 使用SQL简化对MapReduce的操作 | 将HDFS上无序的数据映射成有序的表格,便于管理和使用数据 |
数据存储 | 1. Hive是纯逻辑表,无物理存储结构;只定义表格元数据,元数据保存在其他数据库上如MySQL,表格数据存储在HDFS上; 2. Hive是逻辑表,属于稠密型,定义列数,每一行有固定的列数。 |
1. HBase表则是物理表,适合存放非结构化的数据; 2. HBase的存储表存储密度小,用户可以对行定义成不同的列。 |
数据访问 | Hive是在MapReduce的基础上对数据进行处理,而MapReduce的数据处理依照行模式; | HBase为列模式,这样使得对海量数据的随机访问变得可行。 |
使用场景 | 1. Hive使用Hadoop来分析处理数据,而Hadoop系统是批处理系统,所以数据处理存在延时的问题; 2. Hive没有row-level的更新,它适用于大量append-only数据集(如日志)的批任务处理; 3. Hive全面支持SQL,一般可以用来进行基于历史数据的挖掘、分析; 4. Hive主要针对的是OLAP应用,其底层是hdfs分布式文件系统,重点是基于一个统一的查询分析层,支撑OLAP应用中的各种关联,分组,聚合类SQL语句。Hive一般只用于查询分析统计,而不能是常见的CUD操作,要知道Hive是需要从已有的数据库或日志进行同步最终入到HDFS文件系统中,当前要做到增量实时同步都相当困难。 |
1. HBase是准实时系统,可以实现数据的实时查询; 2. HBase的查询,支持和row-level的更新; 3. HBase不适用于有join,多级索引,表关系复杂的应用场景; 4. HBase的应用场景通常是采集网页数据的存储,因为它是key-value型数据库,从而可以到各种key-value应用场景,例如存储日志信息,对于内容信息不需要完全结构化出来的类CMS应用等。注意HBase针对的仍然是OLTP应用为主。 |
结合两者的特点,我们可以将Hbase和Hive应用在大数据架构中的不同位置,使用Hbase解决实时数据查询问题,使用Hive解决数据处理和计算问题。
那么Hive具体是如何工作的,其结构原理是怎样的,下面我们具体分析:
1. Hive在0.11版本中引入HiveServer2,是HiveServer(ThriftServer)的升级版本,增加了支持多用户并发和安全认证等功能;HiveServer2是Hive的服务端,接受客户端的任务请求并执行;
2. HiveServer2的客户端有:Beeline、JDBC、Python Client、Ruby Client等。Beeline是HiveServer2的命令行工具,Hive CLI由于不支持多用户等特性已被弃用,JDBC、Python Client、Ruby Client等接口需要用户开发客户端程序连接Hive。
3. HiveServer2的任务执行流程:
(1) Hive将客户端提交的HQL任务解析编译成一组操作符(Operator),比如GroupByOperator,JoinOperator等;
(2)操作符Operator是Hive的最小处理单元;
(3)每个操作符代表一个HDFS操作或者MapReduce作业;
(4)Hive通过ExecMapper和ExecReducer执行MapReduce程序。
(5) Hive 编译器的工作职责:
a. Parser:将 HQL 语句转换成抽象语法树(AST:Abstract Syntax Tree);
b. Semantic Analyzer:将抽象语法树转换成查询块;
c. Logic Plan Generator:将查询块转换成逻辑查询计划;
d. Logic Optimizer:重写逻辑查询计划,优化逻辑执行计划;
e. Physical Plan Gernerator:将逻辑计划转化成物理计划(MapReduce Jobs);
f. Physical Optimizer:选择最佳的 Join 策略,优化物理执行计划。
(6) 优化器类型:
下表中带①符号的,优化目的都是尽量将任务合并到一个Job中,以减少 Job数量,带②的优化目的是尽量减少shuffle数据量。
一句话概括上述过程,将HQL语句翻译成MapReduce任务执行,在Hadoop平台提供SQL语言的操作接口,降低大数据平台的使用难度。所以接下来的问题是HQL语言如何使用,Hive的数据结构到底是怎样设计的。
1. HQL是SQL的一个子集,支持SQL的大部分功能。在Beeline上编写SQL语句即可实现对Hive的操作,如:
2. Hive的数据模型:
(1)Hive数据库
类似传统数据库的DataBase,存储在MetaStore(MySQL)的元数据实际是一张表。
//创建一个数据库
hive > create database test_database;
(2)内部表
Hive的内部表与数据库中的Table在概念上是类似。每一个Table在Hive中都有一个相应的目录存储数据。例如一个表pvs,它在HDFS中的路径为/wh/pvs,其中wh是在hive-site.xml中由${hive.metastore.warehouse.dir} 指定的数据仓库的目录,所有的Table数据(不包括External Table)都保存在这个目录中。删除表时,元数据与数据都会被删除。
(3)外部表
外部表可理解为指向HDFS文件的链接,仅为HDFS上的结构化数据定义了表结构,便于操作文件。
外部表指向已经在HDFS中存在的数据,可以创建Partition。它和内部表在元数据的组织上是相同的,而实际数据的存储则有较大的差异。
内部表的创建过程和数据加载过程这两个过程可以分别独立完成,也可以在同一个语句中完成,在加载数据的过程中,实际数据会被移动到数据仓库目录中;之后对数据对访问将会直接在数据仓库目录中完成。删除内部表时,表中的数据和元数据将会被同时删除。
而外部表只有一个过程,加载数据和创建表同时完成(CREATE EXTERNAL TABLE ……LOCATION),实际数据是存储在LOCATION后面指定的 HDFS 路径中,并不会移动到数据仓库目录中。当删除一个External Table时,仅删除该链接。
//创建一个外部表
hive > create external table test_external_table (key string)
(4)分区表
Partition对应于数据库中的Partition列的密集索引,但是Hive中Partition的组织方式和数据库中的很不相同。在Hive中,表中的一个Partition对应于表下的一个目录,所有的Partition的数据都存储在对应的目录中。例如pvs表中包含ds和city两个Partition,则对应于ds = 20090801, ctry = US 的HDFS子目录为/wh/pvs/ds=20090801/ctry=US;对应于 ds = 20090801, ctry = CA 的HDFS子目录为/wh/pvs/ds=20090801/ctry=CA。
//创建一个分区表
hive >create table test_partition_table (key string) partitioned by (dt string)
(5)桶表
Buckets是将表的列通过Hash算法进一步分解成不同的文件存储。它对指定列计算hash,根据hash值切分数据,目的是为了并行,每一个Bucket对应一个文件。例如将user列分散至32个bucket,首先对user列的值计算hash,对应hash值为0的HDFS目录为/wh/pvs/ds=20090801/ctry=US/part-00000;hash值为20的HDFS目录为/wh/pvs/ds=20090801/ctry=US/part-00020。适用于多Map任务的场景。
//创建一个桶表
hive >create table test_bucket_table (key string) clustered by (key) into 20 buckets
(6)Hive的视图
视图与传统数据库的视图类似。视图是个虚表,只读的,它基于基本表,如果增加数据不会影响视图的呈现;如果删除,会出现问题。如果不指定视图的列,会根据select语句后的生成。
//创建一个试图
hive >create view test_view as select * from test
Hive的具体安装配置和使用方法,官网http://hive.apache.org/上的wiki有详细介绍,这里不再赘述。最后我们简要介绍Hive使用Zookeeper实现HA功能。
Hive从0.14开始,使用Zookeeper实现了HiveServer2的HA功能(ZooKeeper Service Discovery),Client端可以通过指定一个nameSpace来连接HiveServer2,而不是指定某一个host和port。
1. 将HiveServer2注册到Zookeeper上,以apache-hive-2.0.0-bin为例,编辑hive-site.xml:
启动HiveServer2后,可到Zookeeper中观察到已注册的Hive服务。
2. 使用JDBC连接服务
JDBC连接的URL格式为:
HiveServer2的多实例高可用配置完成,解决生产中并发、负载均衡、单点故障、安全等问题。
Hive--可执行SQL的Hadoop数据仓库管理工具的更多相关文章
- 【原创】大叔经验分享(1)在yarn上查看hive完整执行sql
hive执行sql提交到yarn上的任务名字是被处理过的,通常只能显示sql的前边一段和最后几个字符,这样就会带来一些问题: 1)相近时间提交了几个相近的sql,相互之间无法区分: 2)一个任务有问题 ...
- Hive和SparkSQL:基于 Hadoop 的数据仓库工具
Hive 前言 Hive 是基于 Hadoop 的一个数据仓库工具,可以将结构化的数据文件映射为一张数据库表,并提供完整的 SQL 查询功能,将类 SQL 语句转换为 MapReduce 任务执行. ...
- Hive和SparkSQL: 基于 Hadoop 的数据仓库工具
Hive: 基于 Hadoop 的数据仓库工具 前言 Hive 是基于 Hadoop 的一个数据仓库工具,可以将结构化的数据文件映射为一张数据库表,并提供完整的 SQL 查询功能,将类 SQL 语句转 ...
- hive元数据格式化 在hive中执行sql语句:SemanticException org.apache.hadoop.hive.ql.metadata.HiveException:
https://blog.csdn.net/xiaoqiu_cr/article/details/80913437
- hive批量执行sql命令及使用小技巧
root@hadoop-senior hive-0.13.1]$ bin/hive -helpusage: hive -d, --define <key=value> Variable s ...
- Mysql Workbench 执行sql语句删除数据时提示error code 1175
error code 1175是因为有安全模式限制 执行命令SET SQL_SAFE_UPDATES = 0;之后可以进行操作
- mysql动态执行sql批量删除数据
CREATE PROCEDURE `sp_delete_pushmsg_data`() BEGIN ); ); declare l_dutyno int; ; ; ; ; day),'%Y-%m-%d ...
- 使用Hive或Impala执行SQL语句,对存储在Elasticsearch中的数据操作(二)
CSSDesk body { background-color: #2574b0; } /*! zybuluo */ article,aside,details,figcaption,figure,f ...
- 使用Hive或Impala执行SQL语句,对存储在Elasticsearch中的数据操作
http://www.cnblogs.com/wgp13x/p/4934521.html 内容一样,样式好的版本. 使用Hive或Impala执行SQL语句,对存储在Elasticsearch中的数据 ...
随机推荐
- Ubuntu做Tomcat服务:insserv: warning: script 'tomcat' missing LSB tags and overrides
https://blog.csdn.net/hanchao5272/article/details/79819460 转载自:https://blog.bbzhh.com/index.php/arch ...
- 网罗收集10046的各种Case,方便trace信息的收集
每逢与遇到SQL相关性能,我们总是需要收集10046的,来查看和诊断问题.因为10046真实的反应的SQL语句执行的时候的真实信息,解析,执行,获取的时间消耗,row source operation ...
- MDT配置数据库
连接数据库可以使用数据库账户和Windows集成身份验证两种方法:使用数据库账户:1.连接数据库时选择TCP/IP2.在数据库中添加相应规则后,配置数据库3.在CustomSettings.ini文件 ...
- MATLAB 正则表达式(一)(转)
http://blog.sina.com.cn/s/blog_53f29119010009uf.html 正则表达式这个词上大学的时候就听同寝室的一个家伙常念叨——那家伙当然很厉害啦,现在已经发洋财去 ...
- mysqlDOS命令
MySQL : 1.安装mysql服务:mysqld install 2.删除mysql服务:sc delete mysql 3.启动mysql服务:net start mysql 4.初始化设置密码 ...
- blank site teamplate去了哪里?
在sharepoint 2010包括sharepoint2010以前,有一个模板是blank site template.到了sharepoint2013,突然发现没有了. 再也不能生成基于blank ...
- 【转】爬虫的一般方法、异步、并发与框架scrapy的效率比较
该文非原创文字,文字转载至 jclian91 链接:https://www.cnblogs.com/jclian91/p/9799697.html Python爬虫的N种姿势 问题的由来 ...
- 【Alpha】Daily Scrum Meeting——blog2
团队成员 吴吉键 201421122007(组长) 魏修祺 201421122008 孙劲林 201421122022 1. 会议当天照片 忘记拍了!(没有拍照片的习惯,没有第四人拍照) 2. 每个人 ...
- RabbitMQ学习以及与Spring的集成(二)
本文介绍RabbitMQ的一些基本概念. RabbitMQ服务可以安装在独立服务器上,通过配置的账户和ip访问使用.也就是说,RabbitMQ和使用它的应用可以部署在不同的服务器上.RabbitMQ的 ...
- 对象在hibernate中的状态
首先hibernate中对象的状态有三种:瞬态.游离态和持久态,三种状态转化的方法都是通过session来调用,瞬态到持久态的方法有save().saveOrUpdate().get().load() ...