apache hive:
数据仓库,通过sql语句很方便的读、写、管理分布式系统中的大数据集,hadoop上层的工具。 1.通过sql语句访问数据,可以支持ETL(extract/transform/load)、报表和数据分析等。 2.支持丰富的数据格式,加强数据结构化 3.既可以直接访问hadoop上的数据,也可以访问hbase之类的数据存储系统上的数据。 4.支持通过Tez、spark、MapReduce查询引擎查询数据。 并不是设计用来OLTP,最佳使用场所就是替代传统的数据仓库,有极强的伸缩性,扩展机器、高性能,容错,数据格式宽泛。组件:
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。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://如果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.HiveDriverhive中的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';设计原理:
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设置重新尝试的次数,