數(shù)據(jù)倉庫Hive編程——Hive基礎(chǔ)知識(shí)

從早期的互聯(lián)網(wǎng)主流大爆發(fā)開始,主要的搜索引擎公司和電子商務(wù)公司就一直在和不斷增長的數(shù)據(jù)進(jìn)行較量。最近,社交網(wǎng)站也遇到了同樣的問題。如今,許多組織已經(jīng)意識(shí)到他們所收集的數(shù)據(jù)是讓他們了解他們的用戶,提高業(yè)務(wù)在市場(chǎng)上的表現(xiàn)以及提高基礎(chǔ)架構(gòu)效率的一個(gè)寶貴的資源。

Hadoop生態(tài)系統(tǒng)就是為處理如此大數(shù)據(jù)集而產(chǎn)生的一個(gè)合乎成本效益的解決方案。Hadoop實(shí)現(xiàn)了一個(gè)特別的計(jì)算模型,也就是MapReduce,其可以將計(jì)算任務(wù)分割成多個(gè)處理單元然后分散到一群家用的或服務(wù)器級(jí)別的硬件機(jī)器上,從而降低成本并提供水平可伸縮性。這個(gè)計(jì)算模型的下面是一個(gè)被稱為Hadoop分布式文件系統(tǒng)(HDFS)的分布式文件系統(tǒng)。這個(gè)文件系統(tǒng)是“可插拔的”,而且現(xiàn)在已經(jīng)出現(xiàn)了幾個(gè)商用的和開源的替代方案。

不過,仍然存在一個(gè)挑戰(zhàn),那就是用戶如何從一個(gè)現(xiàn)有的數(shù)據(jù)基礎(chǔ)架構(gòu)轉(zhuǎn)移到Hadoop上,而這個(gè)基礎(chǔ)架構(gòu)是基于傳統(tǒng)關(guān)系型數(shù)據(jù)庫和結(jié)構(gòu)化查詢語句(SQL)的。對(duì)于大量的SQL用戶(包括專業(yè)數(shù)據(jù)庫設(shè)計(jì)師和管理員,也包括那些使用SQL從數(shù)據(jù)倉庫中抽取信息的臨時(shí)用戶)來說,這時(shí)就需要Hive了。Hive提供了一個(gè)被稱為Hive查詢語言(簡(jiǎn)稱HiveQL或HQL)的SQL方言,來查詢存儲(chǔ)在Hadoop集群中的數(shù)據(jù)。

SQL知識(shí)分布廣泛的一個(gè)原因是:它是一個(gè)可以有效地、合理地且直觀地組織和使用數(shù)據(jù)的模型。即使對(duì)于經(jīng)驗(yàn)豐富的Java開發(fā)工程師來說,將這些常見的數(shù)據(jù)運(yùn)算對(duì)應(yīng)到底層的MapReduce Java API也是令人畏縮的。Hive可以幫助用戶來做這些苦活,這樣用戶就可以集中精力關(guān)注于查詢本身了。Hive可以將大多數(shù)的查詢轉(zhuǎn)換為MapReduce任務(wù),進(jìn)而在介紹一個(gè)令人熟悉的SQL抽象的同時(shí),拓寬Hadoop的可擴(kuò)展性。

Hive最適合于數(shù)據(jù)倉庫應(yīng)用程序,使用該應(yīng)用程序進(jìn)行相關(guān)的靜態(tài)數(shù)據(jù)分析,不需要快速響應(yīng)給出結(jié)果,而且數(shù)據(jù)本身不會(huì)頻繁變化。

