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

下載本文檔

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

文檔簡(jiǎn)介

Hive

編程指南

(中文版)

目錄

第1章基礎(chǔ)知識(shí)

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)計(jì)算法

1.4后續(xù)事情

第2章基礎(chǔ)操作

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

2.2安裝詳細(xì)步驟

2.2.1裝Java

2.2.2安裝Hadoop

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

2.2.4測(cè)試Hadoop

2.2.5安裝Hive

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

2.4啟動(dòng)Hive

2.5配置Hadoop環(huán)境

2.5.1本地模式配置

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

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

2.6Hive命令

命令選項(xiàng)

2.7命令行界面

2.7.1CLI選項(xiàng)

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腳本中如何進(jìn)行注釋

2.7.11顯示字段名稱

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

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

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

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

3.4讀時(shí)模式

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

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

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

4.3創(chuàng)建表

4.3.1管理表

4.3.2外部表

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

4.4.1外部分區(qū)表

4.4.2自定義表的存儲(chǔ)格式

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修改存儲(chǔ)屬性

4.6.8眾多的修改表語(yǔ)句

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

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

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

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

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

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

第6章HiveQL:查詢

6.1SELECT-FROM語(yǔ)句

6.1.1使用正則表達(dá)式來(lái)指定列

6.1.2使用列值進(jìn)行計(jì)算

6.1.3算術(shù)運(yùn)算符

6.1.4使用函數(shù)

6.1.5LIMIT語(yǔ)句

6.1.6列別名

6.1.7嵌套SELECT語(yǔ)句

6.1.8CASE???WHEN…THEN句式

6.1.9什么情況FHive可以避免進(jìn)行MapReduce

6.2WHERE語(yǔ)句

6.2.1謂詞操作符

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

6.2.3LIKE和RLIKE

6.3GROUPBY語(yǔ)句

HAVING語(yǔ)句

6.4JOIN語(yǔ)句

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使用視圖來(lái)降低查詢復(fù)雜度

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

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

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

第8章HiveQL:索引

8.1創(chuàng)建索引

Bitmap索引

8.2重建索引

8.3顯不索引

8.4刪除索引

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

第9章模式設(shè)計(jì)

9.1按天劃分的表

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

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

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

9.5對(duì)于每個(gè)表的分區(qū)

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

9.7為表增加列

9.8使用列存儲(chǔ)表

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個(gè)數(shù)

10.9JVM重用

10.10索引

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

10.12推測(cè)執(zhí)行

10.13單個(gè)MapReduce中多個(gè)GROUPBY

10.14虛擬列

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

11.1確定安裝編解碼器

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

11.3開啟中間壓縮

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

11.5sequencefile存儲(chǔ)格式

11.6使用壓縮實(shí)踐

11.7存檔分區(qū)

11.8壓縮:包扎

第12章開發(fā)

12.1修改Log4J屬性

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

12.3從源碼編譯Hive

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

12.3.2執(zhí)行hook

12.4配置Hive和Eclipse

12.5Maven工程中使用Hive

12.6Hive中使用hive_test進(jìn)行單元測(cè)試

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一個(gè)通過(guò)日期計(jì)算其星座的UDF

13.7UDF與GenericUDF

13.8不變函數(shù)

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

創(chuàng)建一個(gè)COLLECTUDAF來(lái)模擬GROUP_CONCAT

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

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

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

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

13.11在UDF中訪問(wèn)分布式緩存

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進(jìn)行聚合計(jì)算

14.8CLUSTERBY、DISTRIBUTEBY、SORTBY

14.9GenericMRToolsforStreamingtoJava

14.10計(jì)算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進(jìn)化的模式

15.12二進(jìn)制輸出

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

16.1啟動(dòng)ThriftServer

16.2配置Groovy使用HiveServer

16.3連接到HiveServer

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

16.5結(jié)果集模式

16.6獲取結(jié)果

16.7獲取執(zhí)行計(jì)劃

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

表檢查器例子

16.9管理HiveServer

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

16.9.2清理

16.10HiveThriftMetastore

16.10.1ThriftMetastore配置

16.10.2客戶端配置

第17章存儲(chǔ)處理程序和NoSQL

17.1StorageHandlerBackground

17.2HiveStoragellandler

17.3HBase

17.4Cassandra

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

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

