Hive是一個(gè)基于HDFS的數(shù)據(jù)倉(cāng)庫(kù)軟件东羹,可理解為數(shù)據(jù)庫(kù)管理工具愕难;Hive的功能主要有:
1. 支持使用SQL對(duì)分布式存儲(chǔ)的大型數(shù)據(jù)集進(jìn)行讀、寫(xiě)案疲、管理,將SQL轉(zhuǎn)化成MapReduce任務(wù)執(zhí)行麻养;
2. 將數(shù)據(jù)結(jié)構(gòu)映射到已存儲(chǔ)的數(shù)據(jù)中褐啡,即將存儲(chǔ)在HDFS上結(jié)構(gòu)化的文件內(nèi)容定義成Hive的外部表。
3. Hive提供了命令行的操作工具和JDBC的開(kāi)發(fā)接口回溺。
我們知道HBase也是基于HDFS的數(shù)據(jù)庫(kù)春贸,兩者之間有何異同點(diǎn)呢混萝?簡(jiǎn)言之,Hive和HBase都是Hadoop集群下的工具(bi)萍恕,Hive是對(duì)MapReduce的優(yōu)化(使用SQL操作MR)逸嘀,而HBase則是HDFS數(shù)據(jù)存儲(chǔ)的大管家。
對(duì)大數(shù)據(jù)以及人工智能概念都是模糊不清的允粤,該按照什么線路去學(xué)習(xí)崭倘,學(xué)完往哪方面發(fā)展,想深入了解类垫,想學(xué)習(xí)的同學(xué)歡迎加入大數(shù)據(jù)學(xué)習(xí)qq群:458345782司光,有大量干貨(零基礎(chǔ)以及進(jìn)階的經(jīng)典實(shí)戰(zhàn))分享給大家,并且有清華大學(xué)畢業(yè)的資深大數(shù)據(jù)講師給大家免費(fèi)授課悉患,給大家分享目前國(guó)內(nèi)最完整的大數(shù)據(jù)高端實(shí)戰(zhàn)實(shí)用學(xué)習(xí)流程體系 残家。從java和linux入手,其后逐步的深入到HADOOP-hive-oozie-web-flume-python-hbase-kafka-scala-SPARK等相關(guān)知識(shí)一一分享售躁!
HiveHBase
出發(fā)點(diǎn)使用SQL簡(jiǎn)化對(duì)MapReduce的操作將HDFS上無(wú)序的數(shù)據(jù)映射成有序的表格坞淮,便于管理和使用數(shù)據(jù)
數(shù)據(jù)存儲(chǔ)1. Hive是純邏輯表,無(wú)物理存儲(chǔ)結(jié)構(gòu)陪捷;只定義表格元數(shù)據(jù)回窘,元數(shù)據(jù)保存在其他數(shù)據(jù)庫(kù)上如MySQL,表格數(shù)據(jù)存儲(chǔ)在HDFS上市袖;
2. Hive是邏輯表啡直,屬于稠密型,定義列數(shù)苍碟,每一行有固定的列數(shù)酒觅。
1. HBase表則是物理表,適合存放非結(jié)構(gòu)化的數(shù)據(jù)驰怎;
2. HBase的存儲(chǔ)表存儲(chǔ)密度小阐滩,用戶可以對(duì)行定義成不同的列二打。
數(shù)據(jù)訪問(wèn)Hive是在MapReduce的基礎(chǔ)上對(duì)數(shù)據(jù)進(jìn)行處理县忌,而MapReduce的數(shù)據(jù)處理依照行模式;HBase為列模式继效,這樣使得對(duì)海量數(shù)據(jù)的隨機(jī)訪問(wèn)變得可行症杏。
使用場(chǎng)景1. Hive使用Hadoop來(lái)分析處理數(shù)據(jù),而Hadoop系統(tǒng)是批處理系統(tǒng)瑞信,所以數(shù)據(jù)處理存在延時(shí)的問(wèn)題厉颤;
2. Hive沒(méi)有row-level的更新,它適用于大量append-only數(shù)據(jù)集(如日志)的批任務(wù)處理凡简;
3. Hive全面支持SQL逼友,一般可以用來(lái)進(jìn)行基于歷史數(shù)據(jù)的挖掘精肃、分析;
4. Hive主要針對(duì)的是OLAP應(yīng)用帜乞,其底層是hdfs分布式文件系統(tǒng)司抱,重點(diǎn)是基于一個(gè)統(tǒng)一的查詢分析層,支撐OLAP應(yīng)用中的各種關(guān)聯(lián)黎烈,分組习柠,聚合類SQL語(yǔ)句。Hive一般只用于查詢分析統(tǒng)計(jì)照棋,而不能是常見(jiàn)的CUD操作资溃,要知道Hive是需要從已有的數(shù)據(jù)庫(kù)或日志進(jìn)行同步最終入到HDFS文件系統(tǒng)中,當(dāng)前要做到增量實(shí)時(shí)同步都相當(dāng)困難烈炭。
1. HBase是準(zhǔn)實(shí)時(shí)系統(tǒng)溶锭,可以實(shí)現(xiàn)數(shù)據(jù)的實(shí)時(shí)查詢;
2. HBase的查詢符隙,支持和row-level的更新暖途;
3. HBase不適用于有join,多級(jí)索引膏执,表關(guān)系復(fù)雜的應(yīng)用場(chǎng)景驻售;
4. HBase的應(yīng)用場(chǎng)景通常是采集網(wǎng)頁(yè)數(shù)據(jù)的存儲(chǔ),因?yàn)樗莐ey-value型數(shù)據(jù)庫(kù)更米,從而可以到各種key-value應(yīng)用場(chǎng)景欺栗,例如存儲(chǔ)日志信息,對(duì)于內(nèi)容信息不需要完全結(jié)構(gòu)化出來(lái)的類CMS應(yīng)用等征峦。注意HBase針對(duì)的仍然是OLTP應(yīng)用為主迟几。
結(jié)合兩者的特點(diǎn),我們可以將Hbase和Hive應(yīng)用在大數(shù)據(jù)架構(gòu)中的不同位置栏笆,使用Hbase解決實(shí)時(shí)數(shù)據(jù)查詢問(wèn)題类腮,使用Hive解決數(shù)據(jù)處理和計(jì)算問(wèn)題。
那么Hive具體是如何工作的蛉加,其結(jié)構(gòu)原理是怎樣的蚜枢,下面我們具體分析:
1. Hive在0.11版本中引入HiveServer2,是HiveServer(ThriftServer)的升級(jí)版本针饥,增加了支持多用戶并發(fā)和安全認(rèn)證等功能厂抽;HiveServer2是Hive的服務(wù)端,接受客戶端的任務(wù)請(qǐng)求并執(zhí)行丁眼;
2.?HiveServer2的客戶端有:Beeline筷凤、JDBC、Python Client苞七、Ruby Client等藐守。Beeline是HiveServer2的命令行工具挪丢,Hive CLI由于不支持多用戶等特性已被棄用,JDBC卢厂、Python Client吃靠、Ruby Client等接口需要用戶開(kāi)發(fā)客戶端程序連接Hive。
3.HiveServer2的任務(wù)執(zhí)行流程:
(1) Hive將客戶端提交的HQL任務(wù)解析編譯成一組操作符(Operator)足淆,比如GroupByOperator巢块,JoinOperator等;
(2)操作符Operator是Hive的最小處理單元巧号;
(3)每個(gè)操作符代表一個(gè)HDFS操作或者M(jìn)apReduce作業(yè)族奢;
(4)Hive通過(guò)ExecMapper和ExecReducer執(zhí)行MapReduce程序。
(5) ?Hive 編譯器的工作職責(zé):
a. Parser:將 HQL 語(yǔ)句轉(zhuǎn)換成抽象語(yǔ)法樹(shù)(AST:Abstract Syntax Tree)丹鸿;
b. Semantic Analyzer:將抽象語(yǔ)法樹(shù)轉(zhuǎn)換成查詢塊越走;
c. Logic Plan Generator:將查詢塊轉(zhuǎn)換成邏輯查詢計(jì)劃;
d. Logic Optimizer:重寫(xiě)邏輯查詢計(jì)劃靠欢,優(yōu)化邏輯執(zhí)行計(jì)劃廊敌;
e. Physical Plan Gernerator:將邏輯計(jì)劃轉(zhuǎn)化成物理計(jì)劃(MapReduce Jobs);
f. Physical Optimizer:選擇最佳的 Join 策略门怪,優(yōu)化物理執(zhí)行計(jì)劃骡澈。
(6) 優(yōu)化器類型:
下表中帶①符號(hào)的,優(yōu)化目的都是盡量將任務(wù)合并到一個(gè)Job中掷空,以減少 Job數(shù)量肋殴,帶②的優(yōu)化目的是盡量減少shuffle數(shù)據(jù)量。
一句話概括上述過(guò)程坦弟,將HQL語(yǔ)句翻譯成MapReduce任務(wù)執(zhí)行护锤,在Hadoop平臺(tái)提供SQL語(yǔ)言的操作接口,降低大數(shù)據(jù)平臺(tái)的使用難度酿傍。所以接下來(lái)的問(wèn)題是HQL語(yǔ)言如何使用烙懦,Hive的數(shù)據(jù)結(jié)構(gòu)到底是怎樣設(shè)計(jì)的。
1. HQL是SQL的一個(gè)子集赤炒,支持SQL的大部分功能氯析。在Beeline上編寫(xiě)SQL語(yǔ)句即可實(shí)現(xiàn)對(duì)Hive的操作,如:
hive>?create?database?test_inner_table (key string);//從本地文件加載數(shù)據(jù)到Hive(LOAD為剪切操作)//去掉LOCAL可霎,'filepath'指的是HDFS的文件地址hive>LOAD?DATA?LOCAL?INPATH?‘filepath’?INTO?TABLE?test_inner_tablehive >select* from test_inner_table;hive>selectcount(*) from test_inner_tablehive >drop table test_inner_table
2. ?Hive的數(shù)據(jù)模型:
(1)Hive數(shù)據(jù)庫(kù)
類似傳統(tǒng)數(shù)據(jù)庫(kù)的DataBase魄鸦,存儲(chǔ)在MetaStore(MySQL)的元數(shù)據(jù)實(shí)際是一張表。
//創(chuàng)建一個(gè)數(shù)據(jù)庫(kù)hive> create database test_database;
(2)內(nèi)部表
Hive的內(nèi)部表與數(shù)據(jù)庫(kù)中的Table在概念上是類似癣朗。每一個(gè)Table在Hive中都有一個(gè)相應(yīng)的目錄存儲(chǔ)數(shù)據(jù)。例如一個(gè)表pvs旺罢,它在HDFS中的路徑為/wh/pvs旷余,其中wh是在hive-site.xml中由${hive.metastore.warehouse.dir} 指定的數(shù)據(jù)倉(cāng)庫(kù)的目錄绢记,所有的Table數(shù)據(jù)(不包括External Table)都保存在這個(gè)目錄中。刪除表時(shí)正卧,元數(shù)據(jù)與數(shù)據(jù)都會(huì)被刪除蠢熄。
(3)外部表
外部表可理解為指向HDFS文件的鏈接,僅為HDFS上的結(jié)構(gòu)化數(shù)據(jù)定義了表結(jié)構(gòu)炉旷,便于操作文件签孔。
外部表指向已經(jīng)在HDFS中存在的數(shù)據(jù),可以創(chuàng)建Partition窘行。它和內(nèi)部表在元數(shù)據(jù)的組織上是相同的饥追,而實(shí)際數(shù)據(jù)的存儲(chǔ)則有較大的差異。
內(nèi)部表的創(chuàng)建過(guò)程和數(shù)據(jù)加載過(guò)程這兩個(gè)過(guò)程可以分別獨(dú)立完成罐盔,也可以在同一個(gè)語(yǔ)句中完成但绕,在加載數(shù)據(jù)的過(guò)程中,實(shí)際數(shù)據(jù)會(huì)被移動(dòng)到數(shù)據(jù)倉(cāng)庫(kù)目錄中惶看;之后對(duì)數(shù)據(jù)對(duì)訪問(wèn)將會(huì)直接在數(shù)據(jù)倉(cāng)庫(kù)目錄中完成捏顺。刪除內(nèi)部表時(shí),表中的數(shù)據(jù)和元數(shù)據(jù)將會(huì)被同時(shí)刪除纬黎。
而外部表只有一個(gè)過(guò)程幅骄,加載數(shù)據(jù)和創(chuàng)建表同時(shí)完成(CREATE EXTERNAL TABLE ……LOCATION),實(shí)際數(shù)據(jù)是存儲(chǔ)在LOCATION后面指定的 HDFS 路徑中本今,并不會(huì)移動(dòng)到數(shù)據(jù)倉(cāng)庫(kù)目錄中昌执。當(dāng)刪除一個(gè)External Table時(shí),僅刪除該鏈接诈泼。
//創(chuàng)建一個(gè)外部表hive >createexternaltabletest_external_table (keystring)
(4)分區(qū)表
Partition對(duì)應(yīng)于數(shù)據(jù)庫(kù)中的Partition列的密集索引懂拾,但是Hive中Partition的組織方式和數(shù)據(jù)庫(kù)中的很不相同。在Hive中铐达,表中的一個(gè)Partition對(duì)應(yīng)于表下的一個(gè)目錄岖赋,所有的Partition的數(shù)據(jù)都存儲(chǔ)在對(duì)應(yīng)的目錄中。例如pvs表中包含ds和city兩個(gè)Partition瓮孙,則對(duì)應(yīng)于ds = 20090801, ctry = US 的HDFS子目錄為/wh/pvs/ds=20090801/ctry=US唐断;對(duì)應(yīng)于 ds = 20090801, ctry = CA 的HDFS子目錄為/wh/pvs/ds=20090801/ctry=CA。
//創(chuàng)建一個(gè)分區(qū)表hive >createtabletest_partition_table (keystring) partitionedby(dtstring)
(5)桶表
Buckets是將表的列通過(guò)Hash算法進(jìn)一步分解成不同的文件存儲(chǔ)杭抠。它對(duì)指定列計(jì)算hash脸甘,根據(jù)hash值切分?jǐn)?shù)據(jù),目的是為了并行偏灿,每一個(gè)Bucket對(duì)應(yīng)一個(gè)文件丹诀。例如將user列分散至32個(gè)bucket,首先對(duì)user列的值計(jì)算hash,對(duì)應(yīng)hash值為0的HDFS目錄為/wh/pvs/ds=20090801/ctry=US/part-00000铆遭;hash值為20的HDFS目錄為/wh/pvs/ds=20090801/ctry=US/part-00020硝桩。適用于多Map任務(wù)的場(chǎng)景。
//創(chuàng)建一個(gè)桶表hive?>createtabletest_bucket_table?(keystring)?clusteredby(key)into20buckets
?(6)Hive的視圖
視圖與傳統(tǒng)數(shù)據(jù)庫(kù)的視圖類似枚荣。視圖是個(gè)虛表碗脊,只讀的,它基于基本表橄妆,如果增加數(shù)據(jù)不會(huì)影響視圖的呈現(xiàn)衙伶;如果刪除,會(huì)出現(xiàn)問(wèn)題害碾。如果不指定視圖的列矢劲,會(huì)根據(jù)select語(yǔ)句后的生成。
//創(chuàng)建一個(gè)試圖hive >create view test_viewasselect *fromtest
Hive的具體安裝配置和使用方法蛮原,官網(wǎng)http://hive.apache.org/上的wiki有詳細(xì)介紹卧须,這里不再贅述。最后我們簡(jiǎn)要介紹Hive使用Zookeeper實(shí)現(xiàn)HA功能儒陨。
Hive從0.14開(kāi)始花嘶,使用Zookeeper實(shí)現(xiàn)了HiveServer2的HA功能(ZooKeeper Service Discovery),Client端可以通過(guò)指定一個(gè)nameSpace來(lái)連接HiveServer2蹦漠,而不是指定某一個(gè)host和port椭员。
1. 將HiveServer2注冊(cè)到Zookeeper上,以apache-hive-2.0.0-bin為例笛园,編輯hive-site.xml:
hive.server2.support.dynamic.service.discoverytrue? hive.server2.zookeeper.namespacehiveserver2_zk? hive.zookeeper.quorumzkNode1:2181,zkNode2:2181,zkNode3:2181hive.zookeeper.client.port2181hive.server2.thrift.bind.host0.0.0.0hive.server2.thrift.port10001//兩個(gè)HiveServer2實(shí)例的端口號(hào)要一致
啟動(dòng)HiveServer2后隘击,可到Zookeeper中觀察到已注冊(cè)的Hive服務(wù)。
2. 使用JDBC連接服務(wù)
JDBC連接的URL格式為:
//為Zookeeper的集群鏈接串研铆,如zkNode1:2181,zkNode2:2181,zkNode3:2181//為Hive數(shù)據(jù)庫(kù)埋同,默認(rèn)為default// serviceDiscoveryMode=zooKeeper 指定模式為zooKeeper// zooKeeperNamespace=hiveserver2 指定ZK中的nameSpace,即參數(shù)hive.server2.zookeeper.namespace所定義jdbc:hive2:///;serviceDiscoveryMode=zooKeeper;zooKeeperNamespace=hiveserver2
HiveServer2的多實(shí)例高可用配置完成棵红,解決生產(chǎn)中并發(fā)凶赁、負(fù)載均衡、單點(diǎn)故障逆甜、安全等問(wèn)題虱肄。
對(duì)大數(shù)據(jù)以及人工智能概念都是模糊不清的,該按照什么線路去學(xué)習(xí)交煞,學(xué)完往哪方面發(fā)展咏窿,想深入了解,想學(xué)習(xí)的同學(xué)歡迎加入大數(shù)據(jù)學(xué)習(xí)qq群:458345782素征,有大量干貨(零基礎(chǔ)以及進(jìn)階的經(jīng)典實(shí)戰(zhàn))分享給大家集嵌,并且有清華大學(xué)畢業(yè)的資深大數(shù)據(jù)講師給大家免費(fèi)授課萝挤,給大家分享目前國(guó)內(nèi)最完整的大數(shù)據(jù)高端實(shí)戰(zhàn)實(shí)用學(xué)習(xí)流程體系 。從java和linux入手纸淮,其后逐步的深入到HADOOP-hive-oozie-web-flume-python-hbase-kafka-scala-SPARK等相關(guān)知識(shí)一一分享平斩!