Hive編程指南(中文版)_第1頁
Hive編程指南(中文版)_第2頁
Hive編程指南(中文版)_第3頁
Hive編程指南(中文版)_第4頁
Hive編程指南(中文版)_第5頁
已閱讀5頁,還剩257頁未讀 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認(rèn)領(lǐng)

文檔簡介

Hive

編程指南

(中文版)

目錄

第1章基礎(chǔ)知識

1.1Hadoop和MapReduce綜述

MapReduce

1.2Hadoop生態(tài)系統(tǒng)中的Hive

1.2.1Pig

1.2.2HBase

1.2.3CascadingsCrunch及其他

1.3Java和Hive:詞頻統(tǒng)計算法

1.4后續(xù)事情

第2章基礎(chǔ)操作

2.1安裝預(yù)先配置好的虛擬機

2.2安裝詳細步驟

2.2.1裝Java

2.2.2安裝Hadoop

2.2.3本地模式、偽分布式模式和分布式模式

2.2.4測試Hadoop

2.2.5安裝Hive

2.3Hive內(nèi)部是什么

2.4啟動Hive

2.5配置Hadoop環(huán)境

2.5.1本地模式配置

2.5.2分布式模式和偽分布式模式配置

2.5.3使用JDBC連接元數(shù)據(jù)

2.6Hive命令

命令選項

2.7命令行界面

2.7.1CLI選項

2.7.2變量和屬性

2.7.3Hive中“一次使用”命令

2.7.4從文件中執(zhí)行Hive查詢

2.7.5hiverc文件

2.7.6使用HiveCL1的更多介紹

2.7.7查看操作命令歷史

2.7.8執(zhí)行shell命令

2.7.9在Hive內(nèi)使用Hadoop的dfs命令

2.7.10Hive腳本中如何進行注釋

2.7.11顯示字段名稱

第3章數(shù)據(jù)類型和文件格式

3.1基本數(shù)據(jù)類型

3.2集合數(shù)據(jù)類型

3.3文本文件數(shù)據(jù)編碼

3.4讀時模式

第4章HiveQL:數(shù)據(jù)定義

4.1Hive中的數(shù)據(jù)庫

4.2修改數(shù)據(jù)庫

4.3創(chuàng)建表

4.3.1管理表

4.3.2外部表

4.4分區(qū)表、管理表

4.4.1外部分區(qū)表

4.4.2自定義表的存儲格式

4.5刪除表

4.6修改表

4.6.1表重命名

4.6.2增加、修改和刪除表分區(qū)

4.6.3修改列信息

4.6.4增加列

4.6.5刪除或者替換列

4.6.6修改表屬性

4.6.7修改存儲屬性

4.6.8眾多的修改表語句

第5章HiveQL:數(shù)據(jù)操作

5.1向管理表中裝載數(shù)據(jù)

5.2通過查詢語句向表中插入數(shù)據(jù)

動態(tài)分區(qū)插入

5.3單個查詢語句中創(chuàng)建表并加載數(shù)據(jù)

5.4導(dǎo)出數(shù)據(jù)

第6章HiveQL:查詢

6.1SELECT-FROM語句

6.1.1使用正則表達式來指定列

6.1.2使用列值進行計算

6.1.3算術(shù)運算符

6.1.4使用函數(shù)

6.1.5LIMIT語句

6.1.6列別名

6.1.7嵌套SELECT語句

6.1.8CASE???WHEN…THEN句式

6.1.9什么情況FHive可以避免進行MapReduce

6.2WHERE語句

6.2.1謂詞操作符

6.2.2關(guān)于浮點數(shù)比較

6.2.3LIKE和RLIKE

6.3GROUPBY語句

HAVING語句

6.4JOIN語句

6.4.1INNERJOIN

6.4.2JOIN優(yōu)化

6.4.3LEFTOUTERJOIN

6.4.4OUTERJOIN

6.4.5RIGHTOUTERJOIN

6.4.6FULLOUTERJOIN

6.4.7LEFTSEMI-JOIN

6.4.8笛卡爾積JOIN

6.4.9map-sideJOIN

6.5ORDERBY和SORTBY

6.6含有SORTBY的DISTRIBUTEBY

6.7CLUSTERBY

6.8類型轉(zhuǎn)換

類型轉(zhuǎn)換BINARY值

6.9抽樣查詢

6.9.1數(shù)據(jù)塊抽樣

6.9.2分桶表的輸入裁剪

6.10UNIONALL

第7章HiveQL:視圖

7.1使用視圖來降低查詢復(fù)雜度

7.2使用視圖來限制基于條件過濾的數(shù)據(jù)

7.3動態(tài)分區(qū)中的視圖和map類型

7.4視圖零零碎碎相關(guān)的事情

第8章HiveQL:索引

8.1創(chuàng)建索引

Bitmap索引

8.2重建索引

8.3顯不索引

8.4刪除索引

8.5實現(xiàn)一個定制化的索引處理器

第9章模式設(shè)計

9.1按天劃分的表

9.2關(guān)于分區(qū)

9.3唯一鍵和標(biāo)準(zhǔn)化

9.4同一份數(shù)據(jù)多種處理

9.5對于每個表的分區(qū)

9.6分桶表數(shù)據(jù)存儲

9.7為表增加列

9.8使用列存儲表

9.8.1重復(fù)數(shù)據(jù)

9.8.2多列

9.9(幾乎)總是使用壓縮

第10章調(diào)優(yōu)

10.1使用EXPLAIN

10.2EXPLAINEXTENDED

10.3限制調(diào)整

10.4JOIN優(yōu)化

10.5本地模式

10.6并行執(zhí)行

10.7嚴(yán)格模式

10.8調(diào)整mapper和reducer個數(shù)

10.9JVM重用

10.10索引

10.11動態(tài)分區(qū)調(diào)整

10.12推測執(zhí)行

10.13單個MapReduce中多個GROUPBY

10.14虛擬列

第11章其他文件格式和壓縮方法

11.1確定安裝編解碼器

11.2選擇一種壓縮編/解碼器

11.3開啟中間壓縮

11.4最終輸出結(jié)果壓縮

11.5sequencefile存儲格式

11.6使用壓縮實踐

11.7存檔分區(qū)

11.8壓縮:包扎

第12章開發(fā)

12.1修改Log4J屬性

12.2連接Java調(diào)試器到Hive

12.3從源碼編譯Hive

12.3.1執(zhí)行Hive測試用例

12.3.2執(zhí)行hook

12.4配置Hive和Eclipse

12.5Maven工程中使用Hive

12.6Hive中使用hive_test進行單元測試

12.7新增的插件開發(fā)f具箱(PDK)

第13章函數(shù)

13.1發(fā)現(xiàn)和描述函數(shù)

13.2調(diào)用函數(shù)

13.3標(biāo)準(zhǔn)函數(shù)

13.4聚合函數(shù)

13.5表生成函數(shù)

13.6一個通過日期計算其星座的UDF

