天天看點

Hadoop/Spark相關面試問題總結Hadoop/Spark相關面試問題總結

版權聲明:本文為部落客原創文章,未經部落客允許不得轉載。 https://blog.csdn.net/qq1010885678/article/details/46916857

Hadoop/Spark相關面試問題總結

面試回來之後把其中比較重要的問題記了下來寫了個總結:

(答案在後面)

1、簡答說一下hadoop的map-reduce程式設計模型

2、hadoop的TextInputFormat作用是什麼,如何自定義實作

3、hadoop和spark的都是并行計算,那麼他們有什麼相同和差別

4、為什麼要用flume導入hdfs,hdfs的構架是怎樣的

5、map-reduce程式運作的時候會有什麼比較常見的問題

6、簡單說一下hadoop和spark的shuffle過程

以下是自己的了解,如果有不對的地方希望各位大俠可以幫我指出來~:

首先map task會從本地檔案系統讀取資料,轉換成key-value形式的鍵值對集合

使用的是hadoop内置的資料類型,比如longwritable、text等

将鍵值對集合輸入mapper進行業務處理過程,将其轉換成需要的key-value在輸出

之後會進行一個partition分區操作,預設使用的是hashpartitioner,可以通過重寫hashpartitioner的getpartition方法來自定義分區規則

之後會對key進行進行sort排序,grouping分組操作将相同key的value合并分組輸出,在這裡可以使用自定義的資料類型,重寫WritableComparator的Comparator方法來自定義排序規則,重寫RawComparator的compara方法來自定義分組規則

之後進行一個combiner歸約操作,其實就是一個本地段的reduce預處理,以減小後面shufle和reducer的工作量

reduce task會通過網絡将各個資料收集進行reduce處理,最後将資料儲存或者顯示,結束整個job

InputFormat會在map操作之前對資料進行兩方面的預處理

1是getSplits,傳回的是InputSplit數組,對資料進行split分片,每片交給map操作一次

2是getRecordReader,傳回的是RecordReader對象,對每個split分片進行轉換為key-value鍵值對格式傳遞給map

常用的InputFormat是TextInputFormat,使用的是LineRecordReader對每個分片進行鍵值對的轉換,以行偏移量作為鍵,行内容作為值

自定義類繼承InputFormat接口,重寫createRecordReader和isSplitable方法

在createRecordReader中可以自定義分隔符

兩者都是用mr模型來進行并行計算,hadoop的一個作業稱為job,job裡面分為map task和reduce task,每個task都是在自己的程序中運作的,當task結束時,程序也會結束

spark使用者送出的任務成為application,一個application對應一個sparkcontext,app中存在多個job,每觸發一次action操作就會産生一個job

這些job可以并行或串行執行,每個job中有多個stage,stage是shuffle過程中DAGSchaduler通過RDD之間的依賴關系劃分job而來的,每個stage裡面有多個task,組成taskset有TaskSchaduler分發到各個executor中執行,executor的生命周期是和app一樣的,即使沒有job運作也是存在的,是以task可以快速啟動讀取記憶體進行計算

hadoop的job隻有map和reduce操作,表達能力比較欠缺而且在mr過程中會重複的讀寫hdfs,造成大量的io操作,多個job需要自己管理關系

spark的疊代計算都是在記憶體中進行的,API中提供了大量的RDD操作如join,groupby等,而且通過DAG圖可以實作良好的容錯

flume可以實時的導入資料到hdfs中,當hdfs上的檔案達到一個指定大小的時候會形成一個檔案,或者超過指定時間的話也形成一個檔案

檔案都是存儲在datanode上面的,namenode記錄着datanode的中繼資料資訊,而namenode的中繼資料資訊是存在記憶體中的,是以當檔案切片很小或者很多的時候會卡死

比如說作業中大部分都完成了,但是總有幾個reduce一直在運作

這是因為這幾個reduce中的處理的資料要遠遠大于其他的reduce,可能是因為對鍵值對任務劃分的不均勻造成的資料傾斜

解決的方法可以在分區的時候重新定義分區規則對于value資料很多的key可以進行拆分、均勻打散等處理,或者是在map端的combiner中進行資料預處理的操作

