Linux系統(tǒng)與大數(shù)據(jù)應(yīng)用 課件 第9章 大數(shù)據(jù)應(yīng)用開(kāi)發(fā)工具_(dá)第1頁(yè)
Linux系統(tǒng)與大數(shù)據(jù)應(yīng)用 課件 第9章 大數(shù)據(jù)應(yīng)用開(kāi)發(fā)工具_(dá)第2頁(yè)
Linux系統(tǒng)與大數(shù)據(jù)應(yīng)用 課件 第9章 大數(shù)據(jù)應(yīng)用開(kāi)發(fā)工具_(dá)第3頁(yè)
Linux系統(tǒng)與大數(shù)據(jù)應(yīng)用 課件 第9章 大數(shù)據(jù)應(yīng)用開(kāi)發(fā)工具_(dá)第4頁(yè)
Linux系統(tǒng)與大數(shù)據(jù)應(yīng)用 課件 第9章 大數(shù)據(jù)應(yīng)用開(kāi)發(fā)工具_(dá)第5頁(yè)
已閱讀5頁(yè),還剩84頁(yè)未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

Linux系統(tǒng)與大數(shù)據(jù)應(yīng)用9大數(shù)據(jù)應(yīng)用開(kāi)發(fā)工具第章本章內(nèi)容9.1數(shù)據(jù)抽取ETL技術(shù)9.2

Hbase原理和模型9.3Hive基礎(chǔ)與應(yīng)用9.4本章小結(jié)9.1數(shù)據(jù)抽取ETL技術(shù)數(shù)據(jù)倉(cāng)庫(kù)是一個(gè)獨(dú)立的數(shù)據(jù)環(huán)境,需要通過(guò)抽取過(guò)程將數(shù)據(jù)從聯(lián)機(jī)事務(wù)處理環(huán)境,外部數(shù)據(jù)源和脫機(jī)的數(shù)據(jù)存儲(chǔ)介質(zhì)導(dǎo)入到數(shù)據(jù)倉(cāng)庫(kù)中,而ETL技術(shù)是數(shù)據(jù)倉(cāng)庫(kù)中非常重要的一環(huán)。ETL(Extract-Transform-Load的縮寫(xiě),即數(shù)據(jù)抽取、轉(zhuǎn)換、裝載的過(guò)程)作為BI/DW(BusinessIntelligence)的核心和靈魂,能夠按照統(tǒng)一的規(guī)則集成并提高數(shù)據(jù)的價(jià)值,是負(fù)責(zé)完成數(shù)據(jù)從數(shù)據(jù)源向目標(biāo)數(shù)據(jù)倉(cāng)庫(kù)轉(zhuǎn)化的過(guò)程,是實(shí)施數(shù)據(jù)倉(cāng)庫(kù)的重要步驟。數(shù)據(jù)倉(cāng)庫(kù)系統(tǒng)中數(shù)據(jù)不要求與聯(lián)機(jī)事務(wù)處理系統(tǒng)中的數(shù)據(jù)實(shí)時(shí)同步,所以ETL可以定時(shí)進(jìn)行。ETL是數(shù)據(jù)抽?。‥xtract)、清洗(Cleaning)、轉(zhuǎn)換(Transform)、裝載(Load)的過(guò)程。是構(gòu)建數(shù)據(jù)倉(cāng)庫(kù)的重要一環(huán),用戶(hù)從數(shù)據(jù)源抽取出所需的數(shù)據(jù),經(jīng)過(guò)數(shù)據(jù)清洗,最終按照預(yù)先定義好的數(shù)據(jù)倉(cāng)庫(kù)模型,將數(shù)據(jù)加載到數(shù)據(jù)倉(cāng)庫(kù)中去。9.1.1ETL概述數(shù)據(jù)抽取數(shù)據(jù)抽取是從數(shù)據(jù)源中抽取數(shù)據(jù)的過(guò)程。實(shí)際應(yīng)用中,數(shù)據(jù)源較多采用的是關(guān)系數(shù)據(jù)庫(kù)。從數(shù)據(jù)庫(kù)中抽取數(shù)據(jù)一般有以下幾種方式。1)全量抽取全量抽取類(lèi)似于數(shù)據(jù)遷移或數(shù)據(jù)復(fù)制,它將數(shù)據(jù)源中的表或視圖的數(shù)據(jù)原封不動(dòng)的從數(shù)據(jù)庫(kù)中抽取出來(lái),并轉(zhuǎn)換成自己的ETL工具可以識(shí)別的格式。全量抽取比較簡(jiǎn)單。2)增量抽取增量抽取只抽取自上次抽取以來(lái)數(shù)據(jù)庫(kù)中要抽取的表中新增或修改的數(shù)據(jù)。在ETL使用過(guò)程中。增量抽取較全量抽取應(yīng)用更廣。如何捕獲變化的數(shù)據(jù)是增量抽取的關(guān)鍵。對(duì)捕獲方法一般有兩點(diǎn)要求:準(zhǔn)確性,能夠?qū)I(yè)務(wù)系統(tǒng)中的變化數(shù)據(jù)按一定的頻率準(zhǔn)確地捕獲到;性能,不能對(duì)業(yè)務(wù)系統(tǒng)造成太大的壓力,影響現(xiàn)有業(yè)務(wù)。目前增量數(shù)據(jù)抽取中常用的捕獲變化數(shù)據(jù)的方法有:9.1.1ETL概述1.觸發(fā)器:在要抽取的表上建立需要的觸發(fā)器,一般要建立插入、修改、刪除三個(gè)觸發(fā)器,每當(dāng)源表中的數(shù)據(jù)發(fā)生變化,就被相應(yīng)的觸發(fā)器將變化的數(shù)據(jù)寫(xiě)入一個(gè)臨時(shí)表,抽取線程從臨時(shí)表中抽取數(shù)據(jù),臨時(shí)表中抽取過(guò)的數(shù)據(jù)被標(biāo)記或刪除。觸發(fā)器方式的優(yōu)點(diǎn)是數(shù)據(jù)抽取的性能較高,缺點(diǎn)是要求業(yè)務(wù)表建立觸發(fā)器,對(duì)業(yè)務(wù)系統(tǒng)有一定的影響。9.1.1ETL概述2.時(shí)間戳:它是一種基于快照比較的變化數(shù)據(jù)捕獲方式,在源表上增加一個(gè)時(shí)間戳字段,系統(tǒng)中更新修改表數(shù)據(jù)的時(shí)候,同時(shí)修改時(shí)間戳字段的值。當(dāng)進(jìn)行數(shù)據(jù)抽取時(shí),通過(guò)比較系統(tǒng)時(shí)間與時(shí)間戳字段的值來(lái)決定抽取哪些數(shù)據(jù)。有的數(shù)據(jù)庫(kù)的時(shí)間戳支持自動(dòng)更新,即表的其它字段的數(shù)據(jù)發(fā)生改變時(shí),自動(dòng)更新時(shí)間戳字段的值。有的數(shù)據(jù)庫(kù)不支持時(shí)間戳的自動(dòng)更新,這就要求業(yè)務(wù)系統(tǒng)在更新業(yè)務(wù)數(shù)據(jù)時(shí),手工更新時(shí)間戳字段。同觸發(fā)器方式一樣,時(shí)間戳方式的性能也比較好,數(shù)據(jù)抽取相對(duì)清楚簡(jiǎn)單,但對(duì)業(yè)務(wù)系統(tǒng)也有很大的傾入性(加入額外的時(shí)間戳字段),特別是對(duì)不支持時(shí)間戳的自動(dòng)更新的數(shù)據(jù)庫(kù),還要求業(yè)務(wù)系統(tǒng)進(jìn)行額外的更新時(shí)間戳操作。另外,無(wú)法捕獲對(duì)時(shí)間戳以前數(shù)據(jù)的delete和update操作,在數(shù)據(jù)準(zhǔn)確性上受到了一定的限制。9.1.1ETL概述3.全表比對(duì):典型的全表比對(duì)的方式是采用MD5校驗(yàn)碼。ETL工具事先為要抽取的表建立一個(gè)結(jié)構(gòu)類(lèi)似的MD5臨時(shí)表,該臨時(shí)表記錄源表主鍵以及根據(jù)所有字段的數(shù)據(jù)計(jì)算出來(lái)的MD5校驗(yàn)碼。每次進(jìn)行數(shù)據(jù)抽取時(shí),對(duì)源表和MD5臨時(shí)表進(jìn)行MD5校驗(yàn)碼的比對(duì),從而決定源表中的數(shù)據(jù)是新增、修改還是刪除,同時(shí)更新MD5校驗(yàn)碼。MD5方式的優(yōu)點(diǎn)是對(duì)源系統(tǒng)的傾入性較?。▋H需要建立一個(gè)MD5臨時(shí)表),但缺點(diǎn)也是顯而易見(jiàn)的,與觸發(fā)器和時(shí)間戳方式中的主動(dòng)通知不同,MD5方式是被動(dòng)的進(jìn)行全表數(shù)據(jù)的比對(duì),性能較差。當(dāng)表中沒(méi)有主鍵或唯一列且含有重復(fù)記錄時(shí),MD5方式的準(zhǔn)確性較差。9.1.1ETL概述4.日志對(duì)比:通過(guò)分析數(shù)據(jù)庫(kù)自身的日志來(lái)判斷變化的數(shù)據(jù)。Oracle的改變數(shù)據(jù)捕獲(CDC,ChangedDataCapture)技術(shù)是這方面的代表。CDC特性是在Oracle9i數(shù)據(jù)庫(kù)中引入的。CDC能夠幫助你識(shí)別從上次抽取之后發(fā)生變化的數(shù)據(jù)。利用CDC,在對(duì)源表進(jìn)行insert、update或delete等操作的同時(shí)就可以提取數(shù)據(jù),并且變化的數(shù)據(jù)被保存在數(shù)據(jù)庫(kù)的變化表中。這樣就可以捕獲發(fā)生變化的數(shù)據(jù),然后利用數(shù)據(jù)庫(kù)視圖以一種可控的方式提供給目標(biāo)系統(tǒng)。CDC體系結(jié)構(gòu)基于發(fā)布者/訂閱者模型。發(fā)布者捕捉變化數(shù)據(jù)并提供給訂閱者。訂閱者使用從發(fā)布者那里獲得的變化數(shù)據(jù)。通常,CDC系統(tǒng)擁有一個(gè)發(fā)布者和多個(gè)訂閱者。發(fā)布者首先需要識(shí)別捕獲變化數(shù)據(jù)所需的源表。然后,它捕捉變化的數(shù)據(jù)并將其保存在特別創(chuàng)建的變化表中。它還使訂閱者能夠控制對(duì)變化數(shù)據(jù)的訪問(wèn)。訂閱者需要清楚自己感興趣的是哪些變化數(shù)據(jù)。一個(gè)訂閱者可能不會(huì)對(duì)發(fā)布者發(fā)布的所有數(shù)據(jù)都感興趣。訂閱者需要?jiǎng)?chuàng)建一個(gè)訂閱者視圖來(lái)訪問(wèn)經(jīng)發(fā)布者授權(quán)可以訪問(wèn)的變化數(shù)據(jù)。CDC分為同步模式和異步模式,同步模式實(shí)時(shí)的捕獲變化數(shù)據(jù)并存儲(chǔ)到變化表中,發(fā)布者與訂閱都位于同一數(shù)據(jù)庫(kù)中。異步模式則是基于Oracle的流復(fù)制技術(shù)。ETL處理的數(shù)據(jù)源除了關(guān)系數(shù)據(jù)庫(kù)外,還可能是文件,例如txt文件、excel文件、xml文件等。對(duì)文件數(shù)據(jù)的抽取一般是進(jìn)行全量抽取,一次抽取前可保存文件的時(shí)間戳或計(jì)算文件的MD5校驗(yàn)碼,下次抽取時(shí)進(jìn)行比對(duì),如果相同則可忽略本次抽取。9.1.1ETL概述數(shù)據(jù)轉(zhuǎn)換和加工從數(shù)據(jù)源中抽取的數(shù)據(jù)不一定完全滿(mǎn)足目的庫(kù)的要求,例如數(shù)據(jù)格式的不一致、數(shù)據(jù)輸入錯(cuò)誤、數(shù)據(jù)不完整等等,因此有必要對(duì)抽取出的數(shù)據(jù)進(jìn)行數(shù)據(jù)轉(zhuǎn)換和加工。數(shù)據(jù)的轉(zhuǎn)換和加工可以在ETL引擎中進(jìn)行,也可以在數(shù)據(jù)抽取過(guò)程中利用關(guān)系數(shù)據(jù)庫(kù)的特性同時(shí)進(jìn)行。9.1.1ETL概述1)ETL引擎中的數(shù)據(jù)轉(zhuǎn)換和加工ETL引擎中一般以組件化的方式實(shí)現(xiàn)數(shù)據(jù)轉(zhuǎn)換。常用的數(shù)據(jù)轉(zhuǎn)換組件有字段映射、數(shù)據(jù)過(guò)濾、數(shù)據(jù)清洗、數(shù)據(jù)替換、數(shù)據(jù)計(jì)算、數(shù)據(jù)驗(yàn)證、數(shù)據(jù)加解密、數(shù)據(jù)合并、數(shù)據(jù)拆分等。這些組件如同一條流水線上的一道道工序,它們是可插拔的,且可以任意組裝,各組件之間通過(guò)數(shù)據(jù)總線共享數(shù)據(jù)。在數(shù)據(jù)庫(kù)中進(jìn)行數(shù)據(jù)加工

