大數(shù)據(jù)技術(shù)及應(yīng)用-基于Python語言 課件 第6、7章 Hive基礎(chǔ)與應(yīng)用、分布式計算框架MapReduce_第1頁
大數(shù)據(jù)技術(shù)及應(yīng)用-基于Python語言 課件 第6、7章 Hive基礎(chǔ)與應(yīng)用、分布式計算框架MapReduce_第2頁
大數(shù)據(jù)技術(shù)及應(yīng)用-基于Python語言 課件 第6、7章 Hive基礎(chǔ)與應(yīng)用、分布式計算框架MapReduce_第3頁
大數(shù)據(jù)技術(shù)及應(yīng)用-基于Python語言 課件 第6、7章 Hive基礎(chǔ)與應(yīng)用、分布式計算框架MapReduce_第4頁
大數(shù)據(jù)技術(shù)及應(yīng)用-基于Python語言 課件 第6、7章 Hive基礎(chǔ)與應(yīng)用、分布式計算框架MapReduce_第5頁
已閱讀5頁,還剩218頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

第6章Hive基礎(chǔ)與應(yīng)用本章學(xué)習(xí)目標(biāo)了解數(shù)據(jù)庫與數(shù)據(jù)倉庫的區(qū)別,了解Hive在Hadoop平臺的位置和特征;掌握Hive存儲模型,掌握Hive數(shù)據(jù)表的組織方式;掌握Hive的常用命令,能夠結(jié)合數(shù)據(jù)模型理解和靈活使用DDL實(shí)現(xiàn)數(shù)據(jù)倉庫表構(gòu)建、分區(qū)設(shè)置和應(yīng)用等操作;能夠靈活使用DML語言,實(shí)現(xiàn)對Hive數(shù)據(jù)倉庫表數(shù)據(jù)的操縱;掌握Hive-QL命令實(shí)現(xiàn)對Hive數(shù)據(jù)倉庫表的構(gòu)建、分區(qū)應(yīng)用、數(shù)據(jù)操縱和數(shù)據(jù)查詢操作;01Hive簡介02Hive的存儲模型目錄Contents03Hive初探04Hive的數(shù)據(jù)定義—DDL05Hive的數(shù)據(jù)操縱—DML06Hive的數(shù)據(jù)檢索—Hive-QL07本章小結(jié)Hive簡介01Hive簡介ApacheHive是由Facebook開源,用于解決海量結(jié)構(gòu)日志的數(shù)據(jù)倉庫軟件。Hive使用類SQL(Hive-QL,HQL)語法進(jìn)行數(shù)據(jù)的讀取、寫入、檢索等操作,本質(zhì)是把HQL轉(zhuǎn)化為MapReduce程序。為什么要用HiveMapReduce的出現(xiàn),極大的簡化大數(shù)據(jù)編程的難度,使得普通程序員也能從事開發(fā)大數(shù)據(jù)編程。但數(shù)據(jù)分析人員通常使用SQL語言進(jìn)行大數(shù)據(jù)統(tǒng)計以及分析,而Mapreduce編程是有一定的門檻,如果每次都采用MapReduce開發(fā),則成本太高、效率太低。那么有沒有更簡單的辦法,可以直接通過SQL在大數(shù)據(jù)平臺下運(yùn)行進(jìn)行數(shù)據(jù)分析?有的,答案即是Hive。數(shù)據(jù)庫與數(shù)據(jù)倉庫對比角度數(shù)

據(jù)

庫數(shù)據(jù)倉庫目的目的在于記錄目的在于分析應(yīng)用處理方法在線事務(wù)處理(OLTP)在線分析處理(OLAP).應(yīng)用范圍數(shù)據(jù)庫用于支持業(yè)務(wù)過程的日?;A(chǔ)操作數(shù)據(jù)倉庫使你可以對業(yè)務(wù)進(jìn)行分析表與連接數(shù)據(jù)庫的表和聯(lián)接是復(fù)雜的,但是它們是規(guī)范化的。數(shù)據(jù)庫的表和聯(lián)接比較簡單,它們是非規(guī)范化的。面向面向應(yīng)用的數(shù)據(jù)收集面向主題的數(shù)據(jù)收集數(shù)據(jù)庫與數(shù)據(jù)倉庫對比角度數(shù)

據(jù)

庫數(shù)據(jù)倉庫存儲限制通常限制于單個的應(yīng)用范圍所存儲數(shù)據(jù)常被應(yīng)用于多個應(yīng)用中可用性數(shù)據(jù)是實(shí)時可用的數(shù)據(jù)只有在需要的時候再進(jìn)行更新,非實(shí)時性的模型用ER模型進(jìn)行數(shù)據(jù)庫的設(shè)計用數(shù)據(jù)建模技術(shù)進(jìn)行模型的構(gòu)建技能捕獲實(shí)時在線數(shù)據(jù)分析數(shù)據(jù)數(shù)據(jù)庫與數(shù)據(jù)倉庫對比角度數(shù)

據(jù)

