1. 簡答說一下hadoop的map-reduce編程模型
首先map task會從本地文件系統(tǒng)讀取數(shù)據(jù)媒峡,轉(zhuǎn)換成key-value形式的鍵值對集合
使用的是hadoop內(nèi)置的數(shù)據(jù)類型,比如longwritable、text等
將鍵值對集合輸入mapper進行業(yè)務(wù)處理過程,將其轉(zhuǎn)換成需要的key-value在輸出
之后會進行一個partition分區(qū)操作,默認(rèn)使用的是hashpartitioner,可以通過重寫hashpartitioner的getpartition方法來自定義分區(qū)規(guī)則
之后會對key進行進行sort排序,grouping分組操作將相同key的value合并分組輸出惰瓜,在這里可以使用自定義的數(shù)據(jù)類型副编,重寫WritableComparator的Comparator方法來自定義排序規(guī)則呻待,重寫RawComparator的compara方法來自定義分組規(guī)則
之后進行一個combiner歸約操作奏篙,其實就是一個本地段的reduce預(yù)處理敛熬,以減小后面shufle和reducer的工作量
reduce task會通過網(wǎng)絡(luò)將各個數(shù)據(jù)收集進行reduce處理诲锹,最后將數(shù)據(jù)保存或者顯示,結(jié)束整個job
2. 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中可以自定義分隔符
3. hadoop和spark的都是并行計算母剥,那么他們有什么相同和區(qū)別
兩者都是用mr模型來進行并行計算,hadoop的一個作業(yè)稱為job,job里面分為map task和reduce task环疼,每個task都是在自己的進程中運行的习霹,當(dāng)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的生命周期是和app一樣的,即使沒有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)良好的容錯
4. 為什么要用flume導(dǎo)入hdfs毙沾,hdfs的構(gòu)架是怎樣的
flume可以實時的導(dǎo)入數(shù)據(jù)到hdfs中,當(dāng)hdfs上的文件達到一個指定大小的時候會形成一個文件直晨,或者超過指定時間的話也形成一個文件
文件都是存儲在datanode上面的搀军,namenode記錄著datanode的元數(shù)據(jù)信息,而namenode的元數(shù)據(jù)信息是存在內(nèi)存中的勇皇,所以當(dāng)文件切片很小或者很多的時候會卡死
5. map-reduce程序運行的時候會有什么比較常見的問題
比如說作業(yè)中大部分都完成了罩句,但是總有幾個reduce一直在運行
這是因為這幾個reduce中的處理的數(shù)據(jù)要遠遠大于其他的reduce,可能是因為對鍵值對任務(wù)劃分的不均勻造成的數(shù)據(jù)傾斜
解決的方法可以在分區(qū)的時候重新定義分區(qū)規(guī)則對于value數(shù)據(jù)很多的key可以進行拆分敛摘、均勻打散等處理门烂,或者是在map端的combiner中進行數(shù)據(jù)預(yù)處理的操作
6. 簡單說一下hadoop和spark的shuffle過程
hadoop:map端保存分片數(shù)據(jù),通過網(wǎng)絡(luò)收集到reduce端
spark:spark的shuffle是在DAGSchedular劃分Stage的時候產(chǎn)生的兄淫,TaskSchedule要分發(fā)Stage到各個worker的executor
減少shuffle可以提高性能
7. Hive中存放是什么屯远?
表。
存的是和hdfs的映射關(guān)系捕虽,hive是邏輯上的數(shù)據(jù)倉庫慨丐,實際操作的都是hdfs上的文件,HQL就是用sql語法來寫的mr程序泄私。
8. Hive與關(guān)系型數(shù)據(jù)庫的關(guān)系房揭?
沒有關(guān)系备闲,hive是數(shù)據(jù)倉庫,不能和數(shù)據(jù)庫一樣進行實時的CURD操作捅暴。
是一次寫入多次讀取的操作恬砂,可以看成是ETL工具。
9. Flume工作機制是什么蓬痒?
核心概念是agent泻骤,里面包括source、chanel和sink三個組件梧奢。
source運行在日志收集節(jié)點進行日志采集狱掂,之后臨時存儲在chanel中,sink負(fù)責(zé)將chanel中的數(shù)據(jù)發(fā)送到目的地粹断。
只有成功發(fā)送之后chanel中的數(shù)據(jù)才會被刪除符欠。
首先書寫flume配置文件嫡霞,定義agent瓶埋、source、chanel和sink然后將其組裝诊沪,執(zhí)行flume-ng命令。
10. Sqoop工作原理是什么?
hadoop生態(tài)圈上的數(shù)據(jù)傳輸工具棠枉。
可以將關(guān)系型數(shù)據(jù)庫的數(shù)據(jù)導(dǎo)入非結(jié)構(gòu)化的hdfs讹俊、hive或者bbase中,也可以將hdfs中的數(shù)據(jù)導(dǎo)出到關(guān)系型數(shù)據(jù)庫或者文本文件中渐裸。
使用的是mr程序來執(zhí)行任務(wù)巫湘,使用jdbc和關(guān)系型數(shù)據(jù)庫進行交互。
import原理:通過指定的分隔符進行數(shù)據(jù)切分昏鹃,將分片傳入各個map中尚氛,在map任務(wù)中在每行數(shù)據(jù)進行寫入處理沒有reduce。
export原理:根據(jù)要操作的表名生成一個java類洞渤,并讀取其元數(shù)據(jù)信息和分隔符對非結(jié)構(gòu)化的數(shù)據(jù)進行匹配阅嘶,多個map作業(yè)同時執(zhí)行寫入關(guān)系型數(shù)據(jù)庫
11. Hbase行健列族的概念,物理模型载迄,表的設(shè)計原則讯柔?
行健:是hbase表自帶的护昧,每個行健對應(yīng)一條數(shù)據(jù)魂迄。
列族:是創(chuàng)建表時指定的,為列的集合惋耙,每個列族作為一個文件單獨存儲捣炬,存儲的數(shù)據(jù)都是字節(jié)數(shù)組慈格,其中的數(shù)據(jù)可以有很多,通過時間戳來區(qū)分遥金。
物理模型:整個hbase表會拆分為多個region浴捆,每個region記錄著行健的起始點保存在不同的節(jié)點上,查詢時就是對各個節(jié)點的并行查詢稿械,當(dāng)region很大時使用.META表存儲各個region的起始點选泻,-ROOT又可以存儲.META的起始點。
rowkey的設(shè)計原則:各個列簇數(shù)據(jù)平衡美莫,長度原則页眯、相鄰原則,創(chuàng)建表的時候設(shè)置表放入regionserver緩存中厢呵,避免自動增長和時間窝撵,使用字節(jié)數(shù)組代替string,最大長度64kb襟铭,最好16字節(jié)以內(nèi)碌奉,按天分表,兩個字節(jié)散列寒砖,四個字節(jié)存儲時分毫秒赐劣。
列族的設(shè)計原則:盡可能少(按照列族進行存儲,按照region進行讀取哩都,不必要的io操作)魁兼,經(jīng)常和不經(jīng)常使用的兩類數(shù)據(jù)放入不同列族中,列族名字盡可能短漠嵌。
12. Spark Streaming和Storm有何區(qū)別咐汞?
一個實時毫秒一個準(zhǔn)實時亞秒,不過storm的吞吐率比較低儒鹿。
13. mllib支持的算法化撕?
大體分為四大類,分類挺身、聚類侯谁、回歸、協(xié)同過濾章钾。
15. Hadoop平臺集群配置墙贱、環(huán)境變量設(shè)置?
zookeeper:修改zoo.cfg文件贱傀,配置dataDir惨撇,和各個zk節(jié)點的server地址端口,tickTime心跳時間默認(rèn)是2000ms府寒,其他超時的時間都是以這個為基礎(chǔ)的整數(shù)倍魁衙,之后再dataDir對應(yīng)目錄下寫入myid文件和zoo.cfg中的server相對應(yīng)报腔。
hadoop:修改
hadoop-env.sh配置java環(huán)境變量
core-site.xml配置zk地址,臨時目錄等
hdfs-site.xml配置nn信息剖淀,rpc和http通信地址纯蛾,nn自動切換、zk連接超時時間等
yarn-site.xml配置resourcemanager地址
mapred-site.xml配置使用yarn
slaves配置節(jié)點信息
格式化nn和zk纵隔。
hbase:修改
hbase-env.sh配置java環(huán)境變量和是否使用自帶的zk
hbase-site.xml配置hdfs上數(shù)據(jù)存放路徑翻诉,zk地址和通訊超時時間、master節(jié)點
regionservers配置各個region節(jié)點
zoo.cfg拷貝到conf目錄下
spark:
安裝Scala
修改spark-env.sh配置環(huán)境變量和master和worker節(jié)點配置信息
環(huán)境變量的設(shè)置:直接在/etc/profile中配置安裝的路徑即可捌刮,或者在當(dāng)前用戶的宿主目錄下碰煌,配置在.bashrc文件中,該文件不用source重新打開shell窗口即可绅作,配置在.bash_profile的話只對當(dāng)前用戶有效芦圾。
16. Hadoop性能調(diào)優(yōu)?
調(diào)優(yōu)可以通過系統(tǒng)配置俄认、程序編寫和作業(yè)調(diào)度算法來進行个少。
hdfs的block.size可以調(diào)到128/256(網(wǎng)絡(luò)很好的情況下,默認(rèn)為64)
調(diào)優(yōu)的大頭:mapred.map.tasks梭依、mapred.reduce.tasks設(shè)置mr任務(wù)數(shù)(默認(rèn)都是1)
mapred.tasktracker.map.tasks.maximum每臺機器上的最大map任務(wù)數(shù)
mapred.tasktracker.reduce.tasks.maximum每臺機器上的最大reduce任務(wù)數(shù)
mapred.reduce.slowstart.completed.maps配置reduce任務(wù)在map任務(wù)完成到百分之幾的時候開始進入
這個幾個參數(shù)要看實際節(jié)點的情況進行配置稍算,reduce任務(wù)是在33%的時候完成copy典尾,要在這之前完成map任務(wù)役拴,(map可以提前完成)
mapred.compress.map.output,mapred.output.compress配置壓縮項,消耗cpu提升網(wǎng)絡(luò)和磁盤io
合理利用combiner
注意重用writable對象
17. Hadoop高并發(fā)钾埂?
首先肯定要保證集群的高可靠性河闰,在高并發(fā)的情況下不會掛掉,支撐不住可以通過橫向擴展褥紫。
datanode掛掉了使用hadoop腳本重新啟動姜性。
19. hadoop和spark的都是并行計算,那么他們有什么相同和區(qū)別髓考?
兩者都是用mr模型來進行并行計算部念,hadoop的一個作業(yè)稱為job,job里面分為map task和reduce task氨菇,每個task都是在自己的進程中運行的儡炼,當(dāng)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的生命周期是和app一樣的晶衷,即使沒有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)良好的容錯露懒。
20. 為什么要用flume導(dǎo)入hdfs,hdfs的構(gòu)架是怎樣的砂心?
flume可以實時的導(dǎo)入數(shù)據(jù)到hdfs中懈词,當(dāng)hdfs上的文件達到一個指定大小的時候會形成一個文件,或者超過指定時間的話也形成一個文件辩诞。
文件都是存儲在datanode上面的坎弯,namenode記錄著datanode的元數(shù)據(jù)信息,而namenode的元數(shù)據(jù)信息是存在內(nèi)存中的译暂,所以當(dāng)文件切片很小或者很多的時候會卡死抠忘。
22. 簡單說一下hadoop和spark的shuffle過程?
hadoop:map端保存分片數(shù)據(jù)外永,通過網(wǎng)絡(luò)收集到reduce端崎脉。
spark:spark的shuffle是在DAGSchedular劃分Stage的時候產(chǎn)生的,TaskSchedule要分發(fā)Stage到各個worker的executor伯顶。
減少shuffle可以提高性能囚灼。
23. RDD機制?
rdd分布式彈性數(shù)據(jù)集祭衩,簡單的理解成一種數(shù)據(jù)結(jié)構(gòu)灶体,是spark框架上的通用貨幣。
所有算子都是基于rdd來執(zhí)行的汪厨,不同的場景會有不同的rdd實現(xiàn)類赃春,但是都可以進行互相轉(zhuǎn)換。
rdd執(zhí)行過程中會形成dag圖劫乱,然后形成lineage保證容錯性等织中。
從物理的角度來看rdd存儲的是block和node之間的映射锥涕。
24. spark有哪些組件?
(1)master:管理集群和節(jié)點狭吼,不參與計算层坠。
(2)worker:計算節(jié)點,進程本身不參與計算刁笙,和master匯報破花。
(3)Driver:運行程序的main方法,創(chuàng)建spark context對象疲吸。
(4)spark context:控制整個application的生命周期座每,包括dagsheduler和task scheduler等組件。
(5)client:用戶提交程序的入口摘悴。
25. spark工作機制峭梳?
用戶在client端提交作業(yè)后,會由Driver運行main方法并創(chuàng)建spark context上下文蹂喻。
執(zhí)行add算子葱椭,形成dag圖輸入dagscheduler,按照add之間的依賴關(guān)系劃分stage輸入task scheduler口四。
task scheduler會將stage劃分為task set分發(fā)到各個節(jié)點的executor中執(zhí)行孵运。
26. spark的優(yōu)化怎么做?
通過spark-env文件蔓彩、程序中sparkconf和set property設(shè)置治笨。
(1)計算量大,形成的lineage過大應(yīng)該給已經(jīng)緩存了的rdd添加checkpoint粪小,以減少容錯帶來的開銷大磺。
(2)小分區(qū)合并,過小的分區(qū)造成過多的切換任務(wù)開銷探膊,使用repartition。
27. kafka工作原理待榔?
producer向broker發(fā)送事件逞壁,consumer從broker消費事件。
事件由topic區(qū)分開锐锣,每個consumer都會屬于一個group腌闯。
相同group中的consumer不能重復(fù)消費事件,而同一事件將會發(fā)送給每個不同group的consumer雕憔。
28. ALS算法原理姿骏?
答:對于user-product-rating數(shù)據(jù),als會建立一個稀疏的評分矩陣斤彼,其目的就是通過一定的規(guī)則填滿這個稀疏矩陣分瘦。
als會對稀疏矩陣進行分解蘸泻,分為用戶-特征值,產(chǎn)品-特征值嘲玫,一個用戶對一個產(chǎn)品的評分可以由這兩個矩陣相乘得到悦施。
通過固定一個未知的特征值,計算另外一個特征值去团,然后交替反復(fù)進行最小二乘法抡诞,直至差平方和最小,即可得想要的矩陣土陪。
29. kmeans算法原理昼汗?
隨機初始化中心點范圍,計算各個類別的平均值得到新的中心點鬼雀。
重新計算各個點到中心值的距離劃分乔遮,再次計算平均值得到新的中心點,直至各個類別數(shù)據(jù)平均值無變化取刃。
30. canopy算法原理蹋肮?
根據(jù)兩個閾值來劃分?jǐn)?shù)據(jù),以隨機的一個數(shù)據(jù)點作為canopy中心璧疗。
計算其他數(shù)據(jù)點到其的距離坯辩,劃入t1、t2中崩侠,劃入t2的從數(shù)據(jù)集中刪除漆魔,劃入t1的其他數(shù)據(jù)點繼續(xù)計算,直至數(shù)據(jù)集中無數(shù)據(jù)却音。
31. 樸素貝葉斯分類算法原理改抡?
對于待分類的數(shù)據(jù)和分類項,根據(jù)待分類數(shù)據(jù)的各個特征屬性系瓢,出現(xiàn)在各個分類項中的概率判斷該數(shù)據(jù)是屬于哪個類別的阿纤。
32. 關(guān)聯(lián)規(guī)則挖掘算法apriori原理?
一個頻繁項集的子集也是頻繁項集夷陋,針對數(shù)據(jù)得出每個產(chǎn)品的支持?jǐn)?shù)列表欠拾,過濾支持?jǐn)?shù)小于預(yù)設(shè)值的項,對剩下的項進行全排列骗绕,重新計算支持?jǐn)?shù)藐窄,再次過濾,重復(fù)至全排列結(jié)束酬土,可得到頻繁項和對應(yīng)的支持?jǐn)?shù)荆忍。