關(guān)系數(shù)據(jù)庫(kù)本身已經(jīng)提供了強(qiáng)大的SQL、函數(shù)來(lái)支持?jǐn)?shù)據(jù)的加工,如在SQL查詢(xún)語(yǔ)句中添加where條件進(jìn)行過(guò)濾,查詢(xún)中重命名字段名與目的表進(jìn)行映射,substr函數(shù),case條件判斷等等。下面是一個(gè)SQL查詢(xún)的例子。9.1.1ETL概述selectIDasUSERID,substr(TITLE,1,20)asTITLE,casewhenREMARKisnullthen''elseREMARKendasCONTENTfromTB_REMARKwhereID>100;相比在ETL引擎中進(jìn)行數(shù)據(jù)轉(zhuǎn)換和加工,直接在SQL語(yǔ)句中進(jìn)行轉(zhuǎn)換和加工更加簡(jiǎn)單清晰,性能更高。對(duì)于SQL語(yǔ)句無(wú)法處理的可以交由ETL引擎處理。9.1.1ETL概述數(shù)據(jù)裝載將轉(zhuǎn)換和加工后的數(shù)據(jù)裝載到目的庫(kù)中通常是ETL過(guò)程的最后步驟。裝載數(shù)據(jù)的最佳方法取決于所執(zhí)行操作的類(lèi)型以及需要裝入多少數(shù)據(jù)。當(dāng)目的庫(kù)是關(guān)系數(shù)據(jù)庫(kù)時(shí),一般來(lái)說(shuō)有兩種裝載方式:直接SQL語(yǔ)句進(jìn)行insert、update、delete操作。采用批量裝載方法,如bcp、bulk、關(guān)系數(shù)據(jù)庫(kù)特有的批量裝載工具或api。大多數(shù)情況下會(huì)使用第一種方法,因?yàn)樗鼈冞M(jìn)行了日志記錄并且是可恢復(fù)的。但是,批量裝載操作易于使用,并且在裝入大量數(shù)據(jù)時(shí)效率較高。使用哪種數(shù)據(jù)裝載方法取決于業(yè)務(wù)系統(tǒng)的需要。9.1.1ETL概述9.1.2

ETL工具1.主流工具Datastage優(yōu)點(diǎn):內(nèi)嵌一種BASIC語(yǔ)言,可通過(guò)批處理程序增加靈活性,可對(duì)每個(gè)job設(shè)定參數(shù)并在job內(nèi)部引用。缺點(diǎn):早期版本對(duì)流程支持缺乏考慮;圖形化界面改動(dòng)費(fèi)事。Powercenter優(yōu)點(diǎn):元數(shù)據(jù)管理更為開(kāi)放,存放在關(guān)系數(shù)據(jù)庫(kù)中,可以很容易被訪問(wèn)。缺點(diǎn):沒(méi)有內(nèi)嵌類(lèi)BASIC語(yǔ)言,參數(shù)值需要人為更新,且不能引用參數(shù)名;圖形化界面改動(dòng)費(fèi)事9.1.2

ETL工具Automation優(yōu)點(diǎn):提供一套ETL框架,利用Teradata數(shù)據(jù)倉(cāng)庫(kù)本身的并行處理能力。缺點(diǎn):對(duì)數(shù)據(jù)庫(kù)依賴(lài)性強(qiáng),選型時(shí)需要考慮綜合成本(包括數(shù)據(jù)庫(kù)等)。國(guó)產(chǎn)ETL軟件:udis睿智ETL優(yōu)點(diǎn):適合國(guó)內(nèi)需求,性?xún)r(jià)比高。缺點(diǎn):配置復(fù)雜,缺少對(duì)元數(shù)據(jù)的管理。9.1.3