Hive不是一個(gè)完整的數(shù)據(jù)庫。Hadoop以及HDFS的設(shè)計(jì)本身約束和局限性地限制了Hive所能勝任的工作。其中最大的限制就是Hive不支持記錄級(jí)別的更新、插入或者刪除操作。但是用戶可以通過查詢生成新表或者將查詢結(jié)果導(dǎo)入到文件中。同時(shí),因?yàn)镠adoop是一個(gè)面向批處理的系統(tǒng),而MapReduce任務(wù)的啟動(dòng)過程需要消耗較長的時(shí)間,所以Hive查詢延時(shí)比較嚴(yán)重。傳統(tǒng)數(shù)據(jù)庫中在秒級(jí)別可以完成的查詢,在Hive中,即使數(shù)據(jù)集相對(duì)較小,往往也需要執(zhí)行更長的時(shí)間。最后需要說明的是,Hive不支持事務(wù)。因此,Hive不支持OLTP(聯(lián)機(jī)事務(wù)處理)所需的關(guān)鍵功能,而更接近成為一個(gè)OLAP(聯(lián)機(jī)分析技術(shù))工具。但是我們將會(huì)看到,由于Hadoop本身的時(shí)間開銷很大,并且Hadoop所被設(shè)計(jì)用來處理的數(shù)據(jù)規(guī)模非常大,因此提交查詢和返回結(jié)果是可能具有非常大的延時(shí)的,所以Hive并沒有滿足OLAP中的“聯(lián)機(jī)”部分,至少目前并沒有滿足。

如果用戶需要對(duì)大規(guī)模數(shù)據(jù)使用OLTP功能的話,那么應(yīng)該選擇使用一個(gè)NoSQL數(shù)據(jù)庫,例如,和Hadoop結(jié)合使用的HBase及Cassandra。如果用戶使用的是Amazon彈性MapReduce計(jì)算系統(tǒng)(EMR)或者彈性計(jì)算云服務(wù)(EC2)的話,也可以使用DynamoDB。用戶甚至可以和這些數(shù)據(jù)庫(還包括其他一些數(shù)據(jù)庫)結(jié)合來使用Hive。

因此,Hive是最適合數(shù)據(jù)倉庫應(yīng)用程序的,其可以維護(hù)海量數(shù)據(jù),而且可以對(duì)數(shù)據(jù)進(jìn)行挖掘,然后形成意見和報(bào)告等。因?yàn)榇蠖鄶?shù)的數(shù)據(jù)倉庫應(yīng)用程序是使用基于SQL的關(guān)系型數(shù)據(jù)庫實(shí)現(xiàn)的,所以Hive降低了將這些應(yīng)用程序移植到Hadoop上的障礙。用戶如果懂得SQL,那么學(xué)習(xí)使用Hive將會(huì)很容易。如果沒有Hive,那么這些用戶就需要去重新學(xué)習(xí)新的語言和新的工具后才能進(jìn)行生產(chǎn)。

同樣地,相對(duì)于其他Hadoop語言和工具來說,Hive也使得開發(fā)者將基于SQL的應(yīng)用程序移植到Hadoop變得更加容易。不過,和大多數(shù)SQL方言一樣,HiveQL并不符合ANSI SQL標(biāo)準(zhǔn),其和Oracle,MySQL,SQL Server支持的常規(guī)SQL方言在很多方面存在差異(不過,HiveQL和MySQL提供的SQL方言最接近)。

因此,本博客商業(yè)智能的《數(shù)據(jù)倉庫Hive編程》系列共有兩個(gè)目的。其一,提供了一個(gè)針對(duì)所有讀者的介紹。這個(gè)介紹會(huì)比較綜合,并且會(huì)使用例子來進(jìn)行講解。適用的讀者包括開發(fā)者、數(shù)據(jù)庫管理員和架構(gòu)師,以及其他(如商業(yè)分析師等)非技術(shù)類用戶。其二,針對(duì)開發(fā)者和Hadoop管理員等需要深入了解Hive技術(shù)細(xì)節(jié)的用戶提供了更詳盡的講述,以幫助這些讀者學(xué)習(xí)如何優(yōu)化Hive查詢性能,如何通過用戶自定義函數(shù)和自定義數(shù)據(jù)格式等,來個(gè)性化使用Hive。

Hadoop生態(tài)綜述

我們?cè)凇禜adoop與Spark等大數(shù)據(jù)框架介紹》介紹了Hadoop生態(tài),這里在以介紹Hive為目再次介紹一下Hadoop生態(tài)。

MapReduce

雖然用戶無需精通MapReduce就可以使用Hive,但是理解MapReduce的基本原理將幫有助于用戶了解Hive在底層是如何運(yùn)作的,以及了解如何才能更高效地使用Hive。

