大數據面試(個人總結含答案)

来源:https://www.cnblogs.com/dream-come-true/archive/2023/05/13/17397608.html
-Advertisement-
Play Games

大數據面試題 Hadoop 分散式系統基礎架構,主要是為瞭解決海量數據的存儲和和海量數據的分析計算問題 Hadoop的特點 高可靠性:Hadoop底層維護多個數據副本,即使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=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


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 本文屬於OData系列文章 前文說到了 EDM 與 OData 之間的關係,具有 EDM 的 OData 提供了強大的查詢能力,但是 OData 並不必須要配置 EDM,我們也可以使用 Non-EDM 方案。 Non-EDM 所謂 Non-EDM ,並不是說在 OData 運行時不需要 EDM 配置 ...
  • 一:背景 1. 講故事 前段時間有位朋友找到我,說他 docker 中的web服務深夜cpu被打滿,讓我幫忙看一下,很多朋友問docker中怎麼抓dump,我一般都推薦使用 procdump 這款自動化工具,誰用誰知道,有了 dump 之後,接下來就是分析了。 二:WinDbg 分析 1. cpu ...
  • 在本文中,您將學習到新建字元串數組如何設置預設值。數組是可以使用索引訪問的相同類型的元素的集合。對於字元串數組,每個元素都是一個字元串值。在 C# 中創建新的字元串數組時,預設值為 null。但是,在某些情況下,您可能希望使用特定的預設值而不是 null 初始化字元串數組。例如,希望 Array 的 ...
  • 生成的代碼將和介面對應的參數、返回值一一對應,本文底層使用的工具為NSwag.exe,其他可替代的方案還有AutoSet.exe。 本文中生成的代碼將在編譯過程中自動編譯,類似grpc生成代碼的模式,如果使用AutoSet則需要手動引入代碼。 另外也可以使用NSwag對應的vs插件(https:// ...
  • LTSpice 是常用的電路模擬軟體, 但是只有 Windows 版本和 Mac 版本, 在 Linux 下需要用 Wine 運行. 以下說明如何在 Ubuntu 下安裝最新的 LTSpice 17.1.8 ...
  • 本文首發於公眾號:Hunter後端 原文鏈:Redis基礎命令彙總,看這篇就夠了 本篇筆記將彙總 Redis 基礎命令,包括幾個常用的通用命令,和各個類型的數據的操作,包括字元串、哈希、列表、集合、有序集合等在內的基本操作。 以下是本篇筆記目錄: 通用命令 字元串命令 哈希命令 列表命令 集合命令 ...
  • 部分概念: 1、在資料庫中產生數據不一致的根本原因是冗餘 2、一個事務對某數據加S鎖後,其它的事務不能對該數據加任何類型的鎖(錯誤):所謂S鎖,是事務T對數據A加上S鎖時,其他事務只能再對數據A加S鎖,而不能加X鎖,直到T釋放A上的S鎖 3、一個資料庫只有一個模式和一個內模式 4、使某個事務永遠處於 ...
  • 索引(基礎) 一、索引介紹 1.1、前言 在資料庫中,執行如下語句時: select * from emp where id=1000; mysql 是從第一條記錄開始遍歷,直至找到 id = 1000 的數據,然而這樣查詢的效率低,所以 mysql 允許通過建立索引來加快數據表的查詢和排序。 1. ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...