網(wǎng)絡(luò)爬蟲(chóng)技術(shù)及應(yīng)用1)網(wǎng)絡(luò)爬蟲(chóng)技術(shù)概述網(wǎng)絡(luò)爬蟲(chóng)是Spider(或Robots、Crawler)等詞的意譯,是一種高效的信息抓取工具,它集成了搜索引擎技術(shù),并通過(guò)大數(shù)據(jù)技術(shù)手段進(jìn)行優(yōu)化,用以從互聯(lián)網(wǎng)搜索、抓取并保存任何通過(guò)HTML(超文本標(biāo)記語(yǔ)言)進(jìn)行標(biāo)準(zhǔn)化的網(wǎng)頁(yè)信息。搜索引擎使用網(wǎng)絡(luò)爬蟲(chóng)尋找網(wǎng)絡(luò)內(nèi)容,網(wǎng)絡(luò)上的HTML文檔使用超鏈接連接了起來(lái),就像織成了一張網(wǎng),而網(wǎng)絡(luò)爬蟲(chóng)順著這張網(wǎng)爬行,每到一個(gè)網(wǎng)頁(yè)就用抓取程序?qū)⑦@個(gè)網(wǎng)頁(yè)抓下來(lái),將內(nèi)容抽取出來(lái),同時(shí)抽取超鏈接,作為進(jìn)一步爬行的線索。網(wǎng)絡(luò)爬蟲(chóng)總是要從某個(gè)起點(diǎn)開(kāi)始爬,這個(gè)起點(diǎn)叫做種子你可以告訴它,也可以到一些網(wǎng)址列表網(wǎng)站上獲取。9.1.3

網(wǎng)絡(luò)爬蟲(chóng)技術(shù)及應(yīng)用網(wǎng)絡(luò)爬蟲(chóng)應(yīng)用隨著互聯(lián)網(wǎng)技術(shù)的發(fā)展和數(shù)據(jù)爆炸,網(wǎng)絡(luò)爬蟲(chóng)技術(shù)為商業(yè)銀行數(shù)據(jù)采集和信息整合應(yīng)用提供了全新的技術(shù)路徑。站在商業(yè)銀行應(yīng)用實(shí)踐的角度,網(wǎng)絡(luò)爬蟲(chóng)在銀行日常經(jīng)營(yíng)管理中的發(fā)展?jié)摿薮?。網(wǎng)絡(luò)爬蟲(chóng)技術(shù)的應(yīng)用可以助力銀行轉(zhuǎn)型成為最了解自身、最了解客戶(hù)、最了解競(jìng)爭(zhēng)對(duì)手、最了解經(jīng)營(yíng)環(huán)境的“智慧銀行”??梢灶A(yù)見(jiàn),網(wǎng)絡(luò)爬蟲(chóng)技術(shù)將成為商業(yè)銀行提升精細(xì)化管理能力、提高決策智能化水平的重要技術(shù)手段。9.2Hbase原理和模型Hbase(HadoopDatabase)是一個(gè)針對(duì)結(jié)構(gòu)化數(shù)據(jù)的可伸縮、高可靠、高性能、分布式和面向列的分布式存儲(chǔ)系統(tǒng),利用Hbase技術(shù)可在廉價(jià)PCServer上搭建大規(guī)模結(jié)構(gòu)化存儲(chǔ)集群。Hbase是基于GoogleBigtable開(kāi)源實(shí)現(xiàn)。類(lèi)似GoogleBigtable利用GFS作為其文件存儲(chǔ)系統(tǒng),Hbase利用HadoopHDFS作為其文件存儲(chǔ)系統(tǒng);Google運(yùn)行MapReduce來(lái)處理Bigtable中的海量數(shù)據(jù),Hbase同樣利用HadoopMapReduce來(lái)處理Hbase中的海量數(shù)據(jù);GoogleBigtable利用Chubby作為協(xié)同服務(wù),Hbase利用Zookeeper作為對(duì)應(yīng)。9.2.1Hbase安裝和部署Hbase偽分布模式安裝下載安裝包因?yàn)镠base-1.3.1-bin.tar.gz版本與Hadoop-2.7.4版本良好兼容,所以從/apache/hbase/1.3.1網(wǎng)址下載安裝包,并將下載好的Hbase-1.3.1-bin.tar.gz拷貝到/home/hadoop目錄下。下載安裝包時(shí)的界面如9-1所示。9.2.1Hbase安裝和部署解壓安裝包右鍵點(diǎn)擊ExtractHere如圖9-2所示。9.2.1Hbase安裝和部署將解壓完的文件夾名改為hbase:mvhbase-1.3.1hbase更改環(huán)境變量sudovim/etc/profile在文件尾行添加如下內(nèi)容exportHBASE_HOME=/home/hadoop/hbaseexportPATH=$PATH:$HBASE_HOME/bin執(zhí)行source命令使上述配置生效source/etc/profile9.2.1Hbase安裝和部署3)打開(kāi)hbase文件夾配置/conf/hbase-env.sh文件,修改如下:exportJAVA_HOME=/usr/java/jdk1.8.0_144/#jdk版本要與本機(jī)一致exportHBASE_CLASSPATH=/usr/local/hadoop/etc/hadoop#讓hbase知道hadoop配置文件所在exportHBASE_MANAGES_ZK=true#配置由hbase自己管理zookeeper,不需要單獨(dú)的zookeeper。9.2.1Hbase安裝和部署4)配置/conf/hbase-site.xml文件用文本編輯器打開(kāi)hbase-default.xml文件,下面是要修改的內(nèi)容:<configuration><property><name>hbase.rootdir</name><value>hdfs://master:9000/hbase</value><description>ThedirectorysharedbyregionserversandintowhichHBasepersists.TheURLshouldbe'fully-qualified'toincludethefilesystemscheme.Forexample,tospecifytheHDFSdirectory'/hbase'wheretheHDFSinstance'snamenodeisrunningatonport9000,setthisvalueto:hdfs://:9000/hbase.Bydefault,wewritetowhatever${hbase.tmp.dir}issettoo--usually/tmp--sochangethisconfigurationorelsealldatawillbeloston9.2.1Hbase安裝和部署machinerestart.</description></property><property><name>hbase.cluster.distributed</name><value>true</value><description>Themodetheclusterwillbein.Possiblevaluesarefalseforstandalonemodeandtruefordistributedmode.Iffalse,startupwillrunallHBaseandZooKeeperdaemonstogetherintheoneJVM.</description></property><property><name>hbase.tmp.dir</name><value>/home/hadoop/hbase/tmp</value><description>Temporarydirectoryonthelocalfilesystem.Changethissettingtopointtoalocationmorepermanentthan'/tmp',theusualresolveforjava.io.tmpdir,asthe'/tmp'directoryisclearedonmachinerestart.</description></property></configuration>9.2.1Hbase安裝和部署覆蓋Hadoop核心jar包這是關(guān)鍵一步,主要目的是防止因?yàn)镠base和Hadoop版本不同出現(xiàn)兼容問(wèn)題,造成HMaster啟動(dòng)異常。rm-rflib/hadoop*.jarfind/usr/local/hadoop/share/hadoop-name“hadoop*jar”|xargs-icp{}/home/hadoop/hbase/lib/9.2.1Hbase安裝和部署6)啟動(dòng)Hbase,驗(yàn)證是否配置成功啟動(dòng)Hbase前先啟動(dòng)Hadoop:start-all.sh然后在Hbase下的bin目錄下啟動(dòng)Hbase,如圖9-3所示。9.2.2Hbase應(yīng)用1.Hbase框架和基本組件Hbase基本框架如圖9-4所示。9.2.2Hbase應(yīng)用Hbase構(gòu)建在HDFS之上,其組件包括Cilent、zookeeper、HDFS、Hmaster以及HRegionSever。Client包含訪問(wèn)Hbase的接口,并維護(hù)cache來(lái)加快對(duì)Hbase的訪問(wèn)。Zookeeper用來(lái)保證任何時(shí)候,集群中只有一個(gè)master,存貯所有Region的尋址入口以及實(shí)時(shí)監(jiān)控Regionsever的上線和下線信息。并實(shí)時(shí)通知給Master存儲(chǔ)Hbase的schema和table元數(shù)據(jù)。HMaster負(fù)責(zé)為Regionsever分配region和Regionserver的負(fù)載均衡。如果發(fā)現(xiàn)失效的Regionserver并重新分配其上的region。同時(shí),管理用戶(hù)對(duì)table的增刪改查操作。RegionServer負(fù)責(zé)維護(hù)region,處理對(duì)這些region的IO請(qǐng)求并且切分在運(yùn)行過(guò)程中變得過(guò)大的region。9.2.2Hbase應(yīng)用Hbase數(shù)據(jù)模型Hbase數(shù)據(jù)模型如表9-1所示。9.2.2Hbase應(yīng)用Hbase應(yīng)用場(chǎng)景HBase有三種主要使用場(chǎng)景:捕獲增量數(shù)據(jù)、內(nèi)容服務(wù)、信息交換。愿意使用HBase的用戶(hù)數(shù)量在過(guò)去幾年里迅猛增長(zhǎng)。部分原因在于HBase產(chǎn)品變得更加可靠和性能更好,更多原因在于越來(lái)越多的公司開(kāi)始投入大量資源來(lái)支持和使用它。隨著越來(lái)越多的商業(yè)服務(wù)供應(yīng)商提供支持,用戶(hù)越發(fā)自信地把HBase應(yīng)用于關(guān)鍵應(yīng)用系統(tǒng)。一個(gè)設(shè)計(jì)初衷是用來(lái)存儲(chǔ)互聯(lián)網(wǎng)持續(xù)更新網(wǎng)頁(yè)副本的技術(shù),用在互聯(lián)網(wǎng)相關(guān)的其他方面也很是合適的。例如,HBase在社交網(wǎng)絡(luò)公司內(nèi)部和周?chē)鞣N各樣的需求中找到了用武之地。從存儲(chǔ)個(gè)人之間的通信信息,到通信信息分析,HBase成為Facebook,Twitter,和StumbleUpon等公司里的關(guān)鍵基礎(chǔ)架構(gòu)。HBase可以用來(lái)對(duì)相同數(shù)據(jù)進(jìn)行在線服務(wù)和離線處理。這正是HBase的獨(dú)到之處。9.2.3Hbase優(yōu)化和存儲(chǔ)Hbase優(yōu)化Hbase垃圾回收優(yōu)化Java本身提供了垃圾回收機(jī)制,依靠JRE對(duì)程序行為的各種假設(shè)進(jìn)行垃圾回收,但是HBase支持海量數(shù)據(jù)持續(xù)入庫(kù),非常占用內(nèi)存,因此繁重的負(fù)載會(huì)迫使內(nèi)存分配策略無(wú)法安全地依賴(lài)于JRE的判斷:需要調(diào)整JRE的參數(shù)來(lái)調(diào)整垃圾回收策略。HBASE_OPTS或者HBASE_REGIONSERVER_OPT變量來(lái)設(shè)置垃圾回收的選項(xiàng),后面一般是用于配置RegionServer的,需要在每個(gè)子節(jié)點(diǎn)的HBASE_OPTS文件中進(jìn)行配置。設(shè)置新生代大小的參數(shù),不能過(guò)小,過(guò)小則導(dǎo)致年輕代過(guò)快成為老生代,引起老生代產(chǎn)生內(nèi)存隨便。同樣不能過(guò)大,過(guò)大導(dǎo)致所有的JAVA進(jìn)程停止時(shí)間長(zhǎng)。-XX:MaxNewSize=256m-XX:NewSize=256m這兩個(gè)可以合并成為-Xmn256m這一個(gè)配置來(lái)完成。設(shè)置垃圾回收策略:-XX:+UseParNewGC-XX:+UseConcMarkSweepGC也叫收集器設(shè)置。設(shè)置CMS的值,占比多少時(shí),開(kāi)始并發(fā)標(biāo)記和清掃檢查。-XX:CMSInitiatingOccupancyFraction=709.2.3Hbase優(yōu)化和存儲(chǔ)優(yōu)化Region拆分合并以及與拆分Regionhbase.hregion.max.filesize默認(rèn)為256M(在hbase-site.xml中進(jìn)行配置),當(dāng)region達(dá)到這個(gè)閾值時(shí),會(huì)自動(dòng)拆分??梢园堰@個(gè)值設(shè)的無(wú)限大,則可以關(guān)閉HBase自動(dòng)管理拆分,手動(dòng)運(yùn)行命令來(lái)進(jìn)行region拆分,這樣可以在不同的region上交錯(cuò)運(yùn)行,分散I/O負(fù)載。預(yù)拆分region,用戶(hù)可以在建表的時(shí)候就制定好預(yù)設(shè)定的region,這樣就可以避免后期region自動(dòng)拆分造成I/O負(fù)載。