hadoop:map端儲存分片資料,通過網絡收集到reduce端

spark:spark的shuffle是在DAGSchedular劃分Stage的時候産生的,TaskSchedule要分發Stage到各個worker的executor

減少shuffle可以提高性能

部分答案不是十分準确歡迎補充:-)

——-補充更新———

1、Hive中存放是什麼?

表。

存的是和hdfs的映射關系,hive是邏輯上的資料倉庫,實際操作的都是hdfs上的檔案,HQL就是用sql文法來寫的mr程式。

2、Hive與關系型資料庫的關系?

沒有關系,hive是資料倉庫,不能和資料庫一樣進行實時的CURD操作。

是一次寫入多次讀取的操作,可以看成是ETL工具。

3、Flume工作機制是什麼?

核心概念是agent,裡面包括source、chanel和sink三個元件。

source運作在日志收集節點進行日志采集,之後臨時存儲在chanel中,sink負責将chanel中的資料發送到目的地。

隻有成功發送之後chanel中的資料才會被删除。

首先書寫flume配置檔案,定義agent、source、chanel和sink然後将其組裝,執行flume-ng指令。

4、Sqoop工作原理是什麼?

hadoop生态圈上的資料傳輸工具。

可以将關系型資料庫的資料導入非結構化的hdfs、hive或者bbase中,也可以将hdfs中的資料導出到關系型資料庫或者文本檔案中。

使用的是mr程式來執行任務,使用jdbc和關系型資料庫進行互動。

import原理:通過指定的分隔符進行資料切分,将分片傳入各個map中,在map任務中在每行資料進行寫入處理沒有reduce。

export原理:根據要操作的表名生成一個java類,并讀取其中繼資料資訊和分隔符對非結構化的資料進行比對,多個map作業同時執行寫入關系型資料庫

5、Hbase行健列族的概念,實體模型,表的設計原則?

行健:是hbase表自帶的,每個行健對應一條資料。

列族:是建立表時指定的,為列的集合,每個列族作為一個檔案單獨存儲,存儲的資料都是位元組數組,其中的資料可以有很多,通過時間戳來區分。

實體模型:整個hbase表會拆分為多個region,每個region記錄着行健的起始點儲存在不同的節點上,查詢時就是對各個節點的并行查詢,當region很大時使用.META表存儲各個region的起始點,-ROOT又可以存儲.META的起始點。

rowkey的設計原則:各個列簇資料平衡,長度原則、相鄰原則,建立表的時候設定表放入regionserver緩存中,避免自動增長和時間,使用位元組數組代替string,最大長度64kb,最好16位元組以内,按天分表,兩個位元組散列,四個位元組存儲時分毫秒。

列族的設計原則:盡可能少(按照列族進行存儲,按照region進行讀取,不必要的io操作),經常和不經常使用的兩類資料放入不同列族中,列族名字盡可能短。

6、Spark Streaming和Storm有何差別?

一個實時毫秒一個準實時亞秒,不過storm的吞吐率比較低。

7、mllib支援的算法?

大體分為四大類,分類、聚類、回歸、協同過濾。

8、簡答說一下hadoop的map-reduce程式設計模型?

首先map task會從本地檔案系統讀取資料,轉換成key-value形式的鍵值對集合。

将鍵值對集合輸入mapper進行業務處理過程,将其轉換成需要的key-value在輸出。

之後會進行一個partition分區操作,預設使用的是hashpartitioner,可以通過重寫hashpartitioner的getpartition方法來自定義分區規則。

之後會對key進行進行sort排序,grouping分組操作将相同key的value合并分組輸出。

在這裡可以使用自定義的資料類型,重寫WritableComparator的Comparator方法來自定義排序規則,重寫RawComparator的compara方法來自定義分組規則。

之後進行一個combiner歸約操作,其實就是一個本地段的reduce預處理,以減小後面shufle和reducer的工作量。

reduce task會通過網絡将各個資料收集進行reduce處理,最後将資料儲存或者顯示,結束整個job。

9、Hadoop平台叢集配置、環境變量設定?

zookeeper:修改zoo.cfg檔案,配置dataDir,和各個zk節點的server位址端口,tickTime心跳時間預設是2000ms,其他逾時的時間都是以這個為基礎的整數倍,之後再dataDir對應目錄下寫入myid檔案和zoo.cfg中的server相對應。

