hive 结构metastone_深入理解hive之事务处理
事務(wù)的四個特性
1.automicity:原子性
2.consistency:一致性
3. isolation:獨立性
4.durability:持久性
5.支持事務(wù)有幾個條件需要滿足:1.所有的事務(wù)都支持自動提交;2.只支持ORC格式的數(shù)據(jù);3.桶表
7.配置hive的參數(shù)使其支持事務(wù):
在hive-site.xml文件中進(jìn)行如下的配置
hive.support.concurrency
true
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
1
hive.enforce.bucketing
true
對幾個重要的屬性做闡述:
hive.exec.dynamic.partition.mode:
可選值有:strict, nonstric.
strict嚴(yán)格模式下,必須制定一個partition為靜態(tài)分區(qū),目的是為了防止誤操作其他partition.
在一個事務(wù)中,可能不止會更新一個Partition, 而且更新時也無法控制到底哪些partition會被操作到,因此為了支持事務(wù),必須使用 Nonstrict.
hive.compactor.initiator.on
默認(rèn)值是 false, 因為默認(rèn)的情況連事務(wù)都不開啟。
這個屬性很重要的原因是回答之前我們的一個問題,如果 delta 文件過多,對namenode造成了影響,我們改如何改善系統(tǒng)性能?(在thrift metaserver 上)開啟了這個屬性之后,會使得在 metaStore 實例上運行 Initiator, cleaner 進(jìn)程。initiator 進(jìn)程負(fù)責(zé)查找哪些表或者分區(qū)的 delta 文件需要被壓縮,cleaner 進(jìn)程負(fù)責(zé)刪除已經(jīng)不再需要的 delta 文件。接下來看看幾個hive的事務(wù)性操作
$hive>create table tx(id int,name string,age int) clustered by (id) into 3 buckets row format delimited fields terminated by ',' stored as orc ;//創(chuàng)建桶表,存儲格式為orc使其支持事務(wù)
$hive>desc formatted tx ; //查看tx表的結(jié)構(gòu)
$hive>insert into tx values(1,'tom',23); //向桶表中來插入數(shù)據(jù)
hive分區(qū)
Hive分區(qū)的概念與傳統(tǒng)關(guān)系型數(shù)據(jù)庫分區(qū)不同。
傳統(tǒng)數(shù)據(jù)庫的分區(qū)方式:就oracle而言,分區(qū)獨立存在于段里,里面存儲真實的數(shù)據(jù),在數(shù)據(jù)進(jìn)行插入的時候自動分配分區(qū)。
Hive的分區(qū)方式:由于Hive實際是存儲在HDFS上的抽象,Hive的一個分區(qū)名對應(yīng)一個目錄名,子分區(qū)名就是子目錄名,并不是一個實際字段。所以我們在插入數(shù)據(jù)的時候指定分區(qū),就是新建一個目錄或者子目錄,或者在原來目錄的基礎(chǔ)上來添加數(shù)據(jù)。對于hive分區(qū)而言,可以分為靜態(tài)分區(qū)和動態(tài)分區(qū)這兩個類
1.靜態(tài)分區(qū)
$hive>create table customers(id int,name string ,age int ) partitioned by(year int,month int) row format delimited? fields terminated by ','; //創(chuàng)建靜態(tài)分區(qū)表
$hive>alter table customers add partition(year=2014,month=11) partition(year=2014,month=12);//在靜態(tài)分區(qū)表中來添加分區(qū)
$hive>desc customers;//查看表結(jié)構(gòu)
$hive>show partitions customers ;? //查看customers表的分區(qū)結(jié)構(gòu)
$hive>load data local inpath '/data/customers.txt' into table customers? partition(year=2014,year=11); //從外部表加載數(shù)據(jù)到靜態(tài)分區(qū)表的指定分區(qū)中來,這是文件的復(fù)制操作
$hive>dfs -lsr /; //查看文件系統(tǒng)的文件結(jié)構(gòu)
$hive>select? * from customers where?year=2014 and? month=11;
新建表的時候定義的分區(qū)順序,決定了文件目錄順序(誰是父目錄誰是子目錄),正因為有了這個層級關(guān)系,當(dāng)我們查詢所有year=1024的時候,2014以下的所有日期下的數(shù)據(jù)都會被查出來。如果只查詢月份分區(qū),但父目錄都有該日期的數(shù)據(jù),那么Hive會對輸入路徑進(jìn)行修剪,從而只掃描日期分區(qū),性別分區(qū)不作過濾(即查詢結(jié)果包含了所有性別)。
2.動態(tài)分區(qū)
在使用靜態(tài)分區(qū)的時候,我們首先要知道有什么分區(qū)類型,然后每個分區(qū)來進(jìn)行數(shù)據(jù)的加載,這個操作過程比較麻煩;而動態(tài)分區(qū)不會有這些不必要的操作,動態(tài)分區(qū)可以根據(jù)查詢得到的數(shù)據(jù)動態(tài)地分配到分區(qū)中去,動態(tài)分區(qū)與靜態(tài)分區(qū)最大的區(qū)別是不指定分區(qū)目錄,由系統(tǒng)自己進(jìn)行過選擇。
動態(tài)分區(qū)模式可以分為嚴(yán)格模式(strict)和非嚴(yán)格模式(non-strict),二者的區(qū)別是:嚴(yán)格模式在進(jìn)行插入的時候至少指定一個靜態(tài)分區(qū),而非嚴(yán)格模式在進(jìn)行插入的時候可以不指定靜態(tài)分區(qū)
首先啟動動態(tài)分區(qū)的功能:
$hive>set hive.exec.dynamic.partition=true;
再設(shè)置分區(qū)模式為非嚴(yán)格模式
$hive>set hive.exec.dynamic.partition.mode=nonstrict
總結(jié)
以上是生活随笔為你收集整理的hive 结构metastone_深入理解hive之事务处理的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 小米汽车工厂一期项目厂房已基本成型 预计
- 下一篇: 带通滤波器作用和用途_带通滤波器的作用和