9.2.3Hbase優(yōu)化和存儲(chǔ)客戶(hù)端入庫(kù)調(diào)優(yōu)1)用戶(hù)在編寫(xiě)程序入庫(kù)時(shí),HBase的自動(dòng)刷寫(xiě)是默認(rèn)開(kāi)啟的,即用戶(hù)每一次put都會(huì)提交到HBaseserver進(jìn)行一次刷寫(xiě),如果需要高速插入數(shù)據(jù),則會(huì)造成I/O負(fù)載過(guò)重。在這里可以關(guān)閉自動(dòng)刷寫(xiě)功能,setAutoFlush(false)。如此,put實(shí)例會(huì)先寫(xiě)到一個(gè)緩存中,這個(gè)緩存的大小通過(guò)hbase.client.write.buffer這個(gè)值來(lái)設(shè)定緩存區(qū),當(dāng)緩存區(qū)被填滿(mǎn)之后才會(huì)被送出。如果想要顯示刷寫(xiě)數(shù)據(jù),可以調(diào)用flushCommits()方法。引申:采取這個(gè)方

法要估算服務(wù)器端內(nèi)存占用則可以:hbase.client.write.buffer*hbase.regionserver.handler.count得出內(nèi)存情況。2)第二個(gè)方法,是關(guān)閉每次put上的WAL(writeToWAL(flase))這樣可以刷寫(xiě)數(shù)據(jù)前,不需要預(yù)寫(xiě)日志,但是如果數(shù)據(jù)重要的話建議不要關(guān)閉。

9.2.3Hbase優(yōu)化和存儲(chǔ)3)hbase.client.scanner.caching:默認(rèn)為1。這是設(shè)計(jì)客戶(hù)端讀取數(shù)據(jù)的配置調(diào)優(yōu),在hbase-site.xml中進(jìn)行配置,代表scanner一次緩存多少數(shù)據(jù)(從服務(wù)器一次抓取多少數(shù)據(jù)來(lái)scan)默認(rèn)的太小,但是對(duì)于大文件,值不應(yīng)太大。4)hbase.regionserver.lease.period默認(rèn)值:60000。說(shuō)明:客戶(hù)端租用HRegionserver期限,即超時(shí)閥值。調(diào)優(yōu):這個(gè)配合hbase.client.scanner.caching使用,如果內(nèi)存夠大,但是取出較多數(shù)據(jù)后計(jì)算過(guò)程較長(zhǎng),可能超過(guò)這個(gè)閾值,適當(dāng)可設(shè)置較長(zhǎng)的響應(yīng)時(shí)間以防被認(rèn)為宕機(jī)。還有諸多實(shí)踐,如設(shè)置過(guò)濾器,掃描緩存等,指定行掃描等多種客戶(hù)端調(diào)優(yōu)方案,需要在實(shí)踐中慢慢挖掘。

9.2.3Hbase優(yōu)化和存儲(chǔ)HBase配置文件hbase.hregion.memstore.mslab.enabled默認(rèn)值:true,這個(gè)是在hbase-site.xml中進(jìn)行配置的值??梢詼p少因內(nèi)存碎片導(dǎo)致的FullGC,提高整體性能。zookeeper.session.timeout(默認(rèn)3分鐘)ZK的超期參數(shù),默認(rèn)配置為3分鐘,在生產(chǎn)環(huán)境上建議減小這個(gè)值在1分鐘或更小。設(shè)置原則:這個(gè)值越小,當(dāng)RS故障時(shí)Hmaster獲知越快,Hlog分裂和region部署越快,集群恢復(fù)時(shí)間越短。但是,設(shè)置這個(gè)值得原則是留足夠的時(shí)間進(jìn)行GC回收,否則會(huì)導(dǎo)致頻繁的RS宕機(jī)。一般就做默認(rèn)即可。

9.2.3Hbase優(yōu)化和存儲(chǔ)hbase.regionserver.handler.count(默認(rèn)10)。對(duì)于大負(fù)載的put(達(dá)到了M范圍)或是大范圍的Scan操作,handler數(shù)目不易過(guò)大,易造成OOM。對(duì)于小負(fù)載的put或是get,delete等操作,handler數(shù)要適當(dāng)調(diào)大。根據(jù)上面的原則,要看我們的業(yè)務(wù)的情況來(lái)設(shè)置。(具體情況具體分析)。選擇使用壓縮算法,目前HBase默認(rèn)支持的壓縮算法包括GZ,LZO以及snappy(hbase-site.xml中配置)。hbase.hregion.max.filesize默認(rèn)256M。上面說(shuō)過(guò)了,hbase自動(dòng)拆分region的閾值,可以設(shè)大或者無(wú)限大,無(wú)限大需要手動(dòng)拆分region,懶的人別這樣。

