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設置從新嘗試的次數,