hadoop面試題

一、簡答說一下hadoop的map-reduce編程模型java

首先map task會從本地文件系統讀取數據,轉換成key-value形式的鍵值對集合node

使用的是hadoop內置的數據類型,好比longwritable、text等算法

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

以後會進行一個partition分區操做,默認使用的是hashpartitioner,能夠經過重寫hashpartitioner的getpartition方法來自定義分區規則shell

以後會對key進行進行sort排序,grouping分組操做將相同key的value合併分組輸出,在這裏可使用自定義的數據類型,重寫WritableComparator的Comparator方法來自定義排序規則,重寫RawComparator的compara方法來自定義分組規則數據庫

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

reduce task會經過網絡將各個數據收集進行reduce處理,最後將數據保存或者顯示,結束整個job數組

二、hadoop的TextInputFormat做用是什麼,如何自定義實現緩存

InputFormat會在map操做以前對數據進行兩方面的預處理 
1是getSplits,返回的是InputSplit數組,對數據進行split分片,每片交給map操做一次 
2是getRecordReader,返回的是RecordReader對象,對每一個split分片進行轉換爲key-value鍵值對格式傳遞給mapbash

經常使用的InputFormat是TextInputFormat,使用的是LineRecordReader對每一個分片進行鍵值對的轉換,以行偏移量做爲鍵,行內容做爲值

自定義類繼承InputFormat接口,重寫createRecordReader和isSplitable方法 
在createRecordReader中能夠自定義分隔符

三、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圖能夠實現良好的容錯

四、爲何要用flume導入hdfs,hdfs的構架是怎樣的

flume能夠實時的導入數據到hdfs中,當hdfs上的文件達到一個指定大小的時候會造成一個文件,或者超過指定時間的話也造成一個文件

文件都是存儲在datanode上面的,namenode記錄着datanode的元數據信息,而namenode的元數據信息是存在內存中的,因此當文件切片很小或者不少的時候會卡死

五、map-reduce程序運行的時候會有什麼比較常見的問題

好比說做業中大部分都完成了,可是總有幾個reduce一直在運行

這是由於這幾個reduce中的處理的數據要遠遠大於其餘的reduce,多是由於對鍵值對任務劃分的不均勻形成的數據傾斜

解決的方法能夠在分區的時候從新定義分區規則對於value數據不少的key能夠進行拆分、均勻打散等處理,或者是在map端的combiner中進行數據預處理的操做

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

hadoop:map端保存分片數據,經過網絡收集到reduce端 
spark:spark的shuffle是在DAGSchedular劃分Stage的時候產生的,TaskSchedule要分發Stage到各個worker的executor

減小shuffle能夠提升性能

七、Hive中存放是什麼?

表。 
存的是和hdfs的映射關係,hive是邏輯上的數據倉庫,實際操做的都是hdfs上的文件,HQL就是用sql語法來寫的mr程序。

八、Hive與關係型數據庫的關係?

沒有關係,hive是數據倉庫,不能和數據庫同樣進行實時的CURD操做。 
是一次寫入屢次讀取的操做,能夠當作是ETL工具。

九、Flume工做機制是什麼?

核心概念是agent,裏面包括source、chanel和sink三個組件。 
source運行在日誌收集節點進行日誌採集,以後臨時存儲在chanel中,sink負責將chanel中的數據發送到目的地。 
只有成功發送以後chanel中的數據纔會被刪除。 
首先書寫flume配置文件,定義agent、source、chanel和sink而後將其組裝,執行flume-ng命令。

十、Sqoop工做原理是什麼?

hadoop生態圈上的數據傳輸工具。 
能夠將關係型數據庫的數據導入非結構化的hdfs、hive或者bbase中,也能夠將hdfs中的數據導出到關係型數據庫或者文本文件中。 
使用的是mr程序來執行任務,使用jdbc和關係型數據庫進行交互。 
import原理:經過指定的分隔符進行數據切分,將分片傳入各個map中,在map任務中在每行數據進行寫入處理沒有reduce。 
export原理:根據要操做的表名生成一個java類,並讀取其元數據信息和分隔符對非結構化的數據進行匹配,多個map做業同時執行寫入關係型數據庫

十一、Hbase行健列族的概念,物理模型,表的設計原則?

行健:是hbase表自帶的,每一個行健對應一條數據。 
列族:是建立表時指定的,爲列的集合,每一個列族做爲一個文件單獨存儲,存儲的數據都是字節數組,其中的數據能夠有不少,經過時間戳來區分。 
物理模型:整個hbase表會拆分爲多個region,每一個region記錄着行健的起始點保存在不一樣的節點上,查詢時就是對各個節點的並行查詢,當region很大時使用.META表存儲各個region的起始點,-ROOT又能夠存儲.META的起始點。 
rowkey的設計原則:各個列簇數據平衡,長度原則、相鄰原則,建立表的時候設置表放入regionserver緩存中,避免自動增加和時間,使用字節數組代替string,最大長度64kb,最好16字節之內,按天分表,兩個字節散列,四個字節存儲時分毫秒。 
列族的設計原則:儘量少(按照列族進行存儲,按照region進行讀取,沒必要要的io操做),常常和不常用的兩類數據放入不一樣列族中,列族名字儘量短。

十二、Spark Streaming和Storm有何區別?

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

1三、mllib支持的算法?

大致分爲四大類,分類、聚類、迴歸、協同過濾。