9.2.3Hbase優(yōu)化和存儲(chǔ)hbase.hregion.memstore.flush.size。單個(gè)region內(nèi)所有的memstore大小總和超過(guò)指定值時(shí),flush該region的所有memstore。hbase.hstore.blockingStoreFiles默認(rèn)值:7。說(shuō)明:在flush時(shí),當(dāng)一個(gè)region中的Store(CoulmnFamily)內(nèi)有超過(guò)7個(gè)storefile時(shí),則block所有的寫(xiě)請(qǐng)求進(jìn)行compaction,以減少storefile數(shù)量。調(diào)優(yōu):block寫(xiě)請(qǐng)求會(huì)嚴(yán)重影響當(dāng)前regionServer的響應(yīng)時(shí)間,但過(guò)多的storefile也會(huì)影響讀性能。從實(shí)際應(yīng)用來(lái)看,為了獲取較平滑的響應(yīng)時(shí)間,可將值設(shè)為無(wú)限大。如果能容忍響應(yīng)時(shí)間出現(xiàn)較大的波峰波谷,那么默認(rèn)或根據(jù)自身場(chǎng)景調(diào)整即可。

9.2.3Hbase優(yōu)化和存儲(chǔ)hbase.hregion.memstore.block.multiplier默認(rèn)值:2。說(shuō)明:當(dāng)一個(gè)region里總的memstore占用內(nèi)存大小超過(guò)hbase.hregion.memstore.flush.size兩倍的大小時(shí),block該region的所有請(qǐng)求,進(jìn)行flush,釋放內(nèi)存。雖然我們?cè)O(shè)置了region所占用的memstores總內(nèi)存大小,比如64M,但想象一下,在最后63.9M的時(shí)候,我Put了一個(gè)200M的數(shù)據(jù),此時(shí)memstore的大小會(huì)瞬間暴漲到超過(guò)預(yù)期的hbase.hregion.memstore.flush.size的幾倍。這個(gè)參數(shù)的作用是當(dāng)memstore的大小增至超過(guò)hbase.hregion.memstore.flush.size2倍時(shí),block所有請(qǐng)求,遏制風(fēng)險(xiǎn)進(jìn)一步擴(kuò)大。調(diào)優(yōu):這個(gè)參數(shù)的默認(rèn)值還是比較靠譜的。如果你預(yù)估你的正常應(yīng)用場(chǎng)景(不包括異常)不會(huì)出現(xiàn)突發(fā)寫(xiě)或?qū)懙牧靠煽兀敲幢3帜J(rèn)值即可。如果正常情況下,你的寫(xiě)請(qǐng)求量就會(huì)經(jīng)常暴長(zhǎng)到正常的幾倍,那么你應(yīng)該調(diào)大這個(gè)倍數(shù)并調(diào)整其他參數(shù)值,比如hfile.block.cache.size和hbase.regionserver.global.memstore.upperLimit/lowerLimit,以預(yù)留更多內(nèi)存,防止HBaseserverOOM。

9.2.3Hbase優(yōu)化和存儲(chǔ)hfile.block.cache.size:默認(rèn)20%。這是涉及hbase讀取文件的主要配置,BlockCache主要提供給讀使用。讀請(qǐng)求先到memstore中查數(shù)據(jù),查不到就到blockcache中查,再查不到就會(huì)到磁盤(pán)上讀,并把讀的結(jié)果放入blockcache。由于blockcache是一個(gè)LRU,因此blockcache達(dá)到上限(heapsize*hfile.block.cache.size)后,會(huì)啟動(dòng)淘汰機(jī)制,淘汰掉最老的一批數(shù)據(jù)。對(duì)于注重讀響應(yīng)時(shí)間的系統(tǒng),應(yīng)該將blockcache設(shè)大些,比如設(shè)置blockcache=0.4,memstore=0.39,這會(huì)加大緩存命中率。

9.2.3Hbase優(yōu)化和存儲(chǔ)HDFS優(yōu)化部分HBase是基于hdfs文件系統(tǒng)的一個(gè)數(shù)據(jù)庫(kù),其數(shù)據(jù)最終是寫(xiě)到hdfs中的,因此涉及hdfs調(diào)優(yōu)的部分也是必不可少的。erval:默認(rèn)3秒??梢哉{(diào)高,避免hdfs頻繁備份,從而提高吞吐率。dfs.datanode.handler.count:默認(rèn)為10??梢哉{(diào)高這個(gè)處理線程數(shù),使得寫(xiě)數(shù)據(jù)更快。node.handler.count:默認(rèn)為8。dfs.socket.timeout:最好也要調(diào)高,默認(rèn)的很小。可以調(diào)高,提高整體速度與性能。

9.2.3Hbase優(yōu)化和存儲(chǔ)Hbase物理存儲(chǔ)對(duì)于Hbase的物理模型我們分別從Table的分割、Region的拆分、Region的分布。Region的構(gòu)成四個(gè)部分。Table的分割Table中的所有行都按照rowkey的字典序排列,Table在行的方向上分割為多個(gè)Region,一個(gè)Region在同一時(shí)刻只能被一個(gè)RegionServer管理,RegionServer可以管理多個(gè)Region(一對(duì)多)。Table的分割如圖9-5所示。

9.2.3Hbase優(yōu)化和存儲(chǔ)2)Region的拆分拆分Region是為了并行處理,提高效率,Region是按大小分割的,新創(chuàng)建的表只有一個(gè)region(數(shù)據(jù)為空),隨著數(shù)據(jù)增多,region不斷增大,當(dāng)增大到一個(gè)閥值時(shí),region就會(huì)拆分為兩個(gè)新的region,之后region也會(huì)越來(lái)越多。Region的拆分如圖9-6所示。

9.2.3Hbase優(yōu)化和存儲(chǔ)3)Region的分布Region是Hbase中分布式存儲(chǔ)和負(fù)載均衡的最小單元,不同的Region分不到不同的RegionServer上,下圖Table1、Table2中均有多個(gè)Region,這些Region分布在不同的RegionServer中。Region的分布如圖9-7所示。

9.2.3Hbase優(yōu)化和存儲(chǔ)4)Region的構(gòu)成Region雖然是分布式分布式存儲(chǔ)的最小單元,但并不是存儲(chǔ)的最小單元,Store是存儲(chǔ)的最小單元。Region由一個(gè)或者多個(gè)Store組成,每個(gè)Store會(huì)保存一個(gè)ColumnFamily;每個(gè)Store又由一個(gè)MemStore或0至多個(gè)StoreFile組成;MemStore存儲(chǔ)在內(nèi)存中,StoreFile存儲(chǔ)在HDFS中,下圖為Region的構(gòu)成,當(dāng)我們向HBase插入數(shù)據(jù)時(shí),會(huì)先存放到memStore(內(nèi)存)中,然后再?gòu)膬?nèi)存中存放到磁盤(pán)文件StoreFile中,磁盤(pán)文件滿(mǎn)了之后再存放到HDFS中。Hbase的物理模型圖如圖9-8所示。

9.2.3Hbase優(yōu)化和存儲(chǔ)

9.2.3Hbase優(yōu)化和存儲(chǔ)4)Region的構(gòu)成Region雖然是分布式分布式存儲(chǔ)的最小單元,但并不是存儲(chǔ)的最小單元,Store是存儲(chǔ)的最小單元。Region由一個(gè)或者多個(gè)Store組成,每個(gè)Store會(huì)保存一個(gè)ColumnFamily;每個(gè)Store又由一個(gè)MemStore或0至多個(gè)StoreFile組成;MemStore存儲(chǔ)在內(nèi)存中,StoreFile存儲(chǔ)在HDFS中,下圖為Region的構(gòu)成,當(dāng)我們向HBase插入數(shù)據(jù)時(shí),會(huì)先存放到memStore(內(nèi)存)中,然后再?gòu)膬?nèi)存中存放到磁盤(pán)文件StoreFile中,磁盤(pán)文件滿(mǎn)了之后再存放到HDFS中。Hbase的物理模型圖如圖9-8所示。

9.3Hive基礎(chǔ)與應(yīng)用Hive是建立在Hadoop上的數(shù)據(jù)倉(cāng)庫(kù)基礎(chǔ)構(gòu)架。它提供了一系列的工具,可以用來(lái)進(jìn)行數(shù)據(jù)提取轉(zhuǎn)化加載(ETL),這是一種可以存儲(chǔ)、查詢(xún)和分析存儲(chǔ)在Hadoop中的大規(guī)模數(shù)據(jù)的機(jī)制。Hive定義了簡(jiǎn)單的類(lèi)SQL查詢(xún)語(yǔ)言,稱(chēng)為QL,它允許熟悉SQL的用戶(hù)查詢(xún)數(shù)據(jù)。同時(shí),這個(gè)語(yǔ)言也允許熟悉MapReduce開(kāi)發(fā)者的開(kāi)發(fā)自定義的mapper和reducer來(lái)處理內(nèi)建的mapper和reducer無(wú)法完成的復(fù)雜的分析工作。9.3.1Hive安裝安裝并配置Hive內(nèi)嵌模式安裝Hive下載并解壓安裝包登錄/apache/hive/hive-2.2.0/下載apache-hive-2.2.0-bin.tar.gz,并將壓縮包拷貝到/home/hadoop目錄下。右鍵點(diǎn)擊壓縮包,點(diǎn)擊ExtractHere(提取到此處)。同時(shí)將文件夾名改為Hive。9.3.1Hive安裝配置Hive環(huán)境變量執(zhí)行下列代碼,并在文件中添加變量:sudovim/etc/profileexportHIVE_HOME=/home/hadoop/hiveexportPATH=$PATH:$HIVE_HOME/binexportCLASSPATH=$CLASSPATH:$HIVE_HOME/libsource/etc/profile#保存后,使