MapReduce是一種計(jì)算模型,該模型可將大型數(shù)據(jù)處理任務(wù)分解成很多單個(gè)的、可以在服務(wù)器集群中并行執(zhí)行的任務(wù)。這些任務(wù)的計(jì)算結(jié)果可以合并在一起來計(jì)算最終的結(jié)果。

MapReduce編程模型是由谷歌(Google)開發(fā)的。Google通過一篇很有影響力的論文對(duì)這個(gè)計(jì)算模型進(jìn)行了描述,本書附錄部分可查看到該論文,名為《MapReduce:大數(shù)據(jù)之上的簡(jiǎn)化數(shù)據(jù)處理》。一年后,另一篇名為《Google文件系統(tǒng)》的論文介紹了Google文件系統(tǒng)。這兩篇論文啟發(fā)了道·卡?。―oug Cutting)開發(fā)了Hadoop。

MapReduce這個(gè)術(shù)語來自于兩個(gè)基本的數(shù)據(jù)轉(zhuǎn)換操作:map過程和reduce過程。一個(gè)map操作會(huì)將集合中的元素從一種形式轉(zhuǎn)換成另一種形式。在這種情況下,輸入的鍵-值對(duì)會(huì)被轉(zhuǎn)換成零到多個(gè)鍵-值對(duì)輸出。其中,輸入和輸出的鍵必須完全不同,而輸入和輸出的值則可能完全不同。

在MapReduce計(jì)算框架中,某個(gè)鍵的所有鍵-值對(duì)都會(huì)被分發(fā)到同一個(gè)reduce操作中。確切地說,這個(gè)鍵和這個(gè)鍵所對(duì)應(yīng)的所有值都會(huì)被傳遞給同一個(gè)Reducer。reduce過程的目的是將值的集合轉(zhuǎn)換成一個(gè)值(例如對(duì)一組數(shù)值求和或求平均值),或者轉(zhuǎn)換成另一個(gè)集合。這個(gè)Reducer最終會(huì)產(chǎn)生一個(gè)鍵-值對(duì)。再次說明一下,輸入和輸出的鍵和值可能是不同的。需要說明的是,如果job不需要reduce過程的話,那么也是可以無reduce過程的。

Hadoop提供了一套基礎(chǔ)設(shè)施來處理大多數(shù)困難的工作以保證任務(wù)能夠執(zhí)行成功。例如,Hadoop決定如果將提交的job分解成多個(gè)獨(dú)立的map和reduce任務(wù)來執(zhí)行,它就會(huì)對(duì)這些task進(jìn)行調(diào)度并為其分配合適的資源,決定將某個(gè)task分配到集群中哪個(gè)位置(如果可能,通常是這個(gè)task所要處理的數(shù)據(jù)所在的位置,這樣可以最小化網(wǎng)絡(luò)開銷)。它會(huì)監(jiān)控每一個(gè)task以確保其成功完成,并重啟一些失敗的task。

Hadoop分布式文件系統(tǒng)(也就是HDFS),或者一個(gè)同類的分布式文件系統(tǒng),管理著集群中的數(shù)據(jù)。每個(gè)數(shù)據(jù)塊(block)都會(huì)被冗余多份(通常默認(rèn)會(huì)冗余3份),這樣可以保證不會(huì)因單個(gè)硬盤或服務(wù)器的損壞導(dǎo)致數(shù)據(jù)丟失。同時(shí),因?yàn)槠淠繕?biāo)是優(yōu)化處理非常大的數(shù)據(jù)集,所以HDFS以及類似的文件系統(tǒng)所使用的數(shù)據(jù)塊都非常大,通常是64MB或是這個(gè)值的若干倍。這么大的數(shù)據(jù)塊可以在硬盤上連續(xù)進(jìn)行存儲(chǔ),這樣可以保證以最少的磁盤尋址次數(shù)來進(jìn)行寫入和讀取,從而最大化提高讀寫性能。

