版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
高頻java大數(shù)據(jù)面試題及答案Hadoop中MapReduce的核心執(zhí)行流程是怎樣的?如何處理數(shù)據(jù)傾斜問題?MapReduce執(zhí)行流程主要分為輸入分片、Map階段、Shuffle階段、Reduce階段和輸出結(jié)果。輸入階段,HDFS文件被劃分為多個(gè)InputSplit(默認(rèn)128MB),每個(gè)Split由一個(gè)Map任務(wù)處理。Map函數(shù)讀取Split中的鍵值對(duì),經(jīng)過處理輸出中間鍵值對(duì),這些數(shù)據(jù)會(huì)先寫入內(nèi)存緩沖區(qū)(默認(rèn)100MB),當(dāng)緩沖區(qū)達(dá)到80%閾值時(shí)觸發(fā)溢寫,溢寫前會(huì)按Key進(jìn)行分區(qū)(默認(rèn)HashPartitioner)和排序(快速排序)。多個(gè)溢寫文件最終合并為一個(gè)大的排序文件。Shuffle階段,Reduce任務(wù)通過HTTP拉取對(duì)應(yīng)分區(qū)的Map輸出數(shù)據(jù),合并后按Key排序(歸并排序),相同Key的Value被分組后傳遞給Reduce函數(shù)處理。最終Reduce輸出結(jié)果寫入HDFS。數(shù)據(jù)傾斜通常表現(xiàn)為部分Reduce任務(wù)運(yùn)行緩慢或內(nèi)存溢出,根本原因是Key分布不均。處理方法包括:1)預(yù)處理階段對(duì)傾斜Key添加隨機(jī)前綴(如0-9的隨機(jī)數(shù)),將數(shù)據(jù)分散到多個(gè)Reduce,待處理完成后去除前綴合并結(jié)果;2)在Map階段使用Combiner提前聚合,減少Shuffle數(shù)據(jù)量;3)調(diào)整分區(qū)策略,自定義Partitioner根據(jù)業(yè)務(wù)規(guī)則(如高頻Key單獨(dú)分區(qū));4)設(shè)置hive.map.aggr=true(Hive場(chǎng)景)開啟Map端聚合;5)對(duì)于極端傾斜場(chǎng)景,可將傾斜Key單獨(dú)處理,剩余數(shù)據(jù)正常處理后合并。HDFS的架構(gòu)設(shè)計(jì)中,NameNode和DataNode的職責(zé)分別是什么?如何保證NameNode的高可用?NameNode是HDFS的主節(jié)點(diǎn),負(fù)責(zé)管理文件系統(tǒng)元數(shù)據(jù)(如文件目錄結(jié)構(gòu)、塊與文件的映射、塊的位置信息),處理客戶端的讀寫請(qǐng)求,協(xié)調(diào)DataNode的塊復(fù)制和均衡。DataNode是從節(jié)點(diǎn),負(fù)責(zé)存儲(chǔ)實(shí)際數(shù)據(jù)塊(默認(rèn)128MB),執(zhí)行塊的讀寫操作,定期向NameNode發(fā)送心跳(3秒一次)和塊報(bào)告(每小時(shí)一次),匯報(bào)自身存儲(chǔ)的塊信息。NameNode高可用通過HA(HighAvailability)方案實(shí)現(xiàn),核心是雙NameNode(Active/Standby)架構(gòu)。ActiveNameNode處理用戶請(qǐng)求,Standby作為熱備實(shí)時(shí)同步元數(shù)據(jù)。元數(shù)據(jù)同步通過JournalNode集群(通常3或5個(gè)節(jié)點(diǎn))實(shí)現(xiàn),Active將修改操作寫入JournalNode,Standby從JournalNode讀取并應(yīng)用這些修改,保證兩者元數(shù)據(jù)一致。當(dāng)Active故障時(shí),ZooKeeper觸發(fā)故障轉(zhuǎn)移,通過ZooKeeperFailoverController(ZKFC)檢測(cè)NameNode狀態(tài),選舉Standby為新的Active。此外,DataNode需要同時(shí)向兩個(gè)NameNode發(fā)送心跳和塊報(bào)告,確保Standby掌握最新的塊位置信息。Spark中RDD的持久化(Cache/Persist)和Checkpoint的區(qū)別是什么?如何選擇使用?RDD持久化(Cache/Persist)是將RDD計(jì)算結(jié)果存儲(chǔ)在內(nèi)存或磁盤中,避免重復(fù)計(jì)算。Cache是Persist的簡(jiǎn)化版,默認(rèn)存儲(chǔ)級(jí)別為MEMORY_ONLY(內(nèi)存存儲(chǔ),未序列化)。Persist支持更多存儲(chǔ)級(jí)別(如MEMORY_AND_DISK、DISK_ONLY、MEMORY_ONLY_SER等),可根據(jù)內(nèi)存大小選擇是否序列化或落盤。持久化數(shù)據(jù)在RDD的Lineage(血緣關(guān)系)中仍然保留,當(dāng)部分分區(qū)數(shù)據(jù)丟失時(shí),可通過Lineage重新計(jì)算恢復(fù)。Checkpoint是將RDD數(shù)據(jù)寫入HDFS等可靠存儲(chǔ),切斷RDD的Lineage。Checkpoint后,RDD的依賴關(guān)系被替換為Checkpoint文件路徑,即使后續(xù)父RDD數(shù)據(jù)丟失,也可直接從Checkpoint文件恢復(fù),避免長(zhǎng)鏈Lineage重新計(jì)算的高開銷。選擇策略:對(duì)于Lineage較短、計(jì)算成本低的RDD,使用Cache/Persist即可;對(duì)于Lineage較長(zhǎng)(如多次轉(zhuǎn)換的復(fù)雜計(jì)算)、計(jì)算成本高(如大量Shuffle)的RDD,建議使用Checkpoint。實(shí)際應(yīng)用中可結(jié)合使用:先Cache加速臨時(shí)計(jì)算,再Checkpoint持久化關(guān)鍵節(jié)點(diǎn),兼顧性能與可靠性。Flink的時(shí)間語義有哪幾種?如何處理亂序事件數(shù)據(jù)?Flink支持三種時(shí)間語義:事件時(shí)間(EventTime)、處理時(shí)間(ProcessingTime)、攝入時(shí)間(IngestionTime)。事件時(shí)間是數(shù)據(jù)本身攜帶的時(shí)間戳(如日志提供時(shí)間),處理時(shí)間是數(shù)據(jù)被Flink算子處理的系統(tǒng)時(shí)間,攝入時(shí)間是數(shù)據(jù)進(jìn)入Flink數(shù)據(jù)源的時(shí)間(介于事件時(shí)間和處理時(shí)間之間,由Source自動(dòng)分配時(shí)間戳)。處理亂序事件數(shù)據(jù)時(shí),通?;谑录r(shí)間,結(jié)合水?。╓atermark)機(jī)制和延遲數(shù)據(jù)處理策略。水印是一個(gè)時(shí)間戳,表示“當(dāng)前時(shí)間之前的所有事件都已到達(dá)”,算子根據(jù)水印觸發(fā)窗口計(jì)算。水印提供策略可選擇周期性提供(默認(rèn)200ms)或標(biāo)點(diǎn)提供(基于事件觸發(fā))。對(duì)于亂序數(shù)據(jù),需設(shè)置水印的延遲時(shí)間(如watermark=eventTime5秒),允許事件遲到5秒。若仍有延遲數(shù)據(jù),可通過窗口的allowedLateness屬性設(shè)置額外延遲(如再等待30秒),或使用sideOutputLateData將延遲數(shù)據(jù)輸出到側(cè)流單獨(dú)處理。例如,計(jì)算每10分鐘窗口的訂單金額,事件時(shí)間可能因網(wǎng)絡(luò)延遲導(dǎo)致亂序。設(shè)置水印延遲5秒,窗口觸發(fā)時(shí)等待5秒確保大部分?jǐn)?shù)據(jù)到達(dá);若仍有遲到數(shù)據(jù),通過allowedLateness(30.seconds)讓窗口再保留30秒,接收遲到數(shù)據(jù)并更新結(jié)果;超過30秒的延遲數(shù)據(jù)則發(fā)送到側(cè)流,由下游單獨(dú)處理。分布式系統(tǒng)中,CAP定理的具體含義是什么?HBase和ZooKeeper分別滿足哪些特性?CAP定理指出,分布式系統(tǒng)無法同時(shí)滿足一致性(Consistency)、可用性(Availability)、分區(qū)容錯(cuò)性(PartitionTolerance),最多滿足其中兩個(gè)。一致性指所有節(jié)點(diǎn)在同一時(shí)間看到相同的數(shù)據(jù);可用性指每次請(qǐng)求都能收到非錯(cuò)誤的響應(yīng);分區(qū)容錯(cuò)性指系統(tǒng)在網(wǎng)絡(luò)分區(qū)(節(jié)點(diǎn)間通信中斷)時(shí)仍能繼續(xù)運(yùn)行。HBase是Hadoop生態(tài)中的分布式列式數(shù)據(jù)庫,設(shè)計(jì)上優(yōu)先滿足AP(可用性、分區(qū)容錯(cuò)性),同時(shí)通過版本控制和WAL(預(yù)寫日志)實(shí)現(xiàn)最終一致性。當(dāng)網(wǎng)絡(luò)分區(qū)發(fā)生時(shí),HBase允許不同RegionServer上的副本暫時(shí)不一致,但通過RegionServer恢復(fù)或主RegionServer協(xié)調(diào),最終所有副本會(huì)達(dá)成一致。ZooKeeper是分布式協(xié)調(diào)服務(wù),優(yōu)先滿足CP(一致性、分區(qū)容錯(cuò)性)。ZooKeeper使用ZAB(ZooKeeperAtomicBroadcast)協(xié)議保證主從節(jié)點(diǎn)的數(shù)據(jù)一致性,當(dāng)網(wǎng)絡(luò)分區(qū)導(dǎo)致主節(jié)點(diǎn)不可達(dá)時(shí),會(huì)暫停服務(wù)并進(jìn)行l(wèi)eader選舉,直到新leader當(dāng)選且多數(shù)節(jié)點(diǎn)同步完成后才恢復(fù)服務(wù),因此在分區(qū)期間可能犧牲可用性以保證一致性。Java并發(fā)包中ConcurrentHashMap在JDK7和JDK8中的實(shí)現(xiàn)有何不同?JDK7的ConcurrentHashMap采用分段鎖(Segment)機(jī)制,繼承ReentrantLock。內(nèi)部結(jié)構(gòu)是Segment數(shù)組(默認(rèn)16個(gè)),每個(gè)Segment包含一個(gè)HashEntry數(shù)組。當(dāng)操作某個(gè)桶時(shí),僅需鎖定對(duì)應(yīng)的Segment,不同Segment可并行操作,并發(fā)度為Segment數(shù)量。put操作時(shí),先計(jì)算key的哈希值定位Segment,嘗試獲取鎖(可重入),然后在Segment內(nèi)部的HashEntry數(shù)組中進(jìn)行鏈表操作(頭插法)。JDK8的ConcurrentHashMap摒棄了分段鎖,采用synchronized+CAS的實(shí)現(xiàn)方式。結(jié)構(gòu)上使用Node數(shù)組+鏈表/紅黑樹(當(dāng)鏈表長(zhǎng)度≥8且數(shù)組長(zhǎng)度≥64時(shí)轉(zhuǎn)為紅黑樹)。put操作時(shí),首先通過CAS嘗試插入節(jié)點(diǎn)(如果該位置為空);若沖突,則使用synchronized鎖定該位置的頭節(jié)點(diǎn),然后遍歷鏈表或紅黑樹進(jìn)行插入或更新。紅黑樹的引入提升了查找效率(O(logn)vs鏈表O(n))。此外,JDK8的size計(jì)算通過CounterCell數(shù)組分散計(jì)數(shù),避免了JDK7中遍歷所有Segment累加的高開銷,通過CAS更新CounterCell的值,統(tǒng)計(jì)時(shí)累加所有CounterCell和baseCount。Hive的HQL查詢中,如何優(yōu)化大表關(guān)聯(lián)?常見的優(yōu)化手段有哪些?Hive大表關(guān)聯(lián)優(yōu)化需從數(shù)據(jù)分布、執(zhí)行計(jì)劃、資源配置等多維度入手:1.小表前置:將小表放在JOIN的左邊,Hive會(huì)將左表加載到內(nèi)存,通過MapJoin(無需Shuffle)與右表關(guān)聯(lián)。需開啟hive.auto.convert.join=true(默認(rèn)開啟),并設(shè)置hive.mapjoin.smalltable.filesize(默認(rèn)25MB)調(diào)整小表閾值。2.分桶表優(yōu)化:對(duì)關(guān)聯(lián)字段分桶,且桶數(shù)成倍數(shù)關(guān)系(如大表100桶,小表10桶),Hive可通過BucketJoin直接按桶關(guān)聯(lián),減少掃描數(shù)據(jù)量。需開啟hive.optimize.bucketmapjoin=true。3.傾斜字段處理:對(duì)于關(guān)聯(lián)Key傾斜(如某Key出現(xiàn)次數(shù)占比90%),可通過以下方式:拆分傾斜Key:將傾斜Key和非傾斜Key分開處理,如WHEREkeyIN(傾斜值)和WHEREkeyNOTIN(傾斜值),分別關(guān)聯(lián)后UNIONALL;隨機(jī)前綴:對(duì)大表的傾斜Key添加隨機(jī)數(shù)(如0-9),小表復(fù)制10份并添加相同前綴,關(guān)聯(lián)后去除前綴;設(shè)置hive.skewjoin.key(默認(rèn)100000),當(dāng)單個(gè)Key的行數(shù)超過該值時(shí),自動(dòng)拆分任務(wù)。4.調(diào)整并行度:通過setmapred.reduce.tasks或hive.exec.reducers.bytes.per.reducer(默認(rèn)1GB)調(diào)整Reduce數(shù)量,避免Reduce數(shù)過少導(dǎo)致單節(jié)點(diǎn)壓力大。5.開啟壓縮:設(shè)置press=true,使用Snappy或LZ4壓縮中間數(shù)據(jù),減少磁盤IO和網(wǎng)絡(luò)傳輸。6.避免全表掃描:通過分區(qū)過濾(WHEREdt='2024-01-01')、列裁剪(SELECTa,b而非)減少數(shù)據(jù)量。Spark的Shuffle過程中,HashShuffle與SortShuffle的區(qū)別是什么?如何優(yōu)化SortShuffle?HashShuffle在早期版本(<1.2)中使用,每個(gè)Map任務(wù)為每個(gè)Reduce任務(wù)提供一個(gè)數(shù)據(jù)文件(總文件數(shù)=Map數(shù)×Reduce數(shù)),當(dāng)Map和Reduce數(shù)量較大時(shí)(如各1000個(gè)),會(huì)產(chǎn)生百萬級(jí)小文件,嚴(yán)重影響磁盤IO和內(nèi)存。SortShuffle(1.2+默認(rèn))優(yōu)化了文件提供方式,每個(gè)Map任務(wù)提供一個(gè)或兩個(gè)數(shù)據(jù)文件(數(shù)據(jù)文件+索引文件)。當(dāng)Reduce數(shù)≤spark.shuffle.sort.bypassMergeThreshold(默認(rèn)200)時(shí),使用Bypass模式(類似HashShuffle,但最終合并為一個(gè)文件);否則,Map任務(wù)對(duì)所有數(shù)據(jù)按PartitionID排序,相同Partition的數(shù)據(jù)連續(xù)存儲(chǔ),提供一個(gè)數(shù)據(jù)文件和一個(gè)索引文件(記錄各Partition在數(shù)據(jù)文件中的偏移量),Reduce任務(wù)通過索引文件快速定位所需數(shù)據(jù)。SortShuffle的優(yōu)化手段包括:1.調(diào)整shuffle分區(qū)數(shù):通過spark.sql.shuffle.partitions(默認(rèn)200)控制Reduce端的分區(qū)數(shù),避免分區(qū)過多導(dǎo)致小文件問題;2.開啟合并文件:設(shè)置spark.shuffle.consolidateFiles=true(默認(rèn)true),合并同一Core上的Map任務(wù)的Shuffle文件,減少文件數(shù)量;3.使用外部排序:當(dāng)內(nèi)存不足時(shí),SortShuffle會(huì)將數(shù)據(jù)溢寫到磁盤,通過調(diào)整spark.shuffle.memoryFraction(默認(rèn)0.2)增加Shuffle內(nèi)存占比,減少溢寫次數(shù);4.選擇高效序列化:使用Kryo序列化(spark.serializer=org.apache.spark.serializer.KryoSerializer)替代默認(rèn)的Java序列化,減少數(shù)據(jù)大小,提升網(wǎng)絡(luò)傳輸效率;5.啟用ShuffleService:配置獨(dú)立的ShuffleService(需啟動(dòng)spark.shuffle.service.enabled),避免Map任務(wù)結(jié)束后釋放Executor導(dǎo)致Shuffle文件丟失,提升可靠性。Flink的狀態(tài)管理中,狀態(tài)后端(StateBackend)有哪幾種類型?如何選擇?Flink支持三種狀態(tài)后端:1.MemoryStateBackend:默認(rèn)后端,狀態(tài)存儲(chǔ)在TaskManager的JVM堆內(nèi)存中。檢查點(diǎn)(Checkpoint)時(shí),狀態(tài)數(shù)據(jù)和元數(shù)據(jù)寫入JobManager的內(nèi)存(默認(rèn)最大5MB)。適用于小狀態(tài)、測(cè)試或開發(fā)場(chǎng)景,生產(chǎn)環(huán)境不建議使用(狀態(tài)過大時(shí)JobManager內(nèi)存易溢出)。2.FsStateBackend:狀態(tài)存儲(chǔ)在TaskManager的堆內(nèi)存中,檢查點(diǎn)時(shí)將狀態(tài)快照寫入外部文件系統(tǒng)(如HDFS、S3),元數(shù)據(jù)存儲(chǔ)在JobManager內(nèi)存(或配置為寫入文件系統(tǒng))。適用于中大型狀態(tài)(如數(shù)千萬條目),狀態(tài)在內(nèi)存中快速訪問,Checkpoint時(shí)持久化到可靠存儲(chǔ),平衡了性能與可靠性。3.RocksDBStateBackend:狀態(tài)存儲(chǔ)在本地RocksDB(嵌入式KV數(shù)據(jù)庫,磁盤存儲(chǔ)),檢查點(diǎn)時(shí)將RocksDB的SST文件或增量日志上傳到外部文件系統(tǒng)。適用于超大型狀態(tài)(數(shù)億至數(shù)十億條目),通過磁盤擴(kuò)展內(nèi)存限制,但讀寫延遲高于內(nèi)存(RocksDB通過LSM樹優(yōu)化)。支持增量Checkpoint(spark.state.backend.incremental=true),僅上傳自上次Checkpoint以來的增量數(shù)據(jù),減少網(wǎng)絡(luò)傳輸量。選擇策略:小狀態(tài)(<100MB)用MemoryStateBackend;中狀態(tài)(100MB-10GB)用FsStateBackend;超大型狀態(tài)(>10GB)或需要增量Checkpoint用RocksDBStateBackend。需注意,RocksDB的性能依賴磁盤IO,建議使用SSD;FsStateBackend需確保外部文件系統(tǒng)(如HDFS)的低延遲訪問。Java的JVM調(diào)優(yōu)中,如何選擇垃圾回收器?G1與CMS的主要區(qū)別是什么?JVM垃圾回收器的選擇需結(jié)合應(yīng)用場(chǎng)景(內(nèi)存大小、響應(yīng)時(shí)間要求、吞吐量):SerialGC(-XX:+UseSerialGC):?jiǎn)尉€程回收,STW時(shí)間長(zhǎng),適用于小內(nèi)存(<1GB)、單CPU的客戶端應(yīng)用;ParallelGC(-XX:+UseParallelGC):多線程回收,關(guān)注吞吐量(CPU用于垃圾回收的時(shí)間占比),適用于計(jì)算密集型、對(duì)響應(yīng)時(shí)間不敏感的后臺(tái)任務(wù);CMSGC(-XX:+UseConcMarkSweepGC):并發(fā)標(biāo)記清除,關(guān)注低延遲(STW時(shí)間短),適用于Web應(yīng)用(如Tomcat),但存在內(nèi)存碎片、浮動(dòng)垃圾問題;G1GC(-XX:+UseG1GC):區(qū)域化分代,兼顧吞吐量和低延遲,適用于大內(nèi)存(>4GB)、需要更可預(yù)測(cè)停頓時(shí)間的應(yīng)用(如大數(shù)據(jù)處理)。G1與CMS的主要區(qū)別:1.內(nèi)存劃分:CMS基于傳統(tǒng)分代(年輕代Eden/Survivor,老年代),G1將堆劃分為多個(gè)大小相等的Region(默認(rèn)2MB-32MB),部分Region作為Eden、Survivor,部分作為Old,還有HumongousRegion(存儲(chǔ)大對(duì)象,>50%Region大?。?;2.回收策略:CMS專注于老年代回收,采用標(biāo)記-清除算法;G1通過全局并發(fā)標(biāo)記(ConcurrentMarking)確定各Region的存活對(duì)象,優(yōu)先回收垃圾多的Region(Garbage-First),使用標(biāo)記-復(fù)制算法(存活對(duì)象復(fù)制到新Region,原Region清空),減少內(nèi)存碎片;3.停頓控制:CMS的STW時(shí)間隨老年代大小增加而增長(zhǎng);G1通過-XX:MaxGCPauseMillis(默認(rèn)200ms)控制最大停頓時(shí)間,動(dòng)態(tài)調(diào)整回收的Region數(shù)量,更適合大內(nèi)存場(chǎng)景;4.并發(fā)階段:CMS的并發(fā)標(biāo)記可能產(chǎn)生浮動(dòng)垃圾(標(biāo)記后新產(chǎn)生的垃圾),需預(yù)留老年代空間(-XX:CMSInitiatingOccupancyFraction);G1的并發(fā)標(biāo)記更高效,且復(fù)制算法避免了內(nèi)存碎片,減少FullGC頻率。HBase的RowKey設(shè)計(jì)原則有哪些?如何避免熱點(diǎn)問題?HBase的RowKey是數(shù)據(jù)的唯一標(biāo)識(shí),直接影響數(shù)據(jù)分布、查詢效率和熱點(diǎn)問題。設(shè)計(jì)原則:1.散列性:RowKey需均勻分布,避免相同前綴的數(shù)據(jù)集中在同一RegionServer。常見方法是反轉(zhuǎn)(如將時(shí)間戳1690000000反轉(zhuǎn)為00000000961)、加鹽(添加隨機(jī)數(shù)或哈希值前綴);2.有序性:HBase按RowKey字典序存儲(chǔ),可利用這一特性設(shè)計(jì)時(shí)間戳、ID等有序字段作為后綴,便于范圍查詢(如scanstartRow=’user_20240101’,endRow=’user_20240131’);3.長(zhǎng)度適中:RowKey過長(zhǎng)會(huì)增加存儲(chǔ)和內(nèi)存占用(HBase元數(shù)據(jù)也會(huì)存儲(chǔ)RowKey),建議不超過16字節(jié)(如UUID取前16位);4.業(yè)務(wù)相關(guān)性:結(jié)合查詢場(chǎng)景,將高頻查詢條件(如用戶ID、訂單類型)作為RowKey的前綴,避免全表掃描。避免熱點(diǎn)的方法:加鹽哈希:對(duì)RowKey的部分字段(如用戶ID)進(jìn)行哈希(如MD5取前幾位),作為前綴分散數(shù)據(jù);反轉(zhuǎn)時(shí)間戳:將時(shí)間戳(如yyyyMMddHHmmss)反轉(zhuǎn),使最近的數(shù)據(jù)不會(huì)集中在一個(gè)Region(原時(shí)間戳大的RowKey會(huì)排在后面,反轉(zhuǎn)后變?yōu)樾〉那熬Y);預(yù)分區(qū):創(chuàng)建表時(shí)預(yù)先劃分Region(通過create‘table’,‘cf’,SPLITS=>[‘001’,‘002’,‘003’]),指定RowKey的分割點(diǎn),避免數(shù)據(jù)集中在初始Region;復(fù)合RowKey:組合多維度字段(如user_id+order_time+random_suffix),分散相同user_id的請(qǐng)求到不同Region。例如,用戶行為日志的RowKey可設(shè)計(jì)為hash(user_id)%100+“_”+user_id+“_”+reverse(timestamp),前兩位哈希值分散用戶請(qǐng)求,中間用戶ID便于單用戶查詢,反轉(zhuǎn)時(shí)間戳使近期日志分布在不同Region。SparkSQL中DataFrame與RDD的區(qū)別是什么?為什么推薦使用DataFrame?RDD(ResilientDistributedDataset)是Spark的核心抽象,存儲(chǔ)無結(jié)構(gòu)化的Java/Scala對(duì)象,用戶需自行定義操作邏輯,類型安全但缺乏數(shù)據(jù)結(jié)構(gòu)信息。DataFrame是RDD的擴(kuò)展,存儲(chǔ)結(jié)構(gòu)化的Row對(duì)象(類似關(guān)系型數(shù)據(jù)庫的表),帶有Schema信息(列名、數(shù)據(jù)類型)。推薦使用DataFrame的原因:1.優(yōu)化執(zhí)行計(jì)劃:DataFrame通過Catalyst優(yōu)化器提供物理執(zhí)行計(jì)劃,自動(dòng)優(yōu)化查詢(如謂詞下推、列裁剪、公共子表達(dá)式消除),比手動(dòng)RDD操作更高效;2.結(jié)構(gòu)化處理:Schema信息支持類似SQL的操作(如select、filter、groupBy),代碼更簡(jiǎn)潔(無需手動(dòng)解析對(duì)象字段);3.跨語言支持:DataFrame支持Scala、Java、Python、R等多語言API,且不同語言間操作邏輯一致;4.內(nèi)存優(yōu)化:DataFrame使用Tungsten內(nèi)存管理,以列式存儲(chǔ)(二進(jìn)制格式)替代RDD的對(duì)象存儲(chǔ),減少內(nèi)存占用(約1/3-1/5),提升緩存利用率;5.集成Hive:DataFrame可直接操作Hive表(通過SparkSession.sql(“SELECTFROMtable”)),支持Hive的UDF、分區(qū)等特性,無縫銜接數(shù)據(jù)倉庫。例如,統(tǒng)計(jì)用戶訂單數(shù)量,RDD需手動(dòng)解析元組并分組聚合:rdd.map(t=>(t(0),1)).reduceByKey(_+_)而DataFrame只需一行代碼:df.groupBy(“user_id”).count()Flink的Checkpoint與Savepoint的區(qū)別是什么?如何配置Checkpoint?Checkpoint是Flink自動(dòng)觸發(fā)的狀態(tài)快照,用于故障恢復(fù)(如TaskManager崩潰),依賴Flink的狀態(tài)后端(如FsStateBackend)存儲(chǔ)到臨時(shí)路徑。Checkpoint可配置間隔(如5分鐘)、超時(shí)時(shí)間(如10分鐘)、最大并發(fā)數(shù)(如1),支持增量Checkpoint(僅存儲(chǔ)變化部分)以減少開銷。Checkpoint的生命周期與作業(yè)綁定,作業(yè)取消時(shí)會(huì)被刪除(除非顯式保留)。Savepoint是用戶手動(dòng)觸發(fā)的狀態(tài)快照(通過flinksavepoint命令),用于作業(yè)升級(jí)、遷移或人為干預(yù)恢復(fù)。Savepoint使用與Checkpoint相同的快照機(jī)制,但存儲(chǔ)路徑由用戶指定(如HDFS),且不會(huì)被自動(dòng)刪除,可長(zhǎng)期保留。Savepoint包含完整的作業(yè)元數(shù)據(jù)(如算子ID、并行度),升級(jí)作業(yè)時(shí)需確保算子ID不變(或通過映射文件調(diào)整),避免狀態(tài)無法恢復(fù)。Checkpoint的配置步驟:1.啟用Checkpoint:env.enableCheckpointing(5000)(間隔5秒);2.設(shè)置Checkpoint模式:env.getCheckpointConfig().setCheckpointingMode(CheckpointingMode.EXACTLY_ONCE)(精確一次)或AT_LEAST_ONCE(至少一次);3.配置超時(shí)時(shí)間:setCheckpointTimeout(60000)(1分鐘);4.設(shè)置最大并發(fā)Checkpoint數(shù):setMaxConcurrentCheckpoints(1)(同一時(shí)間僅一個(gè)Checkpoint運(yùn)行);5.設(shè)置最小間隔:setMinPauseBetweenCheckpoints(1000)(兩次Checkpoint間隔至少1秒);6.設(shè)置外部持久化:setExternalizedCheckpointCleanup(ExternalizedCheckpointCleanup.RETAIN_ON_CANCELLATION)(作業(yè)取消時(shí)保留Checkpoint);7.選擇狀態(tài)后端:env.setStateBackend(newFsStateBackend(“hdfs://namenode:8020/checkpoints”))。分布式系統(tǒng)中,如何實(shí)現(xiàn)接口的冪等性?常見的解決方案有哪些??jī)绲刃灾付啻握{(diào)用同一接口與調(diào)用一次產(chǎn)生的結(jié)果相同。大數(shù)據(jù)場(chǎng)景中,消息重復(fù)消費(fèi)、接口重試等都需要冪等性保證。常見解決方案:1.唯一標(biāo)識(shí)(Token):請(qǐng)求時(shí)提供全局唯一的Token(如UUID),服務(wù)端記錄已處理的Token。收到請(qǐng)求時(shí)先檢查Token是否存在,存在則直接返回結(jié)果,否則處理并記錄Token。Token需存儲(chǔ)在分布式緩存(如Redis)或數(shù)據(jù)庫(需唯一索引)中,設(shè)置過期時(shí)間避免內(nèi)存泄漏。2.數(shù)據(jù)庫唯一約束:通過數(shù)據(jù)庫的唯一索引(如訂單號(hào)、業(yè)務(wù)ID)保證重復(fù)插入時(shí)拋出異常,服務(wù)端捕獲異常后返回成功。適用于插入操作,如用戶注冊(cè)(用戶名唯一)、訂單創(chuàng)建(訂單號(hào)唯一)。3.狀態(tài)機(jī)校驗(yàn):業(yè)務(wù)對(duì)象存在狀態(tài)流轉(zhuǎn)(如訂單狀態(tài):待支付→已支付→已完成),更新狀態(tài)時(shí)檢查當(dāng)前狀態(tài)是否允許轉(zhuǎn)換。例如,支付接口僅允許“待支付”狀態(tài)轉(zhuǎn)為“已支付”,重復(fù)調(diào)用時(shí)若狀態(tài)已變更則直接返回。4.悲觀鎖/樂觀鎖:悲觀鎖通過SELECTFORUPDATE鎖定記錄(數(shù)據(jù)庫行鎖),確保同一時(shí)間僅一個(gè)請(qǐng)求處理;樂觀鎖通過版本號(hào)(version字段)實(shí)現(xiàn),更新時(shí)檢查版本號(hào)是否匹配(UPDATESETcount=count+1,version=version+1WHEREid=1ANDversion=oldVersion),不匹配則重試。5.消息隊(duì)列去重:使用消息隊(duì)列(如Kafka)時(shí),消息包含唯一ID(MessageId),消費(fèi)者處理前檢查ID是否已消費(fèi)(通過Redis或DB記錄),避免重復(fù)處理。Kafka自身不保證冪等,但可結(jié)合消費(fèi)者的offset管理和去重邏輯實(shí)現(xiàn)。例如,訂單支付接口可采用“唯一Token+數(shù)據(jù)庫唯一索引”方案:前端提供Token并隨請(qǐng)求發(fā)送,服務(wù)端先查詢Redis是否存在該Token,不存在則提供訂單號(hào)(唯一索引)并插入數(shù)據(jù)庫,同時(shí)將Token存入Redis(過期時(shí)間30分鐘);若Token已存在,直接返回訂單結(jié)果。Hadoop的YARN調(diào)度器有哪幾種?FIFO、CapacityScheduler、FairScheduler的區(qū)別是什么?YARN支持三種調(diào)度器:FIFOScheduler(先進(jìn)先出)、CapacityScheduler(容量調(diào)度器,Hadoop默認(rèn))、FairScheduler(公平調(diào)度器)。FIFOScheduler:所有任務(wù)按提交順序在一個(gè)隊(duì)列中運(yùn)行,先提交的任務(wù)占用全部資源,后續(xù)任務(wù)等待。適用于單用戶、任務(wù)量小的場(chǎng)景,大任務(wù)會(huì)阻塞小任務(wù),無法滿足多用戶共享需求。CapacityScheduler:支持多隊(duì)列,每個(gè)隊(duì)列分配固定容量(如隊(duì)列A占40%,隊(duì)列B占60%),隊(duì)列內(nèi)部按FIFO調(diào)度。隊(duì)列可嵌套(如隊(duì)列A下分A1、A2子隊(duì)列),支持動(dòng)態(tài)調(diào)整容量(空閑資源可分配給其他隊(duì)列)。適用于多用戶、多業(yè)務(wù)線的場(chǎng)景(如生產(chǎn)、測(cè)試隊(duì)列分離),保證關(guān)鍵隊(duì)列的資源下限
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 安全員題庫模擬試題及答案
- 2026貴州省第二人民醫(yī)院招聘12人備考考試題庫及答案解析
- 2026廣東深圳大學(xué)藝術(shù)學(xué)部趙璐特聘教授團(tuán)隊(duì)博士后招聘1人備考考試題庫及答案解析
- 2026山東第一醫(yī)科大學(xué)附屬省立醫(yī)院(山東省立醫(yī)院)招聘高級(jí)崗位專業(yè)技術(shù)人員4人考試參考題庫及答案解析
- 2026新疆烏魯木齊富疆投資發(fā)展有限公司招聘5人備考考試試題及答案解析
- 2026湖北經(jīng)濟(jì)學(xué)院人才招聘35人考試參考試題及答案解析
- 2026寧夏泰和新材集團(tuán)股份有限公司招聘3人備考考試試題及答案解析
- 2026江西贛州市贛縣區(qū)韓坊鎮(zhèn)中心衛(wèi)生院招聘編外人員2人備考題庫含答案詳解
- 2025年下半年山東高速青島產(chǎn)業(yè)投資有限公司招聘5人備考題庫及1套完整答案詳解
- 2026年1月廣東廣州市天河區(qū)先烈東小學(xué)編外聘用制專任教師招聘1人備考題庫(體育)及答案詳解(考點(diǎn)梳理)
- 中華人民共和國(guó)職業(yè)分類大典是(專業(yè)職業(yè)分類明細(xì))
- 2025年中考英語復(fù)習(xí)必背1600課標(biāo)詞匯(30天記背)
- 資產(chǎn)管理部2025年工作總結(jié)與2025年工作計(jì)劃
- 科技成果轉(zhuǎn)化技術(shù)平臺(tái)
- 下腔靜脈濾器置入術(shù)的護(hù)理查房
- 基建人員考核管理辦法
- 2025體育與健康課程標(biāo)準(zhǔn)深度解讀與教學(xué)實(shí)踐
- 礦山救援器材管理制度
- 2025西南民族大學(xué)輔導(dǎo)員考試試題及答案
- T/CSPSTC 17-2018企業(yè)安全生產(chǎn)雙重預(yù)防機(jī)制建設(shè)規(guī)范
- 2025年《三級(jí)物業(yè)管理師》考試復(fù)習(xí)題(含答案)
評(píng)論
0/150
提交評(píng)論