13.7UDF與GenericUDF

13.8不變函數(shù)

13.9用戶自定義聚合函數(shù)

創(chuàng)建一個COLLECTUDAF來模擬GROUP_CONCAT

13.10用戶自定義表生成函數(shù)

13.101可以產(chǎn)生多行數(shù)據(jù)的UDTF

13.10.2可以產(chǎn)生具有多個字段的單行數(shù)據(jù)的UDTF

13.10.3可以模擬復(fù)雜數(shù)據(jù)類型的UDTF

13.11在UDF中訪問分布式緩存

13.12以函數(shù)的方式使用注解

13.12.1定數(shù)性(deterministic)標(biāo)注

13.12.2狀態(tài)性(stateful)標(biāo)注

13.12.3唯一性

13.13宏命令

第14章Streaming

14.1恒等變換

14.2改變類型

14.3投影變換

14.4操作轉(zhuǎn)換

14.5使用分布式內(nèi)存

14.6由一行產(chǎn)生多行

14.7使用streaming進行聚合計算

14.8CLUSTERBY、DISTRIBUTEBY、SORTBY

14.9GenericMRToolsforStreamingtoJava

14.10計算cogroup

第15章自定義Hive文件和記錄格式

15.1文件和記錄格式

15.2闡明CREATETABLE句式

15.3文件格式

15.3.1SequenceFile

15.3.2RCfile

15.3.3示例自定義輸入格式:DuallnputFormat

15.4記錄格式:SerDe

15.5CSV和TSVSerDe

15.6ObjectInspector

15.7ThingBigHiveReflectionObjectinspector

15.8XMLUDF

15.9XPath相關(guān)的函數(shù)

15.10JSONSerDe

15.11AvroHiveSerDe

15.11.1使用表屬性信息定義AvroSchema

15.11.2從指定URL中定義Schema

15.11.3進化的模式

15.12二進制輸出

第16章Hive的Thrift服務(wù)

16.1啟動ThriftServer

16.2配置Groovy使用HiveServer

16.3連接到HiveServer

16.4獲取集群狀態(tài)信息

16.5結(jié)果集模式

16.6獲取結(jié)果

16.7獲取執(zhí)行計劃

16.8元數(shù)據(jù)存儲方法

表檢查器例子

16.9管理HiveServer

16.9.1生產(chǎn)環(huán)境使用HiveServer

16.9.2清理

16.10HiveThriftMetastore

16.10.1ThriftMetastore配置

16.10.2客戶端配置

第17章存儲處理程序和NoSQL

17.1StorageHandlerBackground

17.2HiveStoragellandler

17.3HBase

17.4Cassandra

17.4.1靜態(tài)列映射(StaticColumnMapping)

17.4.2為動態(tài)列轉(zhuǎn)置列映射

17.4.3CassandraSerDeProperties

17.5DynamoDB

第18章安全

18.1和Hadoop安全功能相結(jié)合

18.2使用Hive進行驗證

18.3Hive中的權(quán)限管理

18.3.1用戶、組和角色

18.3.2Grant和Revoke權(quán)限

18.4分區(qū)級別的權(quán)限

18.5自動授權(quán)

第19章鎖

19.1Hive結(jié)合Zookeeper支持鎖功能

19.2顯式鎖和獨占鎖

第20章Hive和Oozie整合

20.1Oozie提供的多種動作(Action)

HiveThriftServiceAction

20.2一個只包含兩個查詢過程的工作流示例

20.3Oozie網(wǎng)頁控制臺

20.4工作流中的變量

20.5獲取輸出

20.6獲取輸出到變量

第21章Hive和亞馬遜網(wǎng)絡(luò)服務(wù)系統(tǒng)(AWS)

21.1為什么要彈性MapReduce

21.2實例

21.3開始前的注意事項

21.4管理自有EMRHive集群

21.5EMRHive上的ThriftServer服務(wù)

21.6EMR上的實例組

21.7配置EMR集群

21.7.1部署hive-site,xml文件

21.7.2部署.hiverc腳本

21.7.3建立一個內(nèi)存密集型配置

21.8EMR上的持久層和元數(shù)據(jù)存儲

21.9EMR集群上的HDFS和S3

21.10在S3上部署資源、配置和輔助程序腳本

21.11S3上的日志

21.12現(xiàn)買現(xiàn)實

21.13安全組

21.14EMR和EC2以及ApacheHive的比較

21.15包裝

第22章HCataiog

22.1介紹

22.2MapReduce

22.2.1讀數(shù)據(jù)

22.2.2寫數(shù)據(jù)

22.3命令行

22.4安全模型

22.5架構(gòu)

第23章案例研究

23.1m6d.com(Media6Degrees)

23.1.1M6D的數(shù)據(jù)科學(xué),使用Hive和R

23.1.2M6DUDF偽隨機

23.1.3M6D如何管理多MapReduce集群間的Hive數(shù)捱訪問

23.2Outbrain

23.2.1站內(nèi)線上身份識別

23.2.2計算復(fù)雜度

23.2.3會話化

23.3NASA噴氣推進實驗室

23.3.1區(qū)域氣候模型評價系統(tǒng)

23.3.2我們的經(jīng)驗:為什么使用Hive

23.3.3解決這些問題我們所面臨的挑戰(zhàn)

23.4Photobucket

23.4.1Photobucket公司的大數(shù)據(jù)應(yīng)用情況

23.4.2Hive所使用的硬件資源信息

23.4.3Hive提供了什么

23.4.4Hive支持的用戶有哪些

23.5SimpleReach

23.6ExperiencesandNeedsfromtheCustomerTrenches

標(biāo)題:來自Karmasphere的視角

23.6.1介紹

23.6.2CustomerTrenches的用例

術(shù)語詞匯表

第1章基礎(chǔ)知識

從早期的互聯(lián)網(wǎng)主流大爆發(fā)開始,主要的搜索引擎公司和電子商務(wù)公司就一直在和不斷增

長的數(shù)據(jù)進行較量。最近,社交網(wǎng)站也遇到了同樣的問題。如今,許多組織已經(jīng)意識到他

們所收集的數(shù)據(jù)是讓他們了解他們的用戶,提高業(yè)務(wù)在市場上的表現(xiàn)以及提高基礎(chǔ)架構(gòu)效

率的一個寶貴的資源。

Hadoop生態(tài)系統(tǒng)就是為史理如此大數(shù)據(jù)集而產(chǎn)生的一個合乎成本效益的解決方案。

Hadoop實現(xiàn)了一個特別的計算模型,也就是物/必。"火e其可以將計算任務(wù)分割成多個處

理單元然后分散到一群家用的或服務(wù)器級別的硬件機器上,從而降低成本并提供水平可伸

縮性。這個計算模型的下面是一個被稱為Hadoop分布式文件系統(tǒng)(11DES)的分布式文件

系統(tǒng)。這個文件系統(tǒng)是“可插拔的”,而且現(xiàn)在已經(jīng)出現(xiàn)了幾個商用的和開源的替代方案。