配置文件的修改生效9.3.1Hive安裝3)配置hive-site.xmlcd$HIVE_CONF_DIR#進(jìn)入目錄sudocphive-default.xml.templatehive-site.xml#/拷貝hive-default.xml.template并重命名為hive-site.xmlvimhive-site.xml#編輯hive-site.xml因?yàn)樵趆ive-site.xml中有如圖9-9,圖9-10這樣的配置:9.3.1Hive安裝所以要在Hadoop集群新建/user/hive/warehouse目錄,執(zhí)行下面命令:cd$HADOOP_HOME#進(jìn)入Hadoop主目錄mkdir-p/user/hive/warehouse#創(chuàng)建目錄sudochmod-R777/user/hive/warehouse#新建的目錄賦予讀寫(xiě)權(quán)限mkdir-p/tmp/hive/#新建/tmp/hive/目錄sudochmod-R777/tmp/hive#目錄賦予讀寫(xiě)權(quán)限//用以下命令檢查目錄是否創(chuàng)建成功ls/user/hivels/tmp/hive9.3.1Hive安裝修改hive-site.xml中的臨時(shí)目錄,將hive-site.xml文件中的${system:java.io.tmpdir}替換為hive的臨時(shí)目錄,例如我替換為/home/hadoop/hive/tmp/,該目錄如果不存在則要自己手工創(chuàng)建,并且賦予讀寫(xiě)權(quán)限。cd/home/hadoop/hivemkdirtmpsudochmod-R777tmp/下面是hive-site.xml文件中所有需要修改的配置:<property><name>javax.jdo.option.ConnectionURL</name><value>jdbc:derby:;databaseName=metastore_db;useSSL=true;create=true</value><description>JDBCconnectstringforaJDBCmetastore.TouseSSLtoencrypt/authenticatetheconnection,providedatabase-specificSSLflagintheconnectionURL.Forexample,jdbc:postgresql://myhost/db?ssl=trueforpostgresdatabase.</description>9.3.1Hive安裝</property><property><name>hive.exec.local.scratchdir</name><value>/home/hadoop/hive/tmp</value><description>LocalscratchspaceforHivejobs</description></property><property><name>hive.downloaded.resources.dir</name><value>/home/hadoop/hive/${hive.session.id}_resources</value><description>Temporarylocaldirectoryforaddedresourcesintheremotefilesystem.</description></property><property><name>hive.querylog.location</name><value>/home/hadoop/hive/tmp</value><description>LocationofHiveruntimestructuredlogfile</description></property><property><name>hive.server2.logging.operation.log.location</name><value>/home/hadoop/hive/tmp/operation_logs</value><description>Topleveldirectorywhereoperationlogsarestoredifloggingfunctionalityisenabled</description></property>9.3.1Hive安裝4)復(fù)制一份hive-env.sh.template模板重命名為hive-env.shcphive-env.sh.templatehive-env.sh//打開(kāi)文件修改如下配置HADOOP_HOME=usr/local/hadoopexportHIVE_CONF_DIR=/home/hadoop/hive/confexportHIVE_AUX_JARS_PATH=/home/hadoop/hive/lib初始化schema庫(kù)schematool-initSchema-dbTypederby9.3.1Hive安裝在當(dāng)前目錄下運(yùn)行Hive,如果結(jié)果如圖9-11所示,則Hive配置成功9.3.2Hive數(shù)據(jù)模型和查詢(xún)語(yǔ)言hive是基于Hadoop的一個(gè)數(shù)據(jù)倉(cāng)庫(kù)工具,可以將結(jié)構(gòu)化的數(shù)據(jù)文件映射為一張數(shù)據(jù)庫(kù)表,并提供簡(jiǎn)單的sql查詢(xún)功能,可以將sql語(yǔ)句轉(zhuǎn)換為MapReduce任務(wù)進(jìn)行運(yùn)行。其優(yōu)點(diǎn)是學(xué)習(xí)成本低,可以通過(guò)類(lèi)SQL語(yǔ)句快速實(shí)現(xiàn)簡(jiǎn)單的MapReduce統(tǒng)計(jì),不必開(kāi)發(fā)專(zhuān)門(mén)的MapReduce應(yīng)用,十分適合數(shù)據(jù)倉(cāng)庫(kù)的統(tǒng)計(jì)分析。9.3.2Hive數(shù)據(jù)模型和查詢(xún)語(yǔ)言Hive數(shù)據(jù)模型Hive數(shù)據(jù)模型如圖9-12所示:9.3.2Hive數(shù)據(jù)模型和查詢(xún)語(yǔ)言Hive中包含以下數(shù)據(jù)模型:Table內(nèi)部表,ExternalTable外部表,Partition分區(qū),Bucket桶。Hive默認(rèn)可以直接加載文本文件,還支持sequencefile、RCFile。Hive的數(shù)據(jù)模型介紹如下:1)Hive數(shù)據(jù)庫(kù)類(lèi)似傳統(tǒng)數(shù)據(jù)庫(kù)的DataBase,在第三方數(shù)據(jù)庫(kù)里實(shí)際是一張表。它的作用是將用戶(hù)和數(shù)據(jù)庫(kù)的應(yīng)用隔離到不同的數(shù)據(jù)庫(kù)或模式中,該模型在hive0.6.0之后的版本支持,hive提供了createdatabasedbname、usedbname以及dropdatabasedbname這樣的語(yǔ)句。2)內(nèi)部表Hive的內(nèi)部表與數(shù)據(jù)庫(kù)中的Table在概念上是類(lèi)似。每一個(gè)Table在Hive中都有一個(gè)相應(yīng)的目錄存儲(chǔ)數(shù)據(jù)。例如一個(gè)表pvs,它在HDFS中的路徑為/wh/pvs,其中wh是在hive-site.xml中由${hive.metastore.warehouse.dir}指定的數(shù)據(jù)倉(cāng)庫(kù)的目錄,所有的Table數(shù)據(jù)(不包括ExternalTable)都保存在這個(gè)目錄中。刪除表時(shí),元數(shù)據(jù)與數(shù)據(jù)都會(huì)被刪除。9.3.2Hive數(shù)據(jù)模型和查詢(xún)語(yǔ)言?xún)?nèi)部表簡(jiǎn)單示例:創(chuàng)建數(shù)據(jù)文件:test_inner_table.txt創(chuàng)建表:createtabletest_inner_table(keystring)加載數(shù)據(jù):LOADDATALOCALINPATH‘filepath’INTOTABLEtest_inner_table查看數(shù)據(jù):select*fromtest_inner_table;selectcount(*)fromtest_inner_table刪除表:droptabletest_inner_table9.3.2Hive數(shù)據(jù)模型和查詢(xún)語(yǔ)言外部表

外部表指向已經(jīng)在HDFS中存在的數(shù)據(jù),可以創(chuàng)建Partition。它和內(nèi)部表在元數(shù)據(jù)的組織上是相同的,而實(shí)際數(shù)據(jù)的存儲(chǔ)則有較大的差異。內(nèi)部表的創(chuàng)建過(guò)程和數(shù)據(jù)加載過(guò)程這兩個(gè)過(guò)程可以分別獨(dú)立完成,也可以在同一個(gè)語(yǔ)句中完成,在加載數(shù)據(jù)的過(guò)程中,實(shí)際數(shù)據(jù)會(huì)被移動(dòng)到數(shù)據(jù)倉(cāng)庫(kù)目錄中;之后對(duì)數(shù)據(jù)對(duì)訪問(wèn)將會(huì)直接在數(shù)據(jù)倉(cāng)庫(kù)目錄中完成。刪除表時(shí),表中的數(shù)據(jù)和元數(shù)據(jù)將會(huì)被同時(shí)刪除。而外部表只有一個(gè)過(guò)程,加載數(shù)據(jù)和創(chuàng)建表同時(shí)完成(CREATEEXTERNALTABLE……LOCATION),實(shí)際數(shù)據(jù)是存儲(chǔ)在LOCATION后面指定的HDFS路徑中,并不會(huì)移動(dòng)到數(shù)據(jù)倉(cāng)庫(kù)目錄中。當(dāng)刪除一個(gè)ExternalTable時(shí),僅刪除該鏈接。9.3.2Hive數(shù)據(jù)模型和查詢(xún)語(yǔ)言