1四、簡答說一下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。

1五、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的話只對當前用戶有效。

1六、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對象

1七、Hadoop高併發?

首先確定要保證集羣的高可靠性,在高併發的狀況下不會掛掉,支撐不住能夠經過橫向擴展。 
datanode掛掉了使用hadoop腳本從新啓動。

1八、hadoop的TextInputFormat做用是什麼,如何自定義實現?

InputFormat會在map操做以前對數據進行兩方面的預處理。 
1是getSplits,返回的是InputSplit數組,對數據進行split分片,每片交給map操做一次 。 
2是getRecordReader,返回的是RecordReader對象,對每一個split分片進行轉換爲key-value鍵值對格式傳遞給map。 
經常使用的InputFormat是TextInputFormat,使用的是LineRecordReader對每一個分片進行鍵值對的轉換,以行偏移量做爲鍵,行內容做爲值。 
自定義類繼承InputFormat接口,重寫createRecordReader和isSplitable方法 。 
在createRecordReader中能夠自定義分隔符。

1九、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圖能夠實現良好的容錯。

20、爲何要用flume導入hdfs,hdfs的構架是怎樣的?

flume能夠實時的導入數據到hdfs中,當hdfs上的文件達到一個指定大小的時候會造成一個文件,或者超過指定時間的話也造成一個文件。 
文件都是存儲在datanode上面的,namenode記錄着datanode的元數據信息,而namenode的元數據信息是存在內存中的,因此當文件切片很小或者不少的時候會卡死。

2一、map-reduce程序運行的時候會有什麼比較常見的問題?

好比說做業中大部分都完成了,可是總有幾個reduce一直在運行。 
這是由於這幾個reduce中的處理的數據要遠遠大於其餘的reduce,多是由於對鍵值對任務劃分的不均勻形成的數據傾斜。 
解決的方法能夠在分區的時候從新定義分區規則對於value數據不少的key能夠進行拆分、均勻打散等處理,或者是在map端的combiner中進行數據預處理的操做。

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

hadoop:map端保存分片數據,經過網絡收集到reduce端。 
spark:spark的shuffle是在DAGSchedular劃分Stage的時候產生的,TaskSchedule要分發Stage到各個worker的executor。 
減小shuffle能夠提升性能。

2三、RDD機制?

rdd分佈式彈性數據集,簡單的理解成一種數據結構,是spark框架上的通用貨幣。 
全部算子都是基於rdd來執行的,不一樣的場景會有不一樣的rdd實現類,可是均可以進行互相轉換。 
rdd執行過程當中會造成dag圖,而後造成lineage保證容錯性等。 
從物理的角度來看rdd存儲的是block和node之間的映射。

2四、spark有哪些組件?

(1)master:管理集羣和節點,不參與計算。 
(2)worker:計算節點,進程自己不參與計算,和master彙報。 
(3)Driver:運行程序的main方法,建立spark context對象。 
(4)spark context:控制整個application的生命週期,包括dagsheduler和task scheduler等組件。 
(5)client:用戶提交程序的入口。

2五、spark工做機制?

用戶在client端提交做業後,會由Driver運行main方法並建立spark context上下文。 
執行add算子,造成dag圖輸入dagscheduler,按照add之間的依賴關係劃分stage輸入task scheduler。 
task scheduler會將stage劃分爲task set分發到各個節點的executor中執行。

2六、spark的優化怎麼作?

經過spark-env文件、程序中sparkconf和set property設置。 
(1)計算量大,造成的lineage過大應該給已經緩存了的rdd添加checkpoint,以減小容錯帶來的開銷。 
(2)小分區合併,太小的分區形成過多的切換任務開銷,使用repartition。

2七、kafka工做原理?

producer向broker發送事件,consumer從broker消費事件。 
事件由topic區分開,每一個consumer都會屬於一個group。 
相同group中的consumer不能重複消費事件,而同一事件將會發送給每一個不一樣group的consumer。

2八、ALS算法原理?

答:對於user-product-rating數據,als會創建一個稀疏的評分矩陣,其目的就是經過必定的規則填滿這個稀疏矩陣。 
als會對稀疏矩陣進行分解,分爲用戶-特徵值,產品-特徵值,一個用戶對一個產品的評分能夠由這兩個矩陣相乘獲得。 
經過固定一個未知的特徵值,計算另一個特徵值,而後交替反覆進行最小二乘法,直至差平方和最小,便可得想要的矩陣。

2九、kmeans算法原理?

隨機初始化中心點範圍,計算各個類別的平均值獲得新的中心點。 
從新計算各個點到中心值的距離劃分,再次計算平均值獲得新的中心點,直至各個類別數據平均值無變化。

30、canopy算法原理?

根據兩個閾值來劃分數據,以隨機的一個數據點做爲canopy中心。 
計算其餘數據點到其的距離,劃入t一、t2中,劃入t2的從數據集中刪除,劃入t1的其餘數據點繼續計算,直至數據集中無數據。

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

對於待分類的數據和分類項,根據待分類數據的各個特徵屬性,出如今各個分類項中的機率判斷該數據是屬於哪一個類別的。

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

一個頻繁項集的子集也是頻繁項集,針對數據得出每一個產品的支持數列表,過濾支持數小於預設值的項,對剩下的項進行全排列,從新計算支持數,再次過濾,重複至全排列結束,可獲得頻繁項和對應的支持數。

相關文章
相關標籤/搜索