庫數(shù)據(jù)倉庫數(shù)據(jù)類型數(shù)據(jù)庫中存儲的總是最新的數(shù)據(jù)記錄.當(dāng)前和歷史數(shù)據(jù)都存儲在數(shù)據(jù)倉庫,通常情況下都不是最新數(shù)據(jù)數(shù)據(jù)存儲利用扁平的關(guān)系方法進(jìn)行數(shù)據(jù)存儲利用空間規(guī)范化方法作為數(shù)據(jù)存儲結(jié)構(gòu),例如采用星型、雪花型存儲模式查詢類型簡單的事務(wù)查詢以分析數(shù)據(jù)為目的的復(fù)雜檢索數(shù)據(jù)匯總存儲數(shù)據(jù)的明細(xì)存儲數(shù)據(jù)匯總信息Hive體系結(jié)構(gòu)與接口Hive體系結(jié)構(gòu)與接口元數(shù)據(jù)存儲:Hive將元數(shù)據(jù)存儲在數(shù)據(jù)庫中(MySql或者Derby)Hive體系結(jié)構(gòu)Client:用戶接口組件主要包含CLI(命令行接口)、JDBC或ODBC、WEBGUI(以瀏覽器訪問Hive);ThriftServer:Thrift是FaceBook開發(fā)的一個軟件框架,它用來進(jìn)行可擴(kuò)展且跨語言的服務(wù)的開發(fā),通過該服務(wù)使不同編程語言調(diào)用Hive的接口;Hive簡介Driver(執(zhí)行引擎):包括Complier、Optimizer和Executor,它們的作用是將Hive-QL語句進(jìn)行語法分析、語法解析、語法優(yōu)化,生成執(zhí)行計劃,然后提交給HadoopMapReduce計算框架處理;Metastore服務(wù):元數(shù)據(jù)服務(wù)組件,提供HDFS中存儲的數(shù)據(jù)與對應(yīng)表結(jié)構(gòu)的關(guān)系。Hive體系結(jié)構(gòu)Hive本身主要存儲數(shù)據(jù)倉庫的元數(shù)據(jù),其數(shù)據(jù)可以分布存儲在Hadoop系統(tǒng)的各個節(jié)點(diǎn)中,這種模式大大減輕了中心服務(wù)器的壓力,從而也為大數(shù)據(jù)處理和數(shù)據(jù)倉庫數(shù)據(jù)的快速分析提供了保障。由其體系結(jié)構(gòu)可以看出,Hive提供了多種數(shù)據(jù)訪問方式,可以通過命令行方式直接訪問,也可以通過Thrift客戶端/服務(wù)器的模式進(jìn)行數(shù)據(jù)的存取和訪問。SQL——MapReduceHive特征Hive的數(shù)據(jù)存儲在HDFS上;Hive數(shù)據(jù)分析的底層實(shí)現(xiàn)是MapReduce;Hive的執(zhí)行程序運(yùn)行在Yarn上;Hive的存儲模型02Hive存儲模型Hive存儲模型數(shù)據(jù)庫(Database)表(Table)分區(qū)(Partition)桶(Bucket)數(shù)據(jù)庫(database)數(shù)據(jù)庫起到命名空間的作用,主要用于避免表、視圖、分區(qū)、列等基本元素的命名沖突。同時,數(shù)據(jù)庫在概念上對基本元素進(jìn)行隔離,所以還可為用戶或用戶組實(shí)施安全性定義提供支持。表(Table)表是具有相同模式的同構(gòu)數(shù)據(jù)單位,但是表的具體數(shù)據(jù)存儲可以有不同的方式。Hive表的概念與關(guān)系型數(shù)據(jù)庫中表的概念具有相似之處。分區(qū)(partitions)每個表可以有一個或多個分區(qū)鍵,可用于確定數(shù)據(jù)的存儲方式。分區(qū)除了作為存儲單元外,還允許用戶有效地識別滿足指定條件的行。例如,STRING類型的date_partition和STRING類型的country_partition,其分區(qū)鍵的每個唯一值定義了表的一個分區(qū)例如,日期為“2009-12-23”中的所有國家為“US”的數(shù)據(jù)都是page_views表的一個分區(qū)。因此,如果只對日期為“2009-12-23”的國家為“US”的數(shù)據(jù)進(jìn)行分析,則只需在表的相關(guān)分區(qū)上運(yùn)行該查詢,從而大大加快了分析速度。分區(qū)(partitions)需要注意的是,一個分區(qū)被命名為“2009-12-23”并不意味著該分區(qū)包含所有或僅包含該日期的數(shù)據(jù),分區(qū)以日期命名是為了方便進(jìn)行數(shù)據(jù)的組織和識別,但是Hive并不確保數(shù)據(jù)的分區(qū)組織。分區(qū)列是虛擬列,它們不是數(shù)據(jù)本身的一部分,而是在加載時派生的。這也就要求數(shù)據(jù)倉庫系統(tǒng)設(shè)計和分區(qū)數(shù)據(jù)導(dǎo)入前能夠?qū)?shù)據(jù)進(jìn)行一定的檢查,從而確保數(shù)據(jù)能夠在邏輯上滿足分區(qū)的設(shè)置。桶或集群(bucket或clusters)每個分區(qū)中的數(shù)據(jù)可以根據(jù)表中某一列的哈希函數(shù)值依次分配到桶。例如,page_views表可以由userid來分隔,userid是page_view表的一列,而不是partitions列。桶的應(yīng)用會大大加快數(shù)據(jù)的檢索速度。Hive初探03Hive初探Hive安裝完成后,首先把$HIVE_HOME設(shè)置到當(dāng)前的Hive安裝目錄,并把$HIVE_HOME/bin加入$PATH中。設(shè)置完成后在命令行直接運(yùn)行“hive”命令啟動Hive。接下來我們開始構(gòu)造第一個Hive數(shù)據(jù)庫。Hive初探首先,我們通過ssh連接到Hive服務(wù)器上,之后運(yùn)行hive,便會進(jìn)入Hive的命令行交互程序,其運(yùn)行過程如下。若在本機(jī)上,則無須使用ssh連接Hive初探步驟1:構(gòu)造Database/SchemaHive初探用CLI和Web方式查看所創(chuàng)建的數(shù)據(jù)庫文件夾,其中“db_city_aq.db”雖然包含了“.db”作為后綴,但其實(shí)際上是一個文件夾。當(dāng)前并未往數(shù)據(jù)庫中添加任何數(shù)據(jù)表,所以文件夾為空。Hive初探采用Web方式查看數(shù)據(jù)庫文件夾Hive初探步驟2:創(chuàng)建數(shù)據(jù)表首先利用USE命令把“db_city_aq”設(shè)置為當(dāng)前的數(shù)據(jù)庫,以保證我們所創(chuàng)建的數(shù)據(jù)表包含在該數(shù)據(jù)庫中。之后,利用“CREATETABLE”創(chuàng)建一個數(shù)據(jù)表數(shù)據(jù)表創(chuàng)建完成后,利用SHOW命令查看數(shù)據(jù)庫中的數(shù)據(jù)表Hive初探Hive初探步驟3:數(shù)據(jù)文件的加載,并確認(rèn)Hive初探步驟4:數(shù)據(jù)的插入操作Hive初探步驟5:數(shù)據(jù)的查詢,分組求平均值Hive初探本節(jié)內(nèi)容完整的展示了一個Hive數(shù)據(jù)庫創(chuàng)建、數(shù)據(jù)表創(chuàng)建并導(dǎo)入數(shù)據(jù)、以及數(shù)據(jù)查看的整個流程,希望這個簡單的Hive應(yīng)用過程能夠讓讀者對Hive形成直觀認(rèn)識,使其不再是抽象的概念。接下來的章節(jié)中將對Hive的數(shù)據(jù)定義語言、數(shù)據(jù)操縱語言和數(shù)據(jù)查詢語言逐一展開介紹。Hive的數(shù)據(jù)定義—DDL04Hive的數(shù)據(jù)定義--DDLHive的數(shù)據(jù)定義主要通過其數(shù)據(jù)定義語言(DDL:DataDefinitionLanguage)完成。DDL中的主要操作包括CREATE、DROP、SHOW、TRUNCATE、DESCRIBE、ALTER等,其操作對象可以是DATABASE,SCHEME,TABLE,VIEW等。數(shù)據(jù)庫的相關(guān)操作1.創(chuàng)建數(shù)據(jù)庫創(chuàng)建Database的操作命令是CREATE,其語法定義如下:CREATE(DATABASE|SCHEMA)[IFNOTEXISTS]database_name[COMMENTdatabase_comment][LOCATIONhdfs_path][MANAGEDLOCATIONhdfs_path][WITHDBPROPERTIES(property_name=property_value,...)]數(shù)據(jù)庫的相關(guān)操作【例6.1】通過指定外部表存儲位置的方法建立城市空氣質(zhì)量數(shù)據(jù)庫“db_city_aq”,同時為該數(shù)據(jù)庫增加說明文字。數(shù)據(jù)庫的相關(guān)操作通過show查看Hive中的數(shù)據(jù)庫,從查詢結(jié)果中可以看到剛剛創(chuàng)建的數(shù)據(jù)庫db_city_aq數(shù)據(jù)庫的相關(guān)操作再通過HDFS文件系統(tǒng)上查看數(shù)據(jù)庫對應(yīng)的文件生成情況,利用ls查看hdfs上的文件夾發(fā)現(xiàn)數(shù)據(jù)庫db_city_aq對應(yīng)的目錄數(shù)據(jù)庫的相關(guān)操作2.刪除數(shù)據(jù)庫刪除數(shù)據(jù)庫的命令是DROP,其語法定義如下:DROP(DATABASE|SCHEMA)[IFEXISTS]database_name[RESTRICT|CASCADE];[RESTRICT|CASCADE]選項沒有明確指定時,缺省值是RESTRICE,表示數(shù)據(jù)庫不為空時不能刪除數(shù)據(jù)庫;若指定為CASCADE,則會級聯(lián)刪除數(shù)據(jù)庫中的所有數(shù)據(jù)表,因此應(yīng)慎重使用。數(shù)據(jù)庫的相關(guān)操作【例6.2】刪除空數(shù)據(jù)庫db_city_aq,再利用show命令查看現(xiàn)有數(shù)據(jù)庫,刪除成功。數(shù)據(jù)庫的相關(guān)操作3.使用數(shù)據(jù)庫使用數(shù)據(jù)庫USE命令的含義是指在交互操作過程中,使用該指令設(shè)置指定數(shù)據(jù)庫為當(dāng)前數(shù)據(jù)庫。其語法定義如下:USEdatabase_name;USEDEFAULT;DEFAULT是缺省情況下特指某個數(shù)據(jù)庫,可以用DEFAULT代替具體的DATABASE名稱,以方便使用。數(shù)據(jù)表的創(chuàng)建Hive的數(shù)據(jù)組織采用文件夾、文件的方式進(jìn)行,其數(shù)據(jù)文件存儲格式可以具體指定,例如文件存儲格式可以是:SEQUENCEFILE|TEXTFILE|RCFILE|ORC|PARQUET|AVRO|JSONFILE|INPUTFORMATinput_format_clsnameOUTPUTFORMAToutput_format_clsname。其中TEXTFILE為缺省文件格式,具體缺省值由hive.default.fileformat指定;JSONFILE文件格式需要Hive4.0.0及以上版本才能支持。數(shù)據(jù)表的創(chuàng)建內(nèi)部表與外部表(ManagedandExternalTables):缺省情況下,Hive創(chuàng)建的表都是內(nèi)部表(也稱管理表),即文件、元數(shù)據(jù)和相關(guān)統(tǒng)計信息由Hive進(jìn)行管理和處理,內(nèi)部表刪除后,相關(guān)數(shù)據(jù)文件也將被刪除;外部表是指所創(chuàng)建的數(shù)據(jù)表存放在非Hive的缺省存儲位置,Hive維護(hù)指向該外部數(shù)據(jù)文件的鏈接,外部表常被多個應(yīng)用共享,從而避免數(shù)據(jù)表被誤刪除。刪除內(nèi)部表會直接刪除元數(shù)據(jù)及存儲數(shù)據(jù),刪除外部表則僅僅刪除元數(shù)據(jù),HDFS上的文件并不會被刪除;對內(nèi)部表的修改會將修改直接同步給元數(shù)據(jù),而對外部表的表結(jié)構(gòu)和分區(qū)進(jìn)行修改,則需要修復(fù)(MSCKREPAIRTABLEtable_name)。Hive基本數(shù)據(jù)類型數(shù)據(jù)表的創(chuàng)建1.創(chuàng)建數(shù)據(jù)表的核心語法定義數(shù)據(jù)表的創(chuàng)建【例6.4】如下創(chuàng)建一個內(nèi)部表,并在創(chuàng)建完成后查看其對應(yīng)的文件夾。數(shù)據(jù)表的創(chuàng)建2.創(chuàng)建帶分區(qū)的數(shù)據(jù)表【例6.5】假設(shè)數(shù)據(jù)包含五列(cdate4query,chour,aq_type,city,value)為了創(chuàng)建基于cdate的分區(qū)表,在數(shù)據(jù)表中以"cdate4query"作為列名,確保cdate屬性可以同時用于分區(qū)和查詢。若在數(shù)據(jù)表中沒有以"cdate4query"作為列名設(shè)置對日期進(jìn)行存儲,那么對該數(shù)據(jù)表進(jìn)行查詢時,將不會返回對應(yīng)日期值。若有查詢包含條件"WHEREdate='...'",Hive將會利用分區(qū)加快查詢效率,同時列"cdate4query"將會返回date的原有值。數(shù)據(jù)表的創(chuàng)建分區(qū)的插入數(shù)據(jù)insertoverwritetablecity_aq_with_partitionpartition(cdate='2021-01-01')values('20210303',0,'AQI','fuzhou',40);數(shù)據(jù)表的創(chuàng)建3.利用Select查詢創(chuàng)建數(shù)據(jù)表Hive數(shù)據(jù)表也可以通過查詢創(chuàng)建(create-table-as-select:CTAS)操作進(jìn)行創(chuàng)建。由CTAS創(chuàng)建數(shù)據(jù)表的過程是一個執(zhí)行事務(wù)的過程,無論該表有多大,數(shù)據(jù)表只有在生成所有查詢結(jié)果并創(chuàng)建表完成后才對其他用戶可見,這一執(zhí)行過程對其他用戶而言是透明的。數(shù)據(jù)表的創(chuàng)建【例6.6】利用Hive初探中的city_aq數(shù)據(jù)表為藍(lán)本,所導(dǎo)入數(shù)據(jù)為全部城市空氣質(zhì)量數(shù)據(jù),使用CTAS創(chuàng)建一個chour=10的數(shù)據(jù)表city_aq_hour10數(shù)據(jù)表的創(chuàng)建4.利用Like創(chuàng)建數(shù)據(jù)表CREATETABLE中的LIKE選項讓用戶可以用源數(shù)據(jù)表結(jié)構(gòu)為模板創(chuàng)建一個具有相同表結(jié)構(gòu)的新表,而不復(fù)制源數(shù)據(jù)表的數(shù)據(jù)?!纠?.7】使用Like方式復(fù)制了city_aq數(shù)據(jù)表結(jié)構(gòu),新建的tbl_create_like表結(jié)構(gòu)與之相同,但不復(fù)制源表中的數(shù)據(jù)。應(yīng)用Like方式創(chuàng)建新數(shù)據(jù)表,并利用DESC查看新建數(shù)據(jù)表的結(jié)構(gòu)數(shù)據(jù)表的創(chuàng)建數(shù)據(jù)表的創(chuàng)建5.創(chuàng)建臨時表(TemporaryTables)若一個表是作為臨時表創(chuàng)建的,那么該表只在當(dāng)前會話期間可見,其數(shù)據(jù)被存儲于用戶的臨時文件夾中,并在會話結(jié)束后刪除。若臨時表的表名與數(shù)據(jù)庫已有的永久表的表名相同,那么在這一會話期間,用戶無法訪問已有的永久表,所有對同名表的訪問都會被導(dǎo)向臨時表。當(dāng)臨時表被刪除后,才能恢復(fù)對永久表的訪問指向。與永久表相比,臨時表有其自身特征:(1)不支持分區(qū);(2)不支持索引。臨時表的存儲位置可以通過hive.exec.temporary.table.storage配置參數(shù)設(shè)置。數(shù)據(jù)表的創(chuàng)建【例6.8】如下應(yīng)用中創(chuàng)建臨時數(shù)據(jù)表數(shù)據(jù)表的創(chuàng)建6.表的約束Hive包括未驗證的主鍵和外鍵約束的支持。當(dāng)存在約束時,一些SQL工具將會生成更加高效的查詢。同時,由于這些約束未經(jīng)驗證,因此相關(guān)系統(tǒng)需要確保數(shù)據(jù)被載入Hive前的完整性。對Hive進(jìn)行數(shù)據(jù)檢索時,Hive的約束將會被用于提高Hive數(shù)據(jù)的查詢優(yōu)化,從而提高數(shù)據(jù)檢索的效率。列約束定義包含主鍵約束、唯一值約束、非空約束等,相關(guān)約束及其定義如下:column_constraint_specification:[PRIMARYKEY|UNIQUE|NOTNULL|DEFAULT[default_value]|CHECK[check_expression]ENABLE|DISABLENOVALIDATERELY/NORELY]數(shù)據(jù)表的創(chuàng)建【例6.9】創(chuàng)建表tbl_pk,其中包含(id1,id2)共同組成該表的primarykey。數(shù)據(jù)表的創(chuàng)建【例6.10】創(chuàng)建表tbl_fk,其中包含外鍵約束關(guān)聯(lián)到tbl_pk表數(shù)據(jù)表和分區(qū)的修改通過ALTER命令可以修改現(xiàn)有數(shù)據(jù)表的結(jié)構(gòu),具體包括增加數(shù)據(jù)列、增加分區(qū)、修改SerDe、增加數(shù)據(jù)表屬性、修改表名等等。類似的,利用ALTER可以修改數(shù)據(jù)表的分區(qū)屬性。數(shù)據(jù)表和分區(qū)的修改1.?dāng)?shù)據(jù)表的修改用法1修改數(shù)據(jù)表名通過ALTERTABLE操作命令,可以修改數(shù)據(jù)表的名稱。數(shù)據(jù)表更名操作不但會修改數(shù)據(jù)表在Hive中的元數(shù)據(jù)信息,也將更改該數(shù)據(jù)表在HDFS中的存儲位置。ALTERTABLEtable_nameRENAMETOnew_table_name;數(shù)據(jù)表和分區(qū)的修改用法2修改數(shù)據(jù)表的屬性通過ALTERTABLE操作命令可以修改數(shù)據(jù)表的屬性,其中數(shù)據(jù)表的定義為(property_name=property_value,...),因此可以一次性更改多個數(shù)據(jù)表的屬性值。當(dāng)然,也可以為數(shù)據(jù)表增加新的屬性。所有數(shù)據(jù)表的擴(kuò)展屬性都可以通過“DESCRIBEEXTENDEDTABLE”查看。ALTERTABLEtable_nameSETTBLPROPERTIES(‘db_pro1’=’pro1_value’);數(shù)據(jù)表和分區(qū)的修改用法3修改數(shù)據(jù)表說明通過ALTERTABLE操作命令,可以修改/設(shè)置數(shù)據(jù)表的說明信息。ALTERTABLEtable_nameSETTBLPROPERTIES('comment'=new_comment);數(shù)據(jù)表和分區(qū)的修改2.修改數(shù)據(jù)表約束用法1修改數(shù)據(jù)表的主鍵約束(PRIMARYKEY)ALTERTABLEtable_nameADDCONSTRAINTconstraint_namePRIMARYKEY(column,...)DISABLENOVALIDATE;數(shù)據(jù)表和分區(qū)的修改【例6.16】如下操作先創(chuàng)建一個數(shù)據(jù)表,之后利用ALTERTABLE增加主鍵約束數(shù)據(jù)表和分區(qū)的修改用法2修改數(shù)據(jù)表的外鍵約束(FOREIGNKEY)ALTERTABLEtable_nameADDCONSTRAINTconstraint_nameFOREIGNKEY(column,...)REFERENCEStable_name(column,...)DISABLENOVALIDATERELY;用法3修改數(shù)據(jù)表的唯一性設(shè)置(UNIQUE)ALTERTABLEtable_nameADDCONSTRAINTconstraint_nameUNIQUE(column,...)DISABLENOVALIDATE;用法4修改數(shù)據(jù)表的非空值約束(NOTNULL)ALTERTABLEtable_nameCHANGECOLUMNcolumn_namecolumn_namedata_typeCONSTRAINTconstraint_nameNOTNULLENABLE;數(shù)據(jù)表和分區(qū)的修改用法5修改數(shù)據(jù)表的缺省值約束(DEFAULT)ALTERTABLEtable_nameCHANGECOLUMNcolumn_namecolumn_namedata_typeCONSTRAINTconstraint_nameDEFAULTdefault_valueENABLE;用法6修改數(shù)據(jù)表的檢查約束(CHECK)ALTERTABLEtable_nameCHANGECOLUMNcolumn_namecolumn_namedata_typeCONSTRAINTconstraint_nameCHECKcheck_expressionENABLE;用法7刪除數(shù)據(jù)表的約束(DROPCONSTRAINT)ALTERTABLEtable_nameDROPCONSTRAINTconstraint_name;數(shù)據(jù)表和分區(qū)的修改3.修改分區(qū)設(shè)置通過ALTERTABLE的PARTITION子句可以對數(shù)據(jù)表的分區(qū)進(jìn)行修改、增加、改名、移動、刪除、存檔等操作。要使元存儲感知添加到HDFS的分區(qū),可以使用元存儲檢查命令(MSCK)進(jìn)行數(shù)據(jù)刷新。數(shù)據(jù)表和分區(qū)的修改用法1:添加新分區(qū)使用下述ALTERTABLEADDPARTITION指令可以增加數(shù)據(jù)表的分區(qū)。其中的分區(qū)值是字符串類型時,需要用單引號包括,分區(qū)存儲位置必須是數(shù)據(jù)文件所在文件夾。ADDPARTITION會修改數(shù)據(jù)表的元數(shù)據(jù),但是不會實(shí)現(xiàn)已有數(shù)據(jù)的重新分區(qū),如果在指定分區(qū)位置不存在對應(yīng)數(shù)據(jù),那么查詢將不會返回任何結(jié)果。ALTERTABLEtable_nameADD[IFNOTEXISTS]PARTITIONpartition_spec[LOCATION'location'][,PARTITIONpartition_spec[LOCATION'location'],...];partition_spec:(partition_column=partition_col_value,...)數(shù)據(jù)表和分區(qū)的修改【例6.23】如下實(shí)例首先創(chuàng)建一個page_view數(shù)據(jù)表,該數(shù)據(jù)表設(shè)置了基于日期dt和國家country的分區(qū)。之后使用ALTERTABLEADDPARTITION指令在數(shù)據(jù)表中手動添加多個分區(qū),并設(shè)置其對應(yīng)的文件夾。下列只列出一種用法,其余可參考教材。數(shù)據(jù)表和分區(qū)的修改數(shù)據(jù)表和分區(qū)的修改4.修改數(shù)據(jù)表/分區(qū)本小節(jié)上述內(nèi)容介紹了適用于修改數(shù)據(jù)表和修改數(shù)據(jù)分區(qū)的操作命令,這里介紹的操作指令既適用于數(shù)據(jù)表的修改,也適用于分區(qū)的修改。數(shù)據(jù)表和分區(qū)的修改用法1修改表/分區(qū)文件格式該命令用于修改數(shù)據(jù)表/分區(qū)的文件存儲格式,其可用的file_format選項可以參考CREATETABLE中的文件類型。該命令的修改僅僅作用于數(shù)據(jù)表的元數(shù)據(jù)中,對文件的實(shí)際數(shù)據(jù)格式修改需要在Hive外進(jìn)行數(shù)據(jù)轉(zhuǎn)換。具體命令如下:ALTERTABLEtable_name[PARTITIONpartition_spec]SETFILEFORMATfile_format;用法2修改表/分區(qū)存儲位置ALTERTABLEtable_name[PARTITIONpartition_spec]SETLOCATION"newlocation";數(shù)據(jù)表和分區(qū)的修改用法3修改表/分區(qū)的保護(hù)機(jī)制對數(shù)據(jù)的保護(hù)可以設(shè)置于表級別,也可以設(shè)置于分區(qū)級別。NO_DROP選項將會確保數(shù)據(jù)表不被刪除,OFFLINE選項則使得數(shù)據(jù)表/分區(qū)中的數(shù)據(jù)被檢索,而他們的元數(shù)據(jù)仍可被存取訪問。若某個分區(qū)被設(shè)置為NO_DROP,那么該分區(qū)所在的表也將是不可刪除的;相反,若數(shù)據(jù)表是NO_DROP的,其包含的分區(qū)是可刪除的;若數(shù)據(jù)表設(shè)置為NO_DROPCASCADE,那么其分區(qū)不能被刪除;若要強(qiáng)制刪除分區(qū),則可以使用IGNOREPROTECTION選項。修改數(shù)據(jù)表/分區(qū)的保護(hù)機(jī)制的操作命令如下。ALTERTABLEtable_name[PARTITIONpartition_spec]ENABLE|DISABLENO_DROP[CASCADE];ALTERTABLEtable_name[PARTITIONpartition_spec]ENABLE|DISABLEOFFLINE;數(shù)據(jù)表和分區(qū)的修改5.修改數(shù)據(jù)列注意:Hive中的列名是大小寫敏感的用法1修改列名/類型/存儲位置/說明如下命令允許用戶修改列名、列數(shù)據(jù)類型、說明文字、存儲位置,或者上述屬性的組合情況。CASCADE關(guān)鍵字使得數(shù)據(jù)表元數(shù)據(jù)中的列屬性同時傳遞變化到所有分區(qū)元數(shù)據(jù)中。RESTRICT為缺省值,限制列的改變只作用于表的元數(shù)據(jù)。ALTERTABLEtable_name[PARTITIONpartition_spec]CHANGE[COLUMN]col_old_namecol_new_namecolumn_type[COMMENTcol_comment][FIRST|AFTERcolumn_name][CASCADE|RESTRICT];數(shù)據(jù)表和分區(qū)的修改【例6.26】如下實(shí)例首先創(chuàng)建一個簡單的數(shù)據(jù)表,之后對其數(shù)據(jù)表的屬性進(jìn)行修改,并調(diào)整位置數(shù)據(jù)表和分區(qū)的修改用法2:添加/替換數(shù)據(jù)列需要添加/替換數(shù)據(jù)列時,可以使用如下操作命令:ALTERTABLEtable_name[PARTITIONpartition_spec]ADD|REPLACECOLUMNS(col_namedata_type[COMMENTcol_comment],...)[CASCADE|RESTRICT]數(shù)據(jù)表的其他操作1.表的刪除DROPTABLE用于刪除數(shù)據(jù)表以及相關(guān)元數(shù)據(jù),其中數(shù)據(jù)表會被移除到垃圾箱中(系統(tǒng)設(shè)定垃圾箱的前提下),而元數(shù)據(jù)則直接從Hive中刪除。若在刪除數(shù)據(jù)表時指定了PURGE參數(shù),則會把數(shù)據(jù)文件直接清除,不可恢復(fù)。刪除數(shù)據(jù)表的語法如下:DROPTABLE[IFEXISTS]table_name[PURGE];數(shù)據(jù)表的其他操作2.表的截斷與刪除表不同,截斷表用于刪除表或者分區(qū)中的全部數(shù)據(jù),若設(shè)定了垃圾箱,則數(shù)據(jù)會被移除到垃圾箱中,否則直接刪除。被截斷的數(shù)據(jù)表要求為內(nèi)部表,用戶也可以通過partition_spec來截斷特定的分區(qū),移除指定的分區(qū)。缺省情況下,TRUNCATE將會刪除所有數(shù)據(jù),其定義如下:TRUNCATE[TABLE]table_name[PARTITIONpartition_spec];partition_spec::(partition_column=partition_col_value,partition_column=partition_col_value,...)數(shù)據(jù)表的其他操作3.SHOW命令SHOW提供了一種查看Hive中數(shù)據(jù)的元存儲信息及元數(shù)據(jù)的方法。SHOW命令的詳細(xì)用法請查閱教材數(shù)據(jù)表的其他操作4.Describe命令DESCRIBE命令也是用于顯示數(shù)據(jù)庫、表等基本元素的相關(guān)信息。但是與SHOW不同,DESCRIBE更加側(cè)重從更高的層次上查看總體數(shù)據(jù)情況。DESCRIBE命令的詳細(xì)用法請查閱教材。Hive的數(shù)據(jù)操縱—DML05Hive的數(shù)據(jù)操縱--DMLHive的數(shù)據(jù)操縱主要通過其數(shù)據(jù)操作語言(DML:DataManipulationLanguage)完成,DML中包含有LOAD、INSERT、UPDATE、DELETE、IMPORT/EXPORT、…等。下面將對其中一些常用命令進(jìn)行介紹。Hive的數(shù)據(jù)操縱--DML1.加載數(shù)據(jù)文件到表(Load)Hive將數(shù)據(jù)文件加載到表時不進(jìn)行任何轉(zhuǎn)換,其加載操作是一種復(fù)制/移動操作,即將數(shù)據(jù)文件移動到與Hive表對應(yīng)的位置。其語法格式如下:LOADDATA[LOCAL]INPATH'filepath'[OVERWRITE]INTOTABLEtablename[PARTITION(partcol1=val1,partcol2=val2...)][INPUTFORMAT'inputformat'SERDE'serde']Hive的數(shù)據(jù)操縱--DML2.把檢索結(jié)果存入表(Insert)除了可以直接把文件加載到表中,Hive還提供把檢索結(jié)果插入表的操作(Insert),該操作的語法如下:語法格式1:INSERTOVERWRITETABLEtablename1[PARTITION(partcol1=val1,partcol2=val2...)[IFNOTEXISTS]]select_statement1FROMfrom_statement;Hive的數(shù)據(jù)操縱--DML2.把檢索結(jié)果存入表(Insert)Hive擴(kuò)展2(多表插入語句):FROMfrom_statementINSERTINTOTABLEtablename1[PARTITION(partcol1=val1,partcol2=val2...)]select_statement1[INSERTINTOTABLEtablename2[PARTITION...]select_statement2][INSERTOVERWRITETABLEtablename2[PARTITION...[IFNOTEXISTS]]select_statement2]...;Hive的數(shù)據(jù)操縱--DML3.把檢索結(jié)果導(dǎo)出到文件(Insert)Hive的檢索結(jié)果可以導(dǎo)出到文件系統(tǒng)中保存成文件,其具體命令與Insert到數(shù)據(jù)表的命令應(yīng)用類似,其語法定義如下:標(biāo)準(zhǔn)語法:INSERTOVERWRITE[LOCAL]DIRECTORYdirectory1[ROWFORMATrow_format][STOREDASfile_format]SELECT...FROM...Hive的數(shù)據(jù)操縱--DML3.把檢索結(jié)果導(dǎo)出到文件(Insert)Hive的檢索結(jié)果可以導(dǎo)出到文件系統(tǒng)中保存成文件,其具體命令與Insert到數(shù)據(jù)表的命令應(yīng)用類似,其語法定義如下:Hive擴(kuò)展語法:FROMfrom_statementINSERTOVERWRITE[LOCAL]DIRECTORYdirectory1select_statement1[INSERTOVERWRITE[LOCAL]DIRECTORYdirectory2select_statement2]...Hive的數(shù)據(jù)操縱--DML4.利用SQL的INSERTINTO把數(shù)據(jù)插入表除了支持將數(shù)據(jù)文件以及Hive檢索結(jié)果數(shù)據(jù)插入表外,Hive還支持SQL的INSERTINTO實(shí)現(xiàn)Hive數(shù)據(jù)插入。其語法定義如下:INSERTINTOTABLEtablename[PARTITION(partcol1[=val1],partcol2[=val2]...)]VALUESvalues_row[,values_row...]values_row=(value[,value...])Hive的數(shù)據(jù)操縱--DML5.?dāng)?shù)據(jù)更新操作(Update)Hive表的數(shù)據(jù)更新操作僅可用于支持ACID的表。其語法定義如下:UPDATEtablenameSETcolumn=value[,column=value...][WHEREexpression]Hive的數(shù)據(jù)操縱--DML6.?dāng)?shù)據(jù)刪除操作(Delete)與Update操作一樣,Delete只能應(yīng)用于支持ACID的表中。其語法格式為:DELETEFROMtablename[WHEREexpression]Hive的數(shù)據(jù)操縱--DML7.?dāng)?shù)據(jù)合并操作(Merge)合并(MERGE)操作是指利用與源數(shù)據(jù)表的連接結(jié)果更新目標(biāo)數(shù)據(jù)表的操作,該操作也僅可用于支持ACID的表上,其語法格式如下:MERGEINTO<targettable>ASTUSING<sourceexpression/table>ASSON<booleanexpression1>WHENMATCHED[AND<booleanexpression2>]THENUPDATESET<setclauselist>WHENMATCHED[AND<booleanexpression3>]THENDELETEWHENNOTMATCHED[AND<booleanexpression4>]THENINSERTVALUES<valuelist>Hive的數(shù)據(jù)檢索—Hive-QL06Hive的數(shù)據(jù)檢索—Hive-QL在完成本小結(jié)內(nèi)容前,我們新增兩個數(shù)據(jù)表到數(shù)據(jù)庫中,分別對應(yīng)空氣質(zhì)量檢測站點(diǎn)信息,以及站點(diǎn)采集數(shù)據(jù)的原始數(shù)據(jù),其建表和數(shù)據(jù)導(dǎo)入過程請參考教科書。上述過程完成后,將會建立連個數(shù)據(jù)表(tbl_sites,tbl_site_data),并且導(dǎo)入一定數(shù)量的數(shù)據(jù)。Hive的數(shù)據(jù)檢索—Hive-QLHiveQL提供數(shù)據(jù)檢索的功能。其具體語法如下,H-QL中還提供了部分特有的檢索功能,我們將結(jié)合該操作命令的語法進(jìn)行介紹。SELECT[ALL|DISTINCT]select_expr,select_expr,...FROMtable_reference[WHEREwhere_condition][GROUPBYcol_list][ORDERBYcol_list][CLUSTERBYcol_list|[DISTRIBUTEBYcol_list][SORTBYcol_list]][LIMIT[offset,]rows]Hive的數(shù)據(jù)檢索—Hive-QL(1)SELECTFROM關(guān)于SELECT檢索,其中的FROMtable_reference表示查詢操作的輸入表,這些輸入除了一般的數(shù)據(jù)表外,還可以是一個視圖、一個join構(gòu)造,或者一個子查詢。需要注意的是,Hive查詢語句中的表名和列名是大小寫相關(guān)的。Hive的數(shù)據(jù)檢索—Hive-QL如下檢索只返回PM2.5的相關(guān)測量數(shù)值,并指定了返回列。Hive的數(shù)據(jù)檢索—Hive-QL(2)WHEREWHERE表示查詢條件,其后連接的是一個布爾表達(dá)式,例如如下查詢將會返回數(shù)據(jù)表tbl_sites中所有經(jīng)度大于130的檢測站點(diǎn)。Hive的數(shù)據(jù)檢索—Hive-QL在Hive中,WHERE子句中還支持子查詢的應(yīng)用。WHERE中的子查詢需要結(jié)合IN/NOTIN,EXISTS/NOTEXISTS使用,IN/NOTIN需要選擇一個單個的數(shù)據(jù)列,用來查看數(shù)據(jù)是否在所選擇列的數(shù)據(jù)集中;而EXTSTS/NOTEXISTS則無須選擇單個數(shù)據(jù)列,其判斷依據(jù)是子查詢返回結(jié)果是否為空。下面是一個簡單的帶子查詢的檢索,該檢索選擇所有站點(diǎn)經(jīng)度大于100度區(qū)域的站點(diǎn)監(jiān)測數(shù)據(jù),并輸出站點(diǎn)監(jiān)測數(shù)據(jù)、站點(diǎn)編號等信息。Hive的數(shù)據(jù)檢索—Hive-QLHive的數(shù)據(jù)檢索—Hive-QL(3)ALL和DISTINCTALL和DISTINCT用于說明返回值中重復(fù)行的數(shù)據(jù)處理方式。ALL為缺省情況,其表示返回所有數(shù)據(jù)行;而DISTINCT則需要進(jìn)一步過濾,消除重復(fù)行數(shù)據(jù)。(4)基于分區(qū)的檢索一般情況下,SELECT查詢會掃描整個數(shù)據(jù)表。若一個Hive的數(shù)據(jù)表包含分區(qū),那么SELECT檢索有可能無須檢索整個數(shù)據(jù)表,而只檢索數(shù)據(jù)表的部分分區(qū)便可完成查詢操作。Hive支持分區(qū)探測,也就是說會利用分區(qū)謂詞與WHERE子句,或者與JOIN中的ON子句進(jìn)行綜合判斷,從而避免沒有必要的分區(qū)數(shù)據(jù)檢索。Hive的數(shù)據(jù)檢索—Hive-QL(5)GROUPBY與HAVING子句GROUPBY子句用于設(shè)定檢索數(shù)據(jù)分組依據(jù),該子句通常用于查詢聚合數(shù)據(jù)結(jié)果,例如查詢數(shù)據(jù)的平均值、求和、或者求分組元素個數(shù)等。GROUPBY子句語法定義如下,其分組表達(dá)式用于設(shè)定具體的分組依據(jù),通常情況下是數(shù)據(jù)列名,或者列名的表達(dá)式。groupByClause:GROUPBYgroupByExpression(,groupByExpression)*Hive的數(shù)據(jù)檢索—Hive-QL(6)ORDERBY與LIMIT子句ORDERBY子句用于指定返回結(jié)果排序依據(jù),其語法定義如下:orderBy:ORDERBYcolName(ASC|DESC)?(NULLSFIRST|NULLSLAST)?(colName(ASC|DESC)?(NULLSFIRST|NULLSLAST)?)*Hive的數(shù)據(jù)檢索—Hive-QL上述只列出了Hive-QL部分最主要結(jié)構(gòu)及部分檢索應(yīng)用實(shí)例,更加詳細(xì)的操作實(shí)例可以參考教材。本章小結(jié)07本章小結(jié)Hive是基于Hadoop的一個數(shù)據(jù)倉庫工具,用來進(jìn)行數(shù)據(jù)提取、轉(zhuǎn)化、加載,是一種可以存儲、查詢和分析存儲在Hadoop中的大規(guī)模數(shù)據(jù)的工具。本章簡要介紹了數(shù)據(jù)庫管理系統(tǒng)與數(shù)據(jù)倉庫的區(qū)別,介紹了Hive的存儲模型,并以一個簡單的實(shí)例展示Hive建庫、建表、數(shù)據(jù)導(dǎo)入和查詢的全過程。PPT模板下載:/moban/行業(yè)PPT模板:/hangye/節(jié)日PPT模板:/jieri/PPT素材下載:/sucai/PPT背景圖片:/beijing/PPT圖表下載:/tubiao/優(yōu)秀PPT下載:/xiazai/PPT教程:/powerpoint/Word教程:/word/Excel教程:/excel/資料下載:/ziliao/PPT課件下載:/kejian/范文下載:/fanwen/試卷下載:/shiti/教案下載:/jiaoan/字體下載:/ziti/