外部表簡(jiǎn)單示例:創(chuàng)建數(shù)據(jù)文件:test_external_table.txt創(chuàng)建表:createexternaltabletest_external_table(keystring)加載數(shù)據(jù):LOADDATAINPATH‘filepath’INTOTABLEtest_inner_table查看數(shù)據(jù):select*fromtest_external_table;?selectcount(*)fromtest_external_table刪除表:droptabletest_external_table9.3.2Hive數(shù)據(jù)模型和查詢(xún)語(yǔ)言分區(qū)Partition對(duì)應(yīng)于數(shù)據(jù)庫(kù)中的Partition列的密集索引,但是Hive中Partition的組織方式和數(shù)據(jù)庫(kù)中的很不相同。在hive存儲(chǔ)上就體現(xiàn)在表的主目錄(hive的表實(shí)際顯示就是一個(gè)文件夾)下的一個(gè)子目錄,這個(gè)文件夾的名字就是我們定義的分區(qū)列的名字,沒(méi)有實(shí)際操作經(jīng)驗(yàn)的人可能會(huì)認(rèn)為分區(qū)列是表的某個(gè)字段,其實(shí)不是這樣,分區(qū)列不是表里的某個(gè)字段,而是獨(dú)立的列,我們根據(jù)這個(gè)列存儲(chǔ)表的里的數(shù)據(jù)文件。使用分區(qū)是為了加快數(shù)據(jù)分區(qū)的查詢(xún)速度而設(shè)計(jì)的,我們?cè)诓樵?xún)某個(gè)具體分區(qū)列里的數(shù)據(jù)時(shí)候沒(méi)必要進(jìn)行全表掃描。在Hive中,表中的一個(gè)Partition對(duì)應(yīng)于表下的一個(gè)目錄,所有的Partition的數(shù)據(jù)都存儲(chǔ)在對(duì)應(yīng)的目錄中。例如pvs表中包含ds和city兩個(gè)Partition,則對(duì)應(yīng)于ds=20090801,ctry=US的HDFS子目錄為/wh/pvs/ds=20090801/ctry=US;對(duì)應(yīng)于ds=20090801,ctry=CA的HDFS子目錄為/wh/pvs/ds=20090801/ctry=CA。9.3.2Hive數(shù)據(jù)模型和查詢(xún)語(yǔ)言分區(qū)表簡(jiǎn)單示例:創(chuàng)建數(shù)據(jù)文件:test_partition_table.txt創(chuàng)建表:createtabletest_partition_table(keystring)partitionedby(dtstring)加載數(shù)據(jù):LOADDATAINPATH‘filepath’INTOTABLEtest_partition_tablepartition(dt=‘2006’)查看數(shù)據(jù):select*fromtest_partition_table;selectcount(*)fromtest_partition_table刪除表:droptabletest_partition_table9.3.2Hive數(shù)據(jù)模型和查詢(xún)語(yǔ)言桶Buckets是將表的列通過(guò)Hash算法進(jìn)一步分解成不同的文件存儲(chǔ)。它對(duì)指定列計(jì)算hash,根據(jù)hash值切分?jǐn)?shù)據(jù),目的是為了并行,每一個(gè)Bucket對(duì)應(yīng)一個(gè)文件。例如將user列分散至32個(gè)bucket,首先對(duì)user列的值計(jì)算hash,對(duì)應(yīng)hash值為0的HDFS目錄為/wh/pvs/ds=20090801/ctry=US/part-00000;hash值為20的HDFS目錄為/wh/pvs/ds=20090801/ctry=US/part-00020。如果想應(yīng)用很多的Map任務(wù)這樣是不錯(cuò)的選擇。9.3.2Hive數(shù)據(jù)模型和查詢(xún)語(yǔ)言Hive的視圖視圖與傳統(tǒng)數(shù)據(jù)庫(kù)的視圖類(lèi)似。視圖是只讀的,它基于的基本表,如果改變,數(shù)據(jù)增加不會(huì)影響視圖的呈現(xiàn);如果刪除,會(huì)出現(xiàn)問(wèn)題。?如果不指定視圖的列,會(huì)根據(jù)select語(yǔ)句后的生成。