17.4.3CassandraSerDeProperties

17.5DynamoDB

第18章安全

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

18.2使用Hive進(jìn)行驗(yàn)證

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

18.3.1用戶、組和角色

18.3.2Grant和Revoke權(quán)限

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

18.5自動(dòng)授權(quán)

第19章鎖

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

19.2顯式鎖和獨(dú)占鎖

第20章Hive和Oozie整合

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

HiveThriftServiceAction

20.2一個(gè)只包含兩個(gè)查詢過(guò)程的工作流示例

20.3Oozie網(wǎng)頁(yè)控制臺(tái)

20.4工作流中的變量

20.5獲取輸出

20.6獲取輸出到變量

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

21.1為什么要彈性MapReduce

21.2實(shí)例

21.3開始前的注意事項(xiàng)

21.4管理自有EMRHive集群

21.5EMRHive上的ThriftServer服務(wù)

21.6EMR上的實(shí)例組

21.7配置EMR集群

21.7.1部署hive-site,xml文件

21.7.2部署.hiverc腳本

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

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

21.9EMR集群上的HDFS和S3

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

21.11S3上的日志

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

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偽隨機(jī)

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

23.2Outbrain

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

23.2.2計(jì)算復(fù)雜度

23.2.3會(huì)話化

23.3NASA噴氣推進(jìn)實(shí)驗(yàn)室

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

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

23.3.3解決這些問(wèn)題我們所面臨的挑戰(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)題:來(lái)自Karmasphere的視角

23.6.1介紹

23.6.2CustomerTrenches的用例

術(shù)語(yǔ)詞匯表

第1章基礎(chǔ)知識(shí)

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

長(zhǎng)的數(shù)據(jù)進(jìn)行較量。最近,社交網(wǎng)站也遇到了同樣的問(wèn)題。如今,許多組織已經(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ì)算模型,也就是物/必。"火e其可以將計(jì)算任務(wù)分割成多個(gè)處

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

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

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

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

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

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

時(shí)用戶)來(lái)說(shuō),這個(gè)問(wèn)題又將如何解決呢?

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

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

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

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

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

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

(job),進(jìn)而在介紹一個(gè)令人熟悉的SQL抽象的同時(shí),拓寬Hadoop的可擴(kuò)展性。如果用

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

介紹。

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

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

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

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

但是用戶可以通過(guò)查詢生成新表或者將查詢結(jié)果導(dǎo)入到文件中。同時(shí)、因?yàn)镠adcop是一

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

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

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

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

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

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

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

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

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

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

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

第17章進(jìn)行介紹。

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

挖掘,然后形成意見和報(bào)告等。

因?yàn)榇蠖鄶?shù)的數(shù)據(jù)倉(cāng)庫(kù)應(yīng)用程序是使用基于SQL的關(guān)系型數(shù)據(jù)庫(kù)實(shí)現(xiàn)的,所以Hive降低

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

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

行生產(chǎn)。

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

移植到Hadoop變得更加容易。

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

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

SQL方言最接近)。

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

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

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

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

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

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

因?yàn)镠ive缺少好的文檔,所以我們經(jīng)歷了不少的挫折才完成了這本書。特別是對(duì)于那些

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

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

釋有時(shí)太少了,而且常常沒有進(jìn)行及時(shí)的更新。我們希望本書可以彌補(bǔ)這些不足,可以提

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

1.1Hadoop和MapReduce綜述

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

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

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

我們?cè)谶@里提供了一個(gè)關(guān)于Hadoop和MapReduce的簡(jiǎn)要描述。更多細(xì)節(jié),請(qǐng)參考Tom

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

MapReduce

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

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

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

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

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

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

MapReduce這個(gè)術(shù)語(yǔ)來(lái)自于兩個(gè)基本的數(shù)據(jù)轉(zhuǎn)換操作:map過(guò)程和reduce過(guò)程。一個(gè)map

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

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

值則可能完全不同。

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

切地說(shuō),這個(gè)鍵和這個(gè)鍵所對(duì)應(yīng)的所有值都會(huì)被傳遞給同一個(gè)Reducer。reduce過(guò)程的目

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

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

不同的。需要說(shuō)明的是,如果job不需要reduce過(guò)程的話,那么也是可以無(wú)reduce過(guò)程

的。

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

