apache hive:
数据仓库,经过sql语句很方便的读、写、管理分布式系统中的大数据集,hadoop上层的工具。
1.经过sql语句访问数据,能够支持ETL(extract/transform/load)、报表和数据分析等。
2.支持丰富的数据格式,增强数据结构化
3.既能够直接访问hadoop上的数据,也能够访问hbase之类的数据存储系统上的数据。
4.支持经过Tez、spark、MapReduce查询引擎查询数据。
并非设计用来OLTP,最佳使用场所就是替代传统的数据仓库,有极强的伸缩性,扩展机器、高性能,容错,数据格式宽泛。sql
组件:
HCatLog:容许用户使用不一样的数据处理工具,如pig、MapReduce等,更容易读写集群上的数据,是hadoop上的表和存储管理层。
WebHCat:提供一些特别的服务,可使用HTTP(REST风格)接口来运行MapReduce或者Yarn、pig、hive
jobs任务,或者来管理hive配置。数据库
HiveServer2客户端:
1.beeline:
基于sqlline的一个jdbc客户端(http://sqlline.sourceforge.net/),hive为嵌入模式时相似hive
cli,远程模式时,经过thrift链接到hiveserver进程。
远程模式的hiveserver仅仅支持thrift调用,经过http方式时也同样,请求体中包含thrift的有效载荷。
eg:beeline -u jdbc:hive2://localhost:10000/default -n scott -w password_file
支持命名的url,设置一个环境变量指定链接的url,经过环境变脸链接的到hive,BEELINE_URL_<name>,如BEELINE_URL_BLUE
能够经过!connect blue 链接到hive。 apache
2.jdbc:
连接URL:
jdbc:hive2://<host1>:<port1>,<host2>:<port2>/dbName;sess_var_list?hive_conf_list#hive_var_list
host:port >> 默认端口是10000,若是为空则使用嵌入式的服务,若是启用服务发现,可使用逗号分隔的多个。
dbName:初始数据库的名称,通常为default
sess_var_list:分号分隔的键值对,如user=admin;password=admin
hive_conf_list:y,用于配置该session使用的hive配置项。
hive_var_list:分号分隔的键值对,设置该session的hive变量。
若是使用嵌入的服务:jdbc:hive2://session
若是hiveserver2运行在http模式:
jdbc:hive2://<host>:<port>/<db>;transportMode=http;httpPath=<http_endpoint>
1.<http_endpoint> is the corresponding HTTP endpoint configured in hive-site.xml. Default value is cliservice.
2.默认端口是10001数据结构
若是hiveserver2服务启用了ssl:
jdbc:hive2://<host>:<port>/<db>;ssl=true;sslTrustStore=<trust_store_path>;trustStorePassword=<trust_store_password>
若是在http模式启用了ssl:
jdbc:hive2://<host>:<port>/<db>;ssl=true;sslTrustStore=<trust_store_path>;trustStorePassword=<trust_store_password>;transportMode=http;httpPath=<http_endpoint>并发
若是启用了zookeeper服务:
在hive 2.0和1.3的版本中,一些额外的配置参数不须要写在连接URL中,好比认证模式、传输模式、ssl的参数等,这些能够经过zookeeper获取。
jdbc:hive2://<zookeeper quorum>/;serviceDiscoveryMode=zooKeeper;zooKeeperNamespace=hiveserver2
zookeeper quorum:jktest163:2181,jktest161:2181,jktest180:2181
驱动类:
org.apache.hive.jdbc.HiveDriveroracle
hive中的acid事务:
启用acid的表才能够执行update操做。
1.begin、commit、rollback还不支持,计划中,全部的更改、删除等都是自动提交的。
2.目前仅ORC格式的文件支持事务。
3.默认事务是关闭的。
必须的参数:
hive.support.concurrency=true
hive.enforce.bucketing=true (hive 2.0中不须要配置)
hive.exec.dynamic.partition.mode = nonstrict
hive.txn.manager = org.apache.hadoop.hive.ql.lockmgr.DbTxnManager
hive.compactor.initiator.on = true
hive.compactor.worker.threads = n (n>0)
4.启用事务的表必须启用bucketed功能,同一系统中不使用事务的表,不须要启用bucketed。
5.目前仅仅支持快照级别的隔离级别。当发生一个查询时,会使用一份一致的数据快照,来执行查询。如今还不支持脏读、读已提交、可重复读以及serializable。
6.已存在zookeeper和内存锁管理器与事务不兼容。
7.使用oracle做为Metastore数据库,而且设置datanucleus.connectionPoolingType=BONECP,可能会提示No such lock... 和 No such transaction错误,推荐设置datanucleus.connectionPoolingType=DBCP。分布式
启用事务时表属性设置:
transactional=true必需要设置 1.1.0版本以后,大小写不敏感
若是表拥有者不但愿系统决定何时执行合并操做,建立表时能够设置NO_AUTO_COMPACTION属性。也能够经过alter语句修改。(表属性经过TPLPROPERTIES子句设置) 1.1.0版本以后,大小写不敏感
建立支持事务的表示例:
create table if not exists users (username string,host string,updates int,last_change timestamp) clustered by (username) into 10 buckets stored as orc tblproperties('transactional'='true')工具
语法的一些改变:
添加了show transactions 和 show compactions命令。
show locks 修改以显示与事务相关的锁。
alter table 添加了一个新的选项,用于将表或分区压缩。
ALTER TABLE table_name [PARTITION (partition_key = 'partition_value' [, ...])] COMPACT 'compaction_type';oop
设计原理: HDFS不支持文件修改(支持读取、新增、删除),当另外一个用户在向文件追加数据时,对其它的用户也不提供读取的一致性。表和分区的数据存储在一个base文件集合中,新增的记录、修改及删除的信息,存储在一个delta集合中。hive为每个修改表或分区的事务建立一个新的delta文件集合。当读取的时候,会合并base集合和delta集合的文件,而且应用更新和删除操做。 delta文件的压缩: delta文件的改变合并到base文件集合中。为了作这个工做,Hive的metastore中添加了一些线程,这些线程负责决定何时要执行压缩,并执行压缩的具体工做,最后还要进行无用资源的清理工做。有两种类型的压缩: Minor:对于每一批数据,把delta集合中的多个文件,重写成一个单独的delta文件。 Major:对于每一批数据,把一个或多个delta文件和这批数据的base文件重写成一个单独的base文件。 全部的压缩操做都在后台进行,并不会影响数据的并发读写。当全部读取旧文件的任务完成以后,系统删除这些旧的文件。 压缩是一个以<hostname>-compactor-<db>.<table>.<partition>这种格式命名的MR任务。 锁管理: DbLockManager:新添加的锁管理器,全部的锁信息存储到metastore中。这意味着事务和锁都被持久化了,服务死掉后,这些信息并不会丢。为了防止由于客户端失去链接,而留下无效的事务和锁信息,锁的持有者和事务的发起者须要向metastore发送心跳数据,当超时后,事务和锁会被撤销掉。 在hive 1.3.0版本,当锁管理器不能获取锁时,会等待一段时间后重试。为了防止短查询给metastore形成太大压力,每次尝试等待时间都会翻倍。初始的等待时间是100ms,最大等待时间由hive.lock.sleep.between.retries参数设置,hive.lock.numretries设置从新尝试的次数,