hadoop:修改

hadoop-env.sh配置java環境變量

core-site.xml配置zk位址,臨時目錄等

hdfs-site.xml配置nn資訊,rpc和http通信位址,nn自動切換、zk連接配接逾時時間等

yarn-site.xml配置resourcemanager位址

mapred-site.xml配置使用yarn

slaves配置節點資訊

格式化nn和zk。

hbase:修改

hbase-env.sh配置java環境變量和是否使用自帶的zk

hbase-site.xml配置hdfs上資料存放路徑,zk位址和通訊逾時時間、master節點

regionservers配置各個region節點

zoo.cfg拷貝到conf目錄下

spark:

安裝Scala

修改spark-env.sh配置環境變量和master和worker節點配置資訊

環境變量的設定:直接在/etc/profile中配置安裝的路徑即可,或者在目前使用者的宿主目錄下,配置在.bashrc檔案中,該檔案不用source重新打開shell視窗即可,配置在.bash_profile的話隻對目前使用者有效。

10、Hadoop性能調優?

調優可以通過系統配置、程式編寫和作業排程算法來進行。

hdfs的block.size可以調到128/256(網絡很好的情況下,預設為64)

調優的大頭:mapred.map.tasks、mapred.reduce.tasks設定mr任務數(預設都是1)

mapred.tasktracker.map.tasks.maximum每台機器上的最大map任務數

mapred.tasktracker.reduce.tasks.maximum每台機器上的最大reduce任務數

mapred.reduce.slowstart.completed.maps配置reduce任務在map任務完成到百分之幾的時候開始進入

這個幾個參數要看實際節點的情況進行配置,reduce任務是在33%的時候完成copy,要在這之前完成map任務,(map可以提前完成)

mapred.compress.map.output,mapred.output.compress配置壓縮項,消耗cpu提升網絡和磁盤io

合理利用combiner

注意重用writable對象

11、Hadoop高并發?

首先肯定要保證叢集的高可靠性,在高并發的情況下不會挂掉,支撐不住可以通過橫向擴充。

datanode挂掉了使用hadoop腳本重新啟動。

12、hadoop的TextInputFormat作用是什麼,如何自定義實作?

InputFormat會在map操作之前對資料進行兩方面的預處理。

1是getSplits,傳回的是InputSplit數組,對資料進行split分片,每片交給map操作一次 。

2是getRecordReader,傳回的是RecordReader對象,對每個split分片進行轉換為key-value鍵值對格式傳遞給map。

常用的InputFormat是TextInputFormat,使用的是LineRecordReader對每個分片進行鍵值對的轉換,以行偏移量作為鍵,行内容作為值。

自定義類繼承InputFormat接口,重寫createRecordReader和isSplitable方法 。

在createRecordReader中可以自定義分隔符。

13、hadoop和spark的都是并行計算,那麼他們有什麼相同和差別?

兩者都是用mr模型來進行并行計算,hadoop的一個作業稱為job,job裡面分為map task和reduce task,每個task都是在自己的程序中運作的,當task結束時,程序也會結束。

spark使用者送出的任務成為application,一個application對應一個sparkcontext,app中存在多個job,每觸發一次action操作就會産生一個job。

這些job可以并行或串行執行,每個job中有多個stage,stage是shuffle過程中DAGSchaduler通過RDD之間的依賴關系劃分job而來的,每個stage裡面有多個task,組成taskset有TaskSchaduler分發到各個executor中執行,executor的生命周期是和app一樣的,即使沒有job運作也是存在的,是以task可以快速啟動讀取記憶體進行計算。

hadoop的job隻有map和reduce操作,表達能力比較欠缺而且在mr過程中會重複的讀寫hdfs,造成大量的io操作,多個job需要自己管理關系。

spark的疊代計算都是在記憶體中進行的,API中提供了大量的RDD操作如join,groupby等,而且通過DAG圖可以實作良好的容錯。

14、為什麼要用flume導入hdfs,hdfs的構架是怎樣的?

flume可以實時的導入資料到hdfs中,當hdfs上的檔案達到一個指定大小的時候會形成一個檔案,或者超過指定時間的話也形成一個檔案。