Hadoop決定如果將提交的job分解成多個(gè)獨(dú)立的map和reduce任務(wù)(task)來(lái)執(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ù)來(lái)進(jìn)行寫入和讀取,從而最大化提高讀寫性能。

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

是MapReduce計(jì)算框架中的“HelloWorld”程序⑴了。WordCount會(huì)返回在語(yǔ)料庫(kù)(單

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

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

制表符進(jìn)行分割。

圖1-1顯示了在MapReduce計(jì)算框架中WordCount程序是如何運(yùn)作的。

|叩由MappersSort,ShuffleReducersOutput

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

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

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

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

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

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

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

些細(xì)節(jié)性問(wèn)題。

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

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

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

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

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

不需要的標(biāo)點(diǎn)符號(hào)),最終這行文本會(huì)被分解成多個(gè)單詞。我們同時(shí)假定Mapper會(huì)將每

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

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

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

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

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

Hadoop會(huì)按照鍵來(lái)對(duì)鍵-值對(duì)進(jìn)行排序,然后“重新洗牌”,將所有具有相同鍵的鍵-值

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

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

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

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

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

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

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

是邏輯是正確的,而且對(duì)于這個(gè)討論,理由是充足的。

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

等。不過(guò)幸運(yùn)的是,存在一種方式,可以通過(guò)使用“高級(jí)”工具自動(dòng)處理這些情況來(lái)重用

這些通用的處理過(guò)程。

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

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

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

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

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

圖1-2Hive組成模塊

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

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

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

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

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

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

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

所有的命令和查詢都會(huì)進(jìn)入到Driver(驅(qū)動(dòng)模塊),通過(guò)該模塊對(duì)輸入進(jìn)行解析編譯,

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

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

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

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

語(yǔ)言翻譯程序,而這個(gè)驅(qū)動(dòng)計(jì)算的“語(yǔ)言”是以XML形式編碼的。

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

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

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

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

的。

Metastore(元數(shù)據(jù)存儲(chǔ))是一個(gè)獨(dú)立的關(guān)系型數(shù)據(jù)庫(kù)(通常是一個(gè)MySQL實(shí)例),Hive

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

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

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

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

不過(guò),用戶的某些工作可能采用其他的工具會(huì)更容易進(jìn)行處理。

1.2.1Pig

Hive的替代工具中最有名的就是Pig了(請(qǐng)參考)<,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)換來(lái)生成一個(gè)或

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

解決這個(gè)問(wèn)題,但是在某些時(shí)刻會(huì)需要重新保存臨時(shí)表(這個(gè)需要用戶自己進(jìn)行管理)來(lái)

控制復(fù)雜度0

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

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

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

對(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ù)裝載)過(guò)程的一部分,也就是將外部數(shù)據(jù)裝載到Hadoop集群中,

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

Pig的一個(gè)缺點(diǎn)就是其所使用的定制語(yǔ)言不是基于SQL的。這是可以理解的,因?yàn)镻ig木

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

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

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

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

1.2.2HBase

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

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

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

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

HBase的設(shè)計(jì)靈感來(lái)自于谷歌(Google)的BigTable,不過(guò)HBase并沒有實(shí)現(xiàn)EigTable

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

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

集時(shí),讀寫速度會(huì)快得多。因?yàn)椴恍枰x取所有的行然后丟棄大部分的列,而是只需讀取

需要的列。

可以像鍵-值存儲(chǔ)一樣來(lái)使用HBase,其每一行都使用了一個(gè)唯一鍵來(lái)提供非常快的速度

讀寫這一行的列或者列族。HBase還會(huì)對(duì)每個(gè)列保留多個(gè)版本的值(按照時(shí)間戳進(jìn)行標(biāo)

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

本的值。

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

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

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

更新進(jìn)行更新等操作。

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

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

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

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

1.2.3Cascading、Crunch及其他

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

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

其中的一些來(lái)進(jìn)行介紹。所有這些都是JVM(Java虛擬機(jī))庫(kù),可用于像Java、Clojure、

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

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

不過(guò),對(duì)于開發(fā)工程師來(lái)說(shuō),這些工具提供了圖靈完全的編程語(yǔ)言的完全控制。Hive和

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

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

編碼來(lái)擴(kuò)展Hive功能(見表1-1)o

表1-1其他可選的Hadoop之上的高級(jí)語(yǔ)言庫(kù)

名稱URL描述

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

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

JRuby和Jython

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

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

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

https://github.com/c1oudera/crunch

因?yàn)镠adoop是面向批處理系統(tǒng)的,所以存在更適合事件流處理的使用不同的分布式計(jì)算

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

