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

下載本文檔

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

文檔簡介

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

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

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

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

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

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

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

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

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

9.2.3Hbase優(yōu)化和存儲HBase配置文件hbase.hregion.memstore.mslab.enabled默認(rèn)值:true,這個是在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)境上建議減小這個值在1分鐘或更小。設(shè)置原則:這個值越小,當(dāng)RS故障時Hmaster獲知越快,Hlog分裂和region部署越快,集群恢復(fù)時間越短。但是,設(shè)置這個值得原則是留足夠的時間進(jìn)行GC回收,否則會導(dǎo)致頻繁的RS宕機(jī)。一般就做默認(rèn)即可。

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

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

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

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

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

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

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

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

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

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

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

9.3Hive基礎(chǔ)與應(yīng)用Hive是建立在Hadoop上的數(shù)據(jù)倉庫基礎(chǔ)構(gòu)架。它提供了一系列的工具,可以用來進(jìn)行數(shù)據(jù)提取轉(zhuǎn)化加載(ETL),這是一種可以存儲、查詢和分析存儲在Hadoop中的大規(guī)模數(shù)據(jù)的機(jī)制。Hive定義了簡單的類SQL查詢語言,稱為QL,它允許熟悉SQL的用戶查詢數(shù)據(jù)。同時,這個語言也允許熟悉MapReduce開發(fā)者的開發(fā)自定義的mapper和reducer來處理內(nèi)建的mapper和reducer無法完成的復(fù)雜的分析工作。9.3.1Hive安裝安裝并配置Hive內(nèi)嵌模式安裝Hive下載并解壓安裝包登錄/apache/hive/hive-2.2.0/下載apache-hive-2.2.0-bin.tar.gz,并將壓縮包拷貝到/home/hadoop目錄下。右鍵點擊壓縮包,點擊ExtractHere(提取到此處)。同時將文件夾名改為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因為在hive-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#新建的目錄賦予讀寫權(quán)限mkdir-p/tmp/hive/#新建/tmp/hive/目錄sudochmod-R777/tmp/hive#目錄賦予讀寫權(quán)限//用以下命令檢查目錄是否創(chuàng)建成功ls/user/hivels/tmp/hive9.3.1Hive安裝修改hive-site.xml中的臨時目錄,將hive-site.xml文件中的${system:java.io.tmpdir}替換為hive的臨時目錄,例如我替換為/home/hadoop/hive/tmp/,該目錄如果不存在則要自己手工創(chuàng)建,并且賦予讀寫權(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//打開文件修改如下配置HADOOP_HOME=usr/local/hadoopexportHIVE_CONF_DIR=/home/hadoop/hive/confexportHIVE_AUX_JARS_PATH=/home/hadoop/hive/lib初始化schema庫schematool-initSchema-dbTypederby9.3.1Hive安裝在當(dāng)前目錄下運行Hive,如果結(jié)果如圖9-11所示,則Hive配置成功9.3.2Hive數(shù)據(jù)模型和查詢語言hive是基于Hadoop的一個數(shù)據(jù)倉庫工具,可以將結(jié)構(gòu)化的數(shù)據(jù)文件映射為一張數(shù)據(jù)庫表,并提供簡單的sql查詢功能,可以將sql語句轉(zhuǎn)換為MapReduce任務(wù)進(jìn)行運行。其優(yōu)點是學(xué)習(xí)成本低,可以通過類SQL語句快速實現(xiàn)簡單的MapReduce統(tǒng)計,不必開發(fā)專門的MapReduce應(yīng)用,十分適合數(shù)據(jù)倉庫的統(tǒng)計分析。9.3.2Hive數(shù)據(jù)模型和查詢語言Hive數(shù)據(jù)模型Hive數(shù)據(jù)模型如圖9-12所示:9.3.2Hive數(shù)據(jù)模型和查詢語言Hive中包含以下數(shù)據(jù)模型:Table內(nèi)部表,ExternalTable外部表,Partition分區(qū),Bucket桶。Hive默認(rèn)可以直接加載文本文件,還支持sequencefile、RCFile。Hive的數(shù)據(jù)模型介紹如下:1)Hive數(shù)據(jù)庫類似傳統(tǒng)數(shù)據(jù)庫的DataBase,在第三方數(shù)據(jù)庫里實際是一張表。它的作用是將用戶和數(shù)據(jù)庫的應(yīng)用隔離到不同的數(shù)據(jù)庫或模式中,該模型在hive0.6.0之后的版本支持,hive提供了createdatabasedbname、usedbname以及dropdatabasedbname這樣的語句。2)內(nèi)部表Hive的內(nèi)部表與數(shù)據(jù)庫中的Table在概念上是類似。每一個Table在Hive中都有一個相應(yīng)的目錄存儲數(shù)據(jù)。例如一個表pvs,它在HDFS中的路徑為/wh/pvs,其中wh是在hive-site.xml中由${hive.metastore.warehouse.dir}指定的數(shù)據(jù)倉庫的目錄,所有的Table數(shù)據(jù)(不包括ExternalTable)都保存在這個目錄中。刪除表時,元數(shù)據(jù)與數(shù)據(jù)都會被刪除。9.3.2Hive數(shù)據(jù)模型和查詢語言內(nèi)部表簡單示例:創(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ù)模型和查詢語言外部表

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

外部表簡單示例:創(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ù)模型和查詢語言分區(qū)Partition對應(yīng)于數(shù)據(jù)庫中的Partition列的密集索引,但是Hive中Partition的組織方式和數(shù)據(jù)庫中的很不相同。在hive存儲上就體現(xiàn)在表的主目錄(hive的表實際顯示就是一個文件夾)下的一個子目錄,這個文件夾的名字就是我們定義的分區(qū)列的名字,沒有實際操作經(jīng)驗的人可能會認(rèn)為分區(qū)列是表的某個字段,其實不是這樣,分區(qū)列不是表里的某個字段,而是獨立的列,我們根據(jù)這個列存儲表的里的數(shù)據(jù)文件。使用分區(qū)是為了加快數(shù)據(jù)分區(qū)的查詢速度而設(shè)計的,我們在查詢某個具體分區(qū)列里的數(shù)據(jù)時候沒必要進(jìn)行全表掃描。在Hive中,表中的一個Partition對應(yīng)于表下的一個目錄,所有的Partition的數(shù)據(jù)都存儲在對應(yīng)的目錄中。例如pvs表中包含ds和city兩個Partition,則對應(yīng)于ds=20090801,ctry=US的HDFS子目錄為/wh/pvs/ds=20090801/ctry=US;對應(yīng)于ds=20090801,ctry=CA的HDFS子目錄為/wh/pvs/ds=20090801/ctry=CA。9.3.2Hive數(shù)據(jù)模型和查詢語言分區(qū)表簡單示例:創(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ù)模型和查詢語言桶Buckets是將表的列通過Hash算法進(jìn)一步分解成不同的文件存儲。它對指定列計算hash,根據(jù)hash值切分?jǐn)?shù)據(jù),目的是為了并行,每一個Bucket對應(yīng)一個文件。例如將user列分散至32個bucket,首先對user列的值計算hash,對應(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ù)這樣是不錯的選擇。9.3.2Hive數(shù)據(jù)模型和查詢語言Hive的視圖視圖與傳統(tǒng)數(shù)據(jù)庫的視圖類似。視圖是只讀的,它基于的基本表,如果改變,數(shù)據(jù)增加不會影響視圖的呈現(xiàn);如果刪除,會出現(xiàn)問題。?如果不指定視圖的列,會根據(jù)select語句后的生成。

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

溫馨提示

  • 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)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論