不過,仍然存在一個挑戰(zhàn),那就是用戶如何從一個現(xiàn)有的數(shù)據(jù)基礎(chǔ)架構(gòu)轉(zhuǎn)移到Hadoop上,

而這個基礎(chǔ)架構(gòu)是基于傳統(tǒng)關(guān)系型數(shù)據(jù)庫和結(jié)麴化查徹源仞(SQL)的。對于大量的SQL

用戶(包括專業(yè)數(shù)據(jù)庫設(shè)計師和管理員,也包括那些使用SQL從數(shù)據(jù)倉庫中抽取信息的臨

時用戶)來說,這個問題又將如何解決呢?

這就是Hive出現(xiàn)的原因。Hive提供了一個被稱為Hive查詢語言(簡稱IliveQL或HQL)

的方言,來查詢存儲在Hadoop集群中的數(shù)據(jù)。

SQL知識分布廣泛的一個原因是:它是一個可以有效地、合理地且直觀地組織和使用數(shù)據(jù)

的模型。即使對于經(jīng)驗豐富的Java開發(fā)工程師來說,將這些常見的數(shù)據(jù)運算對應(yīng)到底層

的MapReduceJavaAPI也是令人畏縮的。Hive可以幫助用戶來做這些苦活,這樣用戶就

可以集中精力關(guān)注于查詢本身了。Hive可以將大多數(shù)的查詢轉(zhuǎn)換為MapReduce任務(wù)

(job),進而在介紹一個令人熟悉的SQL抽象的同時,拓寬Hadoop的可擴展性。如果用

戶對此存在疑惑,請參考稍后部分的第1.3節(jié)“Java和Hive:詞頻統(tǒng)計算法”中的相關(guān)

介紹。

Hive最適合于數(shù)據(jù)倉庫應(yīng)用程序,使用該應(yīng)用程序進行相關(guān)的靜態(tài)數(shù)據(jù)分析,不需要快

速響應(yīng)給出結(jié)果,而且數(shù)據(jù)本身不會頻繁變化。

Hive不是一個完整的數(shù)據(jù)庫。Hadoop以及HDFS的設(shè)計本身約束和局限性地限制了Hive

所能勝任的工作。其中最大的限制就是Hive不支持記錄級別的更新、插入或者刪除操作。

但是用戶可以通過查詢生成新表或者將查詢結(jié)果導(dǎo)入到文件中。同時、因為Hadcop是一

個面向批處理的系統(tǒng),而MapReduce任務(wù)(job)的啟動過程需要消耗較長的時間,所以

Hive查詢延時比較嚴(yán)重。傳統(tǒng)數(shù)據(jù)庫中在秒級別可以完成的查詢,在Hive中,即使數(shù)據(jù)

集相對較小,往往也需要執(zhí)行更長的時間⑴。最后需要說明的是,Hive不支持事務(wù)。

因此,Hive不支持OLTP(聯(lián)機事務(wù)處理)所需的關(guān)鍵功能,而更接近成為一個CLAP(聯(lián)

機分析技術(shù))工具。但是我們將會看到,由于Hadoop本身的時間開銷很大,并且Hadoop

所被設(shè)計用來處理的數(shù)據(jù)規(guī)模非常大,因此提交查詢和返回結(jié)果是可能具有非常大的延時

的,所以Hive并沒有滿足OLAP中的“聯(lián)機”部分,至少目前并沒有滿足。

如果用戶需要對大規(guī)模數(shù)據(jù)使用OLTP功能的話,那么應(yīng)該選擇使用一個NoSQL數(shù)據(jù)庫,

例如,和Hadoop結(jié)合使用的HBase⑵及Cassandra111?如果用戶使用的是Amazon彈性

MapReduce計算系統(tǒng)(EMR)或者彈性計算云服務(wù)(EC2)的話,也可以使用DynamoDB⑷。

用戶甚至可以和這些數(shù)據(jù)走(還包括其他一些數(shù)據(jù)庫)結(jié)合來使用Hive,這個我們會在

第17章進行介紹。

因此,Hive是最適合數(shù)據(jù)倉庫應(yīng)用程序的,其可?以維護海量數(shù)據(jù),而且可以對數(shù)據(jù)進行

挖掘,然后形成意見和報告等。

因為大多數(shù)的數(shù)據(jù)倉庫應(yīng)用程序是使用基于SQL的關(guān)系型數(shù)據(jù)庫實現(xiàn)的,所以Hive降低

了將這些應(yīng)用程序移植到Hadoop上的障礙。用戶如果懂得SQL,那么學(xué)習(xí)使用Hive將會

很容易。如果沒有Hive,那么這些用戶就需要去重新學(xué)習(xí)新的語言和新的工具后才能進

行生產(chǎn)。

同樣地,相對于其他Hadoop語言和工具來說,Hive也使得開發(fā)者將基于SQL的應(yīng)用程序

移植到Hadoop變得更加容易。

不過,和大多數(shù)SQL方言一樣,HiveQL并不符合ANSISQL標(biāo)準(zhǔn),其和Oracle,MySQL,

SQLServer支持的常規(guī)SQL方言在很多方面存在差異(不過,HiveQL和MySQL提供的

SQL方言最接近)。

因此,本書共有兩個目的。其一,本書提供了一個針對所有用戶的介紹。這個介紹會比較

綜合,并且會使用例子來進行講解。適用的用戶包括開發(fā)者、數(shù)據(jù)庫管理員和架構(gòu)師,以

及其他(如商業(yè)分析師等)非技術(shù)類用戶。

其二,本書針對開發(fā)者和Hadoop管理員等需要深入了解Hive技術(shù)細節(jié)的用戶提供了更詳

盡的講述,以幫助這些用戶學(xué)習(xí)如何優(yōu)化Hive查詢性能,如何通過用戶自定義函數(shù)和自

定義數(shù)據(jù)格式等,來個性化使用Hive。

因為Hive缺少好的文檔,所以我們經(jīng)歷了不少的挫折才完成了這本書。特別是對于那些

非開發(fā)者以及不習(xí)慣通過查看項目BUG記錄和功能數(shù)據(jù)庫、源代碼等途徑來獲取其所需信

息的用戶,Hive并沒有提供好的文檔。HiveWikJ提供的信息價值很大,但是其中的解

釋有時太少了,而且常常沒有進行及時的更新。我們希望本書可以彌補這些不足,可以提

供一個對于Hive的所有基本功能以及如何高效使用這些功能的綜合性的指南九

1.1Hadoop和MapReduce綜述

如果用戶已經(jīng)熟悉Hadoop和MapReduce計算模型的話,那么可以跳過本節(jié)。雖然用戶無

需精通MapReduce就可以使用Hive,但是理解MapReduce的基本原理將幫有助于用戶了

解Hive在底層是如何運作的,以及了解如何才能更高效地使用Hive。