目(見表1-2)。

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

名稱URL描述

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

project.org/件,而且其對(duì)于MapReduce中多種計(jì)算可以提供顯著的性能改進(jìn)。同時(shí)還有一個(gè)

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

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

nathanmarz/storm

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

http:〃incubator,apache,org

/kafka/index.html

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

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

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

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

名稱URL描述

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

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

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

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

products/matlab/index,html

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

software/octave/

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

mathematica/和工程師歡迎的工具

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

NumPy

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

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

如果用戶是名Java工程師,那么可能需要閱讀本節(jié),因?yàn)橛脩粜枰獮槠渌诮M織的Hive

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

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

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

通常都會(huì)使用NordCount作為用戶學(xué)習(xí)使用Java編寫MapReduce程序的例子,因?yàn)檫@樣

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

了。

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

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

對(duì)比。

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):

上面是一個(gè)有63行的Java代碼。我們不會(huì)詳細(xì)解釋其中的APU。如下是使用HiveQL進(jìn)

行的相同的運(yùn)算,這時(shí)只有8行代碼,而且不需要進(jìn)行編譯然后生成一個(gè)“JAR”(Java

壓縮包)文件。

CREATETABLEdocs(lineSTRING);

LOADDATAINPATII'docs,OVERWRITEINTOTABLEdocs;

CREATETABLEword*countsAS

SELECTword,count(1)AScountFROM

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

GROUPBYword

ORDERBYword;

我們稍后會(huì)解釋所有這些HiveQL語(yǔ)法。

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

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

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

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

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

進(jìn)度。

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

熟悉SQL了,那么學(xué)習(xí)Hive將會(huì)相當(dāng)?shù)厝菀祝液芏喑绦蛞捕己苋菀卓焖賹?shí)現(xiàn)。

L4后續(xù)事情

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

口]不過(guò),因?yàn)镠ive是被設(shè)計(jì)用來(lái)處理的大數(shù)據(jù)集的,這個(gè)啟動(dòng)所消耗的時(shí)間和實(shí)際數(shù)據(jù)

處理時(shí)間相比是微乎其微的。

[2〕請(qǐng)?jiān)L問(wèn)ApacheIIBase的官方網(wǎng)站,http://hbase.apache.org,以及LarsGeorge(0r

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

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

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

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

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

[6]不過(guò),非常有必要將這個(gè)wiki鏈接加入到網(wǎng)址收藏夾中,因?yàn)閣iki中包含了一些我

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

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

新的語(yǔ)言或者工具集的第一個(gè)程序。

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

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

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

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

避免這種硬編碼。

第2章基礎(chǔ)操作

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

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

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

是在亞馬遜彈性MapReduce系統(tǒng)(EMR)中提交一個(gè)Hive任務(wù)。我們?cè)诘?1章將會(huì)討論

這種方式。

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

部分而直接從”開始看。

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

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

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

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

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

VirtualBox在這些平臺(tái)(包含有Solaris平臺(tái))中都是免費(fèi)的。

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

必,工

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

他類似的類UNIX軟件。

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

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

的指南的。

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

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

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

提供者URL注意事項(xiàng)

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安裝詳細(xì)步驟

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

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

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

下面所提供的指南描述的是在用戶個(gè)人Linux或者M(jìn)acOSX工作站中安裝Hadoop和

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

薦的安裝流程。

2.2.1裝Java

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

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

(Java運(yùn)行時(shí)環(huán)境),但是本書中還是演示了如何使用Java編碼對(duì)Hive進(jìn)行擴(kuò)展,因

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

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

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

變量。

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

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

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

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

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

本)目錄下,而豆會(huì)仄/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)賬號(hào)”來(lái)執(zhí)行某個(gè)命令,而不是在執(zhí)行命令前使用sudo命令來(lái)執(zhí)

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

需要按照提示要求輸入密碼即可。如果是個(gè)人計(jì)算機(jī)的話,用戶賬號(hào)通常就具有“Slid

溫馨提示

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

評(píng)論

0/150

提交評(píng)論