大數(shù)據(jù)相關(guān)面試題每日五問(wèn)(二)
- 常見(jiàn)的窗口排序函數(shù)你知道哪些?說(shuō)一下他們各自作用。
- HDFS如何保證數(shù)據(jù)的可靠性和高可用性?它的副本機(jī)制是如何工作的?
- ES是如何保證數(shù)據(jù)高可用性的?如果一個(gè)節(jié)點(diǎn)宕機(jī),系統(tǒng)會(huì)如何處理?
- Hive表里的分桶有哪幾種形式,分桶與分區(qū)的區(qū)別?什么時(shí)候要去做分桶?
- Spark調(diào)優(yōu)思路?
常見(jiàn)的窗口排序函數(shù)你知道哪些?說(shuō)一下他們各自作用。
常見(jiàn)的窗口排序函數(shù)主要包括 ROW_NUMBER()、RANK()、DENSE_RANK()、NTILE() 等,它們常配合窗口函數(shù) OVER(PARTITION BY ... ORDER BY ...)
使用,作用是對(duì)分組內(nèi)的數(shù)據(jù)進(jìn)行排序和排名。ROW_NUMBER() 是最常用的,給每一行按順序分配唯一的序號(hào),不會(huì)出現(xiàn)重復(fù);RANK() 會(huì)對(duì)相同值的記錄賦相同名次,跳過(guò)后續(xù)名次(比如并列第 2,下一名是第 4);DENSE_RANK() 同樣對(duì)相同值的記錄賦相同名次,但不會(huì)跳過(guò)名次(并列第 2,下一名是第 3);NTILE(n) 是把分組內(nèi)的記錄按順序平均分成 n 份,為每行分配一個(gè)從 1 到 n 的桶編號(hào)。它們常用于如 TopN 查詢、分組內(nèi)排序、分位分析等場(chǎng)景,能在保留全部數(shù)據(jù)的同時(shí)進(jìn)行靈活排名。
HDFS如何保證數(shù)據(jù)的可靠性和高可用性?它的副本機(jī)制是如何工作的?
HDFS 通過(guò)副本機(jī)制來(lái)保證數(shù)據(jù)的可靠性和高可用性,每個(gè)文件被切分成多個(gè)塊(Block),每個(gè)塊默認(rèn)會(huì)在集群中存儲(chǔ) 3 個(gè)副本,分別保存在不同的 DataNode 上,從而避免因單點(diǎn)故障導(dǎo)致數(shù)據(jù)丟失。當(dāng)某個(gè)副本所在的節(jié)點(diǎn)宕機(jī)或數(shù)據(jù)損壞時(shí),NameNode 會(huì)感知并在其他健康節(jié)點(diǎn)上重新復(fù)制該副本,自動(dòng)修復(fù)數(shù)據(jù),確保副本數(shù)維持在配置值以上;同時(shí),HDFS 的 NameNode 雖然是管理元數(shù)據(jù)的核心,但通過(guò)配置 主備 NameNode(HA 高可用架構(gòu)),結(jié)合 Zookeeper 實(shí)現(xiàn)故障自動(dòng)切換,避免了單點(diǎn)故障風(fēng)險(xiǎn)。整體上,HDFS 通過(guò)副本冗余、故障感知、自愈機(jī)制和主備架構(gòu),保障了系統(tǒng)的穩(wěn)定性與數(shù)據(jù)安全。
ES是如何保證數(shù)據(jù)高可用性的?如果一個(gè)節(jié)點(diǎn)宕機(jī),系統(tǒng)會(huì)如何處理?
Elasticsearch 通過(guò)主分片和副本分片機(jī)制來(lái)實(shí)現(xiàn)數(shù)據(jù)的高可用性。每個(gè)索引的數(shù)據(jù)會(huì)被劃分為多個(gè)主分片(primary shard),并為每個(gè)主分片配置一個(gè)或多個(gè)副本分片(replica shard),這些分片分布在不同的節(jié)點(diǎn)上。當(dāng)一個(gè)節(jié)點(diǎn)宕機(jī)時(shí),集群中的 Master 節(jié)點(diǎn)會(huì)立即檢測(cè)到,并將其上的主分片的副本分片提升為新的主分片,繼續(xù)對(duì)外提供讀寫(xiě)服務(wù),同時(shí)將缺失的副本在其他節(jié)點(diǎn)上重新分配和恢復(fù),確保數(shù)據(jù)不丟失、服務(wù)不中斷。此外,Elasticsearch 的分布式架構(gòu)可以自動(dòng)進(jìn)行分片重分配、數(shù)據(jù)均衡和故障轉(zhuǎn)移,從而實(shí)現(xiàn)系統(tǒng)的自我修復(fù)和持續(xù)可用。
Hive表里的分桶有哪幾種形式,分桶與分區(qū)的區(qū)別?什么時(shí)候要去做分桶?
Hive 中的分桶是通過(guò)對(duì)某一列進(jìn)行哈希計(jì)算,再將數(shù)據(jù)平均分配到固定數(shù)量的桶中,常見(jiàn)形式是在建表時(shí)使用 CLUSTERED BY (列名) INTO N BUCKETS
來(lái)定義分桶。分桶和分區(qū)的主要區(qū)別在于:分區(qū)是將數(shù)據(jù)按目錄層級(jí)物理劃分,適用于大范圍數(shù)據(jù)的篩選,提升查詢效率;而分桶是在分區(qū)或全表內(nèi)部的進(jìn)一步劃分,提高了數(shù)據(jù)的分布均勻性和采樣、Join 的效率。通常在以下場(chǎng)景下需要使用分桶:一是當(dāng)需要對(duì)大表做 桶映射 Join(bucket map join),提升 Join 性能;二是在使用 抽樣查詢(tablesample) 時(shí)保證樣本均勻性;三是為了優(yōu)化數(shù)據(jù)傾斜問(wèn)題或提升并行度。簡(jiǎn)而言之,分區(qū)適用于大粒度的數(shù)據(jù)劃分,分桶適用于細(xì)粒度的數(shù)據(jù)優(yōu)化。
Spark調(diào)優(yōu)思路?
Spark 調(diào)優(yōu)的整體思路可以從 資源配置、并行度控制、Shuffle 優(yōu)化、緩存策略和代碼邏輯 五個(gè)方面入手。首先是資源配置,要合理設(shè)置 executor
的數(shù)量、內(nèi)存(executor-memory
)和 CPU 核數(shù)(executor-cores
),避免資源浪費(fèi)或不足;其次是并行度控制,通過(guò)設(shè)置 spark.sql.shuffle.partitions
或 RDD 的 repartition
來(lái)調(diào)整任務(wù)并行度,防止過(guò)多或過(guò)少的分區(qū)導(dǎo)致性能問(wèn)題;在 Shuffle 優(yōu)化 方面,要盡量減少 shuffle 操作,比如用 map-side join
或 broadcast join
替代大表 shuffle;對(duì)于 緩存策略,使用 persist
或 cache
緩存重用的中間結(jié)果,減少重復(fù)計(jì)算;最后,優(yōu)化 代碼邏輯,如避免冗余轉(zhuǎn)換、過(guò)濾盡量提前、少用寬依賴操作等,提升 DAG 執(zhí)行效率。調(diào)優(yōu)過(guò)程中還要結(jié)合 Spark UI 分析瓶頸,定位 Stage 執(zhí)行慢的具體原因,做到有的放矢。
#數(shù)據(jù)人的面試交流地#
努力找實(shí)習(xí)中,整理一些大數(shù)據(jù)相關(guān)面試題和大家分享,共同學(xué)習(xí)進(jìn)步,有建議或批評(píng)歡迎留言!