頻道欄目
首頁 > 資訊 > 云計算 > 正文

Hive的理論基礎

17-09-19        來源:[db:作者]  
收藏   我要投稿

Hive的定義

hive是基于Hadoop的一個數據倉庫工具,可以將結構化的數據文件映射為一張數據庫表,并提供簡單的sql查詢功能,可以將sql語句轉換為MapReduce任務進行運行。 其優點是學習成本低,可以通過類SQL語句快速實現簡單的MapReduce統計,不必開發專門的MapReduce應用,十分適合數據倉庫的統計分析。

MR job的執行過程

一個InputSplit輸入到map,會運行我們實現的Mapper的處理邏輯,對數據進行映射操作。

map輸出時,會首先將輸出中間結果寫入到map自帶的buffer中(buffer默認大小為100M,可以通過io.sort.mb配置)。

map自帶的buffer使用容量達到一定限制(默認0.80或80%,可以通過io.sort.spill.percent配置),一個后臺線程會準備將buffer中的數據寫入到磁盤。

這個后臺線程在將buffer中數據寫入磁盤之前,會首先將buffer中的數據進行partition(分區,partition數為Reducer的個數),對于每個的數據會基于Key進行一個in-memory排序。

排序后,會檢查是否配置了Combiner,如果配置了則直接作用到已排序的每個partition的數據上,對map輸出進行化簡壓縮(這樣寫入磁盤的數據量就會減少,降低I/O操作開銷)。

MapReduce處理過程

現在可以將經過處理的buffer中的數據寫入磁盤,生成一個文件(每次buffer容量達到設置的門限,都會對應著一個寫入到磁盤的文件)。

map任務結束之前,會對輸出的多個文件進行合并操作,合并成一個文件(若map輸出至少3個文件,在多個文件合并后寫入之前,如果配置了Combiner,則會運行來化簡壓縮輸出的數據,文件個數可以通過min.num.splits.for.combine配置;如果指定了壓縮map輸出,這里會根據配置對數據進行壓縮寫入磁盤),這個文件仍然保持partition和排序的狀態。

reduce階段,每個reduce任務開始從多個map上拷貝屬于自己partition(map階段已經做好partition,而且每個reduce任務知道應該拷貝哪個partition;拷貝過程是在不同節點之間,Reducer上拷貝線程基于HTTP來通過網絡傳輸數據)。

每個reduce任務拷貝的map任務結果的指定partition,也是先將數據放入到自帶的一個buffer中(buffer默認大小為Heap內存的70%,可以通過mapred.job.shuffle.input.buffer.percent配置),如果配置了map結果進行壓縮,則這時要先將數據解壓縮后放入buffer中。。

reduce自帶的buffer使用容量達到一定門限(默認0.66或66%,可以通過mapred.job.shuffle.merge.percent配置),或者buffer中存放的map的輸出的數量達到一定門限(默認1000,可以通過mapred.inmem.merge.threshold配置),buffer中的數據將會被寫入到磁盤中。

在將buffer中多個map輸出合并寫入磁盤之前,如果設置了Combiner,則會化簡壓縮合并的map輸出。

當屬于該reducer的map輸出全部拷貝完成,則會在reducer上生成多個文件,這時開始執行合并操作,并保持每個map輸出數據中Key的有序性,將多個文件合并成一個文件(在reduce端可能存在buffer和磁盤上都有數據的情況,這樣在buffer中的數據可以減少一定量的I/O寫入操作開銷)。

最后,執行reduce階段,運行我們實現的Reducer中化簡邏輯,最終將結果直接輸出到HDFS中(因為Reducer運行在DataNode上,輸出結果的第一個replica直接在存儲在本地節點上)。

分區

Partition 對應于數據庫的 Partition 列的密集索引。

在 Hive 中,表中的一個 Partition 對應于表下的一個目錄,所有的 Partition 的數據都存儲在對應的目錄中。用戶在加載數據的時候必須顯示的指定該部分數據放到哪個分區。

分區(partition):hive里分區的概念是根據“分區列”的值對表的數據進行粗略劃分的機制,在hive存儲上就體現在表的主目錄(hive的表實際顯示就是一個文件夾)下的一個子目錄,這個文件夾的名字就是我們定義的分區的名字,沒有實際操作經驗的人可能會認為分區列是表的某個字段,其實不是這樣,分區列不是表里的某個字段,而是獨立的列,我們根據這個列存儲表的里的數據文件。使用分區是為了加快數據分區的查詢速度而設計的,我們在查詢某個具體分區列里的數據時候沒必要進行全表掃描。

靜態分區:靜態分區在加載數據和使用時都需要在sql語句中指定

案例:(p_date=’20120625’)

動態分區:使用動態分區需要設置hive.exec.dynamic.partition參數值為true,默認值為false,在默認情況下,hive會假設主分區時靜態分區,副分區使用動態分區;如果想都使用動態分區,需要設置set hive.exec.dynamic.partition.mode=nostrick,默認為strick

相關TAG標簽
上一篇:臺積電:絕大多數7nm客戶都會轉向6nm_IT新聞_博客園
下一篇:最后一頁
相關文章
圖文推薦

關于我們 | 聯系我們 | 廣告服務 | 投資合作 | 版權申明 | 在線幫助 | 網站地圖 | 作品發布 | Vip技術培訓 | 舉報中心

版權所有: 紅黑聯盟--致力于做實用的IT技術學習網站

美女MM131爽爽爽毛片