MapReduce計(jì)算框架中的輸入和輸出的基本數(shù)據(jù)結(jié)構(gòu)是鍵值對(duì)。當(dāng)Mapper進(jìn)程啟動(dòng)后,其將會(huì)被頻繁調(diào)用來處理文件中的每行文本。每次調(diào)用中,傳遞給Mapper的鍵是文檔中這行的

起始位置的字符偏移量。對(duì)應(yīng)的值是這行對(duì)應(yīng)的文本。

Hive

當(dāng)用戶真正使用Hadoop的API來實(shí)現(xiàn)算法時(shí),甚至有更多的底層細(xì)節(jié)需要用戶自己來控制。這是一個(gè)只適用于有經(jīng)驗(yàn)的Java開發(fā)人員的工作,因此也就將Hadoop潛在地放在了一個(gè)非程序員用戶無法觸及的位置,即使這些用戶了解他們想使用的算法。

事實(shí)上,許多這些底層細(xì)節(jié)實(shí)際上進(jìn)行的是從一個(gè)任務(wù)到下一個(gè)任務(wù)的重復(fù)性工作,例如,將Mapper和Reducer一同寫入某些數(shù)據(jù)操作構(gòu)造這樣的底層的繁重的工作,通過過濾得到所需數(shù)據(jù)的操作,以及執(zhí)行類似SQL中數(shù)據(jù)集鍵的連接 (JOIN)操作等。不過幸運(yùn)的是,存在一種方式,可以通過使用“高級(jí)”工具自動(dòng)處理這些情況來重用這些通用的處理過程。

這也就是引入Hive的原因。Hive不僅提供了一個(gè)熟悉SQL的用戶所能熟悉的編程模型,還消除了大量的通用代碼,甚至是那些有時(shí)是不得不使用Java編寫的令人棘手的代碼。

這就是為什么Hive對(duì)于Hadoop是如此重要的原因,無論用戶是DBA還是Java開發(fā)工程師。Hive可以讓你花費(fèi)相當(dāng)少的精力就可以完成大量的工作。

有好幾種方式可以與Hive進(jìn)行交互。在《數(shù)據(jù)倉庫Hive編程》系列中,我們將主要關(guān)注于CLI,也就是命令行界面。對(duì)于那些更喜歡圖形用戶界面的用戶,可以使用現(xiàn)在逐步出現(xiàn)的商業(yè)和開源的解決方案,例如Karmasphere發(fā)布的一個(gè)商業(yè)產(chǎn)品,Cloudera提供的開源的Hue項(xiàng)目,以及Qubole提供的“Hive即服務(wù)”方式等。

Hive發(fā)行版中附帶的模塊有CLI,一個(gè)稱為Hive網(wǎng)頁界面(HWI)的簡(jiǎn)單網(wǎng)頁界面,以及可通過JDBC、ODBC和一個(gè)Thrift服務(wù)器進(jìn)行編程訪問的幾個(gè)模塊。

所有的命令和查詢都會(huì)進(jìn)入到Driver(驅(qū)動(dòng)模塊),通過該模塊對(duì)輸入進(jìn)行解析編譯,對(duì)需求的計(jì)算進(jìn)行優(yōu)化,然后按照指定的步驟執(zhí)行(通常是啟動(dòng)多個(gè)MapReduce任務(wù)來執(zhí)行)。當(dāng)需要啟動(dòng)MapReduce任務(wù)時(shí),Hive本身是不會(huì)生成Java MapReduce算法程序的。相反,Hive通過一個(gè)表示“job執(zhí)行計(jì)劃”的XML文件驅(qū)動(dòng)執(zhí)行內(nèi)置的、原生的Mapper和Reducer模塊。換句話說,這些通用的模塊函數(shù)類似于微型的語言翻譯程序,而這個(gè)驅(qū)動(dòng)計(jì)算的“語言”是以XML形式編碼的。

Hive通過和JobTracker通信來初始化MapReduce任務(wù),而不必部署在JobTracker所在的管理節(jié)點(diǎn)上執(zhí)行。在大型集群中,通常會(huì)有網(wǎng)關(guān)機(jī)專門用于部署像Hive這樣的工具。在這些網(wǎng)關(guān)機(jī)上可遠(yuǎn)程和管理節(jié)點(diǎn)上的JobTracker通信來執(zhí)行任務(wù)。通常,要處理的數(shù)據(jù)文件是存儲(chǔ)在HDFS中的,而HDFS是由NameNode進(jìn)行管理的。

