hive支持的文件類型:textfile、sequencefile(二進制序列化文件)、rcfile(行列式文件)、parquet、orcfile(優(yōu)化的行列式文件)
一、orc文件
帶有描述式的行列式存儲文件。將數(shù)據(jù)分組切分,一組包含很多行,每一行再按例進行存儲。
orc文件結(jié)合了行式和列式存儲結(jié)構(gòu)的優(yōu)點,在有大數(shù)據(jù)量掃描讀取時,可以按行進行數(shù)據(jù)讀取。如果要讀取某列的數(shù)據(jù),可以在讀取行組的基礎上讀取指定的列,而不需要讀取行組內(nèi)所有數(shù)據(jù)以及一行內(nèi)的所有字段數(shù)據(jù)。
1.1 orc文件的結(jié)構(gòu):
條帶(stripe)
orc文件存儲數(shù)據(jù)的地方
文本腳注(file footer)
包含了stripe列表,每個stripe包含的行數(shù),以及每個列的數(shù)據(jù)類型。包含每個列的最大值,最小值,行計數(shù),求 和等信息。
postscript
壓縮參數(shù)和壓縮大小相關(guān)的信息
1.2 stripe結(jié)構(gòu)
分為三部分:index data、rows data、stripe footer
index data:保存了所在條帶的一些統(tǒng)計信息,以及數(shù)據(jù)在stripe中的位置索引信息
rows data:存儲數(shù)據(jù)的地方,由多行組成,數(shù)據(jù)以stream(流)的形式存儲
stripe footer:保存數(shù)據(jù)所在的目錄
1.3 rows data數(shù)據(jù)結(jié)構(gòu)
metadata stream :描述每個行組的元數(shù)據(jù)信息
data stream:存儲數(shù)據(jù)的地方
1.4 orc文件中提供了三個級別的索引
文件級別:記錄文件中所有script的位置信息,以及文件中存儲的每列數(shù)據(jù)的統(tǒng)計信息
條帶級別:記錄每個stripe所存儲的數(shù)據(jù)統(tǒng)計信息
行組級別:在script中,每10000行構(gòu)成一個行組,該級別的索引信息就是記錄這個行組中存儲的數(shù)據(jù)統(tǒng)計信息
1.5 效率和數(shù)據(jù)類型
通過orc文件的索引,可以快速定位要查詢的數(shù)據(jù)塊,規(guī)避不滿足查詢條件的數(shù)據(jù)塊和文件,相比讀取傳統(tǒng)的數(shù)據(jù)文件,進行查找時需要遍歷全部數(shù)據(jù),使用orc可以避免磁盤和網(wǎng)絡的I/O浪費,從而提高查詢效率。提升整個集群的工作負載。
hive以orc文件格式存儲時,描述這些數(shù)據(jù)的字段信息,字段類型信息以及編碼等信息都和orc中存儲的數(shù)據(jù)放在一起。
orc文件都是自描述的,不依賴外部的數(shù)據(jù),也不存儲在hive元數(shù)據(jù)庫中。
數(shù)據(jù)類型:boolean,tinyint、smallint、int、bigint、float、double、string、varchar、char、binary,timestamp和date、
復雜類型:struct、list、map、union
所有類型都可以接受null值。
1.6 acid事務的支持
0.14版本之前,hive表的數(shù)據(jù)只能新增或者整塊刪除分區(qū)表,而不能對表進行單個記錄的修改。0.14版本以后,orc文件類型能夠確保hive在工作時的原子性、一致性、隔離性、持久性的ACID事務能夠被正確的使用??梢詫螚l數(shù)據(jù)進行更新。
hive 的事務適合對大批量的數(shù)據(jù)進行更新,不適合頻繁的小批量數(shù)據(jù)。
下面是創(chuàng)建hive事務表的方法
--(1)開啟配置
----開啟并發(fā)支持,支持刪除和更新事務
set hive.support.concurrentcy=true;
----支持acid事務的表必須為分桶表
set hive.enforce.bucketing=true;
-----動態(tài)分區(qū),開啟事務需要開啟動態(tài)分區(qū)非嚴格模式
set hive.exec.dynamic.partition=true;
set hive.exec.dynamic.partition.mode=nonstrict;
----所有的org.apache.hadoop.hive.sql.lockmgr.DummyTxnManager 不支持事務
set hive.txn.manager=org.apache.hadoop.hive.sql.lockmgr.DummyTxnManager
---開啟在相同的一個meatore實例運行初始化和清理的線程
set hive.compactor.initiator.on=true;
--設置每個metastore實例運行的線程數(shù)
set hive.compactor.worker.threads=1
--(2)創(chuàng)建表
-- 必須支持分桶
create table student_txn
( id int,
name String
)cluster by (id) into 2 buckets
stored as orc
-- 表屬性中添加支持事務
tblproperties('transactional' = 'true')
--(3) 插入數(shù)據(jù),更新數(shù)據(jù)
insert into table student_txn values('1000','student_1001');
update student_txn set name='student_lzn' where id='1001';
1.7 orc相關(guān)的配置
orc.compress: 壓縮類型,none,zlib,snappy
orc.compress.size: 壓縮塊的大小,默認值262114(256kb)
orc.stripe.size: 寫stripe,可以使用的內(nèi)存緩沖池大小,默認67108864(64mb)
orc.row.index.stride: 行組級別的索引數(shù)量大小,默認10000,必須設定為大于10000的數(shù)。
orc.create.index: 是否創(chuàng)還能行組級別索引,默認true
orc.bloom.filter.columns: 需要創(chuàng)建的布隆過濾器的組
orc.bloom.filter.fpp: 使用布隆過濾器的假正(false positive)概率,默認為0.05
hive中使用布隆過濾器可以用較少的空間判定數(shù)據(jù)是否存在表中(如果不存在,那么100%就是不存在,存在的話再去查找確認存在)。
hive表配置屬性:
hive.stats.gather.num.threads: 收集統(tǒng)計信息的線程數(shù),默認10。只適用于orc這類已經(jīng)實現(xiàn)StatsProvidingReader接口的文件格式。
hive.exec.core.memory.pool: 寫orc文件,可以使用的已分配堆內(nèi)存的最大比例。
hive.exec.orc.default.stripe.size: 每個stripe文件,可以會用的緩沖池大小,默認64MB。
hive.exec.orc.default.block.size: 每個stripe存儲文件塊大小,默認256MB。
hive.exec.orc.dictionary.key.size.threshold: 閾值,默認0.8。如果字典中的鍵數(shù)大于所有非空數(shù)據(jù)行數(shù)的這一閾值,則關(guān)閉字典編碼。
hive.exec.orc.default.row.index.stride: hive表行組級索引數(shù)量大小,默認10000。
hive.exec.orc.default.block.padding: 寫orc文件時,是否填充已有的hdfs文件塊,默認false。
hive.exec.orc.block.padding.tolerance: 閾值,默認0.05,允許填充到hdfs文件塊的最小文件。
hive.exec.orc.default.compress: 定義orc文件壓縮編碼、解碼器。默認為zlib。
hive.merge.orcfile.stripe.level: 默認true。這時如果hive.merge.mapfile、hive.merge.mapredfiles或者hive.merge.tezfiles也開啟,在寫入數(shù)據(jù)到orc文件時,將會一strip級別合并小文件。
hive.exec.orc.zerocopy: 默認false,使用零拷貝方式讀取orc文件。
hive.exec.orc.skip.corrupt.data: 默認false,處理數(shù)據(jù)時,遇到異常拋出,為true,則跳過異常。
二、parquet文件
2.1 parquet的基本結(jié)構(gòu)
表被分為多個行組,每個列塊又被拆分成若干的頁。
parquet存儲時,會記錄數(shù)據(jù)的元數(shù)據(jù),文件級別的元數(shù)據(jù),列塊級別的元數(shù)據(jù),頁級別的元數(shù)據(jù)。
文件級別的元數(shù)據(jù):表結(jié)構(gòu),文件記錄數(shù),文件擁有的行組數(shù),以及行組的總量記錄數(shù),每個行組下,列塊文件偏移量。
列塊級別的元數(shù)據(jù):列塊壓縮前后的數(shù)據(jù)大小,以及壓縮編碼,數(shù)據(jù)頁偏移量,索引頁偏移量,列塊數(shù)據(jù)記錄數(shù)。
頁級別的元數(shù)據(jù)(頁頭):頁的編碼信息,數(shù)據(jù)記錄數(shù)
parquet文件結(jié)構(gòu)同樣在查詢時可以過濾大量的記錄,但是orc對過濾做了額外的優(yōu)化,相比之下,查時,orc文件會消耗更少的資源。
2.2 parquet文件配置
parquet.block.size: 默認134217728byte,128MB,表示在內(nèi)存中的塊大小??梢栽O置更大,可以提高讀效率,但是寫時耗費更多的內(nèi)存。
parquet.page.size: 1048576byte,1MB,每個頁的大小,特指壓縮后的頁大小,讀取時先將頁進行解壓。頁是parquet操作的最小單位,每次讀取時,必須讀完一整頁數(shù)據(jù)才能訪問數(shù)據(jù)。設置過小會導致壓縮出現(xiàn)性能問題。
parquet.compression: 默認uncompressed、表示頁的壓縮方式。
parquet.enable.dictionary: 默認true,是否啟用字典編碼
parquet.dictionary.page.size: 默認1048576byte(1MB),使用字典碼,會在每一行,每一列中創(chuàng)建一個字典頁。使用字典編碼,如果在存儲的數(shù)據(jù)頁中重復數(shù)據(jù)較多,能夠起到很好的壓縮效果,也能減少每頁的內(nèi)存使用。
2.3 數(shù)據(jù)歸檔
對于hdfs中有大量小文件的表,可以通過hadoop歸檔(hadoop archive)的方式將文件歸并成為較大的文件。
歸并后的分區(qū)會先創(chuàng)建data.har目錄,包含:索引和數(shù)據(jù)。索引記錄歸并前的文件在歸并后的位置
數(shù)據(jù)歸檔:數(shù)據(jù)歸檔后不會對數(shù)據(jù)進行壓縮
—啟用數(shù)據(jù)歸檔
set hive.archive.enabled=true;
set hive.archive.har.parentdir.settable=true;
—歸檔后的最大文件大小
set har.partfile.size=1099511627776
—對分區(qū)執(zhí)行歸檔
set table table_name archive partition(partition_col=partition_val)
–將歸檔的分區(qū)還原為原來的普通分區(qū)文章來源:http://www.zghlxwxcb.cn/news/detail-768723.html
alter table table_name unarchive partition (partition_col=partition_val)文章來源地址http://www.zghlxwxcb.cn/news/detail-768723.html
到了這里,關(guān)于hive文件存儲格式orc和parquet詳解的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!