更新時(shí)間:2018年10月24日15時(shí)59分 來源:傳智播客 瀏覽次數(shù):
1、簡答說一下hadoop的map-reduce編程模型
首先map task會(huì)從本地文件系統(tǒng)讀取數(shù)據(jù),轉(zhuǎn)換成key-value形式的鍵值對(duì)集合
使用的是hadoop內(nèi)置的數(shù)據(jù)類型,比如longwritable、text等
將鍵值對(duì)集合輸入mapper進(jìn)行業(yè)務(wù)處理過程,將其轉(zhuǎn)換成需要的key-value在輸出
之后會(huì)進(jìn)行一個(gè)partition分區(qū)操作,默認(rèn)使用的是hashpartitioner,可以通過重寫hashpartitioner的getpartition方法來自定義分區(qū)規(guī)則
之后會(huì)對(duì)key進(jìn)行進(jìn)行sort排序,grouping分組操作將相同key的value合并分組輸出,在這里可以使用自定義的數(shù)據(jù)類型,重寫Writable Comparator的Comparator方法來自定義排序規(guī)則,重寫RawComparator的compara方法來自定義分組規(guī)則
之后進(jìn)行一個(gè)combiner歸約操作,其實(shí)就是一個(gè)本地段的reduce預(yù)處理,以減小后面shufle和reducer的工作量
reduce task會(huì)通過網(wǎng)絡(luò)將各個(gè)數(shù)據(jù)收集進(jìn)行reduce處理,最后將數(shù)據(jù)保存或者顯示,結(jié)束整個(gè)job
2、hadoop的TextInputFormat作用是什么,如何自定義實(shí)現(xiàn)
InputFormat會(huì)在map操作之前對(duì)數(shù)據(jù)進(jìn)行兩方面的預(yù)處理
1是getSplits,返回的是InputSplit數(shù)組,對(duì)數(shù)據(jù)進(jìn)行split分片,每片交給map操作一次
2是getRecordReader,返回的是RecordReader對(duì)象,對(duì)每個(gè)split分片進(jìn)行轉(zhuǎn)換為key-value鍵值對(duì)格式傳遞給map
常用的InputFormat是TextInputFormat,使用的是LineRecordReader對(duì)每個(gè)分片進(jìn)行鍵值對(duì)的轉(zhuǎn)換,以行偏移量作為鍵,行內(nèi)容作為值
自定義類繼承InputFormat接口,重寫createRecordReader和isSplitable方法
在createRecordReader中可以自定義分隔符
3、hadoop和spark的都是并行計(jì)算,那么他們有什么相同和區(qū)別
兩者都是用mr模型來進(jìn)行并行計(jì)算,hadoop的一個(gè)作業(yè)稱為job,job里面分為map task和reduce task,每個(gè)task都是在自己的進(jìn)程中運(yùn)行的,當(dāng)task結(jié)束時(shí),進(jìn)程也會(huì)結(jié)束
spark用戶提交的任務(wù)成為application,一個(gè)application對(duì)應(yīng)一個(gè)sparkcontext,app中存在多個(gè)job,每觸發(fā)一次action操作就會(huì)產(chǎn)生一個(gè)job
這些job可以并行或串行執(zhí)行,每個(gè)job中有多個(gè)stage,stage是shuffle過程中DAGSchaduler通過RDD之間的依賴關(guān)系劃分job而來的,每個(gè)stage里面有多個(gè)task,組成taskset有TaskSchaduler分發(fā)到各個(gè)executor中執(zhí)行,executor的生命周期是和app一樣的,即使沒有job運(yùn)行也是存在的,所以task可以快速啟動(dòng)讀取內(nèi)存進(jìn)行計(jì)算
hadoop的job只有map和reduce操作,表達(dá)能力比較欠缺而且在mr過程中會(huì)重復(fù)的讀寫hdfs,造成大量的io操作,多個(gè)job需要自己管理關(guān)系
spark的迭代計(jì)算都是在內(nèi)存中進(jìn)行的,API中提供了大量的RDD操作如join,groupby等,而且通過DAG圖可以實(shí)現(xiàn)良好的容錯(cuò)
4、為什么要用flume導(dǎo)入hdfs,hdfs的構(gòu)架是怎樣的
flume可以實(shí)時(shí)的導(dǎo)入數(shù)據(jù)到hdfs中,當(dāng)hdfs上的文件達(dá)到一個(gè)指定大小的時(shí)候會(huì)形成一個(gè)文件,或者超過指定時(shí)間的話也形成一個(gè)文件
文件都是存儲(chǔ)在datanode上面的,namenode記錄著datanode的元數(shù)據(jù)信息,而namenode的元數(shù)據(jù)信息是存在內(nèi)存中的,所以當(dāng)文件切片很小或者很多的時(shí)候會(huì)卡死
5、map-reduce程序運(yùn)行的時(shí)候會(huì)有什么比較常見的問題
比如說作業(yè)中大部分都完成了,但是總有幾個(gè)reduce一直在運(yùn)行
這是因?yàn)檫@幾個(gè)reduce中的處理的數(shù)據(jù)要遠(yuǎn)遠(yuǎn)大于其他的reduce,可能是因?yàn)閷?duì)鍵值對(duì)任務(wù)劃分的不均勻造成的數(shù)據(jù)傾斜
解決的方法可以在分區(qū)的時(shí)候重新定義分區(qū)規(guī)則對(duì)于value數(shù)據(jù)很多的key可以進(jìn)行拆分、均勻打散等處理,或者是在map端的combiner中進(jìn)行數(shù)據(jù)預(yù)處理的操作
6、簡單說一下hadoop和spark的shuffle過程
hadoop:map端保存分片數(shù)據(jù),通過網(wǎng)絡(luò)收集到reduce端
spark:spark的shuffle是在DAGSchedular劃分Stage的時(shí)候產(chǎn)生的,TaskSchedule要分發(fā)Stage到各個(gè)worker的executor,減少shuffle可以提高性能
7、Hive中存放是什么?
表(數(shù)據(jù)+元數(shù)據(jù))。 存的是和hdfs的映射關(guān)系,hive是邏輯上的數(shù)據(jù)倉庫,實(shí)際操作的都是hdfs上的文件,HQL就是用sql語法來寫的mr程序。
8、Hive與關(guān)系型數(shù)據(jù)庫的關(guān)系?
沒有關(guān)系,hive是數(shù)據(jù)倉庫,不能和數(shù)據(jù)庫一樣進(jìn)行實(shí)時(shí)的CURD操作。
是一次寫入多次讀取的操作,可以看成是ETL工具。
9、Flume工作機(jī)制是什么?
核心概念是agent,里面包括source、chanel和sink三個(gè)組件。
source運(yùn)行在日志收集節(jié)點(diǎn)進(jìn)行日志采集,之后臨時(shí)存儲(chǔ)在chanel中,sink負(fù)責(zé)將chanel中的數(shù)據(jù)發(fā)送到目的地。
只有成功發(fā)送之后chanel中的數(shù)據(jù)才會(huì)被刪除。
首先書寫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ù)庫進(jìn)行交互。
import原理:通過指定的分隔符進(jìn)行數(shù)據(jù)切分,將分片傳入各個(gè)map中,在map任務(wù)中在每行數(shù)據(jù)進(jìn)行寫入處理沒有reduce。
export原理:根據(jù)要操作的表名生成一個(gè)java類,并讀取其元數(shù)據(jù)信息和分隔符對(duì)非結(jié)構(gòu)化的數(shù)據(jù)進(jìn)行匹配,多個(gè)map作業(yè)同時(shí)執(zhí)行寫入關(guān)系型數(shù)據(jù)庫
11、Hbase行健列族的概念,物理模型,表的設(shè)計(jì)原則?
行?。菏莌base表自帶的,每個(gè)行健對(duì)應(yīng)一條數(shù)據(jù)。
列族:是創(chuàng)建表時(shí)指定的,為列的集合,每個(gè)列族作為一個(gè)文件單獨(dú)存儲(chǔ),存儲(chǔ)的數(shù)據(jù)都是字節(jié)數(shù)組,其中的數(shù)據(jù)可以有很多,通過時(shí)間戳來區(qū)分。
物理模型:整個(gè)hbase表會(huì)拆分為多個(gè)region,每個(gè)region記錄著行健的起始點(diǎn)保存在不同的節(jié)點(diǎn)上,查詢時(shí)就是對(duì)各個(gè)節(jié)點(diǎn)的并行查詢,當(dāng)region很大時(shí)使用.META表存儲(chǔ)各個(gè)region的起始點(diǎn),-ROOT又可以存儲(chǔ).META的起始點(diǎn)。
rowkey的設(shè)計(jì)原則:各個(gè)列簇?cái)?shù)據(jù)平衡,長度原則、相鄰原則,創(chuàng)建表的時(shí)候設(shè)置表放入regionserver緩存中,避免自動(dòng)增長和時(shí)間,使用字節(jié)數(shù)組代替string,最大長度64kb,最好16字節(jié)以內(nèi),按天分表,兩個(gè)字節(jié)散列,四個(gè)字節(jié)存儲(chǔ)時(shí)分毫秒。
列族的設(shè)計(jì)原則:盡可能少(按照列族進(jìn)行存儲(chǔ),按照region進(jìn)行讀取,不必要的io操作),經(jīng)常和不經(jīng)常使用的兩類數(shù)據(jù)放入不同列族中,列族名字盡可能短。
12、combiner和partition的作用
combiner是reduce的實(shí)現(xiàn),在map端運(yùn)行計(jì)算任務(wù),減少map端的輸出數(shù)據(jù)。
作用就是優(yōu)化。
但是combiner的使用場(chǎng)景是mapreduce的map輸出結(jié)果和reduce輸入輸出一樣。
partition的默認(rèn)實(shí)現(xiàn)是hashpartition,是map端將數(shù)據(jù)按照reduce個(gè)數(shù)取余,進(jìn)行分區(qū),不同的reduce來copy自己的數(shù)據(jù)。
partition的作用是將數(shù)據(jù)分到不同的reduce進(jìn)行計(jì)算,加快計(jì)算效果
13、mllib支持的算法?
大體分為四大類,分類、聚類、回歸、協(xié)同過濾。
15、Hadoop平臺(tái)集群配置、環(huán)境變量設(shè)置?
zookeeper:修改zoo.cfg文件,配置dataDir,和各個(gè)zk節(jié)點(diǎn)的server地址端口,tickTime心跳時(shí)間默認(rèn)是2000ms,其他超時(shí)的時(shí)間都是以這個(gè)為基礎(chǔ)的整數(shù)倍,之后再dataDir對(duì)應(yīng)目錄下寫入myid文件和zoo.cfg中的server相對(duì)應(yīng)。
hadoop:修改
hadoop-env.sh配置java環(huán)境變量
core-site.xml配置zk地址,臨時(shí)目錄等
hdfs-site.xml配置nn信息,rpc和http通信地址,nn自動(dòng)切換、zk連接超時(shí)時(shí)間等
yarn-site.xml配置resourcemanager地址
mapred-site.xml配置使用yarn
slaves配置節(jié)點(diǎn)信息
格式化nn和zk。
hbase:修改
hbase-env.sh配置java環(huán)境變量和是否使用自帶的zk
hbase-site.xml配置hdfs上數(shù)據(jù)存放路徑,zk地址和通訊超時(shí)時(shí)間、master節(jié)點(diǎn)
regionservers配置各個(gè)region節(jié)點(diǎn)
zoo.cfg拷貝到conf目錄下
spark:
安裝Scala
修改spark-env.sh配置環(huán)境變量和master和worker節(jié)點(diǎn)配置信息
環(huán)境變量的設(shè)置:直接在/etc/profile中配置安裝的路徑即可,或者在當(dāng)前用戶的宿主目錄下,配置在.bashrc文件中,該文件不用source重新打開shell窗口即可,配置在.bash_profile的話只對(duì)當(dāng)前用戶有效。
16、Hadoop性能調(diào)優(yōu)?
調(diào)優(yōu)可以通過系統(tǒng)配置、程序編寫和作業(yè)調(diào)度算法來進(jìn)行。
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每臺(tái)機(jī)器上的最大map任務(wù)數(shù)
mapred.tasktracker.reduce.tasks.maximum每臺(tái)機(jī)器上的最大reduce任務(wù)數(shù)
mapred.reduce.slowstart.completed.maps配置reduce任務(wù)在map任務(wù)完成到百分之幾的時(shí)候開始進(jìn)入
這個(gè)幾個(gè)參數(shù)要看實(shí)際節(jié)點(diǎn)的情況進(jìn)行配置,reduce任務(wù)是在33%的時(shí)候完成copy,要在這之前完成map任務(wù),(map可以提前完成)
mapred.compress.map.output,mapred.output.compress配置壓縮項(xiàng),消耗cpu提升網(wǎng)絡(luò)和磁盤io
合理利用combiner
注意重用writable對(duì)象
17、Hadoop高并發(fā)?
首先肯定要保證集群的高可靠性,在高并發(fā)的情況下不會(huì)掛掉,支撐不住可以通過橫向擴(kuò)展。
datanode掛掉了使用hadoop腳本重新啟動(dòng)。
21、map-reduce程序運(yùn)行的時(shí)候會(huì)有什么比較常見的問題?
比如說作業(yè)中大部分都完成了,但是總有幾個(gè)reduce一直在運(yùn)行。
這是因?yàn)檫@幾個(gè)reduce中的處理的數(shù)據(jù)要遠(yuǎn)遠(yuǎn)大于其他的reduce,可能是因?yàn)閷?duì)鍵值對(duì)任務(wù)劃分的不均勻造成的數(shù)據(jù)傾斜。
解決的方法可以在分區(qū)的時(shí)候重新定義分區(qū)規(guī)則對(duì)于value數(shù)據(jù)很多的key可以進(jìn)行拆分、均勻打散等處理,或者是在map端的combiner中進(jìn)行數(shù)據(jù)預(yù)處理的操作。
作者:傳智播客大數(shù)據(jù)培訓(xùn)學(xué)院
首發(fā):http://cloud.itcast.cn
2019版大數(shù)據(jù)學(xué)習(xí)路線圖(含大綱+視頻+工具+教材+面試)
2018-05-14云計(jì)算大數(shù)據(jù):spark與storm比對(duì)與選型
2018-01-23【云計(jì)算大數(shù)據(jù)】Java面試題之?dāng)?shù)據(jù)庫三范式是什么
2018-01-10云計(jì)算面試題之Request對(duì)象的主要方法
2018-01-05云計(jì)算大數(shù)據(jù):企業(yè)中處理數(shù)據(jù)的兩種主要方式
2018-01-05云計(jì)算大數(shù)據(jù):數(shù)據(jù)倉庫建模
2017-12-19北京校區(qū)