您好,登錄后才能下訂單哦!
這篇文章主要介紹“web大數(shù)據(jù)面試真題有哪些”,在日常操作中,相信很多人在web大數(shù)據(jù)面試真題有哪些問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對(duì)大家解答”web大數(shù)據(jù)面試真題有哪些”的疑惑有所幫助!接下來,請(qǐng)跟著小編一起來學(xué)習(xí)吧!
class Father{ static { System.out.println("Static Father"); } { System.out.println("Non-static Father"); } public Father(){ System.out.println("Constructor Father"); } } public class Son extends Father{ static { System.out.println("Static Son"); } { System.out.println("Non-static Son"); } public Son(){ System.out.println("Constructor Son"); } public static void main(String[] args) { System.out.println("First Son"); new Son(); System.out.println("Second Son"); new Son(); } }
運(yùn)行結(jié)果:
Static Father Static Son First Son Non-static Father Constructor Father Non-static Son Constructor Son Second Son Non-static Father Constructor Father Non-static Son Constructor Son
分析:
這道程序題考察的是Java中的靜態(tài)代碼塊、構(gòu)造代碼塊、構(gòu)造函數(shù)的概念。
靜態(tài)代碼塊 static {}:
隨著類的加載而執(zhí)行,即JVM加載類后就執(zhí)行,而且只執(zhí)行一次,執(zhí)行優(yōu)先級(jí)高于非靜態(tài)的初始化塊,它會(huì)在類初始化的時(shí)候執(zhí)行一次,執(zhí)行完成便銷毀,它僅能初始化類變量,即static修飾的數(shù)據(jù)成員。
非靜態(tài)代碼塊,也稱構(gòu)造代碼塊 {}:
執(zhí)行的時(shí)候如果有靜態(tài)代碼塊,先執(zhí)行靜態(tài)代碼塊再執(zhí)行非靜態(tài)代碼塊,在每個(gè)對(duì)象生成時(shí)都會(huì)被執(zhí)行一次,它可以初始化類的實(shí)例變量。非靜態(tài)代碼塊會(huì)在構(gòu)造函數(shù)執(zhí)行時(shí),在構(gòu)造函數(shù)主體代碼執(zhí)行之前被運(yùn)行。
構(gòu)造函數(shù):
對(duì)象一建立,就會(huì)調(diào)用與之相應(yīng)的構(gòu)造函數(shù),也就是說,不建立對(duì)象,構(gòu)造函數(shù)是不會(huì)運(yùn)行的。 一個(gè)對(duì)象建立,構(gòu)造函數(shù)只運(yùn)行一次,而一般方法可以被該對(duì)象調(diào)用多次。
再來看本題,程序運(yùn)行,執(zhí)行main()方法會(huì)先加載main()方法所在的類,加載 Son 類,但是 Son 類繼承自 Father 類,所以先加載父類,同時(shí)父類的靜態(tài)代碼塊執(zhí)行,然后加載 Son 類本身,Son 類自己的靜態(tài)代碼塊開始執(zhí)行,類加載完成之后執(zhí)行main()方法內(nèi)部的語句,打印 First Son,然后 new Son(),在創(chuàng)建對(duì)象時(shí)先構(gòu)造父類的對(duì)象,因?yàn)?strong>靜態(tài)代碼塊只在類加載時(shí)執(zhí)行一次,所以不再執(zhí)行,然后執(zhí)行父類的構(gòu)造代碼塊,構(gòu)造函數(shù),構(gòu)造代碼塊的優(yōu)先級(jí)大于構(gòu)造函數(shù)。然后在執(zhí)行 Son 對(duì)象本身。完成之后打印 Second Son,接著又 new Son(),重復(fù)以上步驟。構(gòu)造代碼塊和構(gòu)造函數(shù)在每次new的時(shí)候都會(huì)執(zhí)行一次。
答:通常我們定義一個(gè)基本數(shù)據(jù)類型的變量,一個(gè)對(duì)象的引用,還有就是函數(shù)調(diào)用的現(xiàn)場保存都使用內(nèi)存中的??臻g;而通過new關(guān)鍵字和構(gòu)造器創(chuàng)建的對(duì)象放在堆空間;程序中的字面量(literal)如直接書寫的100、“hello”和常量都是放在靜態(tài)存儲(chǔ)區(qū)中。??臻g操作最快但是也很小,通常大量的對(duì)象都是放在堆空間,整個(gè)內(nèi)存包括硬盤上的虛擬內(nèi)存都可以被當(dāng)成堆空間來使用。
String str = new String(“hello”);
上面的語句中str放在棧上,用new創(chuàng)建出來的字符串對(duì)象放在堆上,而“hello”這個(gè)字面量放在靜態(tài)存儲(chǔ)區(qū)。
補(bǔ)充:較新版本的Java中使用了一項(xiàng)叫“逃逸分析“的技術(shù),可以將一些局部對(duì)象放在棧上以提升對(duì)象的操作性能。(在 Java SE 6u23+ 開始支持,并默認(rèn)設(shè)置為啟用狀態(tài),可以不用額外加這個(gè)參數(shù)。)
答:方案 1:申請(qǐng) 512M 的內(nèi)存,512M是42億多 bit,一個(gè) bit 位代表一個(gè) unsigned int 值。讀入 40 億個(gè)數(shù),設(shè)置相應(yīng)的 bit 位,讀入要查詢的數(shù),查看相應(yīng) bit 位是否為 1,為 1 表示存在,為 0 表示不存在。
方案 2:這個(gè)問題在《編程珠璣》里有很好的描述,大家可以參考下面的思路,探討一下: 因?yàn)?2^32 為 42 億多,所以給定一個(gè)數(shù)可能在,也可能不在其中; 這里我們把 40 億個(gè)數(shù)中的每一個(gè)用 32 位的二進(jìn)制來表示 ,假設(shè)這 40 億個(gè)數(shù)開始放在一個(gè)文件中。 然后將這 40 億個(gè)數(shù)分成兩類:
最高位為 0
最高位為 1
并將這兩類分別寫入到兩個(gè)文件中,其中一個(gè)文件中數(shù)的個(gè)數(shù)<=20 億,而另一個(gè)>=20 億(相當(dāng)于折半); 與要查找的數(shù)的最高位比較并接著進(jìn)入相應(yīng)的文件再查找 然后再把這個(gè)文件為又分成兩類:
次最高位為 0
次最高位為 1
并將這兩類分別寫入到兩個(gè)文件中,其中一個(gè)文件中數(shù)的個(gè)數(shù)<=10 億,而另一個(gè)>=10 億(相當(dāng)于折半); 與要查找的數(shù)的次最高位比較并接著進(jìn)入相應(yīng)的文件再查找。 ..... 以此類推,就可以找到了,而且時(shí)間復(fù)雜度為 O(logn)。
答:
一個(gè) MapReduce 作業(yè)由 Map 階段和 Reduce 階段兩部分組成,這兩階段會(huì)對(duì)數(shù)據(jù)排序,從這個(gè)意義上說,MapReduce 框架本質(zhì)就是一個(gè) Distributed Sort。
在 Map 階段,Map Task 會(huì)在本地磁盤輸出一個(gè)按照 key 排序(采用的是快速排序)的文件(中間可能產(chǎn)生多個(gè)文件,但最終會(huì)合并成一個(gè)),在 Reduce 階段,每個(gè) Reduce Task 會(huì)對(duì)收到的數(shù)據(jù)排序(采用的是歸并排序),這樣,數(shù)據(jù)便按照 Key 分成了若干組,之后以組為單位交給 reduce 處理。
很多人的誤解在 Map 階段,如果不使用 Combiner 便不會(huì)排序,這是錯(cuò)誤的,不管你用不用 Combiner,Map Task 均會(huì)對(duì)產(chǎn)生的數(shù)據(jù)排序(如果沒有 Reduce Task,則不會(huì)排序,實(shí)際上 Map 階段的排序就是為了減輕 Reduce端排序負(fù)載)。
由于這些排序是 MapReduce 自動(dòng)完成的,用戶無法控制,因此,在hadoop 1.x 中無法避免,也不可以關(guān)閉,但 hadoop2.x 是可以關(guān)閉的。
答:
kafka數(shù)據(jù)分區(qū)和消費(fèi)者的關(guān)系:1個(gè)partition只能被同組的?一個(gè)consumer消費(fèi),同組的consumer則起到均衡效果
kafka的數(shù)據(jù)offset讀取流程:
連接ZK集群,從ZK中拿到對(duì)應(yīng)topic的partition信息和partition的Leader的相關(guān)信息
連接到對(duì)應(yīng)Leader對(duì)應(yīng)的broker
consumer將?自?己保存的offset發(fā)送給Leader
Leader根據(jù)offset等信息定位到segment(索引?文件和?日志?文件)
根據(jù)索引?文件中的內(nèi)容,定位到?日志?文件中該偏移量量對(duì)應(yīng)的開始位置讀取相應(yīng)?長度的數(shù)據(jù)并返回給consumer
kafka內(nèi)部如何保證順序:kafka只能保證partition內(nèi)是有序的,但是partition間的有序是沒辦法的。愛奇藝的搜索架構(gòu),是從業(yè)務(wù)上把需要有序的打到同一個(gè)partition。
答:
基于數(shù)據(jù)庫實(shí)現(xiàn)分布式鎖:(性能較差,鎖表的風(fēng)險(xiǎn),非阻塞,失敗需要輪詢耗CPU)
悲觀鎖
利用select … where … for update 排他鎖
注意: 其他附加功能與實(shí)現(xiàn)基本一致,這里需要注意的是“where name=lock ”,name字段必須要走索引,否則會(huì)鎖表。有些情況下,比如表不大,mysql優(yōu)化器會(huì)不走這個(gè)索引,導(dǎo)致鎖表問題。
樂觀鎖
所謂樂觀鎖與悲觀鎖最大區(qū)別在于基于CAS思想,是不具有互斥性,不會(huì)產(chǎn)生鎖等待而消耗資源,操作過程中認(rèn)為不存在并發(fā)沖突,只有update version失敗后才能覺察到。我們的搶購、秒殺就是用了這種實(shí)現(xiàn)以防止超賣。 樂觀鎖是通過增加遞增的版本號(hào)字段實(shí)現(xiàn)的。
基于緩存(Redis等)實(shí)現(xiàn)分布式鎖:(過期時(shí)間不好控制,非阻塞,失敗需要輪詢耗CPU)
獲取鎖的時(shí)候,使用setnx加鎖,并使用expire命令為鎖添加一個(gè)超時(shí)時(shí)間,超過該時(shí)間則自動(dòng)釋放鎖,鎖的value值為一個(gè)隨機(jī)生成的UUID,通過此在釋放鎖的時(shí)候進(jìn)行判斷。
獲取鎖的時(shí)候還設(shè)置一個(gè)獲取的超時(shí)時(shí)間,若超過這個(gè)時(shí)間則放棄獲取鎖。
釋放鎖的時(shí)候,通過UUID判斷是不是該鎖,若是該鎖,則執(zhí)行delete進(jìn)行鎖釋放。
基于Zookeeper實(shí)現(xiàn)分布式鎖:(高可用、可重入、阻塞鎖)
大致思想:每個(gè)客戶端對(duì)某個(gè)功能加鎖時(shí),在zookeeper上的與該功能對(duì)應(yīng)的指定節(jié)點(diǎn)的目錄下,?生成?個(gè)唯一的瞬時(shí)有序節(jié)點(diǎn)。判斷是否獲取鎖的方式很簡單,只需要判斷有序節(jié)點(diǎn)中序號(hào)最小的一個(gè)。當(dāng)釋放鎖的時(shí)候,只需將這個(gè)瞬時(shí)節(jié)點(diǎn)刪除即可。同時(shí),其可以避免服務(wù)宕機(jī)導(dǎo)致的鎖無法釋放,?而產(chǎn)生的死鎖問題。
優(yōu)點(diǎn):鎖安全性高,zk可持久化,且能實(shí)時(shí)監(jiān)聽獲取鎖的客戶端狀態(tài)。一旦客戶端宕機(jī),則瞬時(shí)節(jié)點(diǎn)隨之消失,zk因?而能第一時(shí)間釋放鎖。這也省去了用分布式緩存實(shí)現(xiàn)鎖的過程中需要加入超時(shí)時(shí)間判斷的這一邏輯。
缺點(diǎn):性能開銷?比較高。因?yàn)槠湫枰獎(jiǎng)討B(tài)產(chǎn)生、銷毀瞬時(shí)節(jié)點(diǎn)來實(shí)現(xiàn)鎖功能。所以不太適合直接提供給高并發(fā)的場景使用。
實(shí)現(xiàn):可以直接采用zookeeper第三方庫curator即可方便地實(shí)現(xiàn)分布式鎖。
適用場景:對(duì)可靠性要求非常高,且并發(fā)程度不高的場景下使用。如核心數(shù)據(jù)的定時(shí)全量/增量同步等。
答:
Hadoop底層使用MapReduce計(jì)算架構(gòu),只有map和reduce兩種操作,表達(dá)能力比較欠缺,而且在MR過程中會(huì)重復(fù)的讀寫hdfs,造成大量的磁盤io讀寫操作,所以適合高時(shí)延環(huán)境下批處理計(jì)算的應(yīng)用;
Spark是基于內(nèi)存的分布式計(jì)算架構(gòu),提供更加豐富的數(shù)據(jù)集操作類型,主要分成轉(zhuǎn)化操作和行動(dòng)操作,包括map、reduce、filter、flatmap、groupbykey、reducebykey、union和join等,數(shù)據(jù)分析更加快速,所以適合低時(shí)延環(huán)境下計(jì)算的應(yīng)用;
spark與hadoop最大的區(qū)別在于迭代式計(jì)算模型?;趍apreduce框架的Hadoop主要分為map和reduce兩個(gè)階段,兩個(gè)階段完了就結(jié)束了,所以在一個(gè)job里面能做的處理很有限;spark計(jì)算模型是基于內(nèi)存的迭代式計(jì)算模型,可以分為n個(gè)階段,根據(jù)用戶編寫的RDD算子和程序,在處理完一個(gè)階段后可以繼續(xù)往下處理很多個(gè)階段,而不只是兩個(gè)階段。所以spark相較于mapreduce,計(jì)算模型更加靈活,可以提供更強(qiáng)大的功能。
但是spark也有劣勢,由于spark基于內(nèi)存進(jìn)行計(jì)算,雖然開發(fā)容易,但是真正面對(duì)大數(shù)據(jù)的時(shí)候,在沒有進(jìn)行調(diào)優(yōu)的情況下,可能會(huì)出現(xiàn)各種各樣的問題,比如OOM內(nèi)存溢出等情況,導(dǎo)致spark程序可能無法運(yùn)行起來,而mapreduce雖然運(yùn)行緩慢,但是至少可以慢慢運(yùn)行完。
答:
當(dāng) jobclient 向YARN提交一個(gè)應(yīng)用程序后,YARN將分兩個(gè)階段運(yùn)行這個(gè)應(yīng)用程序:一是啟動(dòng)ApplicationMaster;第二個(gè)階段是由ApplicationMaster創(chuàng)建應(yīng)用程序,為它申請(qǐng)資源,監(jiān)控運(yùn)行直到結(jié)束。
具體步驟如下:
用戶向YARN提交一個(gè)應(yīng)用程序,并指定ApplicationMaster程序、啟動(dòng)ApplicationMaster的命令、用戶程序。
RM為這個(gè)應(yīng)用程序分配第一個(gè)Container,并與之對(duì)應(yīng)的NM通訊,要求它在這個(gè)Container中啟動(dòng)應(yīng)用程序ApplicationMaster。
ApplicationMaster向RM注冊(cè),然后拆分為內(nèi)部各個(gè)子任務(wù),為各個(gè)內(nèi)部任務(wù)申請(qǐng)資源,并監(jiān)控這些任務(wù)的運(yùn)行,直到結(jié)束。
AM采用輪詢的方式向RM申請(qǐng)和領(lǐng)取資源。
RM為AM分配資源,以Container形式返回。
AM申請(qǐng)到資源后,便與之對(duì)應(yīng)的NM通訊,要求NM啟動(dòng)任務(wù)。
NodeManager為任務(wù)設(shè)置好運(yùn)行環(huán)境,將任務(wù)啟動(dòng)命令寫到一個(gè)腳本中,并通過運(yùn)行這個(gè)腳本啟動(dòng)任務(wù)。
各個(gè)任務(wù)向AM匯報(bào)自己的狀態(tài)和進(jìn)度,以便當(dāng)任務(wù)失敗時(shí)可以重啟任務(wù)。
應(yīng)用程序完成后,ApplicationMaster向ResourceManager注銷并關(guān)閉自己。
答:
如一張表的記錄數(shù)在一個(gè)已知的范圍內(nèi),或者上下浮動(dòng)不會(huì)超過某個(gè)閾值:
SQL結(jié)果:var 數(shù)據(jù)量 = select count(*)from 表 where 時(shí)間等過濾條件
報(bào)警觸發(fā)條件設(shè)置:如果數(shù)據(jù)量不在[數(shù)值下限, 數(shù)值上限], 則觸發(fā)報(bào)警
同比增加:如果((本周的數(shù)據(jù)量 -上周的數(shù)據(jù)量)/上周的數(shù)據(jù)量*100)不在 [比例下線,比例上限],則觸發(fā)報(bào)警
環(huán)比增加:如果((今天的數(shù)據(jù)量 - 昨天的數(shù)據(jù)量)/昨天的數(shù)據(jù)量*100)不在 [比例下線,比例上限],則觸發(fā)報(bào)警
報(bào)警觸發(fā)條件設(shè)置一定要有。如果沒有配置的閾值,不能做監(jiān)控 日活、周活、月活、留存(日周月)、轉(zhuǎn)化率(日、周、月)GMV(日、周、月) 復(fù)購率(日周月)
單表空值檢測
某個(gè)字段為空的記錄數(shù)在一個(gè)范圍內(nèi),或者占總量的百分比在某個(gè)閾值范圍內(nèi)
目標(biāo)字段:選擇要監(jiān)控的字段,不能選“無”
SQL結(jié)果:var 異常數(shù)據(jù)量 = select count(*) from 表 where 目標(biāo)字段 is null
單次檢測:如果(異常數(shù)據(jù)量)不在[數(shù)值下限, 數(shù)值上限],則觸發(fā)報(bào)警
單表重復(fù)值檢測
一個(gè)或多個(gè)字段是否滿足某些規(guī)則
目標(biāo)字段:第一步先正常統(tǒng)計(jì)條數(shù);select count(*) form 表;
第二步,去重統(tǒng)計(jì);select count(*) from 表 group by 某個(gè)字段
第一步的值和第二步的值做減法,看是否在上下線閥值之內(nèi)
單次檢測:如果(異常數(shù)據(jù)量)不在[數(shù)值下限, 數(shù)值上限], 則觸發(fā)報(bào)警
跨表數(shù)據(jù)量對(duì)比
主要針對(duì)同步流程,監(jiān)控兩張表的數(shù)據(jù)量是否一致
SQL結(jié)果:count(本表) - count(關(guān)聯(lián)表)
閾值配置與“空值檢測”相同
答:這類問題都?xì)w為求Top K的問題,解決方法都差不多。
將這一天訪問百度的日志的IP取出來,逐個(gè)寫入到一個(gè)大文件中。注意到IP是32位的,最多有個(gè)2^32個(gè)IP。同樣可以采用映射的方法,比如模1000,把整個(gè)大文件映射為1000個(gè)小文件,再找出每個(gè)小文中出現(xiàn)頻率最大的IP(可以采用 HashMap 進(jìn)行頻率統(tǒng)計(jì),然后再找出頻率最大的幾個(gè))及相應(yīng)的頻率。然后再在這1000個(gè)最大的IP中找出那個(gè)頻率最大的IP,即為所求。
算法思想:分而治之+Hash
IP地址最多有2^32=4G種取值情況,所以不能完全加載到內(nèi)存中處理;
可以考慮采用分而治之的思想,按照IP地址的Hash(IP) % 1024值,把海量IP日志分別存儲(chǔ)到1024個(gè) 小文件中,這樣每個(gè)小文件最多包含4MB個(gè)IP地址; 這里解釋一下為什么用Hash(IP) % 1024值,如果不用,而直接分類的話,可能會(huì)出現(xiàn)這樣一種情況,就是有個(gè)IP在每個(gè)小文件中都存在,而且這個(gè)IP并不一定在那個(gè)小文件中是數(shù)量最多的,那么最終可能選擇的結(jié)果會(huì)有問題,所以這里用了Hash(IP)%1024值,這樣的話,通過計(jì)算IP的Hash值,相同IP肯定會(huì)放到一個(gè)文件中,當(dāng)然了不同的IP的Hash值也可能相同,就存在一個(gè)小文件中。
對(duì)于每一個(gè)小文件,可以構(gòu)建一個(gè)IP為key,出現(xiàn)的次數(shù)為value的HashMap,同時(shí)記錄當(dāng)前出現(xiàn)次數(shù)最多的那個(gè)IP地址;
可以得到1024個(gè)小文件中的出現(xiàn)次數(shù)最多的那個(gè)IP,再依據(jù)常規(guī)的排序算法得出總體上出現(xiàn)次數(shù)最多的IP。
到此,關(guān)于“web大數(shù)據(jù)面試真題有哪些”的學(xué)習(xí)就結(jié)束了,希望能夠解決大家的疑惑。理論與實(shí)踐的搭配能更好的幫助大家學(xué)習(xí),快去試試吧!若想繼續(xù)學(xué)習(xí)更多相關(guān)知識(shí),請(qǐng)繼續(xù)關(guān)注億速云網(wǎng)站,小編會(huì)繼續(xù)努力為大家?guī)砀鄬?shí)用的文章!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請(qǐng)聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。