天天看點

《Hive程式設計指南》一第1章 基礎知識

本節書摘來異步社群《hive程式設計指南》一書中的第1章,第1.1節,作者: 【美】edward capriolo , dean wampler , jason rutherglen 譯者: 曹坤,更多章節内容可以通路雲栖社群“異步社群”公衆号檢視。

hive程式設計指南

從早期的網際網路主流大爆發開始,主要的搜尋引擎公司和電子商務公司就一直在和不斷增長的資料進行較量。最近,社交網站也遇到了同樣的問題。如今,許多組織已經意識到他們所收集的資料是讓他們了解他們的使用者,提高業務在市場上的表現以及提高基礎架構效率的一個寶貴的資源。

hadoop生态系統就是為處理如此大資料集而産生的一個合乎成本效益的解決方案。hadoop實作了一個特别的計算模型,也就是mapreduce,其可以将計算任務分割成多個處理單元然後分散到一群家用的或伺服器級别的硬體機器上,進而降低成本并提供水準可伸縮性。這個計算模型的下面是一個被稱為hadoop分布式檔案系統(hdfs)的分布式檔案系統。這個檔案系統是“可插拔的”,而且現在已經出現了幾個商用的和開源的替代方案。

不過,仍然存在一個挑戰,那就是使用者如何從一個現有的資料基礎架構轉移到hadoop上,而這個基礎架構是基于傳統關系型資料庫和結構化查詢語句(sql)的。對于大量的sql使用者(包括專業資料庫設計師和管理者,也包括那些使用sql從資料倉庫中抽取資訊的臨時使用者)來說,這個問題又将如何解決呢?

這就是hive出現的原因。hive提供了一個被稱為hive查詢語言(簡稱hiveql或hql)的sql方言,來查詢存儲在hadoop叢集中的資料。

sql知識分布廣泛的一個原因是:它是一個可以有效地、合理地且直覺地組織和使用資料的模型。即使對于經驗豐富的java開發工程師來說,将這些常見的資料運算對應到底層的mapreduce java api也是令人畏縮的。hive可以幫助使用者來做這些苦活,這樣使用者就可以集中精力關注于查詢本身了。hive可以将大多數的查詢轉換為mapreduce任務(job),進而在介紹一個令人熟悉的sql抽象的同時,拓寬hadoop的可擴充性。如果使用者對此存在疑惑,請參考稍後部分的第1.3節“java和hive:詞頻統計算法”中的相關介紹。

hive最适合于資料倉庫應用程式,使用該應用程式進行相關的靜态資料分析,不需要快速響應給出結果,而且資料本身不會頻繁變化。

hive不是一個完整的資料庫。hadoop以及hdfs的設計本身限制和局限性地限制了hive所能勝任的工作。其中最大的限制就是hive不支援記錄級别的更新、插入或者删除操作。但是使用者可以通過查詢生成新表或者将查詢結果導入到檔案中。同時,因為hadoop是一個面向批處理的系統,而mapreduce任務(job)的啟動過程需要消耗較長的時間,是以hive查詢延時比較嚴重。傳統資料庫中在秒級别可以完成的查詢,在hive中,即使資料集相對較小,往往也需要執行更長的時間[1]。最後需要說明的是,hive不支援事務。

是以,hive不支援oltp(聯機事務處理)所需的關鍵功能,而更接近成為一個olap(聯機分析技術)工具。但是我們将會看到,由于hadoop本身的時間開銷很大,并且hadoop所被設計用來處理的資料規模非常大,是以送出查詢和傳回結果是可能具有非常大的延時的,是以hive并沒有滿足olap中的“聯機”部分,至少目前并沒有滿足。

如果使用者需要對大規模資料使用oltp功能的話,那麼應該選擇使用一個nosql資料庫,例如,和hadoop結合使用的hbase[2]及cassandra[3]。如果使用者使用的是amazon彈性mapreduce計算系統(emr)或者彈性計算雲服務(ec2)的話,也可以使用dynamodb[4]。使用者甚至可以和這些資料庫(還包括其他一些資料庫)結合來使用hive,這個我們會在第17章進行介紹。

是以,hive是最适合資料倉庫應用程式的,其可以維護海量資料,而且可以對資料進行挖掘,然後形成意見和報告等。

因為大多數的資料倉庫應用程式是使用基于sql的關系型資料庫實作的,是以hive降低了将這些應用程式移植到hadoop上的障礙。使用者如果懂得sql,那麼學習使用hive将會很容易。如果沒有hive,那麼這些使用者就需要去重新學習新的語言和新的工具後才能進行生産。

同樣地,相對于其他hadoop語言和工具來說,hive也使得開發者将基于sql的應用程式移植到hadoop變得更加容易。

不過,和大多數sql方言一樣,hiveql并不符合ansi sql标準,其和oracle,mysql,sql server支援的正常sql方言在很多方面存在差異(不過,hiveql和mysql提供的sql方言最接近)。

是以,本書共有兩個目的。其一,本書提供了一個針對所有使用者的介紹。這個介紹會比較綜合,并且會使用例子來進行講解。适用的使用者包括開發者、資料庫管理者和架構師,以及其他(如商業分析師等)非技術類使用者。

其二,本書針對開發者和hadoop管理者等需要深入了解hive技術細節的使用者提供了更詳盡的講述,以幫助這些使用者學習如何優化hive查詢性能,如何通過使用者自定義函數和自定義資料格式等,來個性化使用hive。

因為hive缺少好的文檔,是以我們經曆了不少的挫折才完成了這本書。特别是對于那些非開發者以及不習慣通過檢視項目bug記錄和功能資料庫、源代碼等途徑來擷取其所需資訊的使用者,hive并沒有提供好的文檔。hive wiki[5]提供的資訊價值很大,但是其中的解釋有時太少了,而且常常沒有進行及時的更新。我們希望本書可以彌補這些不足,可以提供一個對于hive的所有基本功能以及如何高效使用這些功能的綜合性的指南[6]。