我們在這里提供了一個關(guān)于Hadoop和MapReduce的簡要描述。更多細節(jié),請參考Tom

White(0,Reilly)所著的《Hadoop權(quán)威指南》一書。

MapReduce

MapReduce是一種計算模型,該模型可將大型數(shù)據(jù)處理任務(wù)分解成很多單個的、可以在服

務(wù)器集群中并行執(zhí)行的任務(wù)。這些任務(wù)的計算結(jié)果可以合并在一起來計算最終的結(jié)果。

MapReduce編程模型是由谷歌(Google)開發(fā)的。Google通過一篇很有影響力的論文對這個

計算模型進行了描述,本書附錄部分可查看到該論文,名為《MapReduce:大數(shù)據(jù)之上的

簡化數(shù)據(jù)處理》。一年后,另一篇名為《Google文件系統(tǒng)》的論文介紹了Google文件系

統(tǒng)。這兩篇論文啟發(fā)了道?卡丁(DougCutting)開發(fā)了Hadoop。

MapReduce這個術(shù)語來自于兩個基本的數(shù)據(jù)轉(zhuǎn)換操作:map過程和reduce過程。一個map

操作會將集合中的元素從一種形式轉(zhuǎn)換成另一種形式。在這種情況下,輸入的鍵-值對會

被轉(zhuǎn)換成零到多個鍵-值對輸出。其中,輸入和輸出的鍵必須完全不同,而輸入和輸出的

值則可能完全不同。

在MapReduce計算框架中,某個鍵的所有鍵-值對都會被分發(fā)到同一個reduce操作中。確

切地說,這個鍵和這個鍵所對應(yīng)的所有值都會被傳遞給同一個Reducer。reduce過程的目

的是將值的集合轉(zhuǎn)換成一個值(例如對一組數(shù)值求和或求平均值),或者轉(zhuǎn)換成另一個集

合。這個Reducer最終會產(chǎn)生一個鍵-值對。再次說明一下,輸入和輸出的鍵和值可能是

不同的。需要說明的是,如果job不需要reduce過程的話,那么也是可以無reduce過程

的。

Hadoop提供了一套基礎(chǔ)設(shè)施來處理大多數(shù)困難的工作以保證任務(wù)能夠執(zhí)行成功。例如,

Hadoop決定如果將提交的job分解成多個獨立的map和reduce任務(wù)(task)來執(zhí)行,它

就會對這些task進行調(diào)度并為其分配合適的資源,決定將某個task分配到集群中哪個位

置(如果可能,通常是這個task所要處理的數(shù)據(jù)所在的位置,這樣可以最小化網(wǎng)絡(luò)開

銷)。它會監(jiān)控每一個task以確保其成功完成,并重啟一些失敗的task。

Hadoop分布式文件系統(tǒng)(也就是HDFS),或者一個同類的分布式文件系統(tǒng),管理著集群

中的數(shù)據(jù)。每個數(shù)據(jù)塊(block)都會被冗余多份(通常默認(rèn)會冗余3份),這樣可以保

證不會因單個硬盤或服務(wù)器的損壞導(dǎo)致數(shù)據(jù)丟失。同時,因為其目標(biāo)是優(yōu)化處理辛常大的

數(shù)據(jù)集,所以HDFS以及類似的文件系統(tǒng)所使用的數(shù)據(jù)塊都非常大,通常是64MB或是這個

值的若干倍。這么大的數(shù)據(jù)塊可以在硬盤上連續(xù)進行存儲,這樣可以保證以最少的磁盤尋

址次數(shù)來進行寫入和讀取,從而最大化提高讀寫性能。

為了更清晰地介紹MapReduce,讓我們來看一個簡單的例子。WordCount算法已經(jīng)被稱為

是MapReduce計算框架中的“HelloWorld”程序⑴了。WordCount會返回在語料庫(單

個或多個文件)中出現(xiàn)的所有單詞以及單詞出現(xiàn)的次數(shù)。輸出內(nèi)容會顯示每個單詞和它的

頻數(shù),每行顯示一條。按照通常的習(xí)慣,單詞(輸出的鍵)和頻數(shù)(輸出的值)通常使用

制表符進行分割。

圖1-1顯示了在MapReduce計算框架中WordCount程序是如何運作的。

|叩由MappersSort,ShuffleReducersOutput

圖IT使用MapReduce執(zhí)行WordCnunt算法

這里有很多內(nèi)容要講,所以我們會從左到右來講解這個圖。

圖1-1中左邊的每個Input(輸入)框內(nèi)都表示一個單獨的文件。例子中有4個文件,其

中第3個文件是個空文件,為了便于簡單描述,其他3個文件都僅僅包含有少量幾個單詞。

默認(rèn)情況下,每個文檔都會觸發(fā)一個Mapper進程進行處理。而在實際場景下,大文件可

能會被劃分成多個部分,而每個部分都會被發(fā)送給一個Mapper進行處理。同時,也有將

多個小文件合并成一個部分供某個Mapper進行處理的方法。不過,我們當(dāng)前不必深究這

些細節(jié)性問題。

MapReduce計算框架中的輸入和輸出的基本數(shù)據(jù)結(jié)構(gòu)是鍵-值對。當(dāng)Mapper進程啟動后,

其將會被頻繁調(diào)用來處理文件中的每行文本。每次調(diào)用中,傳遞給Mapper的鍵是文檔中

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

在WordCounl程序中,沒有使用字符偏移量(也就是沒有使用鍵)。值(也就是這行文本)

可以使用很多種方式進行分割(例如,按照空格分隔是最簡單的方式,但是這樣會遺留下

不需要的標(biāo)點符號),最終這行文本會被分解成多個單詞。我們同時假定Mapper會將每

個單詞轉(zhuǎn)換成小寫,因此對于“FUN”和“fun”會被認(rèn)為是同一個單詞。

最后,對于這行文本中的每個單詞,Mapper都會輸出一個鍵-值對,以單詞作為鍵并以數(shù)

字1作為值(這里1表示“出現(xiàn)1次”)。需要注意的是鍵和值的輸出數(shù)據(jù)類型和輸入數(shù)

據(jù)類型是不同的。

Hadoop神奇的地方一部分在于后面要進行的Sort(排序)和Shuffle(重新分發(fā))過程。

Hadoop會按照鍵來對鍵-值對進行排序,然后“重新洗牌”,將所有具有相同鍵的鍵-值

對分發(fā)到同一個Reducer中。這里有多種方式可以用于決定哪個Reducer獲取哪個范圍內(nèi)

的鍵對應(yīng)的數(shù)據(jù)。這里我們先不必考慮這些問題。但是出于說明性目的,我們假設(shè)圖中使

用了一個特殊的按字母數(shù)字劃分的過程(在實際執(zhí)行中,會有所不同)。

對于Mapper而言如果只是簡單地對每個單詞輸出計數(shù)1這樣的處理的話,那么會在Sort