謝謝!

第7章分布式計算框架MapReduce本章學(xué)習(xí)目標(biāo)掌握MapReduce的基本工作原理;掌握MapReduce各步驟輸入/輸出的銜接關(guān)系;掌握利用HadoopStreaming進(jìn)行代碼測試的基本思路與方法;掌握利用Python設(shè)計MapReduce程序的思路和方法;掌握MapReduce程序設(shè)計模式的基本概念,以及理解常見的幾種設(shè)計模式;理解MRJob的工作原理,并能夠進(jìn)行簡單的MRJob程序設(shè)計應(yīng)用。01MapReduce概述02WordCount實(shí)例詳解目錄Contents03Python代碼測試04利用Python的迭代器和生成器優(yōu)化wordCount程序05MapReduce程序設(shè)計模式06用MRJob庫編寫MapReduce程序07本章小結(jié)MapReduce概述01MapReduce概述HadoopMapReduce是一個計算框架,目的是為了方便編寫具有高可靠性、高容錯性的,能在大型集群(數(shù)千個節(jié)點(diǎn))上并行地處理大量數(shù)據(jù)(數(shù)TB的數(shù)據(jù)集)的分布式應(yīng)用程序。該計算框架管理數(shù)據(jù)傳遞的所有細(xì)節(jié),如發(fā)起任務(wù)、驗證任務(wù)完成情況以及在節(jié)點(diǎn)之間復(fù)制數(shù)據(jù)等。第一個MapReduce的Python程序Hadoop自帶有計算圓周率PI的示例jar包,程序用隨機(jī)數(shù)的方式計算PI值,該程序是一個java程序,通過執(zhí)行以下命令調(diào)用集群進(jìn)行計算:hadoopjar$HADOOP_HOME/share/hadoop/mapreduce/hadoop-mapreduce-examples-3.3.0.jarpi1010輸出結(jié)果如下:第一個MapReduce的Python程序第一個Python程序也是實(shí)現(xiàn)PI的計算。第一個MapReduce的Python程序第一個MapReduce的Python程序在HDFS上創(chuàng)建一個空的文件,之后以該空文件作為輸入文件便可以運(yùn)行計算PI的程序了。運(yùn)行完成后,可以在HDFS文件系統(tǒng)中查看輸出文件內(nèi)容。假設(shè)把程序?qū)?yīng)的mapper和reducer存放在“/codes/Pi”文件夾中,HDFS系統(tǒng)上用作輸入的數(shù)據(jù)存放于HDFS的“/data”文件夾,輸出存放于“/data_rlt”。其操作步驟具體如下:第一個MapReduce的Python程序chmod+x/codes/Pi/*.*第一個MapReduce的Python程序利用如下命令運(yùn)行該程序運(yùn)行結(jié)果如下:mapredstreaming-input/data/tmp.txt-output/data_rlt-mapper/codes/pi/pi_mapper.py-reducer/codes/pi/pi_reducer.py第一個MapReduce的Python程序MapReduce工作原理MapReduce程序分三個階段執(zhí)行,即map階段、shuffle階段和reduce階段其中shuffle可以由MapReduce框架自動完成。因此,多數(shù)情況下,MapReduce算法主要包括兩個任務(wù):Map和Reduce。MapReduce工作原理1.Map階段Map的任務(wù)是對輸入數(shù)據(jù)進(jìn)行處理,通常情況下,MapReduce作業(yè)的輸入和輸出都存儲在文件系統(tǒng)中,MapReduce作業(yè)將輸入數(shù)據(jù)集拆分為獨(dú)立的塊,這些塊由Map任務(wù)以完全并行的方式處理,并轉(zhuǎn)換為一種(key,value)的數(shù)據(jù)模式。MapReduce工作原理2.Reduce階段該階段包括shuffle和reduce,Reducer的任務(wù)是把Mapper生成的(key,value)集整合處理,并輸出最終結(jié)果到HDFS中。系統(tǒng)對map任務(wù)的輸出執(zhí)行排序和轉(zhuǎn)換,并映射為reduce任務(wù)的輸入,此過程就是Shuffle。兩階段任務(wù)完成后,集群收集并縮減數(shù)據(jù)以形成最后結(jié)果,并將其發(fā)送回Hadoop服務(wù)器。MapReduce工作原理CombinerMapReduce程序還可以包含combiner,combiner在Map之后執(zhí)行,通常情況下實(shí)現(xiàn)對Map輸出數(shù)據(jù)的簡單歸納,從而減少數(shù)據(jù)傳輸。在多數(shù)應(yīng)用中,combiner都是能夠大幅提高程序效率的關(guān)鍵步驟。MapReduce工作原理Hadoop框架是用Java實(shí)現(xiàn)的,MapReduce應(yīng)用程序卻可以不用Java編寫。Hadoop流(HadoopStreaming)是一個工具應(yīng)用程序(Utility),它允許用戶使用任何可執(zhí)行文件作為mapper或reducer來創(chuàng)建和運(yùn)行作業(yè);此外,Hadoop管道(HadoopPipes)是一種SWIG兼容的C++API,他可以支持編寫非JNI(JavaNativeInterface)的MapReduce應(yīng)用程序。MapReduce作業(yè)的工作流程MapReduce作業(yè)的工作流程用戶程序中的MapReduce庫首先將輸入文件劃分為M片,每片大小一般在16M到64M之間(可由參數(shù)指定),然后,它在集群多臺機(jī)器上啟動相同的程序復(fù)制。其中一個復(fù)制程序為master(主模塊),其余的都是worker(分模塊)。worker接收master分配的任務(wù),其中有M個Map任務(wù)和R個Reduce任務(wù)要分配。master挑選一個空閑的worker并為其分配一個map任務(wù)或者reduce任務(wù)。MapReduce作業(yè)的工作流程被分配到Map任務(wù)的worker會去讀取相應(yīng)的輸入塊的內(nèi)容。它從輸入文件中解析出鍵值對并且將每個鍵值對傳送給用戶定義的Map函數(shù)。由Map函數(shù)產(chǎn)生的中間鍵值對則緩存在內(nèi)存中。被緩存的鍵值對會階段性地寫回本地磁盤,并且被劃分函數(shù)分割成R份。這些緩存在磁盤上的數(shù)據(jù)位置會被回傳給master(主模塊),master再負(fù)責(zé)將這些位置轉(zhuǎn)發(fā)給Reduceworker。MapReduce作業(yè)的工作流程當(dāng)Reduceworker(Reduce分模塊)從master(主模塊)那里接收到這些位置信息時,它會使用遠(yuǎn)程過程調(diào)用從Mapworker的本地磁盤中獲取緩存的數(shù)據(jù)。當(dāng)Reduceworker讀入全部的中間數(shù)據(jù)之后,將根據(jù)中間鍵對進(jìn)行排序,這樣所有具有相同鍵的鍵值對就都聚集在一起。因為要把具有相同鍵的鍵值對映射到同一個reducetask中,所以需要對中間鍵值對進(jìn)行排序。MapReduce作業(yè)的工作流程Reduceworker遍歷已經(jīng)排好序的中間數(shù)據(jù),每當(dāng)遇到一個新的中間鍵,它會將key和相應(yīng)的中間值傳遞給Reduce函數(shù)。Reduce函數(shù)的輸出會被添加到這個Reduce部分的輸出文件中。當(dāng)所有的Maptasks和Reducetasks都完成時,master將喚醒用戶程序。至此,用戶代碼中的MapReduce調(diào)用返回。MapReduce作業(yè)的工作流程執(zhí)行完后,MapReduce的執(zhí)行結(jié)果被存放在R個輸出文件中(每個Reducetask對應(yīng)一個,文件名由用戶指定)。因為這些輸出文件經(jīng)常作為另一個MapReduce調(diào)用的輸入,或者將它們用于另外一個能夠以多個文件作為輸入的分布式應(yīng)用,所以,用戶并不需要將R個輸出文件歸并成一個。MapReduce作業(yè)的工作流程MapReduce的輸入/輸出MapReduce框架只對<key,value>(鍵值對)進(jìn)行操作,該框架將作業(yè)的輸入視為一組<key,value>,并生成<key,value>作為作業(yè)的輸出。與Java程序不同,Python的Map程序輸入/輸出流為標(biāo)準(zhǔn)輸入/輸出,STDIN和STDOUT,mapper輸入從STDIN中接收數(shù)據(jù),reducer輸出結(jié)果到STDOUT;在mapper和reducer之間的數(shù)據(jù)也是通過標(biāo)準(zhǔn)輸入/輸出進(jìn)行關(guān)聯(lián)。至于他們之間的數(shù)據(jù)流關(guān)系則交由hadoopStreaming處理。WordCount實(shí)例詳解02WordCount程序源碼使用Python編寫MapReduce的要點(diǎn)在于利用Hadoop流的API,通過STDIN(標(biāo)準(zhǔn)輸入)、STDOUT(標(biāo)準(zhǔn)輸出)在Map函數(shù)和Reduce函數(shù)之間傳遞數(shù)據(jù)。我們需要做的是利用Python的sys.stdin讀取輸入數(shù)據(jù),并把輸出傳送給sys.stdout。Hadoop流將會幫助我們處理中間的過程。WordCount程序一共包含兩個部分,分布式map階段程序wordCount_mapper.py和reduce階段程序wordCount_reducer.py,分別如下所示。WordCount程序源碼WordCount程序源碼WordCount程序源碼WordCount程序源碼編寫完代碼,并把他們分別存儲在文件wordCount_mapper.py和wordCount_reducer.py。檢查上述文件是否具有可執(zhí)行權(quán)限,若沒有,可以通過chmod命令設(shè)置兩個文件的執(zhí)行權(quán)限,如“chmod+x./wordCounter/mapper.py”。WordCount程序執(zhí)行利用HadoopStreaming執(zhí)行一個MapReduce任務(wù)的調(diào)用方法如下所示。hadoop-streaming.jar通常命名為hadoop-streaming-x.x.x.jar,其中x.x.x為具體版本號(例如對應(yīng)hadoop3.3.0版的文件名為hadoop-streaming-3.3.0.jar)。WordCount程序執(zhí)行(1)數(shù)據(jù)準(zhǔn)備(路徑可能會因個人不同)后在HDFS上創(chuàng)建“/wordCountData”文件夾,并把數(shù)據(jù)文件(文本文件)上傳到該文件夾;WordCount程序執(zhí)行(2)執(zhí)行命令如下(當(dāng)命令在一行中寫不下時,可以使用“\”換行)mapredstreaming\-input/wordCountData\-output/wordCount_rlt\-mapper"/codes/wordCount/wordCount_mapper.py"\-reducer"/codes/wordCount/wordCount_reducer.py"WordCount程序執(zhí)行(3)運(yùn)行完成后,查看文件夾“/wordCount_rlt”中的文件,可以通過cat直接查看WordCount程序原理將文件拆分成多片段(splits),由于測試用的文件較小,所以每個文件為一個split,并將文件形成標(biāo)準(zhǔn)輸入流,這一步由MapReduce框架自動完成;在mapper中按行讀取標(biāo)準(zhǔn)輸入數(shù)據(jù),并對單詞進(jìn)行分割形成<key,value>,其中key為單詞,value為該單詞出現(xiàn)次數(shù),這里沒有對單詞進(jìn)行統(tǒng)計,所以value都是1;得到map方法輸出的<key,value>集后,shuffle將它們按照key值進(jìn)行排序,并作為reduce的輸入數(shù)據(jù);得到排過序的鍵值對后,利用自定義的reduce方法進(jìn)行處理,得到新的<key,value>對,并作為WordCount的輸出結(jié)果。WordCount程序原理MapReducePython代碼的測試03MapReducePython代碼的測試使用Python編寫完成的MapReduce程序,通常需要進(jìn)行調(diào)試、測試,以排除隱藏的邏輯問題。對運(yùn)行于分布式環(huán)境的MapReduce程序而言,其運(yùn)行的整個過程由mapReduce框架自動管理,在這種情況下要通過一遍遍運(yùn)行查找程序,再在輸出的日志中發(fā)現(xiàn)邏輯錯誤、甚至語法問題將是非常耗時且煩瑣的。因此,我們需要通過使用一些工具和方法來協(xié)助程序代碼的調(diào)試。MapReducePython代碼的測試Python程序的運(yùn)行是通過HadoopStreaming工具進(jìn)行數(shù)據(jù)流的控制,并且Python的Map程序是通過標(biāo)準(zhǔn)輸入STDIN接收輸入數(shù)據(jù)的,所以可以通過構(gòu)造標(biāo)準(zhǔn)輸出作為map程序的輸入,然后利用linux的管道把map輸出到sort工具實(shí)現(xiàn)排序;排序完成后的數(shù)據(jù)再通過管道輸出到reduce程序,從而實(shí)現(xiàn)簡單測試環(huán)境的構(gòu)建。而reduce的最終輸出結(jié)果,則可以通過重定向標(biāo)準(zhǔn)輸出到文件的方式實(shí)現(xiàn)結(jié)果的輸出和存儲。MapReducePython代碼的測試MapReducePython代碼的測試以前面的wordCount程序為例,可以先把輸入文件之一復(fù)制到與mapper和reducer同一文件夾中,此時,該文件夾包含wordCount_mapper.py、wordCount_reducer.py兩個程序文件,運(yùn)行如下命令:MapReducePython代碼的測試還可以把上述節(jié)點(diǎn)分開。例如,可以首先把mapper的輸出重定向到tmp.txt文件中,以便查看mapper階段的運(yùn)行結(jié)果。然后再把中間結(jié)果作為reducer的輸入便可以分步查看兩個階段的運(yùn)行結(jié)果。運(yùn)行命令如下:catinput.txt|./wordCount_mapper.py>tmp.txtcattmp.txt|sort-k1,1|./wordCount_reducer.py>rlt.txt利用迭代器和生成器優(yōu)化wordCount程序04Python中的迭代器迭代器是訪問集合元素的一種方式,它提供了一個統(tǒng)一的訪問集合的接口。迭代器對象從集合的第一個元素開始訪問,直到訪問完所有的元素結(jié)束。迭代器只提供了next方法,所以只能往前不會后退。Python中的迭代器一個簡單的迭代器及使用Python中的迭代器把一個類作為一個迭代器使用需要在類中實(shí)現(xiàn)兩個方法__iter__()與__next__()Python中的生成器帶有yield的函數(shù)在Python中被稱為generator(生成器),生成器是迭代器的一種。例如:Python中的生成器簡單而言,yield的作用就是把一個函數(shù)變成一個generator生成器常被用于數(shù)據(jù)文件讀取,生成器可以根據(jù)需要讀取數(shù)據(jù)。如果直接對文件對象調(diào)用read()方法,會導(dǎo)致不可預(yù)測的內(nèi)存占用。使用yield利用固定長度的緩沖區(qū)來不斷讀取文件內(nèi)容,我們無須編寫讀文件的迭代類,就可以輕松實(shí)現(xiàn)文件讀取。Python中的生成器讀取文件的生成器,每次讀取BLOCK_SIZE大小itertools模塊itertools是Python內(nèi)置的模塊,itertools包提供了更加靈活的生成循環(huán)器的工具,其使用簡單且功能強(qiáng)大。該模塊中的部分內(nèi)容,可以參考教材7.6.3.其中,gropby()迭代器能夠把可迭代的輸入數(shù)據(jù)按關(guān)鍵字進(jìn)行分組后輸出,例如:itertools模塊fromitertoolsimportgroupbyfromoperatorimportitemgettermapout=[('Hello',1),('hadoop',1),('Bye',1),('hadoop',1),('Hello',1),('world',1),('Bye',1),('world',1)]mapout=sorted(mapout,key=itemgetter(0))#排序rlt_groupby=groupby(mapout,key=itemgetter(0))forkey,itemsinrlt_groupby:print("key:",key)forsubiteminitems:print("subitem:",subitem)優(yōu)化wordCount程序利用上述Python的生成器以及itertools模塊工具,我們對wordCount程序進(jìn)行修改,形成更具有Python風(fēng)格的wordCount。優(yōu)化wordCount程序優(yōu)化wordCount程序#!/usr/bin/envpython#-*-coding:UTF-8-*-fromoperatorimportitemgetterfromitertoolsimportgroupbyimportsysdefread_mapper_output(file,separator='\t'):forlineinfile:yieldline.rstrip().split(separator,1)defmain(separator='\t'):data=read_mapper_output(sys.stdin,separator=separator)#data=sorted(data,key=itemgetter(0))forcurrent_word,groupingroupby(data,itemgetter(0)):try:total_count=sum(int(count)forcurrent_word,countingroup)print("%s%s%d"%(current_word,separator,total_count))exceptvalueError:passif__name__=="__main__":main()例7.6.4測試結(jié)果MapReduce程序設(shè)計模式05MR程序設(shè)計模式MapReduce程序設(shè)計模式的目的是通過總結(jié)MapReduce任務(wù)的模式,形成具有一定可替代性的程序設(shè)計模式,以便幫助程序員提高學(xué)習(xí)、實(shí)現(xiàn)MapReduce框架上的程序開發(fā)的效率。數(shù)據(jù)集介紹為了能夠更好的示范程序的數(shù)據(jù)處理與應(yīng)用,我們采用空氣質(zhì)量數(shù)據(jù)作為本章處理的目標(biāo)數(shù)據(jù),全國空氣質(zhì)量數(shù)據(jù)來自中國環(huán)境監(jiān)測總站的全國城市空氣質(zhì)量實(shí)時發(fā)布平臺。數(shù)據(jù)格式:城市空氣指標(biāo)值、站點(diǎn)空氣指標(biāo)、站點(diǎn)詳細(xì)信息20140513,0,AQI,北京,8120140513,0,AQI,天津,6920140513,0,AQI,石家莊,12520140513,0,PM.5,唐山,82(1)聚合查詢模式聚合查詢是指對所要處理的數(shù)據(jù)進(jìn)行一定的統(tǒng)計聚合處理,以從概要、全局的層面上掌握數(shù)據(jù)的特征和狀況。例如,今年北京地區(qū)的空氣質(zhì)量總體情況,包括空氣質(zhì)量各個指標(biāo)的平均值、最大最小值,或者空氣質(zhì)量評價為優(yōu)的天數(shù)等。聚合查詢模式的核心思想是按照一定的關(guān)鍵字對數(shù)據(jù)進(jìn)行分組,然后對分組數(shù)據(jù)進(jìn)行數(shù)據(jù)的聚合、整理、處理。該模式又可以具體分為數(shù)值概要模式、倒排序索引模式、計數(shù)器模式等。聚合查詢模式—數(shù)值概要模式數(shù)值概要模式的目的是按照某些鍵值對數(shù)據(jù)進(jìn)行分組,然后計算特定分組下數(shù)據(jù)的聚合值,如平均值、最大最小值、求和等。任務(wù)1:統(tǒng)計每個城市的PM2.5的最大值、最小值和平均值聚合查詢模式--數(shù)值概要模式聚合查詢模式—倒排序索引模式任務(wù)1的源代碼請參考:教材P238-239mapredstreaming\-input/CityAQ/*\-output/AQI_rlt\-mapper/codes/AQI/-mapper.py\-reducer/codes/AQI/-reducer.py聚合查詢模式—數(shù)值概要模式任務(wù)2:增加combiner,實(shí)現(xiàn)更加高效的數(shù)據(jù)統(tǒng)計工作;聚合查詢模式—倒排序索引模式任務(wù)3的源代碼請參考:教材P240但該版教材的源代碼有點(diǎn)小bug聚合查詢模式—倒排序索引模式倒排索引源于實(shí)際應(yīng)用中需要根據(jù)屬性的值來查找記錄,這種索引表中的每一項都包括一個屬性值和具有該屬性值的記錄的地址。由于不是由記錄確定屬性值,而是由屬性值確定記錄的位置,因而稱為倒排索引(invertedindex)。帶有倒排索引的文件稱為倒排索引文件,簡稱倒排文件(invertedfile)。聚合查詢模式—倒排序索引模式任務(wù)1:構(gòu)建所有城市指定年份空氣質(zhì)量為優(yōu)的日期倒排序索引。輸入:城市空氣質(zhì)量監(jiān)測記錄輸出:一個倒排序文件,每一條記錄格式為<城市,年份,空氣質(zhì)量為優(yōu)的日期列表>為了完成該任務(wù),在Mapper中需要把城市空氣質(zhì)量符合條件的對應(yīng)的日期和時刻加以記錄,并輸出。在Reducer中,其接受到的數(shù)據(jù)序列中,具有相同城市的數(shù)據(jù)相鄰,所以只要把具有相同關(guān)鍵字的鍵值對的值取出,并形成列表便可以得到空氣質(zhì)量為優(yōu)的日期序列。過濾模式過濾模式(FilterPattern)或稱標(biāo)準(zhǔn)模式(CriteriaPattern)是一種設(shè)計模式,這種模式允許開發(fā)人員使用不同的標(biāo)準(zhǔn)來過濾一組對象,通過邏輯運(yùn)算以解耦的方式把它們連接起來。這種類型的設(shè)計模式屬于結(jié)構(gòu)型模式,它結(jié)合多個標(biāo)準(zhǔn)來獲得單一標(biāo)準(zhǔn)。過濾模式最重要的特點(diǎn)是保持?jǐn)?shù)據(jù)的完整性,只是對記錄保留與否進(jìn)行判斷,輸出滿足條件的記錄。過濾模式--過濾器模式過濾器的功能就是通過設(shè)置一定的條件篩選并輸出滿足條件的記錄,其作用類似于SQL語句中的過濾條件。在過濾器模式的實(shí)現(xiàn)中,由于讀取的記錄中已經(jīng)包含了需要的全部信息,所以簡單的過濾模式一般情況下都只需要mapper程序。很多情況下,若最終得到的數(shù)據(jù)是原來數(shù)據(jù)的子集,并且其體量也大大縮小,那么我們希望這些數(shù)據(jù)能夠輸出到一個文件中,而不是被分為多個part進(jìn)行存儲,這時可以利用reduce階段的排序,再把所有數(shù)據(jù)通過一個reducer輸出到一個文件中。若是一些綜合性任務(wù),這里的reducer還可能會在過濾的基礎(chǔ)上完成其他任務(wù)。過濾模式--過濾器模式任務(wù)1:空氣質(zhì)量優(yōu)秀的數(shù)據(jù)檢索。小王是個運(yùn)動愛好者,他幾乎每天早上6-7點(diǎn)之間都進(jìn)行戶外運(yùn)動,為此,他想看看北京市這幾年在他運(yùn)動期間的空氣質(zhì)量為“優(yōu)”的詳細(xì)數(shù)據(jù),請幫他從文件中找出這些數(shù)據(jù)。輸入:所有城市所有日期的空氣質(zhì)量狀況及其各項指標(biāo);輸出:北京市早上六點(diǎn)時空氣質(zhì)量為優(yōu)的數(shù)據(jù)記錄。過濾模式--過濾器模式過濾模式--TopK模式TopK模式是指按照一定的排序條件,從所有符合條件的數(shù)據(jù)中挑選出排在最前的K個元素并輸出。對于該模式,其基本處理思路是從所有mapper中輸出該節(jié)點(diǎn)數(shù)據(jù)的TopK,之后再reducer中對所有mapper的TopK進(jìn)行匯總,輸出最終的K的元素。過濾模式--TopK模式任務(wù)1:空氣質(zhì)量的比較。每年,大眾都會對哪些城市是空氣質(zhì)量最好的城市爭論不休,小劉老師提了個衡量城市質(zhì)量的好方法,他的方法是從全國所有城市中找出空氣質(zhì)量最好的1000條記錄,再看看這1000條記錄都屬于哪

溫馨提示

  • 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

提交評論