Hadoop/Spark相关面试问题总结
Hadoop/Spark相關面試問題總結
面試回來之后把當中比較重要的問題記了下來寫了個總結:
(答案在后面)
1、簡答說一下hadoop的map-reduce編程模型
2、hadoop的TextInputFormat作用是什么,如何自己定義實現
3、hadoop和spark的都是并行計算,那么他們有什么同樣和差別
4、為什么要用flume導入hdfs,hdfs的構架是如何的
5、map-reduce程序執行的時候會有什么比較常見的問題
6、簡單說一下hadoop和spark的shuffle過程
下面是自己的理解,假設有不正確的地方希望各位大俠能夠幫我指出來~:
1、簡答說一下hadoop的map-reduce編程模型
首先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
2、hadoop的TextInputFormat作用是什么。如何自己定義實現
InputFormat會在map操作之前對數據進行雙方面的預處理
1是getSplits,返回的是InputSplit數組,對數據進行split分片,每片交給map操作一次
2是getRecordReader。返回的是RecordReader對象。對每一個split分片進行轉換為key-value鍵值對格式傳遞給map
經常使用的InputFormat是TextInputFormat,使用的是LineRecordReader對每一個分片進行鍵值對的轉換,以行偏移量作為鍵,行內容作為值
自己定義類繼承InputFormat接口。重寫createRecordReader和isSplitable方法
在createRecordReader中能夠自己定義分隔符
3、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圖能夠實現良好的容錯
4、為什么要用flume導入hdfs。hdfs的構架是如何的
flume能夠實時的導入數據到hdfs中,當hdfs上的文件達到一個指定大小的時候會形成一個文件,或者超過指定時間的話也形成一個文件
文件都是存儲在datanode上面的。namenode記錄著datanode的元數據信息,而namenode的元數據信息是存在內存中的,所以當文件切片非常小或者非常多的時候會卡死
5、map-reduce程序執行的時候會有什么比較常見的問題
比方說作業中大部分都完畢了,可是總有幾個reduce一直在執行
這是由于這幾個reduce中的處理的數據要遠遠大于其它的reduce,可能是由于對鍵值對任務劃分的不均勻造成的數據傾斜
解決辦法能夠在分區的時候又一次定義分區規則對于value數據非常多的key能夠進行拆分、均勻打散等處理。或者是在map端的combiner中進行數據預處理的操作
6、簡單說一下hadoop和spark的shuffle過程
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原理?
一個頻繁項集的子集也是頻繁項集。針對數據得出每一個產品的支持數列表。過濾支持數小于預設值的項,對剩下的項進行全排列。又一次計算支持數,再次過濾,反復至全排列結束,可得到頻繁項和相應的支持數。
作者:@小黑
下面是自己的理解,假設有不正確的地方希望各位大俠能夠幫我指出來~:
1、簡答說一下hadoop的map-reduce編程模型
首先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
2、hadoop的TextInputFormat作用是什么,如何自己定義實現
InputFormat會在map操作之前對數據進行雙方面的預處理
1是getSplits,返回的是InputSplit數組,對數據進行split分片。每片交給map操作一次
2是getRecordReader,返回的是RecordReader對象。對每一個split分片進行轉換為key-value鍵值對格式傳遞給map
經常使用的InputFormat是TextInputFormat,使用的是LineRecordReader對每一個分片進行鍵值對的轉換,以行偏移量作為鍵,行內容作為值
自己定義類繼承InputFormat接口。重寫createRecordReader和isSplitable方法
在createRecordReader中能夠自己定義分隔符
3、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圖能夠實現良好的容錯
4、為什么要用flume導入hdfs,hdfs的構架是如何的
flume能夠實時的導入數據到hdfs中,當hdfs上的文件達到一個指定大小的時候會形成一個文件,或者超過指定時間的話也形成一個文件
文件都是存儲在datanode上面的。namenode記錄著datanode的元數據信息,而namenode的元數據信息是存在內存中的,所以當文件切片非常小或者非常多的時候會卡死
5、map-reduce程序執行的時候會有什么比較常見的問題
比方說作業中大部分都完畢了,可是總有幾個reduce一直在執行
這是由于這幾個reduce中的處理的數據要遠遠大于其它的reduce,可能是由于對鍵值對任務劃分的不均勻造成的數據傾斜
解決辦法能夠在分區的時候又一次定義分區規則對于value數據非常多的key能夠進行拆分、均勻打散等處理,或者是在map端的combiner中進行數據預處理的操作
6、簡單說一下hadoop和spark的shuffle過程
hadoop:map端保存分片數據,通過網絡收集到reduce端
spark:spark的shuffle是在DAGSchedular劃分Stage的時候產生的,TaskSchedule要分發Stage到各個worker的executor
降低shuffle能夠提高性能
部分答案不是十分準確歡迎補充:-)
作者:@小黑
轉載于:https://www.cnblogs.com/liguangsunls/p/7354265.html
總結
以上是生活随笔為你收集整理的Hadoop/Spark相关面试问题总结的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 使用Nginx实现灰度发布
- 下一篇: XHTML 相对路径与绝对路径