和Shuffle過程中產(chǎn)生一定的網(wǎng)絡(luò)和磁盤I/O浪費(不過,這樣并不會減少Mapper的內(nèi)

存使用)。有一個優(yōu)化就是跟蹤每個單詞的頻數(shù),然后在Mapper結(jié)束后只輸出每個單詞

在這個Mapper中的總頻數(shù)。對于這個優(yōu)化有好幾種實現(xiàn)方式,但是,最簡單的方式應(yīng)該

是邏輯是正確的,而且對于這個討論,理由是充足的。

每個Reducer的輸入同樣是鍵-值對,但是這次,每個鍵將是Mapper所發(fā)現(xiàn)的單詞中的某

一個單詞,而這個鍵對應(yīng)的值將是所有Mapper對于這個單詞計算出的頻數(shù)的一個集合。

需要注意的是鍵的數(shù)據(jù)類型和值的集合中元素的數(shù)據(jù)類型和Mapper的輸出是一致的。也

就是說,鍵的類型是一個字符串,而集合中的元素的數(shù)據(jù)類型是整型。

為了完成這個算法,所有的Reducer需要做的事情就是將值集合中的頻數(shù)進行求和然后寫

入每個單詞和這個單詞最終的頻數(shù)組成的鍵-值對。

WordCount不是一個虛構(gòu)的例子。這個程序所產(chǎn)生的數(shù)據(jù)可用于拼寫檢查程序、計算機

語言檢測和翻譯系統(tǒng),以及其他應(yīng)用程序。

1.2Hadoop生態(tài)系統(tǒng)中的Hive

WordCount算法,和基于Hadoop實現(xiàn)的大多數(shù)算法一樣,有那么點復(fù)雜。當(dāng)用戶真正使

用Hadoop的API來實現(xiàn)這種算法時,甚至有更多的底層細節(jié)需要用戶自己來控制。這是

一個只適用于有經(jīng)驗的Java開發(fā)人員的工作,因此也就將Hadoop潛在地放在了一個非程

序員用戶無法觸及的位置,即使這些用戶了解他們想使用的算法。

事實上,許多這些底層細節(jié)實際上進行的是從一個任務(wù)(job)到下一個任務(wù)(jeb)的重

復(fù)性工作,例如,將Mapper和Reducer一同寫入某些數(shù)據(jù)操作構(gòu)造這樣的底層的繁重的

工作,通過過濾得到所需數(shù)據(jù)的操作,以及執(zhí)行類似SQL中數(shù)據(jù)集鍵的連接(JOIN)操作

等。不過幸運的是,存在一種方式,可以通過使用“高級”工具自動處理這些情況來重用

這些通用的處理過程。

這也就是引入Hive的原因,Hive不僅提供了一個熟悉SQL的用戶所能熟悉的編程模型,

還消除了大量的通用代碼,甚至是那些有時是不得不使用Java編寫的令人棘手的代碼。

這就是為什么Hive對于Hadoop是如此重要的原因,無論用戶是DB/\還是Java開發(fā)工程

師。Hive可以讓你花費相當(dāng)少的精力就可以完成大量的工作。

圖1-2顯示了Hive的主要“模塊”以及Hive是如何與Hadoop交互工作的。

圖1-2Hive組成模塊

有好幾種方式可以與Hive進行交互。本書中,我們將主要關(guān)注于CLI,也就是命令行界

面。對丁那些更喜歡圖形用戶界面的用戶,可以使用現(xiàn)在逐步出現(xiàn)的商業(yè)和開源的解決方

案,例如Karmasphere發(fā)布的一個商業(yè)產(chǎn)品(http:〃karmasphere.com),Cloudera提

