![大廠數(shù)據(jù)倉庫面試題_第1頁](http://file4.renrendoc.com/view15/M01/03/18/wKhkGWerDFSAATY7AACzcyzFqEY897.jpg)
![大廠數(shù)據(jù)倉庫面試題_第2頁](http://file4.renrendoc.com/view15/M01/03/18/wKhkGWerDFSAATY7AACzcyzFqEY8972.jpg)
![大廠數(shù)據(jù)倉庫面試題_第3頁](http://file4.renrendoc.com/view15/M01/03/18/wKhkGWerDFSAATY7AACzcyzFqEY8973.jpg)
![大廠數(shù)據(jù)倉庫面試題_第4頁](http://file4.renrendoc.com/view15/M01/03/18/wKhkGWerDFSAATY7AACzcyzFqEY8974.jpg)
![大廠數(shù)據(jù)倉庫面試題_第5頁](http://file4.renrendoc.com/view15/M01/03/18/wKhkGWerDFSAATY7AACzcyzFqEY8975.jpg)
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
大廠數(shù)據(jù)倉庫面試題
導(dǎo)讀:此套面試題來自于各大廠的真實(shí)面試題及常問的知識(shí)點(diǎn),如
果能理解吃透這些問題,你的大數(shù)據(jù)能力將會(huì)大大提升,進(jìn)入大廠
指日可待。
本文目錄:
一、Hadoop
一、Hive
三、Spark
五、HBase
六、Flink
七、數(shù)倉業(yè)務(wù)方面
八、算法
SecondaryNameNode加載編輯日志和鏡像文件到內(nèi)存,并合并;
10.
生成新的鏡像文件fsimage.chkpoint;
11.
拷貝fsimage.chkpoint至UNameNode;
12.
NameNode將fsimage.chkpoint重新命名成fsimage;
所以如果NameNode中的元數(shù)據(jù)喪失,是可以從SecondaryNameNode
恢復(fù)一局部元數(shù)據(jù)信息的,但不是全部,因?yàn)镹ameNode正在寫的edits
日志還沒有拷貝到SecondaryNameNode,這局部恢復(fù)不了。
6.SecondaryNameNode不能恢復(fù)NameNode的全部數(shù)
據(jù),那如何保證NameNode數(shù)據(jù)存儲(chǔ)平安
這個(gè)問題就要說NameNode的高可用了,即NameNodeHAo
3.Flink集群運(yùn)行時(shí)角色Flink運(yùn)行時(shí)由兩種類型的進(jìn)程
組成:,個(gè)JobManager和一
個(gè)或者多個(gè)(Worker)
TaskManager0
(Worker)(Worker)
TaskManagerTaskManager
TaskTaskTaskTaskTask
SlotSlotSlotSlotSlot
TaskT
as<
Memory&I/OManager
Network
ManagerMemory&I/ONetwork
ManagerManagerActor
S糜的1System
Flink
ProgramProgTaskStatus
/:
ram/Heartbeats/Deploy,/
CancelStat
C蹴簿是運(yùn)行時(shí)和程序執(zhí)行的一局部,而是用于準(zhǔn)備數(shù)據(jù)流并將其發(fā)usupdates
code';/瓦班研cs&
Optimizer/Client'/Chech砌口總
送給歡)&Manage幟i潦后,客戶端可以斷開連接(別離模式分呼?;虮3滞?/p>
ActorSysteJobManager\
接來接收進(jìn)程報(bào)首1圖-加模式嬴叱小弼⑼
grapCance//*'Actor
客戶端可以作為觸發(fā)執(zhí)行Java/Scala程懶。j局部運(yùn)潞丁1艷卜詢以在命令
Graph
Checkpoint
行進(jìn)程./bin/flinkrun...中運(yùn)行。Coordinator
可以通過多種方式啟動(dòng)JobManager和TaskMa卷斷}曜鑼歌就需k作
為standalone集群啟動(dòng)、在容器中啟動(dòng)、或者通過YARN等資源框架管
理并啟動(dòng)。TaskManager連接到JobManagers,宣布自己可用,并被分配
工作。
JobManager:
JobManager具有許多與協(xié)調(diào)Flink應(yīng)用程序的分布式執(zhí)行有關(guān)的職責(zé):
它決定何時(shí)調(diào)度下一個(gè)task(或一組task)、對(duì)完成的task或執(zhí)行失敗
做出反響、協(xié)調(diào)checkpoints并且協(xié)調(diào)從失敗中恢復(fù)等等。這個(gè)進(jìn)程由三
個(gè)不同的組件組成:
ResourceManagerResourceManager負(fù)責(zé)Flink集群中的資源提
供、回收、分配,管理taskslotSo
DispatcherDispatcher提供了一個(gè)REST接口,用來提交Flink
應(yīng)用程序執(zhí)行,并為每個(gè)提交的作業(yè)啟動(dòng)一個(gè)新的
JobMastero它還運(yùn)行FlinkWebUI用來提供作業(yè)執(zhí)行信息。
JobMasterJobMaster負(fù)責(zé)管理單個(gè)JobGraph的執(zhí)行。Flink集群
中可以同時(shí)運(yùn)行多個(gè)作業(yè),每個(gè)作業(yè)都有自己的JobMastero
TaskManagers:
TaskManager(也稱為worker)執(zhí)行作業(yè)流的task,并且緩存和交換數(shù)據(jù)
流。
必須始終至少有一個(gè)TaskManager。在TaskManager中資源調(diào)度的最小
單位是taskslotoTaskManager中taskslot的數(shù)量表示并發(fā)處理task的
數(shù)量。請(qǐng)注意一個(gè)taskslot中可以執(zhí)行多個(gè)算子。
4.Flink相比SparkStreaming有什么區(qū)別.架構(gòu)模型
SparkStreaming在運(yùn)行時(shí)的主要角色包括:Master、Worker、Driver>
Executor,Flink在運(yùn)行時(shí)主要包含:Jobmanager〉Taskmanager和Sloto.
任務(wù)調(diào)度
SparkStreaming連續(xù)不斷的生成微小的數(shù)據(jù)批次,構(gòu)建有向無環(huán)圖DAG,
SparkStreaming會(huì)依次創(chuàng)立DStreamGraph>JobGenerator>
JobScheduleroFlink根據(jù)用戶提交的代碼生成StreamGraph,經(jīng)過優(yōu)化生成
JobGraph,然后提交給JobManager進(jìn)行處理,JobManager會(huì)根據(jù)
JobGraph生成ExecutionGraph,ExecutionGraph是Flink調(diào)度最核心的
數(shù)據(jù)結(jié)構(gòu),JobManager根據(jù)ExecutionGraphXjJob進(jìn)行調(diào)度。
1.時(shí)間機(jī)制SparkStreaming支持的時(shí)間機(jī)制有限,只支持處理時(shí)間。
Flink支持了流處理程序在時(shí)間上的三個(gè)定義:處理時(shí)間、事件時(shí)間、注入
時(shí)間。同時(shí)也支持watermark機(jī)制來處理滯后數(shù)據(jù)。
2.容錯(cuò)機(jī)制對(duì)于SparkStreaming房務(wù),我們可以設(shè)置checkpoint,然后假
如發(fā)生故障并重啟,我們可以從上次checkpoint之處恢復(fù),但是這個(gè)行
為只能使得數(shù)據(jù)不喪失,可能會(huì)重復(fù)處理,K能做到恰一次處理語義。
Flink那么使用兩階段提交協(xié)議來解決這個(gè)問即。
3.介紹下Flink的容錯(cuò)機(jī)制(checkpoint)Checkpoint機(jī)制
是Flink可靠性的基石,可以保證Flink集群在某個(gè)算子因?yàn)?/p>
某些原因(如異常退出)出現(xiàn)故障時(shí),能夠?qū)⒄麄€(gè)應(yīng)用流
圖的狀態(tài)恢復(fù)到故障之前的某一狀態(tài),保證應(yīng)用流圖狀態(tài)
的一致性。Flink的Checkpoint機(jī)制原理來自Xhandy-Lamport
algorithm〃算法。
每個(gè)需要Checkpoint的應(yīng)用在啟動(dòng)時(shí),F(xiàn)link的JobManager為其創(chuàng)立一
個(gè)Checkpointcoordinator(檢查點(diǎn)協(xié),調(diào)器),Checkpointcoordinator全
權(quán)負(fù)責(zé)本應(yīng)用的快照制作。
Checkpointcoordinator(檢杳點(diǎn)協(xié)調(diào)器),Checkpointcoordinato「全權(quán)負(fù)
責(zé)本應(yīng)用的快照制作。
1.
Checkpointcoordinator(檢查點(diǎn)協(xié)調(diào)器)周期性的向該流應(yīng)用的所有
source算子發(fā)送barrier(屏闡。
2.
當(dāng)某個(gè)source算子收到一個(gè)barrier時(shí),便暫停數(shù)據(jù)處理過程,然后
將自己的當(dāng)前狀態(tài)制作成快照,并保存到指定的持久化存儲(chǔ)中,最后向
Checkpointcoordinator報(bào)告自己快照制作情況,同時(shí)向自身所有下游
算子廣播該barrier,恢復(fù)數(shù)據(jù)處理
3.
下游算子收到barrier之后,會(huì)暫停自己的數(shù)據(jù)處理過程,然后將自身
的相關(guān)狀態(tài)制作成快照,并保存到指定的持久化存儲(chǔ)中,最后向
Checkpointcoordinator報(bào)告自身快照情況,同時(shí)向自身所有下游算子
廣播該barrier,恢復(fù)數(shù)據(jù)處理。
4.
每個(gè)算子按照步驟3不斷制作快照并向下游廣播,直到最后barrier傳
遞到sink算子,快照制作完成。
8.
9.
當(dāng)Checkpointcoordinator收到所有算子的報(bào)告之后,認(rèn)為該周期的
快照制作成功;否那么,如果在規(guī)定的時(shí)間內(nèi)沒有收到所有算子的報(bào)
告,那么認(rèn)為本周期快照制作失敗。
10.
文章推薦:
Flink可靠性的基石-checkpoint機(jī)制詳細(xì)解析
6.FlinkcheckpointSparkStreaming的有什么區(qū)別
或優(yōu)勢(shì)嗎
sparkstreaming的checkpoint僅僅是針對(duì)driver的故障恢復(fù)做『數(shù)
據(jù)和元數(shù)據(jù)的checkpointo而flink的checkpoint機(jī)制要夏雜了很多,
它采用的是輕量級(jí)的分布式快照,實(shí)現(xiàn)了每個(gè)算子的快照,及流動(dòng)中
的數(shù)據(jù)的快照。
7.Flink是如何保證Exactly-once語義的
Flink通過實(shí)現(xiàn)兩階段提交和狀態(tài)保存來實(shí)現(xiàn)端到端的一致性語義。分
為以下幾個(gè)步驟:
開始事務(wù)(beginTransaction)創(chuàng)立一個(gè)臨時(shí)文件夾,來寫把數(shù)據(jù)寫入到
這個(gè)文件夾里面
預(yù)提交(preCommit)將內(nèi)存中緩存的數(shù)據(jù)寫入文件并關(guān)閉
正式提交(commit)將之前寫完的臨時(shí)文件放入目標(biāo)目錄下。這代表
著最終的數(shù)據(jù)會(huì)有一些延遲丟棄(abort)丟棄臨時(shí)文件
假設(shè)失敗發(fā)生在預(yù)提交成功后,正式提交前??梢愿鶕?jù)狀態(tài)來提交預(yù)提
交的數(shù)據(jù),也可刪除預(yù)提交的數(shù)據(jù)。
兩階段提交協(xié)議詳解:八張圖搞懂Flink的Exactly-once
8.如果下級(jí)存儲(chǔ)不支持事務(wù),F(xiàn)link怎么保證exactly-
once
端到端的exactly-once對(duì)sink要求比擬高,具體實(shí)現(xiàn)主要有幕等寫入
和事務(wù)性寫入兩種方式。
募等寫入的場(chǎng)景依賴于業(yè)務(wù)邏輯,更常見的是用事務(wù)性寫入。而事務(wù)性
寫入又有預(yù)寫日志(WAL)和兩階段提交(2PC)兩種方式。
如果外部系統(tǒng)不支持事務(wù),那么可以用預(yù)寫日志的方式,把結(jié)果數(shù)據(jù)先
當(dāng)成狀態(tài)保存,然后在收到checkpoint完成的通知時(shí),一次性寫入sink
系統(tǒng)。
9.Flink常用的算子有哪些
分兩局部:
1.數(shù)據(jù)讀取,這是Flink流計(jì)算應(yīng)用的起點(diǎn),常用算子有:
從內(nèi)存讀:from日ements
從文件讀:readTextFile
Socket接入:socketTextStream
自定義讀?。篶reatelnputi.處理數(shù)據(jù)的算子,常用的算子包括:
Map(單輸入單輸出)、
FlatMap(單輸入、多輸出)、Filter(過濾)、KeyBy(分組)、Reduce
(聚合)、Window(窗口)、Connect(連接)、Split(分割)等。
推薦閱讀:一文學(xué)完Flink流計(jì)算常用算子(Flink算子大全)
10.Flink任務(wù)延時(shí)高,如何入手
在Flink的后臺(tái)任務(wù)管理中,我們可以看到Flink的哪個(gè)算子和task
出現(xiàn)了反壓。最主要的手段是資源調(diào)優(yōu)和算子調(diào)優(yōu)。資源調(diào)優(yōu)即是對(duì)
作業(yè)中的Operator的并發(fā)數(shù)
(parallelism)、CPU(core)>堆內(nèi)存(heapjnemory)等參數(shù)進(jìn)行調(diào)優(yōu)。
作業(yè)參數(shù)調(diào)優(yōu)包括:并行度的設(shè)置,State的設(shè)置,checkpoint的設(shè)置。
11.Flink是如何處理反壓的
Flink內(nèi)部是基于producer-consumer模型來進(jìn)行消息傳遞的,F(xiàn)link
的反壓設(shè)計(jì)也是基于這個(gè)模型。Flink使壓了高效有界的分布式阻塞隊(duì)
列,就像Java通用的阻塞隊(duì)列
(BlockingQueue)一樣。下游消費(fèi)者消費(fèi)變慢,上游就會(huì)受到阻塞。
12.如何排查生產(chǎn)環(huán)境中的反壓問題
1.反壓出現(xiàn)的場(chǎng)景
反壓經(jīng)常出現(xiàn)在促銷、熱門活動(dòng)等場(chǎng)景。短時(shí)間內(nèi)流量陡增造成數(shù)據(jù)的
堆積或者消費(fèi)速度變慢。
它們有一個(gè)共同的特點(diǎn):數(shù)據(jù)的消費(fèi)速度小于數(shù)據(jù)的生產(chǎn)速度。
2,反壓監(jiān)控方法
通過FlinkWebUI發(fā)現(xiàn)反壓問題。
Flink的TaskManager會(huì)每隔50ms觸發(fā)一次反壓狀態(tài)監(jiān)測(cè),共監(jiān)測(cè)
100次,并將計(jì)算結(jié)果反響給JobManager,最后由JobManager進(jìn)行
計(jì)算反壓的比例,然后進(jìn)行展示。這個(gè)比例展示邏輯如下:
0K:0<=Ratio<=0.10,表示狀態(tài)良好正;
LOW:0.10<Ratio<=0.5,表示有待觀察;
HIGH:0.5<Ratio<=1,表示要處理了(增加并行度/subTask/檢查是否
有數(shù)據(jù)傾斜/增加內(nèi)存)。
0.01,代表100次中有一次阻塞在內(nèi)部調(diào)用。
3.flink反壓的實(shí)現(xiàn)方式
Flink任務(wù)的組成由基本的〃流〃和〃算子〃構(gòu)成,〃流〃中的數(shù)據(jù)在〃
算子〃間進(jìn)行計(jì)算和轉(zhuǎn)換時(shí),會(huì)被放入分布式的阻塞隊(duì)列中。當(dāng)消費(fèi)者
的阻塞隊(duì)列滿時(shí),那么會(huì)降低生產(chǎn)者的數(shù)據(jù)生產(chǎn)速度
4,反壓問題定位和處理
Flink會(huì)因?yàn)閿?shù)據(jù)堆積和處理速度變慢導(dǎo)致checkpoint超時(shí),而
checkpoint是Flink保證數(shù)據(jù)一致性的關(guān)鍵所在,最終會(huì)導(dǎo)致數(shù)據(jù)的不
致發(fā)生。
數(shù)據(jù)傾斜:可以在Flink的后臺(tái)管理頁面看到每個(gè)Task處理數(shù)據(jù)的大
小。當(dāng)數(shù)據(jù)傾斜出現(xiàn)時(shí),通常是簡單地使用類似KeyBy等分組聚合函數(shù)
導(dǎo)致的,需要用戶將熱點(diǎn)Key進(jìn)行預(yù)處理,降低或者消除熱點(diǎn)Key的
影。
一個(gè)NameNode有單點(diǎn)故障的問題,那就配置雙NameNode,配置有
兩個(gè)關(guān)鍵點(diǎn),一是必須要保證這兩個(gè)NameNode的元數(shù)據(jù)信息必須要
同步的,二是一個(gè)NameNode掛掉之后另一個(gè)要立馬補(bǔ)上。
元數(shù)據(jù)信息同步在HA方案中采用的是〃共享存儲(chǔ)〃。每次寫文件時(shí),
需要將日志同步寫入共享存儲(chǔ),這個(gè)步驟成功才能認(rèn)定寫文件成功。然
后備份節(jié)點(diǎn)定期從共享存儲(chǔ)同步日志,以便進(jìn)行主備切換。
監(jiān)控NameNode狀態(tài)采用zookeeper,兩個(gè)NameNode節(jié)點(diǎn)的狀態(tài)存
放在zookeeper中,另外兩個(gè)NameNode節(jié)點(diǎn)分別有一個(gè)進(jìn)程監(jiān)控程
序,實(shí)施讀取zookeeper中有NameNode的狀態(tài),來判斷當(dāng)前的
NameNode是不是已經(jīng)down機(jī)。如果Standby的NameNode節(jié)點(diǎn)
的ZKFC發(fā)現(xiàn)主節(jié)點(diǎn)已經(jīng)掛掉,那么就會(huì)強(qiáng)制給原本的Active
NameNode節(jié)點(diǎn)發(fā)送強(qiáng)制關(guān)閉請(qǐng)求,之后將備用的NameNode設(shè)置
為Activeo
如果面試官再問HA中的共享存儲(chǔ)是怎么實(shí)現(xiàn)的知道嗎?
可以進(jìn)行解釋下:NameNode共享存儲(chǔ)方案有很多,
GC:不合理的設(shè)置TaskManager的垃圾回收參數(shù)會(huì)導(dǎo)致嚴(yán)重的GC問
題,我們可以通過-XX:+PrintGCDetails參數(shù)查看GC的日志。
代碼本身:開發(fā)者錯(cuò)誤地使用Flink算子,沒有深入了解算子的實(shí)現(xiàn)機(jī)
制導(dǎo)致性能問題。我們可以通過查看運(yùn)行機(jī)器節(jié)點(diǎn)的CPU和內(nèi)存情況
定位問題。
13.Flink中的狀態(tài)存儲(chǔ)
Flink在做計(jì)算的過程中經(jīng)常需要存儲(chǔ)中間狀態(tài),來防止數(shù)據(jù)喪失和狀
態(tài)恢復(fù)。選擇的狀態(tài)存儲(chǔ)策略不同,會(huì)影響狀態(tài)持久化如何和
checkpoint交互。Flink提供了三種狀態(tài)存儲(chǔ)方式:
MemoryStateBackend>FsStateBackend>
RocksDBStateBackend.,
14.OperatorChains(算子鏈)這個(gè)概念你了解嗎
為了更高效地分布式執(zhí)行,F(xiàn)link會(huì)盡可能地將operator的subtask鏈
接(chain)在一起形成task。每個(gè)task在一個(gè)線程中執(zhí)行。將operators
鏈接成task是非常有效的優(yōu)化:它能減少線程之間的切換,減少消息的
序列化/反序列化,減少數(shù)據(jù)在緩沖區(qū)的交換,減少了延遲的同時(shí)提高
整體的吞吐量。這就是我們所說的算子鏈。
15.Flink的內(nèi)存管理是如何做的
Flink并不是將大量對(duì)象存在堆上,而是將對(duì)象都序列化到一個(gè)預(yù)分配
的內(nèi)存塊上。此外,F(xiàn)link大量的使用了堆外內(nèi)存。如果需要處理的數(shù)
據(jù)超出了內(nèi)存限制,那么會(huì)將局部數(shù)據(jù)存儲(chǔ)到硬盤上。Flink為了直接
操作二進(jìn)制數(shù)據(jù)實(shí)現(xiàn)了自己的序列化框架。
16.如何處理生產(chǎn)環(huán)境中的數(shù)據(jù)傾斜問題
Lflink數(shù)據(jù)傾斜的表現(xiàn):
任務(wù)節(jié)點(diǎn)頻繁出現(xiàn)反壓,增加并行度也不能解決問題;局部節(jié)點(diǎn)出現(xiàn)
00M異常,是因?yàn)榇罅康臄?shù)據(jù)集中在某個(gè)節(jié)點(diǎn)上,導(dǎo)致該節(jié)點(diǎn)內(nèi)存被
爆,任務(wù)失敗重啟。
2.數(shù)據(jù)傾斜產(chǎn)生的原因:
業(yè)務(wù)上有嚴(yán)重的數(shù)據(jù)熱點(diǎn),比方滴滴打車的訂單數(shù)據(jù)中北京、上海等
幾個(gè)城市的訂單量遠(yuǎn)遠(yuǎn)超過其他地區(qū);
技術(shù)上大量使用了KeyBy、GroupBy等操作,錯(cuò)誤的使用了分組Key,
人為產(chǎn)生數(shù)據(jù)熱點(diǎn)。
3.解決問題的思路:
業(yè)務(wù)上要盡量防止熱點(diǎn)key的設(shè)計(jì),例如我們可以把北京、上海等熱
點(diǎn)城市分成不同的區(qū)域,并進(jìn)行單獨(dú)處理;技術(shù)上出現(xiàn)熱點(diǎn)時(shí),要調(diào)整
方案打散原來的key,防止直接聚合;此外Flink還提供了大量的功能可
以防止數(shù)據(jù)傾斜
17.Flink中的Time有哪幾種
Flink中的時(shí)間有三種類型,如下列圖所示:
EventTime:是事件創(chuàng)立的時(shí)間。它通常由事件中的時(shí)間戳描述,例
如采集的日志數(shù)據(jù)中,每一條日志都會(huì)記錄自己的生成時(shí)間,F(xiàn)link通
過時(shí)間戳分配器訪問事件時(shí)間戳。
IngestionTime:是數(shù)據(jù)進(jìn)入Flink的時(shí)間。
ProcessingTime:是每一個(gè)執(zhí)行基于時(shí)間操作的算子的本地系統(tǒng)時(shí)間,
與機(jī)器相關(guān),默認(rèn)的時(shí)間屬性就是
ProcessingTimeo
例如,一條日志進(jìn)入Flink的時(shí)間為2021-01-2210:00:00,123,到達(dá)
Window的系統(tǒng)時(shí)間為2021-01-2210:00:01.234,口志的內(nèi)容如下:
2021-01-0618:37:15.624INFOFailovertorm2對(duì)于業(yè)務(wù)來說,要統(tǒng)
計(jì)Imin內(nèi)的故障日志個(gè)數(shù),哪個(gè)時(shí)間是最有意義的?一一eventTime,
因?yàn)槲覀円鶕?jù)日志的生成時(shí)間進(jìn)行統(tǒng)計(jì)。
18.Flink對(duì)于遲到數(shù)據(jù)是怎么處理的
Flink中WaterMark和Window機(jī)制解決了流式數(shù)據(jù)的亂序問題,對(duì)
于因?yàn)檠舆t而順序有誤的數(shù)據(jù),可以根據(jù)eventTime進(jìn)行業(yè)務(wù)處理,
對(duì)于延遲的數(shù)據(jù)Flink也有自己的解決方法,主要的方法是給定一個(gè)
允許延遲的時(shí)間,在該時(shí)間范圍內(nèi)仍可以接受處理延遲數(shù)據(jù)
設(shè)置允許延遲的時(shí)間是通過allowedLateness(lateness:Time)設(shè)置
保存延遲數(shù)據(jù)那么是通過sideOutputLateData(outputTag:
OutputTag[T])保存
獲取延遲數(shù)據(jù)是通過DataStream.getSideOutput(tag:OutputTag[X])
獲取文章推薦:
Flink中極其重要的Time與Window詳細(xì)解析
19.Flink中window出現(xiàn)數(shù)據(jù)傾斜怎么解決window產(chǎn)生
數(shù)據(jù)傾斜指的是數(shù)據(jù)在不同的窗口內(nèi)堆積的數(shù)據(jù)量相差過多。本質(zhì)上產(chǎn)
生這種情況的原因是數(shù)據(jù)源頭發(fā)送的數(shù)據(jù)量速度不同導(dǎo)致的。出現(xiàn)這種
情況一般通過兩種方式來解決:
在數(shù)據(jù)進(jìn)入窗口前做預(yù)聚合
重新設(shè)計(jì)窗口聚合的key
20.FlinkCEP編程中當(dāng)狀態(tài)沒有到達(dá)的時(shí)候會(huì)將數(shù)
據(jù)保存在哪里
在流式處理中,CEP當(dāng)然是要支持EventTime的,那么相對(duì)應(yīng)的也要
支持?jǐn)?shù)據(jù)的遲到現(xiàn)象,也就是watermark的處理邏輯。CEP對(duì)未匹配
成功的事件序列的處理,和遲到數(shù)據(jù)是類似的。在FlinkCEP的處理邏
輯中,狀態(tài)沒有滿足的和遲到的數(shù)據(jù),都會(huì)存儲(chǔ)在一個(gè)Map數(shù)據(jù)結(jié)構(gòu)
中,也就是說,如果我們限定判斷事件序列的時(shí)長為5分鐘,那么內(nèi)存
中就會(huì)存儲(chǔ)5分鐘的數(shù)據(jù),這在我看來,也是對(duì)內(nèi)存的極大損傷之一。
推薦閱讀:一文學(xué)會(huì)FlinkCEP
21.Flink設(shè)置并行度的方式
們?cè)趯?shí)際生產(chǎn)環(huán)境中可以從四個(gè)不同層面設(shè)置并行度:
1.操作算子層面(OperatorLevel)
.map(ne\vRollmgAdditionMapper()).setParallelism(l0)”將操作算了設(shè)置并行度
$FLINK_HOME/bin/flink的-p參數(shù)修改并行度
env.setParallelism(10)
全局配置在flink-conf.yaml文件中,parallelism.default,默認(rèn)
是1:可以設(shè)置默認(rèn)值大一點(diǎn)
需要注意的優(yōu)先級(jí):算子層面〉環(huán)境層面)客戶端層面〉系統(tǒng)層面。
22.Flink中Task如何做到數(shù)據(jù)交換
在一個(gè)FlinkJob中,數(shù)據(jù)需要在不同的task中進(jìn)行交換,整個(gè)數(shù)據(jù)交
換是有TaskManager負(fù)責(zé)的,TaskManager的網(wǎng)絡(luò)組件首先從緩沖
buffer中收集records,然后再發(fā)送。
Records并不是一個(gè)一個(gè)被發(fā)送的,是積累一個(gè)批次再發(fā)送,batch技
術(shù)可以更加高效的利用網(wǎng)絡(luò)資源。
23.Flink的內(nèi)存管理是如何做的
Flink并不是將大量對(duì)象存在堆上,而是將對(duì)象都序列化到一個(gè)預(yù)分配
的內(nèi)存塊上。此外,F(xiàn)link大量的使用了堆外內(nèi)存。如果需要處理的數(shù)
據(jù)超出了內(nèi)存限制,那么會(huì)將局部數(shù)據(jù)存儲(chǔ)到硬盤上。Flink為了直接
操作一進(jìn)制數(shù)據(jù)實(shí)現(xiàn)了自己的序列化框架。
24.介紹下Flink的序列化
Flink摒棄了Java原生的序列化方法,以獨(dú)特的方式處理數(shù)據(jù)類型和
序列化,包含自己的類型描述符,泛型類型提取和類型序列化框架。
Typeinformation是所有類型描述符的基類。它揭示了該類型的一些基
本屬性,并且可以生成序列化器。
Typeinformation支持以下幾種類型:
BasicTypelnfo:任意Java基本類型或String類型
BasicArrayTypelnfo:任意Java基本類型數(shù)組或String數(shù)組
WritableTypelnfo:任意HadoopWritable接口的實(shí)現(xiàn)類
任意的類型(支持)
TupleTypelnfo:FlinkTupleTupleltoTuple250Flink
tuples是固定長度固定類型的JavaTuple實(shí)現(xiàn)
CaseCassTypelnfo:任意的ScalaCaseClass(包括Scalatuples)
PojoTypelnfo:任意的POJO(JavaorScala),例如,Java對(duì)象的所有成
員變量,要么是public修飾符定義,要么有g(shù)etter/setter方法
GenericTypelnf。:任意無法匹配之前幾種類型的類
25.Flink海量數(shù)據(jù)高效去重L
基于狀態(tài)后端。
2.
基于HyperLogLog:不是精準(zhǔn)的去重。
4.
基于布隆過濾器(BloomFilter);快速判斷一個(gè)key是否存在于某容器,
不存在就直接返回。
5.
基于BitMap;用一個(gè)bit位來標(biāo)記某個(gè)元素對(duì)應(yīng)的Value,而Key即是
該元素。由于采用了Bit為單位來存儲(chǔ)數(shù)據(jù),因此可以大大節(jié)省存儲(chǔ)空
間。
6.
基于外部數(shù)據(jù)庫;選擇使用Redis或者HBase存儲(chǔ)數(shù)據(jù),我們只需要
設(shè)計(jì)好存儲(chǔ)的Key即可,不需要關(guān)心Flink任務(wù)重啟造成的狀態(tài)喪失問
題。
26.FlinkSQL的是如何實(shí)現(xiàn)的
構(gòu)建抽象語法樹的事情交給了Calcite去做。SQLquery會(huì)經(jīng)過Calcite
解析器轉(zhuǎn)變成SQL節(jié)點(diǎn)樹,通過驗(yàn)證后構(gòu)建成Calcite的抽象語法樹(也
就是圖中的LogicalPlan)。另一邊,TableAPI上的調(diào)用會(huì)構(gòu)建成Table
API的抽象語法樹,并通過Calcite提供的RelBuilder轉(zhuǎn)變成Calcite的
抽象語法樹。然后依次被轉(zhuǎn)換成邏輯執(zhí)行計(jì)劃和物理執(zhí)行計(jì)劃,在提
交任務(wù)后會(huì)分發(fā)到各個(gè)TaskManager■中運(yùn)行,在運(yùn)行時(shí)會(huì)使用Janino
編譯器編譯代碼后運(yùn)行。
業(yè)務(wù)方面
1.0DS層采用什么壓縮方式和存儲(chǔ)格式?
壓縮采用Snappy,存儲(chǔ)采用orc,壓縮比是100g數(shù)據(jù)壓縮完10g左右。
2.DWD層做了哪些事?
1.數(shù)據(jù)清洗?空值去除
比方LinuxHA,VMwareFT,QJM等,目前社區(qū)已經(jīng)把由
Clouderea公司實(shí)現(xiàn)的基于QJM(QuorumJournalManager)的方
案合并到HDFS的trunk之中并且作為默認(rèn)的共享存儲(chǔ)實(shí)現(xiàn)。
基于QJM的共享存儲(chǔ)系統(tǒng)主要用「保存EditLog,并不保存
FSImage文件。FSImage文件還是在NameNode的本地磁盤上。
Q川共享存儲(chǔ)的基本思想來自于Paxos算法,采用多個(gè)稱為
JournalNode的節(jié)點(diǎn)組成的JournalNode集群來存儲(chǔ)EditLogo
每個(gè)JournalNode保存同樣的EditLog副本。每次NameNode寫
EditLog的時(shí)候,除了向本地磁盤寫入EditLog之外,也會(huì)并行地
向JournalNode集群之中的每一個(gè)JournalNode發(fā)送寫請(qǐng)求,
只要大多數(shù)的JournalNode節(jié)點(diǎn)返回成功就認(rèn)為向JournalNode
集群寫入EditLog成功。如果有2N+1臺(tái)JournalNode,那么根據(jù)
大多數(shù)的原那么,最多可以容忍有N臺(tái)JournalNode節(jié)點(diǎn)掛掉。
7.在NameNodeHA中,會(huì)出現(xiàn)腦裂問題嗎?怎么解決腦
裂假設(shè)NameNode1當(dāng)前為Active狀態(tài),NameNode2
當(dāng)前為Standby狀態(tài)。如果某一時(shí)刻N(yùn)ameNode1對(duì)過濾核心字
段無意義的數(shù)據(jù),比方訂單表中訂單id為null,
支付表中支付id為空對(duì)手機(jī)號(hào)、身份證號(hào)等敏感數(shù)據(jù)脫敏
對(duì)業(yè)務(wù)數(shù)據(jù)傳過來的表進(jìn)行維度退化和降維。
?將用戶行為寬表和業(yè)務(wù)表進(jìn)行數(shù)據(jù)一致性處理清洗的手段
?Sqkmr>rdd>kettle>Python(工程中采用sql進(jìn)行清除)
3.DWS層做了哪些事?
1.DWS層有3?5張寬表(處理100-200個(gè)指標(biāo)70%以上的需求)
具體寬表名稱:用戶行為寬表,用戶購買商品明細(xì)行為寬表,商品寬表,
購物車寬表,物流寬表、登錄注冊(cè)、售后等。
1.哪個(gè)寬表最寬?大概有多少個(gè)字段?最寬的是用戶行為寬
表。大概有60-100個(gè)字段
1.在處理大數(shù)據(jù)過程中,如何保證得到期望值1.
保證在數(shù)據(jù)采集的時(shí)候不喪失數(shù)據(jù),這個(gè)尤為重要,如果在數(shù)據(jù)采集的
時(shí)候就已經(jīng)不準(zhǔn)確,后面很難到達(dá)期望值
3.
在數(shù)據(jù)處理的時(shí)候不喪失數(shù)據(jù),例如sparkstreaming處理
kafka數(shù)據(jù)的時(shí)候,要保證數(shù)據(jù)不喪失,這個(gè)尤為重要4.
5.
前兩步中,如果無法保證數(shù)據(jù)的完整性,那么就要通過離線計(jì)算進(jìn)
行數(shù)據(jù)的校對(duì),這樣才能保證我們能夠得到期望值
6.
2.你感覺數(shù)倉建設(shè)中最重要的是什么
數(shù)倉建設(shè)中,最重要的是數(shù)據(jù)準(zhǔn)確性,
數(shù)據(jù)的真正價(jià)值在于數(shù)據(jù)驅(qū)動(dòng)決策,通
過數(shù)據(jù)指導(dǎo)運(yùn)營,在一個(gè)不準(zhǔn)確的數(shù)據(jù)
驅(qū)動(dòng)下,得到的一定是錯(cuò)誤的數(shù)據(jù)分
析,影響的是公司的業(yè)務(wù)開展決策,最
終導(dǎo)致公司的策略調(diào)控失敗。
3.數(shù)據(jù)倉庫建模怎么做的數(shù)倉建設(shè)中最
常用模型-Kimball維度建模詳解
4.數(shù)據(jù)質(zhì)量怎么監(jiān)控
單表數(shù)據(jù)量監(jiān)控
一張表的記錄數(shù)在一個(gè)的范圍內(nèi),或者上下浮動(dòng)不會(huì)超過某個(gè)閾值
SQL結(jié)果:var數(shù)據(jù)量=selectcount(*)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ù)購率(日周月)
單表空值檢測(cè)
某個(gè)字段為空的記錄數(shù)在一個(gè)范圍內(nèi),或者占總量的百分比在某個(gè)
閾值范圍內(nèi)
目標(biāo)字段:選擇要監(jiān)控的字段,不能選〃無〃
1.
SQL結(jié)果:var異常數(shù)據(jù)量=selectcount(*)from表where目標(biāo)字段
isnull
單次檢測(cè):如果(異常數(shù)據(jù)量)不在[數(shù)值下限,數(shù)值上限],那么
觸發(fā)報(bào)警
單表重復(fù)值檢測(cè)
一個(gè)或多個(gè)字段是否滿足某些規(guī)那么
目標(biāo)字段:第一步先正常統(tǒng)計(jì)條數(shù);selectcount(*)form表;
第二步,去重統(tǒng)計(jì);selectcount(*)from表groupby某個(gè)字
段
第一步的值和第二步的值做減法,看是否在上下線閥值之內(nèi)
單次檢測(cè):如果(異常數(shù)據(jù)量)不在[數(shù)值下限,數(shù)值上限],那么
觸發(fā)報(bào)警8.
跨表數(shù)據(jù)量比照
主要針對(duì)同步流程,監(jiān)控兩張表的數(shù)據(jù)量是否一致1.
SQL結(jié)果:count(本表)-count(關(guān)聯(lián)表)2.
3.
閾值配置與〃空值檢測(cè)〃相同4.
5.數(shù)據(jù)分析方法論了解過哪些?
數(shù)據(jù)商業(yè)分析的目標(biāo)是利用大數(shù)據(jù)為所有職場(chǎng)人員做出迅捷,高質(zhì),
高效的決策提供可規(guī)模化的解決方案。商業(yè)分析是創(chuàng)造價(jià)值的數(shù)據(jù)
科學(xué)。
數(shù)據(jù)商業(yè)分析中會(huì)存在很多判斷:
1.觀察數(shù)據(jù)當(dāng)前發(fā)生了什么?
比方想知道線上渠道A、B各自帶來了多少流量,新上線的產(chǎn)品有
多少用戶喜歡,新注冊(cè)流中注冊(cè)的人數(shù)有多少。這些都需要通過數(shù)
據(jù)來展示結(jié)果。
1.理解為什么發(fā)生?
我們需要知道渠道A為什么比渠道B好,這些是要通過數(shù)據(jù)去發(fā)現(xiàn)
的。也許某個(gè)關(guān)鍵字帶來的流量轉(zhuǎn)化率比其他都要低,這時(shí)可以通
過信息、知識(shí)、數(shù)據(jù)沉淀出發(fā)生的原因是什么。
1.預(yù)測(cè)未來會(huì)發(fā)生什么?
在對(duì)渠道A、B有了判斷之后,根據(jù)以往的知識(shí)預(yù)測(cè)未來會(huì)發(fā)生什
么。在投放渠道C、D的時(shí)候,猜想渠道C比渠道D好,當(dāng)上線新的
注冊(cè)流、新的優(yōu)化,可以知道哪一個(gè)節(jié)點(diǎn)比較容易出問題,這些都
是通過數(shù)據(jù)進(jìn)行預(yù)測(cè)的過程。
1.商業(yè)決策
所有工作中最有意義的還是商業(yè)決策,通過數(shù)據(jù)來判斷應(yīng)該做什么。
這是商業(yè)分析最終的目的。
算法
大數(shù)據(jù)面試中考察的算法相對(duì)容易一些,??嫉挠信判蛩惴?,查找
算法,二義樹等,卜面講解一些最容易考的算法。
1.排序算法
十種常見排序算法可以分為兩大類:
比擬類排序:通過比擬來決定元素間的相對(duì)次序,由于其時(shí)間復(fù)雜
度不能突破O(nlogn),因此也稱為非線性時(shí)間比擬類排序。
非比擬類排序:不通過比擬來決定元素間的相對(duì)次序,它可
以突破基于比擬排序的時(shí)間下界,以線性時(shí)間運(yùn)行,因此也稱為線
性時(shí)間非比擬類排序。
算法復(fù)雜度:
相關(guān)概念:
穩(wěn)定:如果a原本在b前面,而a二b,排序之后a仍然在b的前面。
不穩(wěn)定:如果a原本在b的前面,而a二b,排序之后a可能會(huì)出現(xiàn)
在b的后面。
時(shí)間復(fù)雜度:對(duì)排序數(shù)據(jù)的總的操作次數(shù)。反映當(dāng)n變化時(shí),操作次
數(shù)呈現(xiàn)什么規(guī)律。
空間復(fù)雜度:是指算法在計(jì)算機(jī)內(nèi)執(zhí)行時(shí)所需存儲(chǔ)空間的度量,它
也是數(shù)據(jù)規(guī)模n的函數(shù)。
下面講解大數(shù)據(jù)中最??嫉膬煞N:快排和歸并
1)快速排序
快速排序的基本思想:通過一趟排序?qū)⒋庞涗浄指舫瑟?dú)立的兩局
部,其中一局部記錄的關(guān)鍵字均比另一局部的關(guān)鍵字小,那么可分
別對(duì)這兩局部記錄繼續(xù)進(jìn)行排序,以到達(dá)整個(gè)序列有序。
算法描述
快速排序使用分治法來把一個(gè)串(list)分為兩個(gè)子串(sub-lists)o
具體算法描述如下:
從數(shù)列中挑出一個(gè)元素,稱為〃基準(zhǔn)〃(pivot);
重新排序數(shù)列,所有元素比基準(zhǔn)值小的擺放在基準(zhǔn)前面,所有元素
比基準(zhǔn)值大的擺在基準(zhǔn)的后面(相同的數(shù)可以到任一邊)。在這個(gè)分
區(qū)退出之后,該基準(zhǔn)就處于數(shù)列的中間位置。這個(gè)稱為分區(qū)(partition)
操作;
遞歸地(recursive)把小于基準(zhǔn)值元素的子數(shù)列和大于基準(zhǔn)值元素的
子數(shù)列排序。
代碼實(shí)現(xiàn):
functionquickSorl(air,lefl,righl)[len=
left二typeofleft!='numbci,?0:left,right=typeofright!='number'?len-1:right;|
if(left<right){
artitionlndex=partition(arr,left,right);uickSort(arr,left,partitionindex-1);
IuickSort(arrj)artitionlndex+1,right);returnarr;
Jvarpivotleft,
functionpartition(air,leftjight)(
varpivol=left,"設(shè)定基準(zhǔn)值5V3)
for(vari=index;iv=right;i++)1
s\vap(airi,
iTTIirSwza
fo「(vari二index;iv=right;i++
s\vap(airi,
swap(arr,pivot,index-MH\ai-temp=2曬;人\1arr|i|=
應(yīng)的ZKFailoverController進(jìn)程發(fā)生了“假死”現(xiàn)象,那么
Zookeeper服務(wù)端會(huì)認(rèn)為NameNodel掛掉了,根據(jù)前面的
主備切換邏輯,NameNode2會(huì)替代NameNodel進(jìn)入
Active狀態(tài)。但是此時(shí)NameNodel可能仍然處于Active狀
態(tài)正常運(yùn)行,這樣NameNodel和NameNode2都處于
Active狀態(tài),都可以對(duì)外提供服務(wù)。這種情況稱為腦裂。
腦裂對(duì)于NameNode這類對(duì)數(shù)據(jù)一致性要求非常高的系統(tǒng)來說是
災(zāi)難性的,數(shù)據(jù)會(huì)發(fā)生錯(cuò)亂且無法恢復(fù)。zookeeper社區(qū)對(duì)這種問
題的解決方法叫做fencing,中文翻譯為隔離,也就是想方法把舊的
ActiveNameNode隔離起來,使它不能正常對(duì)外提供服務(wù)。
在進(jìn)行fencing的時(shí)候,會(huì)執(zhí)行以下的操作:
首先嘗試調(diào)用這個(gè)舊ActiveNameNode的HAServiceProtocolRPC
接口的transitionToStandby方法,看能不能把它轉(zhuǎn)換為Standby
狀態(tài)。
如果transitionToStandby方法調(diào)用失敗,那么就執(zhí)行Hadoop配
置文件之中預(yù)定義的隔離措施,Hadoop目前主要提供兩種隔離措
施,通常會(huì)選擇sshfence:
arr[j]二tem
2)歸并排序
歸并排序是建立在歸并操作上的一種有效的排序算法。該算法是采
用分治法(DivideandConquer)的一個(gè)非常典型的應(yīng)用。將已有序
的子序列合并,得到完全有序的序列;即先使每個(gè)子序列有序,再
使子序列段間有序。假設(shè)將兩個(gè)有序表合并成一個(gè)有序表,稱為2-
路歸并。
算法描述
把長度為n的輸入序列分成兩個(gè)長度為n/2的子序列;
對(duì)這兩個(gè)子序列分別采用歸并排序;
將兩個(gè)排序好的子序列合并成一個(gè)最終的排序序列。
代碼實(shí)現(xiàn):
functionmcrgeSort(air){varlen=arr.lcngth;!
if(len<2)reiurnarr;
middle=MMhJour(len/leftmslicc(0
righi二4iT.srcturnmerge(mergcSort(left),mcrgcSort(right));
rcsiilt.push(lcf[.shin()):……”7
result.push(left.shift());whilc(right.length)
resuk.push(right.shif[());
returnresult;
2.查找算法
七大查找算法:L順序查找、2.二分查找、3,插值查找、4.斐
波那契查找、5.樹表查找、6.分塊查找、7.哈希查找
這些杳找算法中:分杳找是最容易考察的,下面講解二分杳找算
法。
1)二分查找
二分查找也稱折半查找(BinarySearch),它是一種效率較
高的查找方法。但是,折半查找要求線性表必須采用順序存
儲(chǔ)結(jié)構(gòu),而且表中元素按關(guān)鍵字有序排列,注意必須要是有
序排列o
代碼實(shí)現(xiàn):
1.使用遞歸
retum找到的位置口3o\AcstaticintrecursionBinarySearch(intn
airjntkey,intlow,inthigh){
if(key<airRow]||key>arr[high|||low>high){
return
intmiddle=(low+high)/2;
returnrecursionBinarySearch(arr,key,low,middle-I
.?if(arr[middle]<kcy){
returnrecursionBinarySearch(arr,key,middle+1,high);
)clse(
1.
returnmiddle;
*不使用遞歸的二分查熱
1.不使用遞歸實(shí)現(xiàn)(while循環(huán))
*不使用遞歸的二分查熱
Nitle:commonBinarvSeardi
ublicstaticin〔commonBinarySearch(int
high二aiT.Icny由一:
i1(key<aglow]||key>anlhigh]IIlow〉high){MB」
〃比關(guān)鍵字大那么關(guān)鍵字在左區(qū)域
"比關(guān)鍵字小那么關(guān)鍵字在右區(qū)域low二middle+IHUf'J:廉
return-1:仍然沒有找到,那么返回-1
定義;二叉樹,是一種特殊的樹,二叉樹的任意一個(gè)節(jié)點(diǎn)的度都不大
于2,不包含度的節(jié)點(diǎn)稱之為葉子。
遍歷方式:二叉樹的遍歷方式有三種,中序遍歷,先序遍歷,后序遍
歷。
將一個(gè)數(shù)組中的數(shù)以二叉樹的存儲(chǔ)結(jié)構(gòu)存儲(chǔ),并遍歷打?。捍a實(shí)現(xiàn):
importjava.util.ArrayLisliimport|binlree
publicbintrcc
^^^^bintrceright/Jpublicbinlree
pritalcObjectdata/B
publicLisivbintree>datas;|
ublicbintree(bintreeleft,bintreeght.Objectdata)iaIH
publicbintree(Objectdata)[IZH)
publicbintree0(□
datasm心AiTayList<birMrcc>(
binIrcc(o))
〃第一個(gè)數(shù)為根節(jié)點(diǎn)
root二datas.get(O)〃〃‘立
ti=0;i<objsjength/2;i++){Z.按//
if(i*2+2<datas.size0){〃防止陋R矽時(shí)依八版的datas.geKi).right=datas.get(i*2+2);
〃無序遞歷publicvoidpreorder(bintreeroot)
if(root!=null){
System.out.println(root.data);
preorder(root.right);I)i
publicvoidinorder(bint「eeroot){linordcr(rooL1cft)
System,out.Drinlln(ioo【.data);in()i'dcr(root.right
publicvoidafterorder(bintreeroot)<System.out.Drintln(root.data);aflerorder任ooleJ);"AAB;il-
lcro[-clct-(i-oc)Lriglil,):AAAH
voidmain(Strine||arRS){■bintreebintree二iewbintree()「AAB
Object口a=[245,7,l,a2,32.5L22);
biniree.preorder(bintree.rool);
sshfence:通過SSH登錄到目標(biāo)機(jī)器上,執(zhí)行命令fuser
將對(duì)應(yīng)的進(jìn)程殺死;
shellfence:執(zhí)行一個(gè)用戶自定義的shell腳本來將對(duì)應(yīng)的
進(jìn)程隔離。
8.小文件過多會(huì)有什么危害,如何防止Hadoop上大量
HDFS元數(shù)據(jù)信息存儲(chǔ)在NameNode內(nèi)存中,因此過多的
小文件必定會(huì)壓垮NameNode的內(nèi)存。
每個(gè)元數(shù)據(jù)對(duì)象約占150byte,所以如果有1千萬個(gè)小文件,每個(gè)文件
占用一個(gè)block,那么NameNode大約需要2G空間。
如果存儲(chǔ)1億個(gè)文件,那么NameNode需要20G空間。
顯而易見的解決這個(gè)問題的方法就是合并小文件,可以選擇在客戶端
上傳時(shí)執(zhí)行一定的策略先合并,或者是使用Hadoop的
CombineFilelnputFormat\<K,V\>實(shí)現(xiàn)小文件的合并。
9.請(qǐng)說下HDFS的組織架構(gòu)Client:客戶端
切分文件。文件上傳HDFS的時(shí)候,Client將文件切分成一個(gè)一個(gè)的
Block,然后進(jìn)行存儲(chǔ)與NameNode交互,獲取文件的位置信息
與DataNode交互,讀取或者寫入數(shù)據(jù)Client提供一些命令來管理
HDFS,比方啟動(dòng)關(guān)閉HDFS、訪問
HDFS目錄及內(nèi)容等NameNode:名稱節(jié)點(diǎn),也稱主節(jié)點(diǎn),存儲(chǔ)數(shù)據(jù)
的元數(shù)據(jù)信息,不存儲(chǔ)具體的數(shù)據(jù)
管理HDFS的名稱空間管理數(shù)據(jù)塊(Block)映射信息
配置副本策略
處理客戶端讀
寫請(qǐng)求
DataNode:數(shù)據(jù)節(jié)點(diǎn),也稱從節(jié)點(diǎn)。NameNodeF達(dá)命
令,DataNode執(zhí)行實(shí)際的操作
存儲(chǔ)實(shí)際的數(shù)據(jù)塊執(zhí)
行數(shù)據(jù)塊的讀/寫操
作
SecondaryNameNode:并非NameNode的熱備。當(dāng)
NameNode掛掉的時(shí)候,它并不能馬上替換NameNode并提
供服務(wù)
8.
輔助NameNode,分擔(dān)其工作量
定期合并Fsimage和Edits,并推送給NameNode
在緊急情況下,可輔助恢復(fù)NameNode
10.請(qǐng)說下MR中MapTask的工作機(jī)制
簡單概述:
inputFile通過split被切割為多個(gè)split文件,通過Record按行讀
取內(nèi)容給map(自己寫的處理邏輯的方法),數(shù)據(jù)被map處理完之
后交給OutputCollect收集器,對(duì)其結(jié)果key進(jìn)行分區(qū)(默認(rèn)使用
的hashPartitioner),然后寫入buffer,每個(gè)m叩task都有一個(gè)內(nèi)存
緩沖區(qū)(環(huán)形緩沖區(qū)),存放著map的輸出結(jié)果,當(dāng)緩沖區(qū)快滿的時(shí)
候需要將緩沖區(qū)的數(shù)據(jù)以一個(gè)臨時(shí)文件的方式溢寫到磁盤,當(dāng)整個(gè)
maptask結(jié)束:后再對(duì)磁盤中這個(gè)maptask產(chǎn)生的所有臨時(shí)文件做
合并,生成最終的正式輸出文件,然后等待reducetask的拉取。
詳細(xì)步驟:
讀取數(shù)據(jù)組件InputFormat(默認(rèn)TextlnputFormat)會(huì)通過
getSplits方法對(duì)輸入目錄中的文件進(jìn)行邏輯切片規(guī)劃得到block,有
多少個(gè)block就對(duì)應(yīng)啟動(dòng)多少個(gè)MapTasko
將輸入文件切分為block之后,由RecordReader對(duì)象(默認(rèn)是
LineRecordReader)進(jìn)行讀取,以\n作為分隔符,讀取一行數(shù)
據(jù),返回〈key,value),Key表示每行首字符偏移值,Value表示
這一行文本內(nèi)容。
讀取block返回Vkey,value>,進(jìn)入用戶自己繼承的Mapper類
中,執(zhí)行用戶重寫的map函數(shù),RecordReader讀取一行這里調(diào)用
一次。
Mapper邏輯結(jié)束之后,將Mapper的每條結(jié)果通過context.write
進(jìn)行collect數(shù)據(jù)收集。在collect中,會(huì)先對(duì)其進(jìn)行分區(qū)處理,默
認(rèn)使用HashPartitionero9.
接下來,會(huì)將數(shù)據(jù)寫入內(nèi)存,內(nèi)存中這片區(qū)域叫做環(huán)形緩沖區(qū)(默
認(rèn)100M),緩沖區(qū)的作用是批量收集Mapper結(jié)果,減少磁盤
10的影響。我們的Key/Value對(duì)以及Partition的結(jié)果都會(huì)被
寫入緩沖區(qū)。當(dāng)然,寫入之前,Key與Value值都會(huì)被序列化
成字節(jié)數(shù)組。
10.
11.
當(dāng)環(huán)形緩沖區(qū)的數(shù)據(jù)到達(dá)溢寫比列(默認(rèn)0.8),也就是80M
時(shí),溢寫線程啟動(dòng),需要對(duì)這80MB空間內(nèi)的Key做排序(Sort)
。排序是MapReduce模型默認(rèn)的行為,這里的排序也是對(duì)序列化的
字節(jié)做的排序。
12.
13.合并溢寫文件,每次溢寫會(huì)在磁盤上生成一個(gè)臨時(shí)文件(寫之前判斷是否有
Combiner),如果Mapper的輸出結(jié)果真的很大,有屢次這樣的溢寫發(fā)生,磁盤上
相應(yīng)的就會(huì)有多個(gè)臨時(shí)文件存在。當(dāng)整個(gè)數(shù)據(jù)處理結(jié)束之后開始對(duì)磁盤中的臨時(shí)文件
進(jìn)行Merge合并,因
溫馨提示
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 第11章 功和機(jī)械能單元檢測(cè)基礎(chǔ)卷(含解析)-八年級(jí)物理下冊(cè)(人教版)
- 哲學(xué)與??频娜诤?/a>
- 獨(dú)立學(xué)習(xí)之道
- 印象派藝術(shù)漫談
- 春節(jié)環(huán)保行動(dòng)
- 初中生活的新挑戰(zhàn)
- 學(xué)習(xí)策略解析
- 各類申請(qǐng)書格式模板
- 鋼包精煉成套設(shè)備項(xiàng)目風(fēng)險(xiǎn)識(shí)別與評(píng)估綜合報(bào)告
- 初級(jí)公司信貸-初級(jí)銀行從業(yè)資格考試《公司信貸》高頻考點(diǎn)4
- 焊口外觀檢查記錄
- 18-《護(hù)理心理學(xué)》課程標(biāo)準(zhǔn)
- Y2系列電機(jī)樣本
- 市域社會(huì)治理現(xiàn)代化解決方案
- 高考英語單詞3500分類記憶(精編版)
- 許慎《說文解字》(全文)
- 我國應(yīng)急通信保障能力評(píng)估體系探究(金)
- 井控-井口套管頭裝置⑥課件
- 施工質(zhì)量管理體系與保證措施方案
- 變配電室受電方案
- 譯林版五下英語1-3單元電子稿
評(píng)論
0/150
提交評(píng)論