檔案都是存儲在datanode上面的,namenode記錄着datanode的中繼資料資訊,而namenode的中繼資料資訊是存在記憶體中的,是以當檔案切片很小或者很多的時候會卡死。

15、map-reduce程式運作的時候會有什麼比較常見的問題?

比如說作業中大部分都完成了,但是總有幾個reduce一直在運作。

這是因為這幾個reduce中的處理的資料要遠遠大于其他的reduce,可能是因為對鍵值對任務劃分的不均勻造成的資料傾斜。

解決的方法可以在分區的時候重新定義分區規則對于value資料很多的key可以進行拆分、均勻打散等處理,或者是在map端的combiner中進行資料預處理的操作。

16、簡單說一下hadoop和spark的shuffle過程?

hadoop:map端儲存分片資料,通過網絡收集到reduce端。

spark:spark的shuffle是在DAGSchedular劃分Stage的時候産生的,TaskSchedule要分發Stage到各個worker的executor。

減少shuffle可以提高性能。

17、RDD機制?

rdd分布式彈性資料集,簡單的了解成一種資料結構,是spark架構上的通用貨币。

所有算子都是基于rdd來執行的,不同的場景會有不同的rdd實作類,但是都可以進行互相轉換。

rdd執行過程中會形成dag圖,然後形成lineage保證容錯性等。

從實體的角度來看rdd存儲的是block和node之間的映射。

18、spark有哪些元件?

(1)master:管理叢集和節點,不參與計算。

(2)worker:計算節點,程序本身不參與計算,和master彙報。

(3)Driver:運作程式的main方法,建立spark context對象。

(4)spark context:控制整個application的生命周期,包括dagsheduler和task scheduler等元件。

(5)client:使用者送出程式的入口。

19、spark工作機制?

使用者在client端送出作業後,會由Driver運作main方法并建立spark context上下文。

執行add算子,形成dag圖輸入dagscheduler,按照add之間的依賴關系劃分stage輸入task scheduler。

task scheduler會将stage劃分為task set分發到各個節點的executor中執行。

20、spark的優化怎麼做?

通過spark-env檔案、程式中sparkconf和set property設定。

(1)計算量大,形成的lineage過大應該給已經緩存了的rdd添加checkpoint,以減少容錯帶來的開銷。

(2)小分區合并,過小的分區造成過多的切換任務開銷,使用repartition。

21、kafka工作原理?

producer向broker發送事件,consumer從broker消費事件。

事件由topic區分開,每個consumer都會屬于一個group。

相同group中的consumer不能重複消費事件,而同一事件将會發送給每個不同group的consumer。

22、ALS算法原理?

答:對于user-product-rating資料,als會建立一個稀疏的評分矩陣,其目的就是通過一定的規則填滿這個稀疏矩陣。

als會對稀疏矩陣進行分解,分為使用者-特征值,産品-特征值,一個使用者對一個産品的評分可以由這兩個矩陣相乘得到。

通過固定一個未知的特征值,計算另外一個特征值,然後交替反複進行最小二乘法,直至差平方和最小,即可得想要的矩陣。

23、kmeans算法原理?

随機初始化中心點範圍,計算各個類别的平均值得到新的中心點。

重新計算各個點到中心值的距離劃分,再次計算平均值得到新的中心點,直至各個類别資料平均值無變化。

24、canopy算法原理?

根據兩個門檻值來劃分資料,以随機的一個資料點作為canopy中心。

計算其他資料點到其的距離,劃入t1、t2中,劃入t2的從資料集中删除,劃入t1的其他資料點繼續計算,直至資料集中無資料。

25、樸素貝葉斯分類算法原理?

對于待分類的資料和分類項,根據待分類資料的各個特征屬性,出現在各個分類項中的機率判斷該資料是屬于哪個類别的。

26、關聯規則挖掘算法apriori原理?

一個頻繁項集的子集也是頻繁項集,針對資料得出每個産品的支援數清單,過濾支援數小于預設值的項,對剩下的項進行全排列,重新計算支援數,再次過濾,重複至全排列結束,可得到頻繁項和對應的支援數。

作者:

@小黑

繼續閱讀