供的開源的Hue項目(https://github.com/cloudera/hue),以及Qubole提供的“Hive

即服務(wù)”方式(),等。

Hive發(fā)行版中附帶的模塊有CLI,一個稱為Hive網(wǎng)頁界面(HWI)的簡單網(wǎng)頁界面,以及

可通過JDBC、ODBC和一個Thrift服務(wù)器(參考第16章)進行編程訪問的幾個模塊。

所有的命令和查詢都會進入到Driver(驅(qū)動模塊),通過該模塊對輸入進行解析編譯,

對需求的計算進行優(yōu)化,然后按照指定的步驟執(zhí)行(通常是啟動多個MapReduce任務(wù)

(job)來執(zhí)行)。當(dāng)需要啟動MapReduce任務(wù)(job)時,Hive本身是不會生成Java

MapReduce算法程序的。相反,Hive通過一個表示“job執(zhí)行計劃”的XML文件驅(qū)動執(zhí)行

內(nèi)置的、原生的Mapper和Reducer模塊。換句話說,這些通用的模塊函數(shù)類似于微型的

語言翻譯程序,而這個驅(qū)動計算的“語言”是以XML形式編碼的。

Hive通過和JobTracker通信來初始化MapReduce任務(wù)(job),而不必部署在

JobTracker所在的管理節(jié)點上執(zhí)行。在大型集群中,通常會有網(wǎng)關(guān)機專門用于部署像

Hive這樣的工具。在這些網(wǎng)關(guān)機上可遠程和管理節(jié)點上的JobTracker通信來執(zhí)行任務(wù)

(job)o通常,要處理的數(shù)據(jù)文件是存儲在HDFS中的,而HDFS是由NameNode進行管理

的。

Metastore(元數(shù)據(jù)存儲)是一個獨立的關(guān)系型數(shù)據(jù)庫(通常是一個MySQL實例),Hive

會在其中保存表模式和其他系統(tǒng)元數(shù)據(jù)。在我們將詳細進行討論。

盡管本書是關(guān)于Hive的,不過還是有必要提及其他的一些高級工具,這樣用戶可以根據(jù)

需求進行選擇。Hive最適合于數(shù)據(jù)倉庫程序,對于數(shù)據(jù)倉庫程序不需要實時響應(yīng)查詢,

不需要記錄級別的插入、更新和刪除。當(dāng)然,Hive也非常適合于有一定SQL知識的用戶。

不過,用戶的某些工作可能采用其他的工具會更容易進行處理。

1.2.1Pig

Hive的替代工具中最有名的就是Pig了(請參考)<,Pig是由

Yahoo!開發(fā)完成的,而同時期Fackbook正在開發(fā)Hive。Pig現(xiàn)在同樣也是一個和Hadoop

緊密聯(lián)系的頂級Apache項目。

假設(shè)用戶的輸入數(shù)據(jù)具有一個或者多個源,而用戶需要進行一組復(fù)雜的轉(zhuǎn)換來生成一個或

者多個輸出數(shù)據(jù)集。如果使用Hive,用戶可能會使用嵌套查詢(正如我們將看到的)來

解決這個問題,但是在某些時刻會需要重新保存臨時表(這個需要用戶自己進行管理)來

控制復(fù)雜度0

Pig被描述成一種數(shù)據(jù)流語言,而不是一種查詢語言。在Pig中,用戶需要寫一系列的聲

明語句來定義某些關(guān)系和其他一些關(guān)系之間的聯(lián)系,這里每個新的關(guān)系都會執(zhí)行新的數(shù)據(jù)

轉(zhuǎn)換過程。Pig會查找這些聲明,然后創(chuàng)建一系列有次序的MapReduce任務(wù)(jeb),來

對這些數(shù)據(jù)進行轉(zhuǎn)換,直到產(chǎn)生符合用戶預(yù)期的計算方式所得到的最終結(jié)果。

這種步進式的數(shù)據(jù)“流”可以比一組復(fù)雜的查詢更加直觀。也因此,Pig常用于ETL(數(shù)

據(jù)抽取,數(shù)據(jù)轉(zhuǎn)換和數(shù)據(jù)裝載)過程的一部分,也就是將外部數(shù)據(jù)裝載到Hadoop集群中,

然后轉(zhuǎn)換成所期望的數(shù)據(jù)格式。

Pig的一個缺點就是其所使用的定制語言不是基于SQL的。這是可以理解的,因為Pig木

身就不是被設(shè)計為一種查詢語言的,但是這也意味著不適合將SQL應(yīng)用程序移植到Pig中,

而經(jīng)驗豐富的SQL用戶可能需要投入更高的學(xué)習(xí)成本來學(xué)習(xí)Figo

然而,Hadoop團隊通常會將Hive和Pig結(jié)合使用,對于特定的工作選擇合適的工具。

AlanGates(O'Reilly)所編著的《Pig編程指南》一書對于Pig進行了全面的介紹。

1.2.2HBase

如果用戶需要Hive無法提供的數(shù)據(jù)庫特性(如行級別的更新,快速的查詢響應(yīng)時間,以

及支持事務(wù))的話,那么該怎么辦呢?

HBase是一個分布式的、可伸縮的數(shù)據(jù)存儲、其支持行級別的數(shù)據(jù)更新、快速查詢和行級

事務(wù)(但不支持多行事務(wù))。

HBase的設(shè)計靈感來自于谷歌(Google)的BigTable,不過HBase并沒有實現(xiàn)EigTable

的所有特性。HBase支持的一個重要特性就是列存儲?,其中的列可以組織成列族。列族在

分布式集群中物理上是存儲在一起的。這就使得當(dāng)查詢場景涉及的列只是所有列的一個子

集時,讀寫速度會快得多。因為不需要讀取所有的行然后丟棄大部分的列,而是只需讀取

需要的列。

可以像鍵-值存儲一樣來使用HBase,其每一行都使用了一個唯一鍵來提供非??斓乃俣?/p>

讀寫這一行的列或者列族。HBase還會對每個列保留多個版本的值(按照時間戳進行標(biāo)

記),版本數(shù)量是可以配置的,因此,如果需要,可以“時光倒流”回退到之前的某個版

本的值。

最后,HBase和Hadoop之間是什么關(guān)系?HBase使用HDFS(或其他某種分布式文件系統(tǒng))

來持久化存儲數(shù)據(jù)。為了可以提供行級別的數(shù)據(jù)更新和快速查詢,HBase也使用了內(nèi)存緩

存技術(shù)對數(shù)據(jù)和本地文件進行追加數(shù)據(jù)更新操作日志。持久化文件將定期地使用附加日志

更新進行更新等操作。

HBase沒有提供類似于SQL的查詢語言,但是Hive現(xiàn)在已經(jīng)可以和HBase結(jié)合使用了。

在第17.3節(jié)“HBase”中我們將討論這個結(jié)合。

關(guān)于HBase的更多信息,請參考HBase的官方網(wǎng)站,以及參閱LarsGeorgc所著的《HBase

權(quán)威指南》一書。

1.2.3Cascading、Crunch及其他

ApacheHadoop生態(tài)系統(tǒng)之外還有幾個“高級”語言,它們也在Hadoop之上提供了不錯

的抽象來減少對于特定任務(wù)(job)的底層編碼工作。為了敘述的完整性,下面我們列舉

其中的一些來進行介紹。所有這些都是JVM(Java虛擬機)庫,可用于像Java、Clojure、

Scala>JRuby>Groovy和Jython,而不是像Hive和Pig一樣使用自己的語言工具。

使用這些編程語言既有好處也有弊端。它使這些工具很難吸引熟悉SQL的非程序員用戶。

不過,對于開發(fā)工程師來說,這些工具提供了圖靈完全的編程語言的完全控制。Hive和

Pig都是圖靈完全性的(譯者注:圖靈完全性通常是指具有無限存儲能力的通用物理機常

或編程語言)。當(dāng)我們需要Hive本身沒有提供的額外功能時,我們需要學(xué)習(xí)如何用Java

編碼來擴展Hive功能(見表1-1)o

表1-1其他可選的Hadoop之上的高級語言庫

名稱URL描述

Casadinghttp://cascading.org提供數(shù)據(jù)處理抽象的JavaAPI.目前有很多支持Casading的特定領(lǐng)

域語言(DSL),采用的是其他的編程語言,例如Scala、Groovy.

JRuby和Jython

Casaloghttps://github.com/nathanmarz/Casading的一個ClojureDSL,其提供了源于Datalog處理和查詢抽

cascaLog象過程靈感而產(chǎn)生的附屬功能

Crunch提供了可定義數(shù)據(jù)流管道的Java和ScalaAPI

https://github.com/c1oudera/crunch

因為Hadoop是面向批處理系統(tǒng)的,所以存在更適合事件流處理的使用不同的分布式計算

模式的工具。對事件流進行處理時,需要近乎“實時”響應(yīng)。這里我們列舉了其中一些項

目(見表1-2)。

表1-2沒有使用MapReduce的分布式處理工具

名稱URL描述

Sparkhttp://www.spark-一個基于ScalaAPI的分布式數(shù)據(jù)集的分布式計算框架。其可以使用HDFS文

project.org/件,而且其對于MapReduce中多種計算可以提供顯著的性能改進。同時還有一個

將Hive指向Spark的項目,稱作Shark(http://shark.cs.berkeley.edu/)

Stormhttps://git.hub.com/一個實時事件流處理系統(tǒng)

nathanmarz/storm

Kafka一個分布式的發(fā)布-訂閱消息傳遞系統(tǒng)

http:〃incubator,apache,org

/kafka/index.html

最后,當(dāng)無需一個完整的集群時(例如,處理的數(shù)據(jù)集很小,或者對于執(zhí)行某個計算的時

間要求并不苛刻),還有很多可選的工具可以輕松地處理原型算法或者對數(shù)據(jù)子集進行探

索。表卜3列舉了一些相而比較熱門的工具。

表1-3其他數(shù)據(jù)處理語言和工具

名稱URL描述

Rhttp://r-project.org/一個用于統(tǒng)計分析和數(shù)據(jù)圖形化展示的開源語言,通常在數(shù)據(jù)與統(tǒng)計學(xué)

家、經(jīng)濟學(xué)家等人群中很受歡迎。R不是一個分布式系統(tǒng),所有其可以處理

的數(shù)據(jù)大小是有限的。社區(qū)正努力將R和Hadoop結(jié)合起來

Matlabhitp:〃www.mathworks,com/一個受工程師和科學(xué)家歡迎的商業(yè)數(shù)據(jù)分析和數(shù)值方法計算系統(tǒng)

products/matlab/index,html

Octavehttp:〃www.gnu.org/Matlab對應(yīng)的一個開源版

software/octave/

Mathematicahttp://www.wo1fram.com/一個商業(yè)數(shù)據(jù)分析、人工智能和數(shù)值方法運算系統(tǒng),這是個可以受科學(xué)家

mathematica/和工程師歡迎的工具

SciPy,http://scipy.org數(shù)據(jù)科學(xué)家廣泛使用的、使用Python進行科學(xué)編程的軟件

NumPy

1.3Java和Hive:詞頻統(tǒng)計算法

如果用戶不是Java工程師,那么可以直接跳到下一節(jié)。

如果用戶是名Java工程師,那么可能需要閱讀本節(jié),因為用戶需要為其所在組織的Hive

用戶提供技術(shù)支持。你可能會質(zhì)疑如何使用Hive解決自己的工作。如果是這樣的話,那

么可以先看看下面這個實現(xiàn)了之前我們所討論的WordCount算法的例子,我們先學(xué)會使

用JavaMapReduceAPI,然后再學(xué)習(xí)如何使用Hive。

通常都會使用NordCount作為用戶學(xué)習(xí)使用Java編寫MapReduce程序的例子,因為這樣

用戶可以關(guān)注于API。因此,WordCount已經(jīng)成為Hadoop世界中的“Hell。World"程序

了。

ApacheHadoop分支版本中包含有下面的這個Java實現(xiàn)二如果讀者并不了解Java(但

是你仍在讀本節(jié)內(nèi)容的話),也不必擔(dān)心,我們提供這個代碼只是為了方便用戶進行大小

對比。

packageorg.myorg:

importjava.io.lOException:

importjava,util.*;

importorg.apache.had(w)p.fs.Path;

importorg.apache,hadoop.conf.*;

importorg.apache,hadoop.io.*;

importorg.apache,hadoop.mapreduce.*:

importorg.apache,hadoop.mapreduce.1ib.input.FilelnputFormat;

importorg.apache,hadoop.mapreduce.lib.input.TextlnputFormat;

importorg.apache,hadoop.mapreduce.1ib.output.FileOutputFormat;

importorg.apache,hadoop.mapreduce.lib.output.TextOutputFormat;

publicclassWordCount{

publicstaticclassMapextendsMapper<LongWritable,Text,Text,IntWritable>{

privatefinalstaticTntWritableone=newIntWritable(l);

privateTextword=newTextO;

publicvoidmap(LongWritablekey,Textvalue,Contextcontext)

throwslOException,InterruptedException{

Stringline=value.toStringO;

StringTokenizertokenizer=nevSlringTokenizerOine);

while(tokenizer.hasMoreTokensO){

word,set(tokenizer.nextToken().1;

context,write(word,one);

publicstaticclassReduceextendsReducer<Text,IntWritable,Text,IntWritable>{

publicvoidreduce(Textkey,Iterable<IntWritable>values.Contextcontext)

throwslOException,TnterruptedException{

intsum=0:

lor(IntWritableval:values){

sum+=val.get();

)

context.write(key,newIntWritable(sum)):

}

}

publicstaticvoidmain(String[]args)throwsRxception■'

Configurationconf=newConfiguration():

Jobjob=newJob(conf,*wordcount*);

job.setOutputKeyClass(Text,class):

job.setOutputValueClass(InlWritable,class);

job.setMapperClass(Map.class);

job.setReducerClass(Reduce,class):

job.setInputFormatClass(TextInputFormat.class);

job.setOutputFormatClass(TextOulputForniat.class);

Fi1eInputFormat.addInputPath(job,newPath(args[0]));

FileOutputFormat.setOutputPath(job,newPath(args[1]));

job.waitForCompletion(true):

上面是一個有63行的Java代碼。我們不會詳細解釋其中的APU。如下是使用HiveQL進

行的相同的運算,這時只有8行代碼,而且不需要進行編譯然后生成一個“JAR”(Java

壓縮包)文件。

CREATETABLEdocs(lineSTRING);

LOADDATAINPATII'docs,OVERWRITEINTOTABLEdocs;

CREATETABLEword*countsAS

SELECTword,count(1)AScountFROM

(SELECTexplode(split(line,'\s'))ASwordFROMdocs)w

GROUPBYword

ORDERBYword;

我們稍后會解釋所有這些HiveQL語法。

在上面兩個例子中,都是使用盡可能簡單的方法將文件中的內(nèi)容分割成單詞,也就是按照

空格進行劃分的。這個方法不能很好地處理標(biāo)點,同時也不能識別同一個單詞的單數(shù)和復(fù)

數(shù)形式,等等。不過,這里這么使用已經(jīng)可以達到我們的目的了。山

借助JavaAPI可以定制和調(diào)整一個算法實現(xiàn)的每個細節(jié)。不過,大多數(shù)情況下,用戶都

不需要這個級別的控制,而且當(dāng)用戶需要控制所有那些細節(jié)時也會相當(dāng)?shù)胤怕脩舻拈_發(fā)

進度。

如果你不是一名程序員,那么也就用不著寫JavaMapReduce代碼了。不過,如果你已經(jīng)

熟悉SQL了,那么學(xué)習(xí)Hive將會相當(dāng)?shù)厝菀?,而且很多程序也都很容易快速實現(xiàn)。

L4后續(xù)事情

我們描述了Hive在Hadoop生態(tài)系統(tǒng)中所扮演的重要角色?,F(xiàn)在我們開始!

口]不過,因為Hive是被設(shè)計用來處理的大數(shù)據(jù)集的,這個啟動所消耗的時間和實際數(shù)據(jù)

處理時間相比是微乎其微的。

[2〕請訪問ApacheIIBase的官方網(wǎng)站,http://hbase.apache.org,以及LarsGeorge(0r

Reilly)所著的《HBase權(quán)威指南》一書。

[3]請參考Cassandra的官方網(wǎng)站,http:〃cassancira.apache,org/,以及參考Edward

Capriolo(Packt)所著的《HighPerformanceCassandraCookbook))一書。

[4]請參考DynamoDB的官方網(wǎng)站,http://aws.amazon,com/dynamodb/o

[5]參考鏈接https://cwiki.apache.org/Hive/o

[6]不過,非常有必要將這個wiki鏈接加入到網(wǎng)址收藏夾中,因為wiki中包含了一些我

們沒有覆蓋的、比較模糊的信息。

[7]對于不是開發(fā)者的用戶,這里需要補充說明的是"HelloWorld”程序通常是學(xué)習(xí)一門

新的語言或者工具集的第一個程序。

[8]ApacheHadoopwordcount:http://wiki,apache.org/hadoop/WordCount.

[9]詳細信息請參考TomWhite所著的《Hadoop權(quán)威指南》一書。

[10]還有一個微小的差異。Hive查詢硬編碼指定一個指向數(shù)據(jù)的路徑,而Java代碼把這

個路徑作為一個輸入?yún)?shù)處理。在第2章,我們將學(xué)習(xí)如何在Hive腳本中使用*變量*來