Metastore(元數(shù)據(jù)存儲(chǔ))是一個(gè)獨(dú)立的關(guān)系型數(shù)據(jù)庫(通常是一個(gè)MySQL實(shí)例),Hive會(huì)在其中保存表模式和其他系統(tǒng)元數(shù)據(jù)。在我們將詳細(xì)進(jìn)行討論。

盡管本書是關(guān)于Hive的,不過還是有必要提及其他的一些高級(jí)工具,這樣用戶可以根據(jù)需求進(jìn)行選擇。Hive最適合于數(shù)據(jù)倉庫程序,對(duì)于數(shù)據(jù)倉庫程序不需要實(shí)時(shí)響應(yīng)查詢,不需要記錄級(jí)別的插入、更新和刪除。當(dāng)然,Hive也非常適合于有一定SQL知識(shí)的用戶。不過,用戶的某些工作可能采用其他的工具會(huì)更容易進(jìn)行處理。

Pig

Hive的替代工具中最有名的就是Pig了。Pig是由Yahoo!開發(fā)完成的,而同時(shí)期Fackbook正在開發(fā)Hive。Pig現(xiàn)在同樣也是一個(gè)和Hadoop緊密聯(lián)系的頂級(jí)Apache項(xiàng)目。

假設(shè)用戶的輸入數(shù)據(jù)具有一個(gè)或者多個(gè)源,而用戶需要進(jìn)行一組復(fù)雜的轉(zhuǎn)換來生成一個(gè)或者多個(gè)輸出數(shù)據(jù)集。如果使用Hive,用戶可能會(huì)使用嵌套查詢(正如我們將看到的)來解決這個(gè)問題,但是在某些時(shí)刻會(huì)需要重新保存臨時(shí)表來控制復(fù)雜度。

Pig被描述成一種數(shù)據(jù)流語言,而不是一種查詢語言。在Pig中,用戶需要寫一系列的聲明語句來定義某些關(guān)系和其他一些關(guān)系之間的聯(lián)系,這里每個(gè)新的關(guān)系都會(huì)執(zhí)行新的數(shù)據(jù)轉(zhuǎn)換過程。Pig會(huì)查找這些聲明,然后創(chuàng)建一系列有次序的MapReduce任務(wù),來對(duì)這些數(shù)據(jù)進(jìn)行轉(zhuǎn)換,直到產(chǎn)生符合用戶預(yù)期的計(jì)算方式所得到的最終結(jié)果。

這種步進(jìn)式的數(shù)據(jù)“流”可以比一組復(fù)雜的查詢更加直觀。也因此,Pig常用于ETL(數(shù)據(jù)抽取,數(shù)據(jù)轉(zhuǎn)換和數(shù)據(jù)裝載)過程的一部分,也就是將外部數(shù)據(jù)裝載到Hadoop集群中,然后轉(zhuǎn)換成所期望的數(shù)據(jù)格式。

Pig的一個(gè)缺點(diǎn)就是其所使用的定制語言不是基于SQL的。這是可以理解的,因?yàn)镻ig本身就不是被設(shè)計(jì)為一種查詢語言的,但是這也意味著不適合將SQL應(yīng)用程序移植到Pig中,而經(jīng)驗(yàn)豐富的SQL用戶可能需要投入更高的學(xué)習(xí)成本來學(xué)習(xí)Pig。然而, Hadoop團(tuán)隊(duì)通常會(huì)將Hive和Pig結(jié)合使用,對(duì)于特定的工作選擇合適的工具。

HBase

如果用戶需要Hive無法提供的數(shù)據(jù)庫特性,如行級(jí)別的更新,快速的查詢響應(yīng)時(shí)間,以及支持事務(wù)的話,就需要考慮HBase了。 HBase是一個(gè)分布式的、可伸縮的數(shù)據(jù)存儲(chǔ),其支持行級(jí)別的數(shù)據(jù)更新、快速查詢和行級(jí)事務(wù),但其不支持多行事務(wù)。

