目錄
- 大資料面試題
- Hadoop
- Hadoop的特點
- HDFS面試重點
- 1.HDFS的架構
- 2.HDFS的讀寫流程
- 3.HDFS中,檔案為什么以block塊的方式存盤
- 4.小檔案過多有什么危害,你知道的解決辦法有哪些
- hdfs小檔案帶來危害
- 解決方案
- 5.在NameNode HA中,會出現腦裂問題嗎?怎么解決腦裂
- 6.簡述hadoop壓縮和解壓縮的框架
- 7.namenode的安全模式有了解嗎
- 8.Secondary NameNode 了解嗎,它的作業機制是怎樣的
- 9.在上傳檔案的時候,其中一個 DataNode 突然掛掉了怎么辦
- 10.在讀取檔案的時候,其中一個塊突然損壞了怎么辦
- 11.介紹namenode宕機的資料恢復程序
- 12.NameNode 在啟動的時候會做哪些操作
- MapReduce面試重點
- 1.簡述MapReduce整個流程
- 3.join原理
- 4.MapReduce中的檔案切片相關問題
- 檔案切片
- 5.環形緩沖區的底層實作
- 6 .全排序
- 7.MapReduce實作TopK演算法
- Yarn面試重點
- 1. 簡述yarn 集群的架構
- 2.yarn 的任務提交流程是怎樣的
- 3.yarn的資源調度的三種模型
- Hive
- 簡述hive
- 簡述hive讀寫檔案機制
- hive和傳統資料庫之間的區別
- hive的內部表和外部表的區別
- hive靜態磁區和動態磁區的區別
- 內連接、左外連接、右外連接的區別
- hive的join底層實作
- Order By和Sort By的區別
- 行轉列和列轉行函式
- Hive的執行流程
- Hive 有哪些方式保存元資料,各有哪些特點
- grouping_sets、cube和rollup
- UDF、UDAF、UDTF 的區別
- hive3的新特性有了解過嗎
- hive小檔案過多怎么辦
- Hive開窗函式
- Hive優化
- Hive 表關聯查詢,如何解決資料傾斜的問題
- 補充:
- null
- Hadoop
大資料面試題
Hadoop
分布式系統基礎架構,主要是為了解決海量資料的存盤和和海量資料的分析計算問題
Hadoop的特點
高可靠性:Hadoop底層維護多個資料副本,即使Hadoop某個計算元素或存盤出現故障,也不會 導致資料的丟失
高擴展性:集群分配任務資料,可方便擴展數以千計的節點
高效性:并行作業,加快任務處理速度
高容錯性:能夠自動將失敗的任務重新分配
HDFS面試重點
1.HDFS的架構
1)HDFS Client
1、檔案切分,檔案上傳HDFS的時候,Client將檔案切分成一個個block,進行存盤
2、于NN互動,獲取檔案位置資訊
3、與DN互動,讀/寫資料
4、Client提供一些命令來管理HDFS
2)NameNode(NN):Master
1、管理HDFS的命名空間
2、管理資料塊(block)映射資訊
3、配置副本策略
4、處理客戶端讀寫請求
3)DataNode(DN):Slave
1、存盤實際的資料塊
2、執行資料庫的讀/寫操作
4)Secondary NameNode(NN2)
1、輔助NN,分擔其作業量
2、定期合并Fsimage和Edites,并推送給NN
3、在緊急情況下,輔助恢復NN
2.HDFS的讀寫流程
hdfs讀流程
1、Client通過Distributed FileSystem模塊向NN請求上傳檔案,NN檢查目標檔案是否已存在,父目錄是否存在
2、NN回傳是否可以上傳
3、Client請求第一個block上傳哪幾個DN服務器上
4、NN回傳3個DN節點,分別為DN1、DN2、DN3
5、Client通過FSDataOutputStream模塊請求DN1建立傳輸通道,DN1收到請求會繼續呼叫DN2,DN2繼續呼叫DN3
6、DN3應答DN2,DN2應答DN1,DN1應答Client
7、Client開始往DN1上傳第一個block(先從磁盤上讀取資料放到一個本地磁盤快取),以packet為單位,DN1收到一個packet就會上傳給DN2,DN2傳給DN3;DN1每傳一個packet會放入一個應答佇列等待應答
8、當一個block傳輸完成后,Client會再次請求NN上傳第二個block的服務器,重復執行3-7
hdfs寫流程
1、Client通過Distributed FileSystem模塊向NN請求下載檔案,NN通過查詢元資料,找到檔案的DN地
址
2、Client挑選一臺最近的DN,請求讀取資料
3、DN開始傳輸資料給Client(從磁盤里讀取資料輸入流,以packet為單位做校驗)
4、Client以packet為單位接收,先在本地快取,然后寫入目標檔案
3.HDFS中,檔案為什么以block塊的方式存盤
block:
? HDFS 將Block塊設定為128M
磁盤有一個 Block Size的 概念,它是磁盤讀/寫資料的最小單位,檔案系統的塊通常是磁盤塊的整數倍,
HDFS也有 Block 的概念,像磁盤中的檔案系統一樣,HDFS中的檔案按塊大小進行分解,HDFS中一個塊只存盤一個檔案的內容
目的:減少磁盤尋道的時間,
(1)、不設定block:因為資料是分散的存放磁盤上的,讀取資料時需要不停的進行磁盤尋道,開銷比較大,
(2)、使用block:一次可以讀取一個block中的資料,減少磁盤尋道的次數和時間,
4.小檔案過多有什么危害,你知道的解決辦法有哪些
小檔案:檔案大小小于或者等于30M的檔案
hdfs小檔案帶來危害
(1)HDFS不適合大量小檔案的存盤,因namenode將檔案系統的元資料存放在記憶體中,因此存盤的檔案數目受限于 namenode的記憶體大小,HDFS中每個檔案、目錄、資料塊占用150Bytes,如果存放的檔案數目過多的話會占用很大的記憶體甚至撐爆記憶體
(2)HDFS適用于高吞吐量,而不適合低時間延遲的訪問,如果同時存入大量的小檔案會花費很長的時間,hive或者spark計算的時候會影響他們的速度,因為spark計算時會將資料從硬碟讀到記憶體,零碎的檔案將產生較多的尋道程序,
(3) 流式讀取的方式,不適合多用戶寫入,以及任意位置寫入,如果訪問小檔案,則必須從一個datanode跳轉到另外一個datanode,這樣大大降低了讀取性能,
解決方案
Hadoop Archive 小檔案歸檔:一個高效地將小檔案放入HDFS塊中的檔案存檔工具,能夠將多個小檔案打包成 一個HAR檔案,允許對檔案進行透明訪問
Sequence file:由一系列的二進制key/value組成,如果以key為小檔案名,value為檔案內容,則 可以將大批小檔案合并成一個大檔案
CombineFileInputFormat<K,V> 小檔案合并:一種新的inputformat,用于將多個檔案合并成一個單獨的split,
開啟JVM重用:一個Map運行在一個JVM上,開啟重用,該map在JVM運行完畢之后,JVM繼續運行其Map(mapreduce.job.jvm.numtasks),對于大量小檔案的Job,可以減少45%的運行時間,
手動合并,先將hdfs上的檔案copy到本地,本地合并后在上傳到hdfs
5.在NameNode HA中,會出現腦裂問題嗎?怎么解決腦裂
NameNode HA: NameNode High Availability即高可用
腦裂:指當HA集群中的兩個NameNode實體無法正常通信時,會導致兩個實體都認為自己是活動的主NameNode,從而導致集群狀態出現不一致的情況,進而影響資料的一致性和可用性,指當HA集群中的兩個
措施:
1. 心跳機制:設定節點之間的心跳檢測,一旦檢測到心跳例外就會觸發自動切換至備用節點,
2. 仲裁機制:利用第三方仲裁節點,監控節點間的通信情況,并根據各節點的狀態進行選舉,確保只有一個主節點,
zooleeper
3. 拆分服務:將不同的服務在不同的節點上運行,避免單個節點崩潰影響整個系統,
4. 資料沖突檢測與處理:在節點間發生通信例外之后,需要對資料進行沖突檢測并進行相應的處理,以避免資料的不一致性,
6.簡述hadoop壓縮和解壓縮的框架
Hadoop壓縮和解壓縮的框架是一種對Hadoop分布式系統中的資料進行壓縮和解壓縮的工具,主要包括以下幾個組成部分:
1.壓縮編解碼器(Compression Codec):Hadoop內置了多種壓縮編解碼器,包括Deflate、Gzip、Bzip2、Snappy等,這些壓縮編解碼器可以用于對大量資料進行壓縮和解壓縮操作,
2.壓縮格式(Compression Format):Hadoop支持多種壓縮格式,包括SequenceFile、MapFile、Avro、Parquet等,這些壓縮格式可以提高資料存盤和傳輸的效率,
3.壓縮/解壓縮任務(Compression/Decompression Task):Hadoop的壓縮/解壓縮框架可以通過MapReduce任務或基于Hadoop IO的API實作,壓縮/解壓縮任務可以在HDFS中對資料進行處理,
4.壓縮輸出格式(Compressed Output Format):Hadoop的壓縮輸出格式可以在壓縮后輸出結果到HDFS上,這樣可以在節約存盤空間的同時,保證資料的可靠性和高效性,
7.namenode的安全模式有了解嗎
NameNode的安全模式是一個特殊的狀態,在這種狀態下,Hadoop系統將防止對檔案系統的寫操作,直到管理員將其手動關閉,此模式通常用于在出現某些問題時,防止進一步的資料損壞,例如由于資料節點故障或磁盤故障導致資料丟失,
在安全模式下,NameNode將控制檔案系統中檔案的可用性,以避免資料丟失,在這種狀態下,管理員可以執行特定的管理操作,例如修復檔案系統的損壞部分,清除無用資料或在損壞節點上執行維護操作,
在大多數情況下,NamNode的安全模式是自動啟用的,只有在特定情況下,管理員需要手動將系統置于此狀態,
8.Secondary NameNode 了解嗎,它的作業機制是怎樣的
Secondary NameNode是一個輔助節點,旨在協助管理Hadoop集群中的NameNode,它的主要作用是幫助NameNode提高穩定性和可靠性,以及提高集群的性能,
Secondary NameNode的作業機制是這樣的:它定期從NameNode上復制編輯日志和檔案系統元資料,并將其保存為本地副本,編輯日志是一個HDFS中記錄每個檔案的更改的日志,包括添加,洗掉和修改,通過定期保存這些元資料和日志檔案,Secondary NameNode可以從NameNode上恢復資料,并且在NameNode失敗時,可以幫助快速恢復,
Secondary NameNode還有另一個重要的作用,即合并編輯日志,在HDFS中,編輯日志被當做單獨的檔案存盤,如果這些檔案的數量過多,則會降低系統性能,Secondary NameNode可以定期合并這些檔案來提高性能并減少存盤空間的使用,
總的來說,Secondary NameNode與NameNode密切合作,通過復制,備份和編輯日志匯總等作業來提高集群的穩定性和可靠性,
9.在上傳檔案的時候,其中一個 DataNode 突然掛掉了怎么辦
客戶端上傳檔案時與 DataNode 建立 pipeline 管道,管道正向是客戶端向DataNode 發送的資料包,管道反向是 DataNode 向客戶端發送 ack 確認,也就是正確接收到資料包之后發送一個已確認接收到的應答,
當 DataNode 突然掛掉了,客戶端接收不到這個 DataNode 發送的 ack 確認,客戶端會通知 NameNode,NameNode 檢查該塊的副本與規定的不符,NameNode 會通知 DataNode 去復制副本,并將掛掉的 DataNode 作下線處理,不再讓它參與檔案上傳與下載
10.在讀取檔案的時候,其中一個塊突然損壞了怎么辦
當出現塊損壞的情況時,HDFS會自動從副本中選擇一個可用的副本進行讀取,在默認情況下,HDFS會在每個節點上保存三個副本,即使其中一個塊損壞了,也可以從其他副本中讀取資料,如果沒有可用的副本,HDFS會將故障節點視為失敗,并執行相應的故障轉移,
如果希望盡早檢測到損壞的塊并進行故障轉移,則可以考慮增加塊的副本數,這可以通過修改HDFS的組態檔來實作, 還可以使用HDFS的工具來檢測塊損壞和修復塊,Hadoop集群管理者可以使用Hadoop fsck命令來檢測損壞的塊,該命令可以列出損壞的塊并提供有關修復塊的建議,同時,還可以使用Hadoop balancer命令來重新平衡HDFS中的資料并確保每個節點上的塊數量相等,從而提高資料可靠性和可用性,
11.介紹namenode宕機的資料恢復程序
如果寫入檔案過量造成NameNode宕機,那么調高Kafka的存盤大小,控制從Kafka到HDFS的寫入速度,高峰期的時候用Kafka進行快取,高峰期過去資料同步會自動跟上,
1. 檢查namenode的故障原因:包括硬體故障、系統錯誤、網路連接等方面,以確定是否需要更換硬體或對系統進行修復,
2. 啟動namenode備用節點(Secondary Namenode):這是Hadoop系統中的一種備用節點,通常在主節點發生故障時起到主節點的補救作用,在namenode發生故障時,可以通過啟動備用節點來恢復資料,
3. 重新分配block:當主節點出現故障時,備用節點會收集到跟蹤塊分配情況的日志資料,并對資料塊進行重新分配,以確保資料的完整性和正確性,
4. 恢復元資料(Metadata):元資料是Hadoop中與存盤資料相關的資料資訊,包括資料塊的個數、位置、權限、副本數量等等,在主節點發生故障時,備用節點會根據元資料資訊重新構建資料塊,使其重新組成資料檔案,并將資料檔案拷貝到各個資料節點上,
5. 同步元資料:一旦備用節點完成恢復資料的程序,它會將元資料同步回主節點,代替宕機的主節點恢復集群的控制權和儲存結構,
12.NameNode 在啟動的時候會做哪些操作
1. 讀取 Hadoop 配置資訊:NameNode 在啟動時會讀取 Hadoop 配置資訊,其中包括檔案系統的名稱、資料節點的地址等關鍵資訊,
2. 加載 fsimage 和 editlogfile:NameNode 在啟動時會加載 fsimage 和 editlogfile 檔案,這兩個檔案記錄了 HDFS 檔案系統中所有檔案和目錄的元資料資訊,
3. 恢復 fsimage 和 editlogfile:NameNode 在加載 fsimage 和 editlogfile 檔案后,會對其進行恢復,并使用它們來重構檔案系統的元資料資訊,
4. 注冊 DataNode:NameNode 在啟動時會向 DataNode 發送心跳信號,進行通信,并將 DataNode 注冊到其管理節點串列中,
5. 初始化檔案系統的安全性:NameNode 在啟動時會初始化檔案系統的安全性,包括配置 Hadoop 安全性,啟動 Kerberos 和在配置 SSL,
6. 啟動 RPC 服務:NameNode 在啟動時會啟動 RPC 服務,以便客戶端和其他節點可以通過網路訪問 NameNode,
7. 啟動WebUI:NameNode 在啟動時會啟動 WebUI 并打開特定的埠,用于以圖形化的方式查看 HDFS 檔案系統的狀態和資訊,
8. 持久化元資料:NameNode 在啟動時會將元資料持久化到硬碟中,以保證元資料資訊不會丟失,
9. 啟動 SecondaryNameNode:NameNode 在啟動時會啟動 SecondaryNameNode,用于定期備份 fsimage 檔案和 editlogfile,
10. 日志記錄:NameNode 在啟動時會記錄各種關鍵資訊到日志檔案中,以便管理員分析和排除問題,
MapReduce面試重點
MapReduce是一種廣泛使用的大資料處理框架,它能夠處理海量的資料集并且能夠高效地運行在分布式系統上,
1.簡述MapReduce整個流程
MapReduce 處理資料程序主要分成 2 個階段: map 階段和 reduce 階段
先執行 map 階段,再執行 reduce 階段,
1) 在正式執行 map 函式前,需要對輸入進行“分片”(就是將海量資料分成大概相等的“塊”, hadoop 的一個分片默認是 64M ),以便于多個 map 同時作業,每一個 map 任務處理一個“分片”,
2) 分片完畢后,多臺機器就可以同時進行 map 作業了, map 函式要做的事情,相當于對資料進行“預處理”,輸出所要的“關切”, map 對每條記錄的輸出以 pair 的形式輸出,
3) 在進入 reduce 階段之前,還要將各個 map 中相關的資料( key 相同的資料)歸結到一起,發往一個 reducer ,
4) 接下來進入 reduce 階段,相同的 key 的 map 輸出會到達同一個 reducer ,
reducer 對 key 相同的多個 value 進行“ reduce 操作”,最后一個 key 的一串 value 經過 reduce 函式的作用后,變成了一個 value ,
2.手寫wordcount
3.join原理
在MapReduce中,join是將兩個或多個資料集合并在一起的操作,它有兩種基本型別:Map-side join和Reduce-side join,
Map-side join是在Map階段將多個輸入資料集連接起來,它的基本想法是將兩個資料集按照某個公共鍵進行分組,然后對每組的記錄進行笛卡爾積操作,由于Map階段是并行執行的,因此需要使用分布式快取(distributed cache)來加載所有需要連接的資料集,
Reduce-side join是在Reduce階段將多個資料集合并在一起,它的基本想法是將兩個資料集按照某個公共鍵進行分組,并將相同鍵值的記錄合并在一起,Reduce階段的處理是串行執行的,因此不需要使用分布式快取來加載所有需要連接的資料集,
在MapReduce中,join操作有兩個基本的實作方式:Sort-Merge Join和Hash Join,
Sort-Merge Join是在MapReduce框架中使用的一種傳統的連接操作,首先對輸入資料進行排序,然后按照連接鍵進行合并,這種方法適用于資料量較大的情況,但是需要進行兩次排序操作,耗費大量的時間和計算資源,
Hash Join是一種基于哈希表的連接操作,它首先將兩個資料集按照連接鍵進行哈希分桶,并將相同鍵值的記錄放在同一個桶中,然后遍歷每個桶,將相同鍵值的記錄進行連接,這種方法比Sort-Merge Join更快,但是需要占用大量的記憶體空間,
總之,MapReduce中的join操作是一種將不同資料源的資料集合并在一起的操作,可以通過分布式快取來加載多個資料源,在Map階段將分組后的資料集進行笛卡爾積操作或者在Reduce階段將含有相同鍵值的資料集進行合并操作,同時,MapReduce中的join操作也有多種實作方式,包括Sort-Merge Join和Hash Join,
4.MapReduce中的檔案切片相關問題
檔案切片
在MapReduce中,檔案切片是將大型檔案分割成小塊的程序,它是MapReduce的第一步,在檔案切片期間,MapReduce將檔案分成連續的塊,每個塊的大小通常為64MB,這樣可以將檔案分割成多個塊,每個塊可以在不同的計算節點上并行處理,這個程序是自動完成的,不需要人工干預,
檔案切片程序中,MapReduce會依據檔案的格式和大小,選擇合適的切片方法,對于文本檔案,通常是按行進行切分,對于二進制檔案,可以按位元組或固定大小的塊進行切分,在進行Map任務之前,MapReduce會將切片分配給不同的Map任務進行處理,每個Map任務只處理其分配的切片,從而實作了資料的并行處理,
檔案切片是MapReduce中非常重要的一個組成部分,它可以有效提高計算效率和任務并行度,
1. 什么是MapReduce中的檔案切片?
MapReduce中的檔案切片是指將大檔案分割成多個小檔案,按照檔案大小或記錄數等條件進行分割,以便于并行處理和優化計算,
2. 檔案切片的作用是什么?
檔案切片將大檔案分割成多個小檔案,實作分布式處理,提高處理效率和計算速度,同時,檔案切片有利于分散檔案存盤,降低磁盤的IO負載,減輕系統的壓力,
3. 檔案切片的切割規則是什么?
檔案切片的切割規則通常是按照檔案大小或記錄數來進行的,切割后的檔案大小通常為Hadoop默認塊大小,即128MB或256MB,檔案切片時需要考慮資料的平衡性,盡量避免某個塊的資料過多或過少,
4. 如何設定檔案切片的大小?
檔案切片的大小可以通過修改Hadoop的組態檔來設定,通常是通過修改配置引數dfs.blocksize來實作的,根據實際情況設定檔案切片大小,避免資料傾斜和磁盤IO負載過高,
5. 檔案切片的切割粒度對計算速度有響嗎?
檔案切片的切割粒度會影響計算速度,過小的切割粒度會導致過多的切片,增加了網路傳輸和啟動任務的開銷,降低了計算效率,過大的切割粒度則會導致資料傾斜和磁盤IO壓力,因此,需要根據實際情況設定合理的切割粒度,
5.環形緩沖區的底層實作
MapReduce中環形緩沖區的底層實作通常使用回圈佇列,回圈佇列是一種經典的資料結構,其底層使用一個具有固定大小的陣列來保存元素,并使用兩個指標front和rear來標記隊首和隊尾位置,環形緩沖區實際上就是一個回圈佇列,但其實作程序會更加復雜,因為存在多個執行緒同時對緩沖區進行讀寫操作,
MapReduce中的環形緩沖區通常由兩個執行緒共同維護:生產者執行緒和消費者執行緒,生產者執行緒將分割后的資料寫入環形緩沖區,而消費者執行緒則從環形緩沖區中讀取資料進行計算,為了保證資料的正確性和一致性,必須使用一些同步機制來協調不同執行緒之間的讀寫操作,
使用回圈佇列實作環形緩沖區時,需要考慮以下問題:
1. 環形緩沖區的大小需要根據實際情況進行合理設定,以保證能夠容納并發處理的資料量,
2. 由于多個執行緒同時對緩沖區進行讀寫操作,需要采用同步機制來避免并發問題,例如使用互斥鎖或信號量等同步原語,
3. 當環形緩沖區已滿時,需要采取相應的處理策略,例如等待生產者寫入后再進行消費,或者丟棄一部分資料以保證緩沖區空間,
4. 在使用回圈佇列進行資料讀寫時,需要保證指標的正確移動,避免出現指標越界或位置錯誤等問題,
總之,MapReduce中環形緩沖區的底層實作需要充分考慮資料的正確性、一致性以及并發處理的效率,采用合適的資料結構和同步機制可以提高系統的性能和穩定性,
6 .全排序
MapReduce能夠進行全排序,也就是將所有的輸入資料按照指定的順序排列輸出,實作全排序的原理是,通過多次MapReduce作業完成,
首先,在第一個MapReduce作業中,將輸入資料切分成小塊分別排序,這些小塊可以是單行或者多行,按照鍵值排序后輸出,
接著,在第二個MapReduce作業中,將前一次輸出的小塊再次進行排序,形成更大的塊,這個程序是遞回進行的,直到所有的資料被排序完畢,
實作全排序的關鍵是在MapReduce作業中對資料進行切分和排序,對于切分,可以采用Range Partitioner演算法,將資料按照鍵值范圍劃分到不同的Reducer中,對于排序,可以使用Quick Sort演算法或者Merge Sort演算法等,
需要注意的是,全排序演算法的效率非常低,尤其是在處理大量資料時,因此,需要進行優化,如使用Combiner、使用In-Mapper Combining和增加Reducer數量等,
7.MapReduce實作TopK演算法
TopK演算法也是一種常見的演算法,它經常被用來查找資料集中的最大/最小K個數,
MapReduce框架可以用來實作TopK演算法,下面是一種基本的實作方式:
1. Map階段:將資料集中的每個元素映射成與該元素對應的鍵值對,其中鍵為該元素的值,而值則為1,
2. Shuffle階段:將Map產生的鍵值對通過鍵值對中的鍵進行排序和分組,在這個例子中,Map產生的鍵即為元素的值,因此同樣大小的元素會被分到同一個組中,
3. Reduce階段:對于每個組,Reduce函式會對鍵值對中的值進行累加,從而計算出該組中元素的出現次數,然后,將該組的鍵值對存盤到一個最大/最小堆中,以便找到該組中出現次數最多/最少的元素,如果堆的大小大于K,則將堆中最小/最大元素彈出,從而保證堆的大小為K,
4. 最終輸出:Reduce函式輸出所有的TopK元素,為了保證輸出的順序,可以對輸出的元素進行排序,
具體的實作可以參考下面的代碼:
Map函式實作:
def mapper(key, value): yield (value, 1)
Reduce函式實作:
def reducer(key, values):
heap = []
for value in values:
heapq.heappush(heap, value)
if len(heap) > K:
heapq.heappop(heap)
return (key, heap)
Yarn面試重點
1. 簡述yarn 集群的架構
Yarn主要包含:ResourceManager(RM)、NodeManager(NM)、ApplicationMaster和Container 模塊
RM:
處理客戶端請求
監控NM
啟動或監控ApplicationMaster
資源的分配與調度
NM:
管理單個節點上的資源
處理來自RM的命令
處理來自ApplicationMaster的命令
ApplicationMaster:
為應用程式申請資源并分配給內部的任務
任務的監督與容錯
Containr:
是Yarn中的資源抽象,封裝了某個節點上的多維度資源,如記憶體、CPU、磁盤、網路等
2.yarn 的任務提交流程是怎樣的
1.作業提交
(1)Client呼叫job.waitForCompletion方法,向整個集群提交MapReduce作業,
(2)Client向RM申請一個作業id,
(3)RM給Client回傳該job資源的提交路徑和作業id,
(4)Client提交jar包、切片資訊和組態檔到指定的資源提交路徑,
(5)Client提交資源后,向RM申請運行MrAppMaste
2.作業初始化
(6)當RM收到Client的請求后,將該job添加到容量調度器中,
(7)某一個空閑的NM領取到該Job,
(8)該NM創建Container,并產生MRAppmaster,
(9)下載Client提交的資源到本地,
3.任務分配
(10)MrAppMaster向RM申請運行多個MapTask任務資源,
(11)RM將運行MapTask任務分配給另外兩個NodeManager,另兩個NodeManager分別領取任務并 創建容器,
4.任務運行
(12)MR向兩個接收到任務的NodeManager發送程式啟動腳本,這兩個NodeManager分別啟動 MapTask,MapTask對資料磁區排序,
(13)MrAppMaster等待所有MapTask運行完畢后,向RM申請容器,運行ReduceTask,
(14)ReduceTask向MapTask獲取相應磁區的資料,
(15)程式運行完畢后,MR會向RM申請注銷自己,
5.進度和狀態更新
YARN中的任務將其進度和狀態(包括counter)回傳給應用管理器, 客戶端每秒(通過 mapreduce.client.progressmonitor.pollinterval設定)向應用管理器請求進度更新, 展示給用戶,
6.作業完成
除了向應用管理器請求作業進度外, 客戶端每5秒都會通過呼叫waitForCompletion()來檢查作業是否完 成,時間間隔可以通過mapreduce.client.completion.pollinterval來設定,作業完成之后, 應用管理器 和Container會清理作業狀態,作業的資訊會被作業歷史服務器存盤以備之后用戶核查,
Yarn 的任務提交流程如下:
1. 使用者撰寫代碼并打包成一個或多個應用程式,
2. 在運行時,Yarn 客戶端向 Yarn ResourceManager 提交一個作業請求,該請求包括應用程式的位置、資源需求和應用程式啟動命令等資訊,
3. Yarn ResourceManager 接收到作業請求后,會為該作業分配一個 ApplicationMaster(AM),并分配所需的資源,
4. ApplicationMaster 啟動并請求 ResourceManager 分配所需資源,如 CPU、記憶體等,
5. ResourceManager 為 ApplicationMaster 分配所需資源,
6. ApplicationMaster 啟動后,會與 Yarn NodeManager 通信,以便獲得集群中可用節點的資訊,
7. ApplicationMaster 啟動并分配任務(如 MapReduce 任務)給 NodeManager,然后等待任務完成,
8. NodeManager 接收到任務并啟動它,
9. 任務啟動后,在所分配的節點上運行,最終將結果回傳給 ApplicationMaster,
10. ApplicationMaster 將結果收集并整合,最終將結果回傳給 Yarn 客戶端,
11. 當作業完成后,ApplicationMaster 會向 ResourceManager 報告成功完成,然后釋放所需資源,
12. Yarn 客戶端收到作業完成的訊息后,可以獲取結果并進行處理,
3.yarn的資源調度的三種模型
FIFO、容量(Capacity Scheduler)和公平(Fair Scheduler)
FIFO: 先進先出調度器
容量調度器:多佇列;每個佇列內部先進先出,同一時間佇列中只有一個任務在執行,佇列的并行度為佇列的個數
公平調度器:多佇列;每個佇列內部按照缺額大小分配資源啟動任務,同一時間佇列中有多個任務執行,佇列的并行度大于等于佇列的個數,
Hive
簡述hive
基于Hadoop一個資料倉庫工具,可以將結構化的資料檔案映射為一張資料庫表,并提供簡單的 sql 查詢功能,可以將 sql 陳述句轉換為 MapReduce 任務進行運行,適合資料倉庫的統計分析,
簡述hive讀寫檔案機制
Hive支持兩種檔案格式:文本檔案和序列檔案,當Hive讀取文本檔案時,其會將檔案按行讀取,然后決議成Hive表的行資料,當Hive讀取序列檔案時,其會根據序列化的格式將檔案決議成Hive表的行資料,
在Hive中,表資料存盤在HDFS上,每個表對應一個目錄,Hive會將表的資料分成多個塊存盤在多個檔案中,并且每個塊的大小可以配置,當Hive寫入資料時,其會將資料寫入記憶體快取中,當快取達到一定大小時,Hive會將快取中的資料寫入HDFS中的檔案,同時,Hive還支持動態磁區,即在寫入資料時,根據資料的某些屬性值將資料磁區存盤,這樣可以提高查詢效率,
總的來說,Hive的讀寫檔案機制是基于Hadoop的檔案系統HDFS的,其支持文本檔案和序列檔案格式,并且支持動態磁區
hive和傳統資料庫之間的區別
Hive是一個基于Hadoop的資料倉庫工具,它使用類SQL語言(HiveQL)來查詢和管理大規模分布式資料集,而傳統資料庫是指關系型資料庫,使用SQL語言來管理和查詢資料,
以下是Hive和傳統資料庫之間的一些不同之處:
1.存盤方式:傳統資料庫通常使用B+樹等索引結構來存盤資料,而Hive將資料存盤在Hadoop分布式檔案系統(HDFS)中,
2.處理方式:傳統資料庫通常是單機或小型集群,而Hive是基于Hadoop分布式計算框架的,可以在大規模集群上運行,
3.查詢語言:傳統資料庫使用SQL語言,而Hive使用HiveQL語言,類似于SQL語言但有一些不同之處,例如HiveQL支持在查詢中參考非關系型資料,
4.資料型別:傳統資料庫支持多種資料型別,例如整數、浮點數、字串等,而Hive支持更多的資料型別,包括復雜資料型別如陣列、結構體等,
5.執行效率:傳統資料庫通常具有較高的執行效率,可以快速處理大量資料,而由于Hive是基于Hadoop的,因此可能不如傳統資料庫在處理小規模資料時效率高,
hive的內部表和外部表的區別
內部表:加載資料到 hive 所在的 hdfs 目錄,洗掉時,元資料和資料檔案都洗掉
外部表:不加載資料到 hive 所在的 hdfs 目錄,洗掉時,只洗掉表結構
內部表是通過create table創建的,外部表是create external table進行創建的
外部表需要通過location指定表格映射的檔案夾
hive靜態磁區和動態磁區的區別
1. 靜態磁區可以load data和insert兩種方式添加資料,動態只能通過insert的方式添加資料
2. 靜態需要自己指定磁區的內容,動態是通過查詢結果自動指定和分配的
3. 動態需要打開動態磁區和非嚴格模式的開關
set hive.exec.dynamic.partition=true;
set hive.exec.dynamic.partition.mode=nonstrict;
4. 一般情況下都是使用靜態磁區,動態的處理資料的速度相對慢一點
內連接、左外連接、右外連接的區別
內連接是指在兩個表中具有匹配值的行之間建立連接,這意味著只有在兩個表中都存在匹配值的行才會被連接在一起,
左外連接是指左表中的所有行都將與右表中的匹配行連接在一起,如果右表中沒有匹配項,則左表中的行仍將保留,但是這些行中的所有右表列都將為NULL,
右外連接是指右表中的所有行都將與左表中的匹配行連接在一起,如果左表中沒有匹配項,則右表中的行仍將保留,但是這些行中的所有左表列都將為NULL,
綜上所述,內連接只回傳匹配的行,左外連接回傳左表中的所有行和右表中的匹配行以及右表中沒匹配到的行(NULL填充),右外連接回傳右表中的所有行和左表中的匹配行以及左表中沒匹配到的行(NULL填充),
hive的join底層實作
Hive的join底層實作是基于MapReduce的,在進行join操作時,Hive會將資料按照join條件進行磁區,并在磁區內進行本地join操作,然后,將不同磁區的資料進行合并,并通過MapReduce進行全域的join操作,
具體來說,Hive的join操作分為兩個階段,分別是Map階段和Reduce階段,Map階段會讀取資料、進行磁區和本地join操作,同時將結果存盤到中間檔案中,Reduce階段會將中間檔案中的資料按照join條件進行合并,并輸出最終的結果,
為了提高join的性能,Hive在實作中采用了一些優化措施,例如,將小表加載到記憶體中,利用Hash表進行join操作,減少了磁盤IO的消耗;另外,如果資料量較小,Hive會采用Map端join的方式,避免了Reduce階段的執行,
總的來說,Hive的join底層實作是基于MapReduce的,在實作中采用了許多優化措施,以提高join操作的性能和效率,
Order By和Sort By的區別
Order By和Sort By的區別 指的是在資料庫中對資料進行排序時,使用的兩種不同的陳述句
Order By 是SQL陳述句中的關鍵詞,用于按照指定的欄位對查詢結果進行升序或降序排列;
Sort By 是一種在編程語言中常用的函式或方法,用于對陣列、串列或集合等資料結構進行排序,
Order By在SQL陳述句中通常用于查詢陳述句的末尾,其語法為:SELECT column1, column2, ... FROM table_name ORDER BY column1 ASC|DESC, column2 ASC|DESC, ...;其中,ASC表示升序排列,DESC表示降序排列,通過Order By陳述句,可以對查詢結果進行排序,使其更加符合實際需求,
與之不同的是,Sort By是一種編程語言中常見的排序函式或方法,通常用于對陣列、串列或集合等資料結構進行排序,在使用Sort By時,可以指定排序的規則,例如升序或降序,或者按照某個特定的屬性進行排序,與Order By相比,Sort By更加靈活,可以對各種不同型別的資料進行排序,不僅局限于資料庫查詢結果,
行轉列和列轉行函式
行轉列函式包括PIVOT、TRANSPOSE和STACK
列轉行函式包括UNPIVOT、TRANSPOSE和EXPLOD
Hive的執行流程
1.(執行查詢操作)Execute Query
命令列或Web UI之類的Hive介面將查詢發送給Driver(任何資料庫驅動程式,如JDBC、ODBC等)以執行,
2.(獲取計劃任務)Get Plan
Driver借助查詢編譯器決議查詢,檢查語法和查詢計劃或查詢需求
3.(獲取元資料資訊)Get Metadata
編譯器將元資料請求發送到Metastore(任何資料庫),
4.(發送元資料)Send Metadata
Metastore將元資料作為對編譯器的回應發送出去,
5.(發送計劃任務)Send Plan
編譯器檢查需求并將計劃重新發送給Driver,到目前為止,查詢的決議和編譯已經完成
6.(執行計劃任務)Execute Plan
Driver將執行計劃發送到執行引擎,
7.(執行Job任務)Execute Job
在內部,執行任務的程序是MapReduce Job,執行引擎將Job發送到ResourceManager,
ResourceManager位于Name節點中,并將job分配給datanode中的NodeManager,在這里,查詢執行MapReduce任務.
7.1.(元資料操作)Metadata Ops
在執行的同時,執行引擎可以使用Metastore執行元資料操作,
8.(拉取結果集)Fetch Result
執行引擎將從datanode上獲取結果集;
9.(發送結果集至driver)Send Results
執行引擎將這些結果值發送給Driver,
10.(driver將result發送至interface)Send Results
Driver將結果發送到Hive介面
Hive 有哪些方式保存元資料,各有哪些特點
Hive 支持三種不同的元存盤服務器,分別為:內嵌式元存盤服務器、本地元
存盤服務器、遠程元存盤服務器,每種存盤方式使用不同的配置引數,
內嵌式元存盤主要用于單元測驗,在該模式下每次只有一個行程可以連接到
元存盤,Derby 是內嵌式元存盤的默認資料庫,
在本地模式下,每個 Hive 客戶端都會打開到資料存盤的連接并在該連接上請
求 SQL 查詢,
在遠程模式下,所有的 Hive 客戶端都將打開一個到元資料服務器的連接,該
服務器依次查詢元資料,元資料服務器和客戶端之間使用 Thrift 協議通信
grouping_sets、cube和rollup
在Hive中,grouping sets、cube和rollup都是用來實作多維度聚合的功能,它們都可以將多個維度的聚合結果合并成一個結果,
1. grouping sets(分組集)
grouping sets是一種常用的多維度聚合操作,它可以按照多個列進行分組聚合,并且可以指定多個維度的不同組合方式,通過使用grouping sets,可以將多個不同維度的聚合結果合并成一個結果集,
假設一個表包含兩個列A、B,分別為數字和日期型別,使用grouping sets陳述句進行如下查詢:
```
SELECT A,B,SUM(C) FROM table GROUP BY grouping sets ((A,B),(A),(B),())
```
上述陳述句中,通過grouping sets指定了四種情況下的分組聚合方式,分別是按照A、B共同分組、按照A分組、按照B分組、不分組,
2. cube(立方體)
cube是一種更加復雜的多維度聚合操作,它可以對指定的列進行“立方體”般的多維度聚合,與grouping sets不同的是,cube會根據指定的列生成所有可能的組合方式進行聚合,通過使用cube,可以更加靈活地進行多維度聚合操作,
假設一個表包含三個列A、B、C,使用cube陳述句進行如下查詢:
```
SELECT A,B,C,SUM(D) FROM table GROUP BY cube (A,B,C)
```
上述陳述句中,通過cube指定了對A、B、C三個列進行“立方體”聚合的操作,會生成所有可能的組合方式進行聚合,包括(A,B,C)、(A,B)、(A,C)、(B,C)、(A)、(B)、(C)、()等八種情況,
3. rollup(增量式立方體)
rollup是一種增量式的多維度聚合操作,它可以對指定的列進行多維度聚合,并依次增加聚合維度,與cube不同的是,rollup會根據指定的列生成一組遞增的聚合方式進行聚合,通過使用rollup,可以在保證計算準確性的前提下,大大減少計算量和存盤空間,
假設一個表包含三個列A、B、C,使用rollup陳述句進行如下查詢:
```
SELECT A,B,C,SUM(D) FROM table GROUP BY rollup (A,B,C)
```
上述陳述句中,通過rollup指定了對A、B、C三個列進行增量式的聚合操作,會生成一組遞增的聚合方式進行聚合,包括(A,B,C)、(A,B)、(A)、()等四種情況,在計算時,rollup會依次增加聚合維度,計算出每一個聚合維度對應的結果,最終得到所有聚合維度的結果集,
UDF、UDAF、UDTF 的區別
UDF:單行進入,單行輸出
UDAF:多行進入,單行輸出,聚集函式
UDTF:單行輸入,多行輸出
完成步驟:
1)匯入依賴
2)創建一個類,繼承于Hive自帶的UDF
3)打成jar包上傳到linux服務器
4)將jar包添加到hive的classpath
5)創建臨時函式與開發好的java class關聯
hive3的新特性有了解過嗎
1. ACID事務支持:Hive3引入了ACID全稱原子,一致,隔離和持久的特性,這種特性使得多個并發用戶可以在同一時間對同一個表進行修改,并且每個修改都是獨立的,不會影響到其他用戶的修改,
2. 向量化查詢引擎:向量化查詢引擎可以在同一次查詢中同時處理多個資料,從而提高查詢效率,使得Hive3可以更快地處理大規模資料,
3. 改進的存盤格式:Hive3支持新的ORC存盤格式,這種格式可以顯著提高查詢速度和壓縮比率,同時,Hive3還支持Parquet存盤格式和AVRO存盤格式,這使得Hive3可以更好地集成到Hadoop生態系統中,
4. 增強的SQL語言支持:Hive3支持更多的SQL語法,例如視窗函式和分析函式,從而使得用戶可以更方便地進行資料分析,
5. 更好的安全性和認證:Hive3引入了一些新的安全特性,例如列級別的安全、資源調度和控制、權限管理等,從而使得用戶可以更好的保護其資料
hive小檔案過多怎么辦
小檔案太多的出現:
源資料本身有很多小檔案
動態磁區產生很多小檔案
reduce個數越多,小檔案越多
按磁區插入資料產生很多小檔案,檔案個數=maptask個數*磁區數
小檔案太多的影響:
從Hive角度看,會啟動很很多map,一個map需要一個JVM去執行,任務的初始化浪費資源
HDFS存盤太多小檔案,導致NN元資料特別多,占有其太多記憶體
解決方案:
1、通過調整引數合并
2、針對磁區插入資料的時候產生的大量小檔案問題,使用DISTRIBUTE BY rand()將資料隨機分配給Reduce,使每個Reduce處理的資料大體一致
3、使用Sequencefile作為表存盤格式
4、使用Hadoop的archhive歸檔
Hive開窗函式
分析函式:用于計算基于組的某種聚合值
開窗函式:指定分析函式作業的資料視窗大小
分析函式(sum(),max(),row_number()...) + 視窗自己(over函式)
1、SUM函式
sum()根據每一行的視窗回傳各自行對應的值,有多少行記錄就有多少個sum值
2、NTILE函式
NTILE(n)用于將磁區資料按照順序切分成n片,回傳當前切片值
如果切片不均勻,默認增加第一個切片的分布
不支持ROWS BETWEEN
3、ROW_NUMBER函式
ROW_NUMBER()從1開始,按照順序,生成分組內記錄的序列
4、RANK和DENSE_RANK函式
RANK()生成資料項在分組中的排名,排名相等會在名次中留下空位
DENSE_RANK()生成資料項在分組中的排名,排名相等在名次中不會留下空位
5、CUME_DIST函式
CUME_DIST()回傳小于等于當前值的行數/分組內總行數
6、PERCENT_RANK函式
PERCENT_RANK分組當前行的rank值-1/分組內總函式-1
7、LAG和LEAD函式
LAG(col,n,DEFAULT)用于統計視窗內往上第n行值
LEAD(col,n,DEFAULT)用于統計視窗內往下第n行值
col:列名 n:往上第n行 DEFALUT:往上第n行為NULL時,取默認值,不指定為NULL
8、FIRST_VALUE和LAST_VALUE函式
FIRST_VALUE()取分組內排序后,截止到當前行第一個值
LAST_VALUE()取分組內排序后,截止到當前行最后一個值
Hive優化
-- 盡可能減少查詢和運算程序中的資料量
磁區、分桶、查詢列不要使用*、先篩選再聚合和連接表,
-- 修改表格存盤的結構和壓縮的方法
小表:textfile gzip
中大表:orc zlib
-- 設定不同的map和reduce數量
-- 有一些不同的hive資料庫的set開關
aggr 聚合開關
parallel 并行開關等
Hive 表關聯查詢,如何解決資料傾斜的問題
1)傾斜原因:map 輸出資料按 key Hash 的分配到 reduce 中,由于 key 分布不均勻、業務資料本身的特、建表時考慮不周、等原因造成的 reduce 上的資料量差異過大,
(1)key 分布不均勻;
(2)業務資料本身的特性;
(3)建表時考慮不周;
(4)某些 SQL 陳述句本身就有資料傾斜;
如何避免:對于 key 為空產生的資料傾斜,可以對其賦予一個隨機值,
2)解決方案
(1)引數調節:
hive.map.aggr = true
hive.groupby.skewindata=https://www.cnblogs.com/dream-come-true/archive/2023/05/13/true
有資料傾斜的時候進行負載均衡,當選項設定位 true,生成的查詢計劃會有兩個 MR Job,第一個 MR Job 中,Map 的輸出結果集合會隨機分布到 Reduce中,每個 Reduce 做部分聚合操作,并輸出結果,這樣處理的結果是相同的Group By Key 有可能被分發到不同的 Reduce 中,從而達到負載均衡的目的;第二個 MR Job 再根據預處理的資料結果按照 Group By Key 分布到 Reduce 中(這個程序可以保證相同的 Group By Key 被分布到同一個 Reduce 中),最后完成最終的聚合操作,
(2)SQL 陳述句調節:
① 選用 join key 分布最均勻的表作為驅動表,做好列裁剪和 filter 操作,以達到兩表做 join 的時候,資料量相對變小的效果,
② 大小表 Join:
使用 map join 讓小的維度表(1000 條以下的記錄條數)先進記憶體,在map 端完成 reduce,
③ 大表 Join 大表: 把空值的 key 變成一個字串加上亂數,把傾斜的資料分到不同的reduce 上,由于 null 值關聯不上,處理后并不影響最終結果,
④ count distinct 大量相同特殊值: count distinct 時,將值為空的情況單獨處理,如果是計算 countdistinct,可以不用處理,直接過濾,在最后結果中加 1,如果還有其他計算,需要進行group by,可以先將值為空的記錄單獨處理,再和其他計算結果進行 union.
補充:
1.Hive的主要特點是什么?
Hive是一個基于Hadoop的資料倉庫工具,它能夠將結構化資料映射到Hadoop的分布式存盤中,Hive的主要特點包括:
支持SQL查詢語言,使得非專業人員也能夠使用Hadoop進行資料查詢和分析,
支持MapReduce任務,可以將查詢轉化為MapReduce任務,加速查詢效率,
可以與其他Hadoop生態系統工具(如HBase和Spark)無縫集成,
2.Hive中的磁區是什么?
Hive中的磁區是將資料按照指定的列進行分組管理的一種機制,磁區可以提高查詢效率,因為查詢只需要掃描指定磁區的資料,而不需要掃描整個資料集,
例如,可以將一張表按照日期列分為不同的磁區,每個磁區包含該日期的所有資料,這樣,當查詢某個日期的資料時,只需要掃描該磁區,而不需要掃描整個表,
3.Hive中的Bucket是什么?
Hive中的Bucket是將資料按照指定列的值進行劃分為多個部分,每個部分稱為一個Bucket,Bucket可以提高資料查詢的效率,因為Hive可以在查詢時只掃描特定的Bucket,而不是整個資料集,
例如,可以將一張表按照用戶ID列進行Bucket操作,將用戶ID相同的資料放在同一個Bucket中,這樣,在查詢某個用戶ID的資料時,只需要掃描該Bucket,而不需要掃描整個表,
4.Hive中的UDF是什么?有哪些型別?
UDF(User Defined Function)是用戶自定義函式,可以在Hive中自定義函式來滿足特定的查詢需求,Hive中的UDF分為以下幾類:
內置函式:Hive自帶的函式,如數學函式、字串函式等,
簡單自定義函式:用戶自己撰寫的簡單函式,可以使用Java或Python撰寫,
復雜自定義函式:用戶自己撰寫的復雜函式,需要繼承Hive UDF類并實作指定的方法,
5.Hive中的Join有哪些型別?
Hive中的Join有以下幾種型別:
Map-side Join:當一個表很小,可以將其全部加載到記憶體中時,可以使用Map-side Join,這種Join不需要Shuffle和Reduce操作,因此效率較高,
Reduce-side Join:當一個表很大,不能全部加載到記憶體中時,需要使用Reduce-side Join,這種Join需要進行Shuffle和Reduce操作,因此效率較低,
Semi Join:當只需要回傳某個表中滿足條件的記錄時,可以使用Semi Join,這種Join只回傳一個表中符合條件的記錄,而不回傳另一個表的資料,
Map Join:當一個表很小,但是由于其它原因不能使用Map-side Join時,可以使用Map Join,這種Join將小表加載到記憶體中,然后將大表切分為多個部分,每個部分與小表進行Join操作,這種Join能夠充分利用記憶體,因此效率較高,
4個By:
(1)Order By
全域排序,只有一個Reducer,
(2)Sort By
磁區內有序,其在資料進入 reducer 前完成排序
(3)Distrbute By
類似MR中Partition,進行磁區,結合sort by使用,按照指定的欄位對資料進行劃分輸出到不同的 reduce 中,
(4) Cluster By
當Distribute by和Sorts by欄位相同時,可以使用Cluster by方式,Cluster by除了具有Distribute by的功能外還兼具Sort by的功能,但是排序只能是升序排序,不能指定排序規則為ASC或者DESC,在生產環境中Order By用的比較少,容易導致OOM,
在生產環境中Sort By+ Distrbute By用的多
本文來自博客園,作者:JD_L,轉載請注明原文鏈接:https://www.cnblogs.com/dream-come-true/p/17397608.html
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/552402.html
標籤:其他
下一篇:返回列表