避免這種硬編碼。

第2章基礎(chǔ)操作

讓我們求在個人工作站上安裝Hadoop和Hive吧。這是學(xué)習(xí)和體驗Hadoop的?個便捷的

方式。之后我們將討論如何配置Hive以了解如何在Hadoop集群上使用Hive。

如果用戶已經(jīng)在使用亞馬遜網(wǎng)絡(luò)服務(wù)(AWS)了,那么建立一個供學(xué)習(xí)Hive的最快速途徑

是在亞馬遜彈性MapReduce系統(tǒng)(EMR)中提交一個Hive任務(wù)。我們在第21章將會討論

這種方式。

如果用戶已經(jīng)會使用安裝有Hive的Hadoop集群的話,那么我們建議可以跳過本章的第一

部分而直接從”開始看。

2.1安裝預(yù)先配置好的虛擬機

用戶可以通過多種方式來安裝Hadoop和lliveo安裝一個完整的Hadoop系統(tǒng)(包含有

Hive)的一個最容易的方式就是下載一個預(yù)先配置好的成投仞(VM),這個虛擬機可以在

川倘re或者FTrZua/%(中執(zhí)行。對于VMWare,可以使用Windows或Linux(免費的)

的VMWarePlayer,也可以使用MacOSX(需付費但并不貴)的VMWareFusionc

VirtualBox在這些平臺(包含有Solaris平臺)中都是免費的。

虛擬機使用Linux作為操作系統(tǒng),這也是在生產(chǎn)情況下.運行Hadoop的唯一指定操作系統(tǒng)

必,工

在Windows系統(tǒng)中R前使用Hadoop的唯一方式就是使用虛擬機,即使安裝了Cygwin或其

他類似的類UNIX軟件。

目前提供的大多數(shù)預(yù)先配置好的虛擬機(VM)僅是為VMWare設(shè)計的,但是如果用戶偏好

使用VirtualBox,那么也是可以在網(wǎng)站上找到如何將某個特定的VM導(dǎo)入到VirtualBox

的指南的。

用戶可以從表2提供的網(wǎng)站中下載指定的預(yù)先配置好的虛擬機。根據(jù)這些網(wǎng)站上的指

南可以下載并導(dǎo)入到VMWare的虛擬機。

表2-1為VMWare提供的預(yù)先配置好的Hadoop虛擬機

提供者URL注意事項

Cloudera.Inchttps://ccp.cloudera.com/display/SUPPORT/Clou使用Cloudera自己的Hadoop分支,CDII3

dera's+Hacoop+Demo+VM或者CDH4

MapR.Inchttp://w\vw.mapr.com/doc/disp1ay/MapR/QuickMapR的Hadoop分支,其將HDFS替換為了

+Start+-+Test+Drive+MapR+on+a+Virtual+MachineMapR文件系統(tǒng)(VapR-F5)

Hortonworks.Inchttp://docs,hortonworks.com/HDP-1.0.4-PRRVIEW基于最新的穩(wěn)定的Apache的發(fā)行版

-6/Using_HDP_Single_Box_VM/HDP_Single_Box

_VM.htm

ThinkBighttp://thirkbigacadcniy.s3-wcbsitc-us-cast-基于最新的穩(wěn)定的Apache的發(fā)行版

Analytics.Inc1.ama

zonaws.com/vm/README.html

下一步,可以直接從第2.3節(jié)“Hive內(nèi)部是什么“開始看。

2.2安裝詳細步驟

雖然使用一個預(yù)先配置好的虛擬機可能是使用Hive的一個便捷方式,但是自己安裝

Hadoop和Hive可以讓用戶更清楚地知道這些工具是如何工作的,特別是,如果用戶是一

個開發(fā)者的話,這個很重要。

下面所提供的指南描述的是在用戶個人Linux或者MacOSX工作站中安裝Hadoop和

Hive所必需的最少的步驟。對于生.產(chǎn)環(huán)境下的安裝過程,請查閱所使用的Hadoop分支推

薦的安裝流程。

2.2.1裝Java

Hive依賴于Hadoop,而Hadoop依賴于Java。用戶需要確認(rèn)使用的操作系統(tǒng)中安裝有

vl.6.*或者版本的JVM(Java虛擬機)。盡管用戶執(zhí)行Hive只需要使用到JRE

(Java運行時環(huán)境),但是本書中還是演示了如何使用Java編碼對Hive進行擴展,因

此用戶還需要安裝完整的JDK(Java開發(fā)工具集)來編譯這些例子。但是,如果用戶不是

開發(fā)者,可以不進行此操作,本書所附帶的源碼分支版本中已經(jīng)包含有編譯過的例子了。

安裝完成后,用戶需要確認(rèn)Java已經(jīng)存在于環(huán)境中,而且已經(jīng)設(shè)置好了JAVAJ0ME環(huán)境

變量。

1.Linux系統(tǒng)中Java安裝步驟

在Linux操作系統(tǒng)上,下面的指令是在必0錄下創(chuàng)建一個文件,其為

所有的用戶定義了一個〃弘_〃。屹環(huán)境變量,需要root訪問權(quán)限才能夠修改這個目錄下

的環(huán)境變量設(shè)置,而且修改總會影響到系統(tǒng)中所有用戶。(我們使用$作為的s/7shell提

示符。)OracleJVM安裝程序通常會將軟件安裝在必-1.6.X(對于vl.6版

本)目錄下,而豆會仄/usr/java/default^W/usr/Java/latest路徑建立軟鏈接到安裝

路徑下。

$/usr/java/latest/bin/java-version

javaversion”1.6.0_23”

Java(TM)SERuntimeEnvironment(build1.6.0_23~b05)

JavaHotSpot(TM)61-BitServer7M(buiId19.0-b09,mixedmode)

$sudoecho"exportJAVA_HOME=zusr/java/latcstw>/etc/profilc.d/java.sh

$sudoecho"PATH-$PATH:$JA'M_HOME/bin*?/ctc/profilc.d/java.sh

$./ctc/profi1c

$echo$JAVA_HOME

/usr/java/latcst

如果之前是使用“特權(quán)賬號”來執(zhí)行某個命令,而不是在執(zhí)行命令前使用sudo命令來執(zhí)

行的話(也就是需要執(zhí)行的命令分為兩部分:sudo加上用戶需要執(zhí)行的命令),那么只

需要按照提示要求輸入密碼即可。如果是個人計算機的話,用戶賬號通常就具有“Slid

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論