示例:createviewtest_viewasselect*fromtest9.3.2Hive數(shù)據(jù)模型和查詢(xún)語(yǔ)言Hive查詢(xún)語(yǔ)言1.創(chuàng)建表--CreateTableiveCREATE[EXTERNAL]TABLE[IFNOTEXISTS]table_name[(col_namedata_type[COMMENTcol_comment],...)][COMMENTtable_comment][PARTITIONEDBY(col_namedata_type[COMMENTcol_comment],...)][CLUSTEREDBY(col_name,col_name,...)[SORTEDBY(col_name[ASC|DESC],...)]INTOnum_bucketsBUCKETS][ROWFORMATrow_format][STOREDASfile_format][LOCATIONhdfs_path]9.3.2Hive數(shù)據(jù)模型和查詢(xún)語(yǔ)言CREATETABLE創(chuàng)建一個(gè)指定名字的表。如果相同名字的表已經(jīng)存在則拋出異常用戶(hù)可以用IFNOTEXIST選項(xiàng)來(lái)忽略這個(gè)異常。EXTERNAL關(guān)鍵字可以讓用戶(hù)創(chuàng)建一個(gè)外部表,在建表的同時(shí)指定一個(gè)指向?qū)嶋H數(shù)據(jù)的路徑(LOCATION),Hive創(chuàng)建內(nèi)部表時(shí),會(huì)將數(shù)據(jù)移動(dòng)到數(shù)據(jù)倉(cāng)庫(kù)指向的路徑;若創(chuàng)建外部表,僅記錄數(shù)據(jù)所在的路徑,不對(duì)數(shù)據(jù)的位置做任何改變。在刪除表的時(shí)候,內(nèi)部表的元數(shù)據(jù)和數(shù)據(jù)會(huì)被一起刪除,而外部表只刪除元數(shù)據(jù),不刪除數(shù)據(jù)。9.3.2Hive數(shù)據(jù)模型和查詢(xún)語(yǔ)言LIKE允許用戶(hù)復(fù)制現(xiàn)有的表結(jié)構(gòu),但是不復(fù)制數(shù)據(jù)。用戶(hù)在建表的時(shí)候可以自定義SerDe或者使用自帶的SerDe。如果沒(méi)有指定ROWFORMAT或者ROWFORMATDELIMITED,將會(huì)使用自帶的SerDe。在建表的時(shí)候,用戶(hù)還需要為表指定列,用戶(hù)在指定表的列的同時(shí)也會(huì)指定自定義的SerDe,Hive通過(guò)SerDe確定表的具體的列的數(shù)據(jù)。如果文件數(shù)據(jù)是純文本,可以使用STOREDASTEXTFILE。如果數(shù)據(jù)需要壓縮,使用STOREDASSEQUENCE。有分區(qū)的表可以在創(chuàng)建的時(shí)候使用PARTITIONEDBY語(yǔ)句。一個(gè)表可以擁有一個(gè)或者多個(gè)分區(qū),每一個(gè)分區(qū)單獨(dú)存在一個(gè)目錄下。而且,表和分區(qū)都可以對(duì)某個(gè)列進(jìn)行CLUSTEREDBY操作,將若干個(gè)列放入一個(gè)桶(bucket)中。也可以利用SORTBY對(duì)數(shù)據(jù)進(jìn)行排序。這樣可以為特定應(yīng)用提高性能。9.3.2Hive數(shù)據(jù)模型和查詢(xún)語(yǔ)言LIKE允許用戶(hù)復(fù)制現(xiàn)有的表結(jié)構(gòu),但是不復(fù)制數(shù)據(jù)。用戶(hù)在建表的時(shí)候可以自定義SerDe或者使用自帶的SerDe。如果沒(méi)有指定ROWFORMAT或者ROWFORMATDELIMITED,將會(huì)使用自帶的SerDe。在建表的時(shí)候,用戶(hù)還需要為表指定列,用戶(hù)在指定表的列的同時(shí)也會(huì)指定自定義的SerDe,Hive通過(guò)SerDe確定表的具體的列的數(shù)據(jù)。如果文件數(shù)據(jù)是純文本,可以使用STOREDASTEXTFILE。如果數(shù)據(jù)需要壓縮,使用STOREDASSEQUENCE。有分區(qū)的表可以在創(chuàng)建的時(shí)候使用PARTITIONEDBY語(yǔ)句。一個(gè)表可以擁有一個(gè)或者多個(gè)分區(qū),每一個(gè)分區(qū)單獨(dú)存在一個(gè)目錄下。而且,表和分區(qū)都可以對(duì)某個(gè)列進(jìn)行CLUSTEREDBY操作,將若干個(gè)列放入一個(gè)桶(bucket)中。也可以利用SORTBY對(duì)數(shù)據(jù)進(jìn)行排序。這樣可以為特定應(yīng)用提高性能。表名和列名不區(qū)分大小寫(xiě),SerDe和屬性名區(qū)分大小寫(xiě),表和列的注釋是字符串。9.3.2Hive數(shù)據(jù)模型和查詢(xún)語(yǔ)言刪除表--DropTable刪除一個(gè)內(nèi)部表的同時(shí)會(huì)刪除表的元數(shù)據(jù)和數(shù)據(jù)。刪除一個(gè)外部表,只刪除元數(shù)據(jù)而保留數(shù)據(jù)。修改表結(jié)構(gòu)--AlterTableAltertable語(yǔ)句允許用戶(hù)改變現(xiàn)有表的結(jié)構(gòu)。用戶(hù)可以增加列/分區(qū),改變serde,增加表和serde熟悉,表本身重命名。1)AddPARTITIONALTERTABLEtable_nameADDpartition_spec[LOCATION'location1']partition_spec[LOCATION'location2']...其中,partition_spec為:PARTITION(partition_col=partition_col_value,partition_col=partiton_col_value,...)9.3.2Hive數(shù)據(jù)模型和查詢(xún)語(yǔ)言可以用ALTERTABLEADDPARTITION來(lái)向一個(gè)表中增加分區(qū)。當(dāng)分區(qū)名是字符串時(shí)加引號(hào)。ALTERTABLEpage_viewADDPARTITION(dt='2008-08-08',country='us')location'/path/to/us/part080808'PARTITION(dt='2008-08-09',country='us')location'/path/to/us/part080809';2)DROPPARTITIONALTERTABLEtable_nameDROPPARTITION(partition_col=partition_col_value,partition_col=partiton_col_value,...)可以用ALTERTABLEDROPPARTITION來(lái)刪除分區(qū)。分區(qū)的元數(shù)據(jù)和數(shù)據(jù)將被一并刪除(是否區(qū)分內(nèi)外部表?)。ALTERTABLEpage_viewDROPPARTITION(dt='2008-08-08',country='us')9.3.2Hive數(shù)據(jù)模型和查詢(xún)語(yǔ)言3)RENAMETABLELTERTABLEtable_nameRENAMETOnew_table_name使用此命令可以修改表名,但是數(shù)據(jù)所在的位置和分區(qū)名并不改變。換而言之,老的表名并未“釋放”,對(duì)老表的更改會(huì)改變新表的數(shù)據(jù)。9.3.2Hive數(shù)據(jù)模型和查詢(xún)語(yǔ)言4)ChangeColumnName/Type/Position/CommentALTERTABLEtable_nameCHANGE[COLUMN]col_old_namecol_new_namecolumn_type[COMMENTcol_comment][FIRST|AFTERcolumn_name]這個(gè)命令可以允許用戶(hù)修改一個(gè)列的名稱(chēng)、數(shù)據(jù)類(lèi)型、注釋或者位置。比如:CREATETABLEtest_change(aint,bint,cint);ALTERTABLEtest_changeCHANGEaa1INT;將a列的名字改為a1;ALTERTABLEtest_changeCHANGEaa1STRINGAFTERb;將a列的名字改為a1,a列的數(shù)據(jù)類(lèi)型改為string,并將它放置在列b之后。新的表結(jié)構(gòu)為:bint,a1string,cint;ALTERTABLEtest_changeCHANGEbb1INTFIRST;會(huì)將b列的名字修改為b1,并將它放在第一列。新表的結(jié)構(gòu)為:b1int,astring,cint;注意:對(duì)列的改變只會(huì)修改Hive的元數(shù)據(jù),而不會(huì)改變實(shí)際數(shù)據(jù)。用戶(hù)應(yīng)該確定保證元數(shù)據(jù)定義和實(shí)際數(shù)據(jù)結(jié)構(gòu)的一致性。9.3.2Hive數(shù)據(jù)模型和查詢(xún)語(yǔ)言5)Add/ReplaceColumnsALTERTABLEtable_nameADD|REPLACECOLUMNS(col_namedata_type[COMMENTcol_comment],...)ADDCOLUMNS允許用戶(hù)在當(dāng)前列的末尾增加新的列,但是在分區(qū)列之前。REPLACECOLUMNS刪除以后的列,加入新的列。只有在使用native的SerDe(DynamicSerDeorMetadataTypeColumnsetSerDe)的時(shí)候才可以這么做。9.3.2Hive數(shù)據(jù)模型和查詢(xún)語(yǔ)言6)AlterTablePropertiesALTERTABLEtable_nameSETTBLPROPERTIES(property_name=property_value,property_name=property_value,...)可以用這個(gè)命令向表中增加metadata。目前l(fā)ast_modified_user,last_modified_time屬性都是由Hive自動(dòng)管理的,用戶(hù)可以向列表中增加自己的屬性??梢允褂肈ESCRIBEEXTENDEDTABLE來(lái)獲得這些信息。9.3.2Hive數(shù)據(jù)模型和查詢(xún)語(yǔ)言7)AddSerdePropertieALTERTABLEtable_nameSETSERDEserde_class_name[WITHSERDEPROPERTIESserde_properties]LTERTABLEtable_nameSETSERDEPROPERTIESserde_propertiesserde_properties::(property_name=property_value,property_name=property_value,...)這個(gè)命令允許用戶(hù)向SerDe對(duì)象增加用戶(hù)定義的元數(shù)據(jù)。Hive為了序列化和反序列化數(shù)據(jù),將會(huì)初始化SerDe屬性,并將屬性傳給表的SerDe。如此,用戶(hù)可以為自定義的SerDe存儲(chǔ)屬性。AlterTableFileFormatandOrganizationALTERTABLEtable_nameSETFILEFORMATfile_formatALTERTABLEtable_nameCLUSTEREDBY(col_name,col_name,...)[SORTEDBY(col_name,...)]INTOnum_bucketsBUCKETS這個(gè)命令修改了表的物理存儲(chǔ)屬性。9.3.2Hive數(shù)據(jù)模型和查詢(xún)語(yǔ)言Loadingfilesintotable當(dāng)數(shù)據(jù)被加載至表中時(shí),不會(huì)對(duì)數(shù)據(jù)進(jìn)行任何轉(zhuǎn)換。Load操作只是將數(shù)據(jù)復(fù)制/移動(dòng)至Hive表對(duì)應(yīng)的位置。LOADDATA[LOCAL]INPATH'filepath'[OVERWRITE]INTOTABLEtablename[PARTITION(partcol1=val1,partcol2=val2...)]Load操作只是單純的復(fù)制/移動(dòng)操作,將數(shù)據(jù)文件移動(dòng)到Hive表對(duì)應(yīng)的位置。9.3.2Hive數(shù)據(jù)模型和查詢(xún)語(yǔ)言filepath可以是:相對(duì)路徑,例如:project/data1絕對(duì)路徑,例如:/user/hive/project/data1包含模式的完整URI,例如:hdfs://namenode:9000/user/hive/project/data1加載的目標(biāo)可以是一個(gè)表或者分區(qū)。如果表包含分區(qū),必須指定每一個(gè)分區(qū)的分區(qū)名。如果指定了LOCAL,那么:load命令會(huì)去查找本地文件系統(tǒng)中的filepath。如果發(fā)現(xiàn)是相對(duì)路徑,則路徑會(huì)被解釋為相對(duì)于當(dāng)前用戶(hù)的當(dāng)前路徑。用戶(hù)也可以為本地文件指定一個(gè)完整的URI,比如:file:///user/hive/project/data1。9.3.2Hive數(shù)據(jù)模型和查詢(xún)語(yǔ)言load命令會(huì)將filepath中的文件復(fù)制到目標(biāo)文件系統(tǒng)中。目標(biāo)文件系統(tǒng)由表的位置屬性決定。被復(fù)制的數(shù)據(jù)文件移動(dòng)到表的數(shù)據(jù)對(duì)應(yīng)的位置。如果沒(méi)有指定LOCAL關(guān)鍵字,如果filepath指向的是一個(gè)完整的URI,hive會(huì)直接使用這個(gè)URI。否則:如果沒(méi)有指定schema或者authority,Hive會(huì)使用在hadoop配置文件中定義schema和authority,指定了Namenode的URI。如果路徑不是絕對(duì)的,Hive相對(duì)于/user/進(jìn)行解釋。Hive會(huì)將filepath中指定的文件內(nèi)容移動(dòng)到table(或者partition)所指定的路徑中。9.3.2Hive數(shù)據(jù)模型和

溫馨提示

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

最新文檔

評(píng)論

0/150

提交評(píng)論