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