在HDFS和HBase之間,Hadoop提供了許多保存數(shù)據(jù)的方法,使得數(shù)據(jù)可以被多個(gè)應(yīng)用程序訪問(wèn)。但將數(shù)據(jù)集中存儲(chǔ)并提供給多個(gè)應(yīng)用程序訪問(wèn),這樣做產(chǎn)生了一系列新的挑戰(zhàn),包括以下幾點(diǎn):
如何分享數(shù)據(jù),才能夠使數(shù)據(jù)以用戶想要的任何形式來(lái)保存和處理?
如何能夠?qū)⒉煌腍adoop應(yīng)用程序和其他系統(tǒng)集成?
訪問(wèn)數(shù)據(jù)的常見(jiàn)方法之一是通過(guò)表抽象,該方法通常用于訪問(wèn)關(guān)系型數(shù)據(jù)庫(kù),并且為許多開發(fā)者所熟知(和廣泛采用)。一些流行的Hadoop系統(tǒng),例如Hive和Pig,也采用了這種方法。這種抽象解除了數(shù)據(jù)如何存儲(chǔ)(HDFS文件、HBase表)與應(yīng)用程序如何處理數(shù)據(jù)(表格式)之間的耦合。此外,它允許從較大的數(shù)據(jù)語(yǔ)料庫(kù)中“過(guò)濾”感興趣的數(shù)據(jù)。
為支持這種抽象,Hive以關(guān)系型數(shù)據(jù)庫(kù)的形式提供了元存儲(chǔ),這允許我們捕獲實(shí)際物理文件(和HBase表)與用于訪問(wèn)該數(shù)據(jù)的表(虛擬的)之間的依賴關(guān)系。
Hive和Pig
傳統(tǒng)上,數(shù)據(jù)保存在數(shù)據(jù)庫(kù)中,SQL是提供給數(shù)據(jù)工作者的主要接口。
Hadoop的數(shù)據(jù)倉(cāng)庫(kù)系統(tǒng)——Hive,旨在為這些數(shù)據(jù)工作者簡(jiǎn)化Hadoop的使用,它提供了HiveQL——一種類似SQL的語(yǔ)言,用于訪問(wèn)和操作基于Hadoop且保存在HDFS和HBase中的數(shù)據(jù)。通過(guò)將請(qǐng)求透明地轉(zhuǎn)換為MapReduce執(zhí)行,HiveQL支持專有的查詢、連接、摘要等。其結(jié)果是,Hive查詢不是實(shí)時(shí)執(zhí)行,而是作為批量任務(wù)執(zhí)行。
Pig是另外一個(gè)Hadoop數(shù)據(jù)倉(cāng)庫(kù)系統(tǒng),與類SQL的語(yǔ)言不同,它使用Pig的專用腳本語(yǔ)言——Pig Latin。Pig Latin將數(shù)據(jù)視為一個(gè)元組集合(字段的有序集合),允許將輸入元組轉(zhuǎn)換為輸出。類似于Hive,Pig支持專有的查詢、連接和其他操作,且將Pig Latin代碼轉(zhuǎn)換為MapReduce執(zhí)行。Pig還支持大量的并行機(jī)制和諸多優(yōu)化技巧,使其能夠處理非常龐大的數(shù)據(jù)集。
第13章有關(guān)于Hive和Pig更詳細(xì)的信息。
一個(gè)新的Apache項(xiàng)目(HCatalog)擴(kuò)展了Hive的元存儲(chǔ),同時(shí)保留了Hive DDL中用于表定義的組件。其結(jié)果是,Hive的表抽象(當(dāng)使用了HCatalog時(shí))可以用于Pig和MapReduce應(yīng)用程序,這帶來(lái)了以下一些主要優(yōu)勢(shì):
它使得數(shù)據(jù)消費(fèi)者不必知道其數(shù)據(jù)存儲(chǔ)的位置和方式。
它允許數(shù)據(jù)生產(chǎn)者修改物理數(shù)據(jù)存儲(chǔ)和數(shù)據(jù)模型,同時(shí)仍然支持以舊格式存儲(chǔ)的現(xiàn)有數(shù)據(jù),從而數(shù)據(jù)消費(fèi)者不需要修改他們的處理流程。
它為Pig、Hive和MapReduce提供了共享的結(jié)構(gòu)和數(shù)據(jù)模型。
HCatalog應(yīng)用程序的數(shù)據(jù)模型以表的形式組織,表可以放入數(shù)據(jù)庫(kù)中??梢曰谝粋€(gè)或多個(gè)鍵對(duì)表進(jìn)行散列分區(qū),這允許我們將包含一個(gè)(或一組)給定鍵值的所有行組織在一起。例如,如果使用日期對(duì)一個(gè)包含三天數(shù)據(jù)的表進(jìn)行分區(qū),那么表中將會(huì)有三個(gè)分區(qū)。可以從表中動(dòng)態(tài)地創(chuàng)建和刪除新分區(qū)。分區(qū)是多維度的,而非層次化的。
分區(qū)包含多條記錄。一旦創(chuàng)建了分區(qū),相應(yīng)的記錄集就確定了,并且不能修改。記錄被劃分為多列,每列均有名稱和數(shù)據(jù)類型。HCatalog支持與Hive相同的數(shù)據(jù)類型。
HCatalog還為“存儲(chǔ)格式開發(fā)者”提供了一個(gè)API,用于定義如何讀取和寫入保存在實(shí)際物理文件或HBase表中的數(shù)據(jù)(與Hive序列化/反序列化——SerDe相比)。HCatalog的默認(rèn)數(shù)據(jù)格式是RCFile。但如果數(shù)據(jù)以不同格式存儲(chǔ),那么用戶可以實(shí)現(xiàn)HCatInputStorageDriver和HCatOutputStorageDriver來(lái)定義底層數(shù)據(jù)存儲(chǔ)和應(yīng)用程序記錄格式之間的轉(zhuǎn)換。StorageDriver的作用域是一個(gè)分區(qū),允許底層存儲(chǔ)靈活地支持分區(qū)修改,或者將不同布局的多個(gè)文件合并為一個(gè)單獨(dú)的表。
以下是HCatalog的三個(gè)基本用途:
工具間通信——大多數(shù)復(fù)雜的Hadoop應(yīng)用程序都會(huì)使用多種工具來(lái)處理相同的數(shù)據(jù)。它們可能將Pig和MapReduce的組合用于抽取、轉(zhuǎn)換、加載(ETL)的實(shí)現(xiàn),MapReduce用于實(shí)際的數(shù)據(jù)處理,而Hive用于分析查詢。中心化元數(shù)據(jù)存儲(chǔ)庫(kù)的使用簡(jiǎn)化了數(shù)據(jù)共享,并確保了某個(gè)工具的執(zhí)行結(jié)果總是對(duì)其他工具可見(jiàn)。
數(shù)據(jù)發(fā)現(xiàn)——對(duì)于大型Hadoop集群來(lái)說(shuō),常見(jiàn)的情形是應(yīng)用程序和數(shù)據(jù)具有多樣性。通常,一個(gè)應(yīng)用程序的數(shù)據(jù)可以被其他應(yīng)用程序使用,但試圖發(fā)現(xiàn)這些情況需要大量跨應(yīng)用程序的信息。在這種情況下,可以將HCatalog用作對(duì)任何應(yīng)用程序可見(jiàn)的注冊(cè)表。將數(shù)據(jù)在HCatalog中發(fā)布就可以讓其他應(yīng)用程序發(fā)現(xiàn)它們。
系統(tǒng)集成——HCatalog所提供的REST服務(wù),打開了Hadoop數(shù)據(jù)和處理的大門,使其可以應(yīng)用在整體的企業(yè)級(jí)數(shù)據(jù)和處理基礎(chǔ)設(shè)施中。Hadoop以簡(jiǎn)易API和類似SQL語(yǔ)言的形式提供了簡(jiǎn)單的接口。
本節(jié)概述了存儲(chǔ)數(shù)據(jù)的一些方法,以及如何對(duì)其進(jìn)行組裝/反組裝。下一節(jié)介紹一些關(guān)于如何為特定應(yīng)用程序設(shè)計(jì)數(shù)據(jù)布局的指南。