HBase的設(shè)計(jì)靈感來自于谷歌的BigTable,不過HBase并沒有實(shí)現(xiàn)BigTable的所有特性。HBase支持的一個(gè)重要特性就是列存儲(chǔ),其中的列可以組織成列族。列族在分布式集群中物理上是存儲(chǔ)在一起的。這就使得當(dāng)查詢場(chǎng)景涉及的列只是所有列的一個(gè)子集時(shí),讀寫速度會(huì)快得多。因?yàn)椴恍枰x取所有的行然后丟棄大部分的列,而是只需讀取需要的列。

可以像鍵值存儲(chǔ)一樣來使用HBase,其每一行都使用了一個(gè)唯一鍵來提供非??斓乃俣茸x寫這一行的列或者列族。HBase還會(huì)對(duì)每個(gè)列保留多個(gè)版本的值(按照時(shí)間戳進(jìn)行標(biāo)記),版本數(shù)量是可以配置的,因此,如果需要,可以“時(shí)光倒流”回退到之前的某個(gè)版本的值。

HBase使用HDFS(或其他某種分布式文件系統(tǒng))來持久化存儲(chǔ)數(shù)據(jù)。為了可以提供行級(jí)別的數(shù)據(jù)更新和快速查詢,HBase也使用了內(nèi)存緩存技術(shù)對(duì)數(shù)據(jù)和本地文件進(jìn)行追加數(shù)據(jù)更新操作日志。持久化文件將定期地使用附加日志更新進(jìn)行更新等操作。HBase沒有提供類似于SQL的查詢語言,但是Hive現(xiàn)在已經(jīng)可以和HBase結(jié)合使用了。

Cascading、Crunch及其他

Apache Hadoop生態(tài)系統(tǒng)之外還有幾個(gè)“高級(jí)”語言,它們也在Hadoop之上提供了不錯(cuò)的抽象來減少對(duì)于特定任務(wù)的底層編碼工作。為了敘述的完整性,下面我們列舉其中的一些來進(jìn)行介紹。所有這些都是JVM(Java虛擬機(jī))庫,可用于像Java、Clojure、Scala、JRuby、Groovy和Jython,而不是像Hive和Pig一樣使用自己的語言工具。

使用這些編程語言既有好處也有弊端。它使這些工具很難吸引熟悉SQL的非程序員用戶。不過,對(duì)于開發(fā)工程師來說,這些工具提供了圖靈完全的編程語言的完全控制。Hive和Pig都是圖靈完全性的。當(dāng)我們需要Hive本身沒有提供的額外功能時(shí),我們需要學(xué)習(xí)如何用Java編碼來擴(kuò)展Hive功能。


????????????最新視頻教程免費(fèi)領(lǐng)取

????????????加微信:mxm1073

????????????通過驗(yàn)證備注:111(備注必填)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Zookeeper用于集群主備切換。 YARN讓集群具備更好的擴(kuò)展性。 Spark沒有存儲(chǔ)能力。 Spark的Ma...
    Yobhel閱讀 7,602評(píng)論 0 34
  • Hive是基于Hadoop的數(shù)據(jù)倉庫工具,可對(duì)存儲(chǔ)在HDFS上的文件中的數(shù)據(jù)集進(jìn)行數(shù)據(jù)整理、特殊查詢和分析處理,提...
    裘馬輕狂大帥閱讀 528評(píng)論 0 7
  • 鐘巷無煙鎖冷清,昔守離別留殘影。 南國往事從何述,漂零回望故鄉(xiāng)情。
    南國鄉(xiāng)情閱讀 354評(píng)論 19 46
  • 沒有哪一個(gè)地方,你可以同時(shí)看雪山日出,森林探險(xiǎn)、湖中泛舟領(lǐng)略雪山景色,濃濃的異國風(fēng)情神秘充滿魅力。 精雕細(xì)琢的保留...
    白小璨閱讀 305評(píng)論 0 0

友情鏈接更多精彩內(nèi)容