2020-09-28
大數(shù)據(jù)培訓(xùn) 大數(shù)據(jù)面試題
今天好程序員大數(shù)據(jù)培訓(xùn)老師給大家分享一篇關(guān)于大數(shù)據(jù)面試題整理的詳細介紹,下面我們一起來看一下吧。
一、.hdfs寫文件的步驟
答案:
(1)client向NameNode申請上傳…/xxx.txt文件
(2)NN向client響應(yīng)可以上傳文件
(3)Client向NameNode申請DataNode
(4)NN向Client返回DN1,DN2,DN3
(5)Client向DN1,DN2,DN3申請建立文件傳輸通道
(6)DN3,DN2,DN1依次響應(yīng)連接
(7)Client向DN1上傳一個block,DN1向DN2,DN3冗余文件
大數(shù)據(jù)面試題整理
二、hdfs讀取文件步驟
答案:
(1)client向NN請求下載…/xxx.txt文件
(2)NN向client返回文件的元數(shù)據(jù)
(3)Client向DN1請求訪問讀數(shù)據(jù)blk_1
(4)DN1向Client傳輸數(shù)據(jù)
(5)Client向DN2請求訪問讀數(shù)據(jù)blk_2
(6)DN2向Client傳輸數(shù)據(jù)
大數(shù)據(jù)面試題整理
大數(shù)據(jù)面試題整理
三、hadoop的shuffle過程
1.Map端的shuffle
Map端會處理輸入數(shù)據(jù)并產(chǎn)生中間結(jié)果,這個中間結(jié)果會寫到本地磁盤,而不是HDFS。每個Map的輸出會先寫到內(nèi)存緩沖區(qū)中,當寫入的數(shù)據(jù)達到設(shè)定的閾值時,系統(tǒng)將會啟動一個線程將緩沖區(qū)的數(shù)據(jù)寫到磁盤,這個過程叫做spill。
在spill寫入之前,會先進行二次排序,首先根據(jù)數(shù)據(jù)所屬的partition進行排序,然后每個partition中的數(shù)據(jù)再按key來排序。partition的目是將記錄劃分到不同的Reducer上去,以期望能夠達到負載均衡,以后的Reducer就會根據(jù)partition來讀取自己對應(yīng)的數(shù)據(jù)。接著運行combiner(如果設(shè)置了的話),combiner的本質(zhì)也是一個Reducer,其目的是對將要寫入到磁盤上的文件先進行一次處理,這樣,寫入到磁盤的數(shù)據(jù)量就會減少。zui后將數(shù)據(jù)寫到本地磁盤產(chǎn)生spill文件(spill文件保存在{mapred.local.dir}指定的目錄中,Map任務(wù)結(jié)束后就會被刪除)。
zui后,每個Map任務(wù)可能產(chǎn)生多個spill文件,在每個Map任務(wù)完成前,會通過多路歸并算法將這些spill文件歸并成一個文件。至此,Map的shuffle過程就結(jié)束了。
2.Reduce端的shuffle
Reduce端的shuffle主要包括三個階段,copy、sort(merge)和reduce。
首先要將Map端產(chǎn)生的輸出文件拷貝到Reduce端,但每個Reducer如何知道自己應(yīng)該處理哪些數(shù)據(jù)呢?因為Map端進行partition的時候,實際上就相當于指定了每個Reducer要處理的數(shù)據(jù)(partition就對應(yīng)了Reducer),所以Reducer在拷貝數(shù)據(jù)的時候只需拷貝與自己對應(yīng)的partition中的數(shù)據(jù)即可。每個Reducer會處理一個或者多個partition,但需要先將自己對應(yīng)的partition中的數(shù)據(jù)從每個Map的輸出結(jié)果中拷貝過來。
接下來就是sort階段,也成為merge階段,因為這個階段的主要工作是執(zhí)行了歸并排序。從Map端拷貝到Reduce端的數(shù)據(jù)都是有序的,所以很適合歸并排序。zui終在Reduce端生成一個較大的文件作為Reduce的輸入。
zui后就是Reduce過程了,在這個過程中產(chǎn)生了zui終的輸出結(jié)果,并將其寫到HDFS上。
四、fsimage和edit的區(qū)別?
當NN,SN要進行數(shù)據(jù)同步時叫做checkpoint時就用到了fsimage與edit,fsimage是保存zui新的元數(shù)據(jù)的信息,當fsimage數(shù)據(jù)到一定的大小事會去生成一個新的文件來保存元數(shù)據(jù)的信息,這個新的文件就是edit,edit會回滾zui新的數(shù)據(jù)。
五、簡單說一下hadoop的map-reduce模型
首先maptask會從本地文件系統(tǒng)讀取數(shù)據(jù),轉(zhuǎn)換成key-value形式的鍵值對集合,使用的是hadoop內(nèi)置的數(shù)據(jù)類型,如Text,Longwritable等。
將鍵值對集合輸入mapper進行業(yè)務(wù)處理過程,將其轉(zhuǎn)化成需要的key-value再輸出。
之后會進行一個partition分區(qū)操作,默認使用的是hashpartitioner,可以通過重寫hashpartitioner的getPartition方法來自定義分區(qū)規(guī)則。
之后會對key進行sort排序,grouping分組操作將相同key的value合并分組輸出,在這里可以使用自定義的數(shù)據(jù)類型,重寫WritableComparator的Comparator方法來自定義排序規(guī)則,重寫RawComparator的compara方法來自定義分組規(guī)則。
之后進行一個combiner歸約操作,就是一個本地的reduce預(yù)處理,以減小shuffle,reducer的工作量。
Reducetask會用過網(wǎng)絡(luò)將各個數(shù)據(jù)收集進行reduce處理,zui后將數(shù)據(jù)保存或者顯示,結(jié)束整個job。
六、運行hadoop集群需要哪些守護進程?
DataNode,NameNode,TaskTracker和JobTracker都是運行Hadoop集群需要的守護進程。
七、hadoop的TextInputFormat作用是什么,如何自定義實現(xiàn)?
InputFormat會在map操作之前對數(shù)據(jù)進行兩方面的預(yù)處理。
1.是getSplits,返回的是InputSplit數(shù)組,對數(shù)據(jù)進行Split分片,每片交給map操作一次。
2.是getRecordReader,返回的是RecordReader對象,對每個Split分片進行轉(zhuǎn)換為key-value鍵值對格式傳遞給map常用的InputFormat是TextInputFormat,使用的是LineRecordReader對每個分片進行鍵值對的轉(zhuǎn)換,以行偏移量作為鍵,行內(nèi)容作為值。
自定義類繼承InputFormat接口,重寫createRecordReader和isSplitable方法在createRecordReader中可以自定義分隔符。
八、hadoop和spark都是并行計算,那么他們有什么相同和區(qū)別?
兩者都使用mr模型來進行并行計算,hadoop的一個作業(yè)稱為job,job里面分為maptask和reducetask,每個task都是在自己的進程中運行的,當task結(jié)束時,進程也會結(jié)束。
Spark用戶提交的任務(wù)稱為application,一個application對應(yīng)一個SparkContext,app中存在多個job,沒觸發(fā)一個action操作就會產(chǎn)生一個job。
這些job可以并行或者串行執(zhí)行,每個job有多個stage,stage是shuffle過程中DAGSchaduler通過RDD之間的依賴關(guān)系劃分job而來的,每個stage里面有多個task,組成taskset有TaskSchaduler分發(fā)到各個executor中執(zhí)行,executor的生命周期是和application一樣的,即使沒有job運行也是存在的,所以task可以快速啟動讀取內(nèi)存進行計算的。
Hadoop的job只有map和reduce操作,表達能力比較欠缺而且在mr過程中會重復(fù)的讀寫hdfs,造成大量的io操作,多個job需要自己管理關(guān)系。
Spark的迭代計算都是在內(nèi)存中進行的,API中提供了大量的RDD操作join,groupby等,而且通過DAG圖可以實現(xiàn)良好的容錯。
九、為什么要用flume導(dǎo)入hdfs,hdfs的架構(gòu)是怎樣的?
Flume可以實時的導(dǎo)入數(shù)據(jù)到hdfs中,當hdfs上的文件達到一個指定大小的時候會形成一個文件,或者超時所指定時間的話也形成一個文件。
文件都是存儲在datanode上的,namenode存儲著datanode的元數(shù)據(jù)信息,而namenode的元數(shù)據(jù)信息是存在內(nèi)存中的,所以當文件切片很小或者很多的時候會卡死。
十、MR程序運行的時候會有什么比較常見的問題?
比如說作業(yè)中大部分都完成了,但是總有幾個reduce一直在運行。
這是因為這幾個reduce中的處理的數(shù)據(jù)要遠遠大于其他的reduce,可能是對鍵值對任務(wù)劃分的不均勻造成的數(shù)據(jù)傾斜。
解決的方法可以在分區(qū)的時候重新定義分區(qū)規(guī)則對于value數(shù)據(jù)很多的key可以進行拆分、均勻打散等處理,或者是在map端的combiner中進行數(shù)據(jù)預(yù)處理的操作。
十一、簡單說一下hadoop和spark的shuffle過程
Hadoop:map端保存分片數(shù)據(jù),通過網(wǎng)絡(luò)收集到reduce端。
Spark:spark的shuffle實在DAGSchedular劃分Stage的時候產(chǎn)生的,TaskSchedular要分發(fā)Stage到各個worker的executor。減少shuffle可以提高性能。
十二、hive中存放的是什么?
表。
存的是和hdfs的映射關(guān)系,hive是邏輯上的數(shù)據(jù)倉庫,實際操作的都是hdfs上的文件,HQL就是用SQL語法來寫的MR程序。
十三、Hive與關(guān)系型數(shù)據(jù)庫的關(guān)系?
沒有關(guān)系,hive是數(shù)據(jù)倉庫,不能和數(shù)據(jù)庫一樣進行實時的CRUD操作。
是一次寫入多次讀取的操作,可以看成是ETL的工具。
十四、Flume的工作及時是什么?
核心概念是agent,里面包括source,channel和sink三個組件。
Source運行在日志收集節(jié)點進行日志采集,之后臨時存儲在channel中,sink負責將channel中的數(shù)據(jù)發(fā)送到目的地。
只有發(fā)送成功channel中的數(shù)據(jù)才會被刪除。
首先書寫flume配置文件,定義agent、source、channel和sink然后將其組裝,執(zhí)行flume-ng命令。
十五、Hbase行鍵列族的概念,物理模型,表的設(shè)計原則?
行鍵:是hbase表自帶的,每個行鍵對應(yīng)一條數(shù)據(jù)。
列族:是創(chuàng)建表時指定的,為列的集合,每個列族作為一個文件單獨存儲,存儲的數(shù)據(jù)都是字節(jié)數(shù)組,其中數(shù)據(jù)可以有很多,通過時間戳來區(qū)分。
物理模型:整個hbase表會拆分成多個region,每個region記錄著行鍵的起始點保存在不同的節(jié)點上,查詢時就是對各個節(jié)點的并行查詢,當region很大時使用.META表存儲各個region的起始點,-ROOT又可以存儲.META的起始點。
Rowkey的設(shè)計原則:各個列族數(shù)據(jù)平衡,長度原則、相鄰原則,創(chuàng)建表的時候設(shè)置表放入regionserver緩存中,避免自動增長和時間,使用字節(jié)數(shù)組代替string,zui大長度64kb,zui好16字節(jié)以內(nèi),按天分表,兩個字節(jié)散列,四個字節(jié)存儲時分毫秒。
列族的設(shè)計原則:盡可能少(按照列族進行存儲,按照region進行讀取,不必要的io操作),經(jīng)常和不經(jīng)常使用的兩類數(shù)據(jù)放入不同列族中,列族名字盡可能短。
十六、請列出正常的hadoop集群中hadoop都分別需要啟動哪些進程,他們的作用分別都是什么,請盡量列的詳細一些。
namenode:負責管理hdfs中文件塊的元數(shù)據(jù),響應(yīng)客戶端請求,管理datanode上文件block的均衡,維持副本數(shù)量
Secondname:主要負責做checkpoint操作;也可以做冷備,對一定范圍內(nèi)數(shù)據(jù)做快照性備份。
Datanode:存儲數(shù)據(jù)塊,負責客戶端對數(shù)據(jù)塊的io請求
Jobtracker:管理任務(wù),并將任務(wù)分配給tasktracker。
Tasktracker:執(zhí)行JobTracker分配的任務(wù)。
Resourcemanager、Nodemanager、Journalnode、Zookeeper、Zkfc
十七、請說明hive中SortBy、OrderBy、ClusterBy,DistributeBy各代表什么意思?
orderby:會對輸入做全局排序,因此只有一個reducer(多個reducer無法保證全局有序)。只有一個reducer,會導(dǎo)致當輸入規(guī)模較大時,需要較長的計算時間。
sortby:不是全局排序,其在數(shù)據(jù)進入reducer前完成排序。
distributeby:按照指定的字段對數(shù)據(jù)進行劃分輸出到不同的reduce中。
clusterby:除了具有distributeby的功能外還兼具sortby的功能。
十八、HBase簡單讀寫流程?
讀:
找到要讀數(shù)據(jù)的region所在的RegionServer,然后按照以下順序進行讀取:先去BlockCache讀取,若BlockCache沒有,則到Memstore讀取,若Memstore中沒有,則到HFile中去讀。
寫:
找到要寫數(shù)據(jù)的region所在的RegionServer,然后先將數(shù)據(jù)寫到WAL(Write-AheadLogging,預(yù)寫日志系統(tǒng))中,然后再將數(shù)據(jù)寫到Memstore等待刷新,回復(fù)客戶端寫入完成。
十九、HBase的特點是什么?
(1)hbase是一個分布式的基于列式存儲的數(shù)據(jù)庫,基于hadoop的HDFS存儲,zookeeper進行管理。
(2)hbase適合存儲半結(jié)構(gòu)化或非結(jié)構(gòu)化數(shù)據(jù),對于數(shù)據(jù)結(jié)構(gòu)字段不夠確定或者雜亂無章很難按一個概念去抽取的數(shù)據(jù)。
(3)hbase為null的記錄不會被存儲。
(4)基于的表包括rowkey,時間戳和列族。新寫入數(shù)據(jù)時,時間戳更新,同時可以查詢到以前的版本。
(5)hbase是主從結(jié)構(gòu)。Hmaster作為主節(jié)點,hregionserver作為從節(jié)點。
二十、請描述如何解決Hbase中region太小和region太大帶來的結(jié)果。
Region過大會發(fā)生多次compaction,將數(shù)據(jù)讀一遍并寫一遍到hdfs上,占用io,region過小會造成多次split,region會下線,影響訪問服務(wù),調(diào)整hbase.heregion.max.filesize為256m。
以上就是關(guān)于好程序員大數(shù)據(jù)培訓(xùn)之面試題整理的全部內(nèi)容,想要了解更多關(guān)于大數(shù)據(jù)開發(fā)方面內(nèi)容的小伙伴,請關(guān)注好程序員大數(shù)據(jù)培訓(xùn)官網(wǎng)、微信等平臺,好程序員有專業(yè)的大數(shù)據(jù)講師為您指導(dǎo),
開班時間:2021-04-12(深圳)
開班盛況開班時間:2021-05-17(北京)
開班盛況開班時間:2021-03-22(杭州)
開班盛況開班時間:2021-04-26(北京)
開班盛況開班時間:2021-05-10(北京)
開班盛況開班時間:2021-02-22(北京)
開班盛況開班時間:2021-07-12(北京)
預(yù)約報名開班時間:2020-09-21(上海)
開班盛況開班時間:2021-07-12(北京)
預(yù)約報名開班時間:2019-07-22(北京)
開班盛況
Copyright 2011-2023 北京千鋒互聯(lián)科技有限公司 .All Right
京ICP備12003911號-5
京公網(wǎng)安備 11010802035720號