扣丁學(xué)堂盤點2018年大數(shù)據(jù)hadoop面試經(jīng)典題匯總
2018-01-09 14:36:49
2263瀏覽
1.在Hadoop中定義的主要公用InputFormat中,默認(rèn)是哪一個?(A)
A、TextInputFormat
B、KeyValueInputFormat
C、SequenceFileInputFormat
1.下面哪個程序負(fù)責(zé)HDFS數(shù)據(jù)存儲?(C)
A.NameNode
B.JobTracker
C.DataNode
D.SecondaryNameNode
E.tasktracker
2.HDFS中的block默認(rèn)保存幾份?(A)
A.3份
B.2份
C.1份
D.不確定
3.下列哪個程序通常與NameNode在一個節(jié)點啟動?(D)
A.SecondaryNameNode
B.DataNode
C.TaskTracker
D.JobTracker
hadoop的集群是基于master/slave模式,namenode和jobtracker屬于master,datanode和tasktracker屬于slave,master只有一個,而slave有多個.
SecondaryNameNode內(nèi)存需求和NameNode在一個數(shù)量級上,所以通常secondaryNameNode(運(yùn)行在單獨(dú)的物理機(jī)器上)和NameNode運(yùn)行在不同的機(jī)器上。
JobTracker對應(yīng)于NameNode,TaskTracker對應(yīng)于DataNode.
DataNode和NameNode是針對數(shù)據(jù)存放來而言的.JobTracker和TaskTracker是對于MapReduce執(zhí)行而言的.
mapreduce中幾個主要概念,mapreduce整體上可以分為這么幾條執(zhí)行線索:
jobclient,JobTracker與TaskTracker。
1、JobClient會在用戶端通過JobClient類將已經(jīng)配置參數(shù)打包成jar文件的應(yīng)用存儲到hdfs,并把路徑提交到Jobtracker,然后由JobTracker創(chuàng)建每一個Task(即MapTask和ReduceTask)并將它們分發(fā)到各個TaskTracker服務(wù)中去執(zhí)行。
2、JobTracker是一master服務(wù),軟件啟動之后JobTracker接收J(rèn)ob,負(fù)責(zé)調(diào)度Job的每一個子任務(wù)。task運(yùn)行于TaskTracker上,并監(jiān)控它們,如果發(fā)現(xiàn)有失敗的task就重新運(yùn)行它。一般情況應(yīng)該把JobTracker部署在單獨(dú)的機(jī)器上。
3、TaskTracker是運(yùn)行在多個節(jié)點上的slaver服務(wù)。TaskTracker主動與JobTracker通信,接收作業(yè),并負(fù)責(zé)直接執(zhí)行每一個任務(wù)。TaskTracker都需要運(yùn)行在HDFS的DataNode上。
4.關(guān)于SecondaryNameNode哪項是正確的?(C)
A.它是NameNode的熱備
B.它是內(nèi)存沒有要求
C.他的目的使幫助NameNode合并編輯日志,減少NameNode啟動時間
D.SecondaryNameNode應(yīng)與NameNode部署到一個節(jié)點
HDFS默認(rèn)BlockSize是(B)
A.32MB
B.64MB
C.128MB
下列哪項通常是集群的最主要瓶頸(C)
A.CPU
B.網(wǎng)絡(luò)
C.磁盤IO
D.內(nèi)存
1.下列哪項可以作為集群的管理?(ABC)
A.Puppet
B.Pdsh
C.ClouderaManager
D.Zookeeper
2.Client端上傳文件的時候下列哪項正確?(BC)
A.數(shù)據(jù)經(jīng)過NameNode傳遞DataNode
B.Client端將文件切分為Block,依次上傳
C.Client只上傳數(shù)據(jù)到一臺DataNode,然后由NameNode負(fù)責(zé)Block復(fù)制工作
3.下列哪個是Hadoop運(yùn)行的模式?(ABC)
A.單機(jī)版
B.偽分布式
C.分布式
1.列舉幾個hadoop生態(tài)圈的組件并做簡要描述
Zookeeper:是一個開源的分布式應(yīng)用程序協(xié)調(diào)服務(wù),基于zookeeper可以實現(xiàn)同步服務(wù),配置維護(hù),命名服務(wù)。
Flume:一個高可用的,高可靠的,分布式的海量日志采集、聚合和傳輸?shù)南到y(tǒng)。
Hbase:是一個分布式的、面向列的開源數(shù)據(jù)庫,利用HadoopHDFS作為其存儲系統(tǒng).
Hive:基于Hadoop的一個數(shù)據(jù)倉庫工具,可以將結(jié)構(gòu)化的數(shù)據(jù)檔映射為一張數(shù)據(jù)庫表,并提供簡單的sql查詢功能,可以將sql語句轉(zhuǎn)換為MapReduce任務(wù)進(jìn)行運(yùn)行。
Sqoop:將一個關(guān)系型數(shù)據(jù)庫中的數(shù)據(jù)導(dǎo)進(jìn)到Hadoop的HDFS中,也可以將HDFS的數(shù)據(jù)導(dǎo)進(jìn)到關(guān)系型數(shù)據(jù)庫中。
Hadoop中需要哪些配置文件,其作用是什么?
1>.Core-site.xml:
(1)fs.defaultFS:hdfs://cluster1(域名),這里的值指的是默認(rèn)的HDFS路徑。
(2)hadoop.tmp.dir:/export/data/hadoop_tmp,這里的路徑默認(rèn)是NameNode、DataNode、JournalNode等存放數(shù)據(jù)的公共目錄。用戶也可以自己單獨(dú)指定這三類節(jié)點的目錄。
(3)ha.zookeeper.quorum:hadoop101:2181,hadoop102:2181,hadoop103:2181,這里是ZooKeeper集群的地址和端口。注意,數(shù)量一定是奇數(shù),且不少于三個節(jié)點。
2>.Hadoop-env.sh:只需設(shè)置jdk的安裝路徑,如:exportJAVA_HOME=/usr/local/jdk本機(jī)j位置
3>.Hdfs-site.xml:
(1)dfs.replication:他決定著系統(tǒng)里面的文件塊的數(shù)據(jù)備份個數(shù),默認(rèn)為3個。
(2)dfs.data.dir:datanode節(jié)點存儲在文件系統(tǒng)的目錄。
(3)dfs.name.dir:是namenode節(jié)點存儲hadoop文件系統(tǒng)信息的本地系統(tǒng)路徑。
4>.Mapred-site.xml:
(1)mapred.job.tracker:是jobtracker的主機(jī)和端口配置。
4.請列出正常工作的Hadoop集群中Hadoop都分別需要啟動哪些進(jìn)程,它們的作用分別是什么?
a)NameNode它是hadoop中的主服務(wù)器,管理文件系統(tǒng)名稱空間和對集群中存儲的文件的訪問,保存有metadate.
b).SecondaryNameNode它不是namenode的冗余守護(hù)進(jìn)程,而是提供周期檢查點和清理任務(wù)。幫助NN合并editslog,減少NN啟動時間。
c)DataNode它負(fù)責(zé)管理連接到節(jié)點的存儲(一個集群中可以有多個節(jié)點)。每個存
儲數(shù)據(jù)的節(jié)點運(yùn)行一個datanode守護(hù)進(jìn)程。
d)ResourceManager(JobTracker)JobTracker負(fù)責(zé)調(diào)度DataNode上的工作。每個DataNode有一個TaskTracker,它們執(zhí)行實際工作。
e)NodeManager(TaskTracker)執(zhí)行任務(wù)
f)DFSZKFailoverController高可用時它負(fù)責(zé)監(jiān)控NN的狀態(tài),并及時的把狀態(tài)信息寫入ZK。它通過一個獨(dú)立線程周期性的調(diào)用NN上的一個特定接口來獲取NN的健康狀態(tài)。FC也有選擇誰作為ActiveNN的權(quán)利,因為最多只有兩個節(jié)點,目前選擇策略還比較簡單(先到先得,輪換)。
g)JournalNode高可用情況下存放namenode的editlog文件.
HDFS數(shù)據(jù)寫入實現(xiàn)機(jī)制
3.HDFS的存儲機(jī)制?
寫入HDFS過程:
Client調(diào)用DistributedFileSystem對象的create方法,創(chuàng)建一個文件輸出流(FSDataOutputStream)對象,通過DistributedFileSystem對象與Hadoop集群的NameNode進(jìn)行一次RPC遠(yuǎn)程調(diào)用,在HDFS的Namespace中創(chuàng)建一個文件條目(Entry),該條目沒有任何的Block,通過FSDataOutputStream對象,向DataNode寫入數(shù)據(jù),數(shù)據(jù)首先被寫入FSDataOutputStream對象內(nèi)部的Buffer中,然后數(shù)據(jù)被分割成一個個Packet數(shù)據(jù)包,以Packet最小單位,基于Socket連接發(fā)送到按特定算法選擇的HDFS集群中一組DataNode(正常是3個,可能大于等于1)中的一個節(jié)點上,在這組DataNode組成的Pipeline上依次傳輸Packet,這組DataNode組成的Pipeline反方向上,發(fā)送ack,最終由Pipeline中第一個DataNode節(jié)點將Pipelineack發(fā)送給Client,完成向文件寫入數(shù)據(jù),Client在文件輸出流(FSDataOutputStream)對象上調(diào)用close方法,關(guān)閉流.調(diào)用DistributedFileSystem對象的complete方法,通知NameNode文件寫入成功.
讀取文件過程:
使用HDFS提供的客戶端開發(fā)庫Client,向遠(yuǎn)程的Namenode發(fā)起RPC請求;Namenode會視情況返回文件的部分或全部block列表,對于每個block,Namenode都會返回有該block拷貝的DataNode地址;客戶端開發(fā)庫Client會選取離客戶端最接近的DataNode來讀取block;如果客戶端本身就是DataNode,那么將從本地直接獲取數(shù)據(jù).讀取完當(dāng)前block的數(shù)據(jù)后,關(guān)閉與當(dāng)前的DataNode連接,并為讀取下一個block尋找最佳的DataNode;當(dāng)讀完列表的block后,且文件讀取還沒有結(jié)束,客戶端開發(fā)庫會繼續(xù)向Namenode獲取下一批的block列表。讀取完一個block都會進(jìn)行checksum驗證,如果讀取datanode時出現(xiàn)錯誤,客戶端會通知Namenode,然后再從下一個擁有該block拷貝的datanode繼續(xù)讀。
2.HDFS的存儲機(jī)制是什么
客戶端通過把請求發(fā)送給NameNodeactive,NN會把文件切成1個到N個固定大小的block(一般默認(rèn)為128M)并上傳到DN中。當(dāng)所有block拷貝結(jié)束時,NN會立即通知客戶端上傳結(jié)果。但此時上傳的流程還未結(jié)束。DN還需要根據(jù)配置信息的副本數(shù)量,在不同的機(jī)架節(jié)點上通過局域網(wǎng)作數(shù)據(jù)拷貝工作。
6Hadoop是由哪幾個組件組成
hadoop是一套處理大數(shù)據(jù)的生態(tài)系統(tǒng),包括文件存儲HDFS,計算框架MapReduce調(diào)度框架Yarn,數(shù)據(jù)庫Hbase,數(shù)據(jù)倉庫Hive,協(xié)調(diào)與鎖服務(wù)zookeeper,關(guān)系型數(shù)據(jù)庫與Hbase轉(zhuǎn)換工具sqoop,工作流模塊Oozie,機(jī)器學(xué)習(xí)模塊mahout.
1.6hadoop節(jié)點動態(tài)上線下線怎么操作?
節(jié)點上線操作:
當(dāng)要新上線數(shù)據(jù)節(jié)點的時候,需要把數(shù)據(jù)節(jié)點的名字追加在dfs.hosts文件中
一,關(guān)閉新增節(jié)點的防火墻
二,在NameNode節(jié)點的hosts文件中加入新增數(shù)據(jù)節(jié)點的hostname
三,在每個新增數(shù)據(jù)節(jié)點的hosts文件中加入NameNode的hostname
四,在NameNode節(jié)點上增加新增節(jié)點的SSH免密碼登錄的操作
五,在NameNode節(jié)點上的dfs.hosts中追加上新增節(jié)點的hostname,
六,在其他節(jié)點上執(zhí)行刷新操作:hdfsdfsadmin-refreshNodes
七,在NameNode節(jié)點上,更改slaves文件,將要上線的數(shù)據(jù)節(jié)點hostname追加
到slaves文件中
八,啟動DataNode節(jié)點
九,查看NameNode的監(jiān)控頁面看是否有新增加的節(jié)點
節(jié)點下線操作:
一,修改/conf/hdfs-site.xml文件
二,確定需要下線的機(jī)器,dfs.osts.exclude文件中配置好需要下架的機(jī)器,這個是阻
止下架的機(jī)器去連接NameNode
三,配置完成之后進(jìn)行配置的刷新操作./bin/hadoopdfsadmin-refreshNodes,這個
操作的作用是在后臺進(jìn)行block塊的移動
四,當(dāng)執(zhí)行三的命令完成之后,需要下架的機(jī)器就可以關(guān)閉了,可以查看現(xiàn)在集
群上連接的節(jié)點,正在執(zhí)行Decommission,會顯示:
DecommissionStatus:Decommissioninprogress執(zhí)行完畢后,會顯示:
DecommissionStatus:Decommissioned
五,機(jī)器下線完畢,將他們從excludes文件中移除。
10.Hadoop中job和task之間的區(qū)別是什么?
JobTracker是一個master服務(wù),軟件啟動之后JobTracker接收J(rèn)ob,負(fù)責(zé)調(diào)度Job
的每一個子任務(wù)task運(yùn)行于TaskTracker上,并監(jiān)控它們,如果發(fā)現(xiàn)有失敗的task就重新
運(yùn)行它。一般情況應(yīng)該把JobTracker部署在單獨(dú)的機(jī)器上。
TaskTracker是運(yùn)行在多個節(jié)點上的slaver服務(wù)。TaskTracker主動與JobTracker通信,
接收作業(yè),并負(fù)責(zé)直接執(zhí)行每一個任務(wù)11.Hadoop中通過拆分任務(wù)到多個節(jié)點運(yùn)行來實現(xiàn)并行計
算,但某些節(jié)點運(yùn)行較慢會拖慢整個任務(wù)的運(yùn)行,Hadoop
采用何種機(jī)制應(yīng)對這個情況?
答:推測執(zhí)行機(jī)制是Hadoop對“拖后腿”的任務(wù)的一種優(yōu)化機(jī)制,當(dāng)一個作業(yè)的某些任務(wù)
運(yùn)行速度明顯慢于同作業(yè)的其他任務(wù)時,Hadoop會在另一個節(jié)點上為“慢任務(wù)”啟動一
個備份任務(wù),這樣兩個任務(wù)同時處理一份數(shù)據(jù),而Hadoop最終會將優(yōu)先完成的那個任務(wù)
的結(jié)果作為最終結(jié)果,并將另一個任務(wù)殺掉。
2.mapred.job.tracker命令的作用
連接jobtrack服務(wù)器的配置項,默認(rèn)不寫是local,在本地運(yùn)行,默認(rèn)map數(shù)1,reduce數(shù)1。
7如何決定一個job的map和reduce的數(shù)量?
splitSize=max{minSize,min{maxSize,blockSize}}
map數(shù)量由處理的數(shù)據(jù)分成的block數(shù)量決定default_num=total_size/split_size;
reduce的數(shù)量job.setNumReduceTasks(x);x為reduce的數(shù)量.
14.如何為一個Hadoop任務(wù)設(shè)置mappers的數(shù)量?
具體的數(shù)據(jù)分片是這樣的,InputFormat在默認(rèn)情況下會根據(jù)hadoop集群HDFS塊大小進(jìn)行分片,每一個分片會由一個map任務(wù)來進(jìn)行處理,當(dāng)然用戶還是可以通過參數(shù)mapred.min.split.size參數(shù)在作業(yè)提交客戶端進(jìn)行自定義設(shè)置。還有一個重要參數(shù)就是mapred.map.tasks,這個參數(shù)設(shè)置的map數(shù)量僅僅是一個提示,只有當(dāng)InputFormat決定了map任務(wù)的個數(shù)比mapred.map.tasks值小時才起作用。同樣,Map任務(wù)的個數(shù)也能通過使用JobConf的conf.setNumMapTasks(intnum)方法來手動地設(shè)置。這個方法能夠用來增加map任務(wù)的個數(shù),但是不能設(shè)定任務(wù)的個數(shù)小于Hadoop系統(tǒng)通過分割輸入數(shù)據(jù)得到的值。
15.如何為一個Hadoop任務(wù)設(shè)置要創(chuàng)建的reducer的數(shù)量?
純粹的mapreducetask的reducetask數(shù)很簡單,就是參數(shù)mapred.reduce.tasks
的值,hadoop-site.xml文件中和mapreducejob運(yùn)行時。不設(shè)置的話默認(rèn)為1。
10yarn的新特性
ResourceManagerHA:在apachehadoop4.4或者CDH5.0.0版本之后,增加了ResourceMangerHA特性,支持基于Zookeeper的熱主備切換。
磁盤容錯:增加了幾個對多磁盤非常友好地參數(shù),這些參數(shù)允許YARN更好地使用NodeManager上的多塊磁盤.
資源調(diào)度器:FairScheduler增加了允許用戶在線將一個應(yīng)用程序從一個隊列轉(zhuǎn)移到另外一個隊列。
11如何使用mapReduce實現(xiàn)兩個表的join?
reducesidejoin:在map階段,map函數(shù)同時讀取兩個文件File1和File2,為了區(qū)分
兩種來源的key/value數(shù)據(jù)對,對每條數(shù)據(jù)打一個標(biāo)簽(tag),比如:tag=0表示來自文件File1,
tag=2表示來自文件File2。
mapsidejoin:Mapsidejoin是針對以下場景進(jìn)行的優(yōu)化:兩個待連接表中,有一個表非常大,而另一個表非常小,以至于小表可以直接存放到內(nèi)存中。這樣,我們可以將小表復(fù)制多份,讓每個maptask內(nèi)存中存在一份(比如存放到hashtable中),然后只掃描大表:對于大表中的每一條記錄key/value,在hashtable中查找是否有相同的key的記錄,如果有,
則連接后輸出即可。
SemiJoin:SemiJoin,也叫半連接,是從分布式數(shù)據(jù)庫中借鑒過來的方法。它的產(chǎn)生動機(jī)是:對于reducesidejoin,跨機(jī)器的數(shù)據(jù)傳輸量非常大,這成了join操作的一個瓶頸,
如果能夠在map端過濾掉不會參加join操作的數(shù)據(jù),則可以大大節(jié)省網(wǎng)絡(luò)IO。
reducesidejoin+BloomFilter:BloomFilter最常見的作用是:判斷某個元素是否在一個集合里面。它最重要的兩個方法是:add()和contains()。最大的特點是不會存在falsenegative,即:如果contains()返回false,則該元素一定不在集合中,但會存在一定的falsepositive,即:如果contains()返回true,則該元素一定可能在集合中。
參考網(wǎng)址:http://my.oschina.net/leejun2005/blog/95186?fromerr=cDqkUyup
8Hadoop的sequencefile的格式,并說明下什么是java序列化,如何實現(xiàn)java序列化?
SequenceFile文件是Hadoop用來存儲二進(jìn)制形式的key-value對而設(shè)計的一種平面文件;Hadoop的HDFS和MapReduce子框架主要是針對大數(shù)據(jù)文件來設(shè)計的,在小文件的處理上不但效率低下,而且十分消耗磁盤空間(每一個小文件占用一個Block,HDFS默認(rèn)block大小為64M)。
解決辦法通常是選擇一個容器,將這些小文件組織起來統(tǒng)一存儲。HDFS提供了兩種類型的容器,分別是SequenceFile和MapFile。
SequenceFile的每條記錄是可序列化的字符數(shù)組。
序列化是指將結(jié)構(gòu)化的對象轉(zhuǎn)化為字節(jié)流以便在網(wǎng)絡(luò)上傳輸或?qū)懭氲酱疟P進(jìn)行永久存儲的過程,反序列化是指將字節(jié)流轉(zhuǎn)回結(jié)構(gòu)化對象的過程.
9簡述hadoop1與hadoop2的架構(gòu)異同.
加入了yarn解決了資源調(diào)度的問題。
加入了對zookeeper的支持實現(xiàn)比較可靠的高可用.
http://blog.csdn.net/fenglibing/article/details/32916445
13請描述mapReduce二次排序原理
二次排序:就是首先按照第一字段排序,然后再對第一字段相同的行按照第二字段排序,注意不能破壞第一次排序的結(jié)果。
在Hadoop中,默認(rèn)情況下是按照key進(jìn)行排序。對于同一個key,reduce函數(shù)接收到的valuelist是按照value排序的。
有兩種方法進(jìn)行二次排序,分別為:bufferandinmemorysort和value-to-keyconversion。
對于bufferandinmemorysort,主要思想是:在reduce()函數(shù)中,將某個key對應(yīng)的所有value保存下來,然后進(jìn)行排序。這種方法最大的缺點是:可能會造成outofmemory。
對于value-to-keyconversion,主要思想是:將key和部分value拼接成一個組合key(實現(xiàn)WritableComparable接口或者調(diào)用setSortComparatorClass函數(shù)),這樣reduce獲取的結(jié)果便是先按key排序,后按value排序的結(jié)果,需要注意的是,用戶需要自己實現(xiàn)Paritioner,以便只按照key進(jìn)行數(shù)據(jù)劃分。Hadoop顯式的支持二次排序,在Configuration類中有個setGroupingComparatorClass()方法,可用于設(shè)置排序group的key值。
具體參考:http://www.cnblogs.com/xuxm2007/archive/2011/09/03/2165805.html
參考網(wǎng)址:http://my.oschina.net/leejun2005/blog/95186?fromerr=cDqkUyup
14請描述mapReduce中排序發(fā)生的幾個階段
一個是在mapside發(fā)生在spill后partition前。
一個是在reduceside發(fā)生在copy后reduce前。
mapReduce的四個階段:
Splitting:在進(jìn)行map計算之前,mapreduce會根據(jù)輸入文件計算輸入分片(inputsplit),每個輸入分片(inputsplit)針對一個map任務(wù)。輸入分片(inputsplit)存儲的并非數(shù)據(jù)本身,而是一個分片長度和一個記錄數(shù)據(jù)位置的數(shù)組,輸入分片(inputsplit)往往和hdfs的block(塊)關(guān)系很密切,假如我們設(shè)定hdfs的塊的大小是64mb,如果我們輸入有三個文件,大小分別是3mb、65mb和127mb,那么mapreduce會把3mb文件分為一個輸入分片(inputsplit),65mb則是兩個輸入分片(inputsplit)而127mb也是兩個輸入分片(inputsplit),換句話說我們?nèi)绻趍ap計算前做輸入分片調(diào)整,例如合并小文件,那么就會有5個map任務(wù)將執(zhí)行,而且每個map執(zhí)行的數(shù)據(jù)大小不均,這個也是mapreduce優(yōu)化計算的一個關(guān)鍵點。
Mapping:就是程序員編寫好的map函數(shù)了,因此map函數(shù)效率相對好控制,而且一般map操作都是本地化操作也就是在數(shù)據(jù)存儲節(jié)點上進(jìn)行;
Shuffle:描述著數(shù)據(jù)從maptask輸出到reducetask輸入的這段過程。
Reduce:對Map階段多個文件的數(shù)據(jù)進(jìn)行合并。
15請描述mapReduce中shuffle階段的工作流程,如何優(yōu)化shuffle階段
分區(qū),排序,溢寫,拷貝到對應(yīng)reduce機(jī)器上,增加combiner,壓縮溢寫的文件。
16請描述mapReduce中combiner的作用是什么,一般使用情景,哪些情況不需要?
在MR作業(yè)中的Map階段會輸出結(jié)果數(shù)據(jù)到磁盤中。
Combiner只應(yīng)該適用于那種Reduce的輸入(key:value與輸出(key:value)類型完全一致,且不影響最終結(jié)果的場景。比如累加,最大值等,也可以用于過濾數(shù)據(jù),在map端將無效的數(shù)據(jù)過濾掉。
在這些需求場景下,輸出的數(shù)據(jù)是可以根據(jù)key值來作合并的,合并的目的是減少輸出的數(shù)據(jù)量,減少IO的讀寫,減少網(wǎng)絡(luò)傳輸,以提高M(jìn)R的作業(yè)效率。
1.combiner的作用就是在map端對輸出先做一次合并,以減少傳輸?shù)絩educer的數(shù)據(jù)量.
2.combiner最基本是實現(xiàn)本地key的歸并,具有類似本地reduce,那么所有的結(jié)果都是reduce完成,效率會相對降低。
3.使用combiner,先完成的map會在本地聚合,提升速度.
3.簡述Hadoop的幾個默認(rèn)端口及其含義
dfs.namenode.http-address:50070
dfs.datanode.address:50010
fs.defaultFS:8020
yarn.resourcemanager.webapp.address:8088
5.談?wù)勀銓apReduce的優(yōu)化建議。
一.mapper調(diào)優(yōu)
mapper調(diào)優(yōu)主要就一個目標(biāo):減少輸出量。
我們可以通過增加combine階段以及對輸出進(jìn)行壓縮設(shè)置進(jìn)行mapper調(diào)優(yōu)。
1>combine合并:
實現(xiàn)自定義combine要求繼承reducer類。比較適合map的輸出是數(shù)值型的,方便進(jìn)行統(tǒng)計。
2>壓縮設(shè)置:
在提交job的時候分別設(shè)置啟動壓縮和指定壓縮方式。
二.reducer調(diào)優(yōu)
reducer調(diào)優(yōu)主要是通過參數(shù)調(diào)優(yōu)和設(shè)置reducer的個數(shù)來完成。
reducer個數(shù)調(diào)優(yōu):
要求:一個reducer和多個reducer的執(zhí)行結(jié)果一致,不能因為多個reducer導(dǎo)致執(zhí)行結(jié)果異常。
規(guī)則:一般要求在hadoop集群中的執(zhí)行mr程序,map執(zhí)行完成100%后,盡量早的看到reducer執(zhí)行到33%,可以通過命令hadoopjob-statusjob_id或者web頁面來查看。
原因:map的執(zhí)行process數(shù)是通過inputformat返回recordread來定義的;而reducer是有三部分構(gòu)成的,分別為讀取mapper輸出數(shù)據(jù)、合并所有輸出數(shù)據(jù)以及reduce處理,其中第一步要依賴map的執(zhí)行,所以在數(shù)據(jù)量比較大的情況下,一個reducer無法滿足性能要求的情況下,我們可以通過調(diào)高reducer的個數(shù)來解決該問題。
優(yōu)點:充分利用集群的優(yōu)勢。
缺點:有些mr程序沒法利用多reducer的優(yōu)點,比如獲取topn的mr程序。
hadoop家族如此強(qiáng)大,為什么還要結(jié)合R語言?
hadoop和R語言在各自的領(lǐng)域都相當(dāng)?shù)膹?qiáng)大,由RevolutionAnalytics發(fā)起的一個開源項目RHadoop將R語言與Hadoop結(jié)合在一起,很好發(fā)揮了R語言特長。廣大R語言愛好者借助強(qiáng)大工具RHadoop,可以在大數(shù)據(jù)領(lǐng)域大展拳腳。
1.Hadoop家族的強(qiáng)大之處,在于對大數(shù)據(jù)的處理,讓原來的不可能(TB,PB數(shù)據(jù)量計算),成為了可能。
2.R語言的強(qiáng)大之處,在于統(tǒng)計分析,在沒有Hadoop之前,我們對于大數(shù)據(jù)的處理,要取樣本,假設(shè)檢驗,做回歸,長久以來R語言都是統(tǒng)計學(xué)家專屬的工具。
3.hadoop重點是全量數(shù)據(jù)分析,而R語言重點是樣本數(shù)據(jù)分析。兩種技術(shù)放在一起,剛好是取長補(bǔ)短。4.用R語言,通過分析少量數(shù)據(jù),對業(yè)務(wù)目標(biāo)回歸建模,并定義指標(biāo),用Hadoop從海量日志數(shù)據(jù)中,提取指標(biāo)數(shù)據(jù),用R語言模型,對指標(biāo)數(shù)據(jù)進(jìn)行測試和調(diào)優(yōu)
5.R和Hadoop分別都起著非常重要的作用,以計算機(jī)開發(fā)人員的思路,所有有事情都用Hadoop去做,沒有數(shù)據(jù)建模和證明,”預(yù)測的結(jié)果”一定是有問題的。以統(tǒng)計人員的思路,所有的事情都用R去做,以抽樣方式,得到的“預(yù)測的結(jié)果”也一定是有問題的。所以讓二者結(jié)合,是產(chǎn)界業(yè)的必然的導(dǎo)向,也是產(chǎn)界業(yè)和學(xué)術(shù)界的交集,同時也為交叉學(xué)科的人才提供了更廣闊的發(fā)展空間。
5.Mapreduce的工作原理,請舉例子說明mapreduce是怎么運(yùn)行的?
離線計算框架,過程分為splitmapshufflereduce四個過程。
架構(gòu)節(jié)點有:JobtrackerTaskTracker。
Split將文件分割,傳輸?shù)絤apper,mapper接收KV形式的數(shù)據(jù),經(jīng)過處理,再傳到shuffle過程。
Shuffle先進(jìn)行HashPartition或者自定義的partition,會有數(shù)據(jù)傾斜和reduce的負(fù)載均衡問題;再進(jìn)行排序,默認(rèn)按字典排序;為減少mapper輸出數(shù)據(jù),再根據(jù)key進(jìn)行合并,相同key的數(shù)據(jù)value會被合并;最后分組形成(key,value{})形式的數(shù)據(jù),輸出到下一階段。
Reduce輸入的數(shù)據(jù)就變成了,key+迭代器形式的數(shù)據(jù),再進(jìn)行處理。
2.兩個類TextInputFormat和KeyValueInputFormat的區(qū)別是什么?
相同點:
TextInputformat和KeyValueTextInputFormat都繼承了FileInputFormat類,都是每一行作為一個記錄;
區(qū)別:
TextInputformat將每一行在文件中的起始偏移量作為key,每一行的內(nèi)容作為value。默認(rèn)以\n或回車鍵作為一行記錄。
KeyValueTextInputFormat適合處理輸入數(shù)據(jù)的每一行是兩列,并用tab分離的形式。
3.在一個運(yùn)行的Hadoop任務(wù)中,什么是InputSplit?
在執(zhí)行mapreduce之前,原始數(shù)據(jù)被分割成若干個split,每個split作為一個map
任務(wù)的輸入,在map執(zhí)行過程中split會被分解成一個個記錄(key-value對)。
4.Hadoop框架中文件拆分是怎么被調(diào)用的?
InputFormat是MapReduce中一個很常用的概念是文件拆分必須實現(xiàn)的一個接口,包含了兩個方法:
publicinterfaceInputFormat{
InputSplit[]getSplits(JobConfjob,intnumSplits)throwsIOException;
RecordReadercreateRecordReader(InputSplitsplit,TaskAttemptContext
context)throwsIOException;
}
這兩個方法分別完成以下工作:
方法getSplits將輸入數(shù)據(jù)切分成splits,splits的個數(shù)即為maptasks的個數(shù),
splits的大小默認(rèn)為塊大小,即64M
方法getRecordReader將每個split解析成records,再依次將record解析成
對,也就是說InputFormat完成以下工作:InputFile-->splits-->
系統(tǒng)常用的InputFormat又有哪些呢?TextFileInputFormat,
KeyValueTextFileInputFormat,SequenceFileInputFormat,
NLineInputFormat其中TextInputFormat便是最常用的,它的就代表<行偏移,
該行內(nèi)容>
然而系統(tǒng)所提供的這幾種固定的將InputFile轉(zhuǎn)換為的方式有時候并不能滿足我
們的需求:
此時需要我們自定義InputFormat,從而使Hadoop框架按照我們預(yù)設(shè)的方式來將
InputFile解析為
在領(lǐng)會自定義InputFormat之前,需要弄懂一下幾個抽象類、接口及其之間的關(guān)系:
InputFormat(interface),FileInputFormat(abstractclass),TextInputFormat(class),
RecordReader(interface),LineRecordReader(class)的關(guān)系FileInputFormatimplementsInputFormat
TextInputFormatextendsFileInputFormat
TextInputFormat.getRecordReadercallsLineRecordReader
LineRecordReaderimplementsRecordReader
對于InputFormat接口,上面已經(jīng)有詳細(xì)的描述
再看看FileInputFormat,它實現(xiàn)了InputFormat接口中的getSplits方法,而將
getRecordReader與isSplitable留給具體類(如TextInputFormat)實現(xiàn),isSplitable方
法通常不用修改,所以只需要在自定義的InputFormat中實現(xiàn)
getRecordReader方法即可,而該方法的核心是調(diào)用LineRecordReader(即由
LineRecorderReader類來實現(xiàn)"將每個split解析成records,再依次將record解析成
對"),該方法實現(xiàn)了接口RecordReader
publicinterfaceRecordReader{
booleannext(Kkey,Vvalue)throwsIOException;
KcreateKey();
VcreateValue();
longgetPos()throwsIOException;
publicvoidclose()throwsIOException;
floatgetProgress()throwsIOException;
}
定義一個InputFormat的核心是定義一個類似于LineRecordReader的RecordReader
5.參考下面的M/R系統(tǒng)的場景:HDFS塊大小為64MB;輸入類型為FileInputFormat;有三個文件大小分別是:
64KB65MB127MB。Hadoop框架會把這些文件拆分為多少塊?
分別為1塊,2塊,2塊。
6.Hadoop中RecordReader的作用是什么?
Hadoop的MapReduce框架來處理數(shù)據(jù),主要是面向海量大數(shù)據(jù),對于這類數(shù)據(jù),Hadoop能夠使其真正發(fā)揮其能力。對于海量小文件,不是說不能使用Hadoop來處理,只不過直接進(jìn)行處理效率不會高,實際應(yīng)用中,我們在使用Hadoop進(jìn)行計算的時候,需要考慮將小數(shù)據(jù)轉(zhuǎn)換成大數(shù)據(jù),比如通過合并壓縮等方法,我們通過自定義InputFormat和RecordReader來實現(xiàn)對海量小文件的并行處理。
8.如果沒有定義partitioner,那數(shù)據(jù)在被送達(dá)reducer前
是如何被分區(qū)的?
如果沒有自定義的partitioning,則默認(rèn)的partition算法,即根據(jù)每一條數(shù)據(jù)的key
的hashcode值摸運(yùn)算(%)reduce的數(shù)量,得到的數(shù)字就是“分區(qū)號“。
7.Map階段結(jié)束后,Hadoop框架會處理:Partitioning,Shuffle和Sort,在這個階段都發(fā)生了什么?
maptask上的洗牌(shuffle)結(jié)束,此時reducertask上的洗牌開始,抓取fetch所
屬于自己分區(qū)的數(shù)據(jù),同時將這些分區(qū)的數(shù)據(jù)進(jìn)行排序sort(默認(rèn)的排序是根據(jù)每一條數(shù)據(jù)的鍵的字典
排序),進(jìn)而將數(shù)據(jù)進(jìn)行合并merge,即根據(jù)key相同的,將其value組成一個集合,最后輸出結(jié)果。
5.請列出你所知道的Hadoop調(diào)度器,并簡要說明其工作方法。
(1)默認(rèn)的調(diào)度器FIFO
Hadoop中默認(rèn)的調(diào)度器,它先按照作業(yè)的優(yōu)先級高低,再按照到達(dá)時間的先后選擇被執(zhí)行的作業(yè)。
(2)計算能力調(diào)度器CapacityScheduler
支持多個隊列,每個隊列可配置一定的資源量,每個隊列采用FIFO調(diào)度策略,為了防止同一個用戶的作業(yè)獨(dú)占隊列中的資源,該調(diào)度器會對同一用戶提交的作業(yè)所占資源量進(jìn)行限定。調(diào)度時,首先按以下策略選擇一個合適隊列:計算每個隊列中正在運(yùn)行的任務(wù)數(shù)與其應(yīng)該分得的計算資源之間的比值,選擇一個該比值最小的隊列;然后按以下策略選擇該隊列中一個作業(yè):按照作業(yè)優(yōu)先級和提交時間順序選擇,同時考慮用戶資源量限制和內(nèi)存限制。
(3)公平調(diào)度器FairScheduler
同計算能力調(diào)度器類似,支持多隊列多用戶,每個隊列中的資源量可以配置,同一隊列中的作業(yè)公平共享隊列中所有資源。實際上,Hadoop的調(diào)度器遠(yuǎn)不止以上三種,最近,出現(xiàn)了很多針對新型應(yīng)用的Hadoop調(diào)度器。
(4)適用于異構(gòu)集群的調(diào)度器LATE
現(xiàn)有的Hadoop調(diào)度器都是建立在同構(gòu)集群的假設(shè)前提下,具體假設(shè)如下:
1)集群中各個節(jié)點的性能完全一樣
2)對于reducetask,它的三個階段:copy、sort和reduce,用時各占1/3
3)同一job的同類型的task是一批一批完成的,他們用時基本一樣。
現(xiàn)有的Hadoop調(diào)度器存在較大缺陷,主要體現(xiàn)在探測落后任務(wù)的算法上:如果一個task的進(jìn)度落后于同類型task進(jìn)度的20%,則把該task當(dāng)做落后任務(wù)(這種任務(wù)決定了job的完成時間,需盡量縮短它的執(zhí)行時間),從而為它啟動一個備份任務(wù)(speculativetask)。
如果集群異構(gòu)的,對于同一個task,即使是在相同節(jié)點上的執(zhí)行時間也會有較大差別,因而在異構(gòu)集群中很容易產(chǎn)生大量的備份任務(wù)。
LATE調(diào)度器從某種程度上解決了現(xiàn)有調(diào)度器的問題,它定義三個閾值:
SpeculativeCap,系統(tǒng)中最大同時執(zhí)行的speculativetask數(shù)目(作者推薦值為總slot數(shù)的10%);SlowNodeThreshold(作者推薦值為25%):得分(分?jǐn)?shù)計算方法見論文)低于該閾值的node(快節(jié)點)上不會啟動speculativetask;SlowTaskThreshold(作者推薦值為25%):當(dāng)task進(jìn)度低于同批同類task的平均進(jìn)度的SlowTaskThreshold時,會為該task啟動speculativetask。它的調(diào)度策略是:當(dāng)一個節(jié)點出現(xiàn)空閑資源且系統(tǒng)中總的備份任務(wù)數(shù)小于SpeculativeCap時,a.如果該節(jié)點是慢節(jié)點(節(jié)點得分高于SlowNodeThreshold),則忽略這個請求。b.對當(dāng)前正在運(yùn)行的task按估算的剩余完成時間排序c.選擇剩余完成時間最大且進(jìn)度低于SlowTaskThreshold的task,為該task啟動備份任務(wù)。
(5)適用于實時作業(yè)的調(diào)度器DeadlineScheduler和Constraint-basedScheduler
這種調(diào)度器主要用于有時間限制的作業(yè)(DeadlineJob),即給作業(yè)一個deadline時間,讓它在該時間內(nèi)完成。實際上,這類調(diào)度器分為兩種,軟實時(允許作業(yè)有一定的超時)作業(yè)調(diào)度器和硬實時(作業(yè)必須嚴(yán)格按時完成)作業(yè)調(diào)度器。
DeadlineScheduler主要針對的是軟實時作業(yè),該調(diào)度器根據(jù)作業(yè)的運(yùn)行進(jìn)度和剩余時間動態(tài)調(diào)整作業(yè)獲得的資源量,以便作業(yè)盡可能的在deadline時間內(nèi)完成。
Constraint-basedScheduler主要針對的是硬實時作業(yè),該調(diào)度器根據(jù)作業(yè)的deadline和當(dāng)前系統(tǒng)中的實時作業(yè)運(yùn)行情況,預(yù)測新提交的實時作業(yè)能不能在deadline時間內(nèi)完成,如果不能,則將作業(yè)反饋給用戶,讓他重調(diào)整作業(yè)的deadline。
13.有可能使Hadoop任務(wù)輸出到多個目錄中么?如果可以,怎么做?
Hadoop內(nèi)置的輸出文件格式有:
MultipleOutputs可以把輸出數(shù)據(jù)輸送到不同的目錄;
在自定義的reduce的函數(shù)中首先使用setup函數(shù)(注:該函數(shù)在task啟動后數(shù)據(jù)處理前就調(diào)用一次)new出MultipleOutputs對象,利用該對象調(diào)用write方法定義輸出的目錄。
12.HadoopAPI中的什么特性可以使mapreducer任務(wù)以不同語言(如Perl,ruby,awk等)實現(xiàn)靈活性?
Hadoop序列化機(jī)制,支持多語言的交互。
1.3Hadoop集群有幾種角色的節(jié)點,每個節(jié)點對應(yīng)的進(jìn)程有哪些?
Hadoop集群從三個角度劃分為兩個角色。Hadoop集群包括hdfs作為文件存儲系統(tǒng),mapreduce作為分布式計算框架。
(1)最基本的劃分為主節(jié)點和從節(jié)點
(2)在hdfs中,Namenode作為主節(jié)點,接收客戶端的讀寫服務(wù)。存儲文件的的元數(shù)據(jù)如文件名,文件目錄結(jié)構(gòu),文件屬性(生成時間,副本數(shù),文件權(quán)限),以及block所在的datanode等等,namenode的元數(shù)據(jù)信息會在啟動后加載到內(nèi)存,metadata存儲到磁盤文件名為”fsimage”,block的信息不會保存到fsimage,edits記錄對metadata的操作日志datanode作為從節(jié)點。Datanode的作用是存儲數(shù)據(jù)即block,啟動datanode線程的時候會向namenode匯報block信息,通過向namenode發(fā)送心跳保持與其聯(lián)系,如果namenode10分鐘沒有收到datanode的心跳,則認(rèn)為datanode掛了,并復(fù)制其上的block到其他datanode。
(3)在mapreduce中的主節(jié)點為jobTracker和tasktracker。
JobTracker作為主節(jié)點,負(fù)責(zé)調(diào)度分配每一個子任務(wù)task運(yùn)行于taskTracker上,如果發(fā)現(xiàn)有失敗的task就重新分配到其他節(jié)點,每個Hadoop集群一般有一個JobTaskTracker,運(yùn)行在master節(jié)點上。
TaskTracker主動與JobTracker通信,接收作業(yè),并負(fù)責(zé)直接執(zhí)行每一個任務(wù),為了減少網(wǎng)絡(luò)帶寬TaskTracker最好運(yùn)行在datanode上
1.7mapreduce的優(yōu)化方法有哪些?
Mapreduce程序效率的瓶頸在于兩點:
一計算機(jī)性能
二I/O操作優(yōu)化
優(yōu)化分為時間和空間兩種常見的優(yōu)化策略如下:
1,輸入的文件盡量使用大文件,眾多的小文件會導(dǎo)致map的數(shù)量眾多,每個map任務(wù)都會造成一些性能的損失,如果輸入的是小的文件可以在進(jìn)行mapreduce處理之前整合成為大文件,或者直接采用ConbinFileInputFormat來作為輸入方式,此時,hadoop會考慮節(jié)點和集群的位置信息,決定將哪些文件打包到一個單元中。
2,合理的分配map和reduce的任務(wù)的數(shù)量.
3,壓縮中間數(shù)據(jù),減少I/O.
4,在map之后先進(jìn)行combine處理,減少I/O.
1.10列舉你了解的海量數(shù)據(jù)的處理方法及適用范圍,如果有相關(guān)使用經(jīng)驗,可簡要說明。
mapreduce分布式計算mapreduce的思想就是分而治之
倒排索引:一種索引方法,用來存儲在全文搜索下某個單詞在一個文檔或者一組文檔中的存儲位置的映射,在倒排索引中單詞指向了包含單詞的文檔。
消息隊列:大量的數(shù)據(jù)寫入首先存入消息隊列進(jìn)行緩沖,再把消息隊列作為數(shù)據(jù)來源進(jìn)行數(shù)據(jù)讀取。
數(shù)據(jù)庫讀寫分離:向一臺數(shù)據(jù)庫寫入數(shù)據(jù),另外的多臺數(shù)據(jù)庫從這臺數(shù)據(jù)庫中進(jìn)行讀取。
2編程題MR作業(yè)設(shè)計:有兩種格式的海量日志文件存放于hdfs上,可以通過文件名前綴區(qū)分,其中登錄日志格式:
user,ip,time,oper(枚舉值:1為上線,2位下線);
訪問日志格式:ip,time,url,假設(shè)登錄日志中user上下線信息完整,且同一上下線時間段內(nèi)使用的ip唯一,要計算訪問日志中獨(dú)立user數(shù)量最多的前10個url,請給出MapReduce設(shè)計思路,如需要幾個MapReduce,及每個MapReduce算法偽代碼。
思路:
將userid,ip,url封裝成一個對象,map類輸入數(shù)據(jù),按照userid為key輸出,value
為1(intwritable),按照reduce計算寫一個排序類然后按照value降序輸出前十個。
2.運(yùn)行一個hadoop任務(wù)的流程是什么樣的。
1、導(dǎo)入數(shù)據(jù)對需分析的數(shù)據(jù)進(jìn)行分片,片的大小默認(rèn)與datanode塊大小相同。
2、每個數(shù)據(jù)片由一個mapper進(jìn)行分析,mapper按照需求將數(shù)據(jù)拆分為一個個keyvalue格式的數(shù)據(jù)。
3、每個key-value數(shù)據(jù)調(diào)用一次map方法,對數(shù)據(jù)進(jìn)行相應(yīng)的處理后輸出。
4、將輸出的數(shù)據(jù)復(fù)制到對應(yīng)的分區(qū),默認(rèn)一個鍵一個區(qū),相同鍵放在同一個區(qū)中。
5、將輸出的數(shù)據(jù)進(jìn)行合并為key-Iterable格式。
6、每個分區(qū)有一個reduce,每個reduce將同一個分區(qū)的數(shù)據(jù)進(jìn)行合并處理為自己所需的數(shù)據(jù)格式。
7、將數(shù)據(jù)輸出至hdfs。
3.secondarynamenode/HAnamenode是如何工作的?
1、secondarynamenode在namenode的editslog文件超過規(guī)定值(默認(rèn)64M)時,或者每隔3600秒(默認(rèn)值)時會剪切editslog文件,復(fù)制namenode上的fsimage文件(若沒有fsimage)。
2、namenode節(jié)點創(chuàng)建一個新的edits文件。
3、將editslog文件及fsimage文件進(jìn)行合并為一個新fsimage。
4、將fsimage文件回傳至namenode節(jié)點。
5、Namenode節(jié)點使用secondaynamenode節(jié)點回傳的fsimage文件覆蓋本地的fsimage文件。
6、當(dāng)namenode節(jié)點啟動時可以從secondaynamenode節(jié)點復(fù)制fsimage文件達(dá)到快速啟動的目的。
4.什么樣的計算不能用mr來提速,舉5個例子。
1、數(shù)據(jù)量很小。
2、繁雜的小文件。
3、索引是更好的存取機(jī)制的時候。
4、事務(wù)處理。
5、只有一臺機(jī)器的時候。
5.一個mr作業(yè)跑的比較慢,如何來優(yōu)化。至少給出6個方案。
mr跑的慢可能有很多原因,如:數(shù)據(jù)傾斜、map和reduce數(shù)設(shè)置不合理、reduce等待過久、小文件過多、spill次數(shù)過多、merge次數(shù)過多等。
1、解決數(shù)據(jù)傾斜:數(shù)據(jù)傾斜可能是partition不合理,導(dǎo)致部分partition中的數(shù)據(jù)過多,部分過少??赏ㄟ^分析數(shù)據(jù),自定義分區(qū)器解決。
2、合理設(shè)置map和reduce數(shù):兩個都不能設(shè)置太少,也不能設(shè)置太多。太少,會導(dǎo)致task等待,延長處理時間;太多,會導(dǎo)致map、reduce任務(wù)間競爭資源,造成處理超時等錯誤。
3、設(shè)置map、reduce共存:調(diào)整slowstart.completedmaps參數(shù),使map運(yùn)行到一定程度后,reduce也開始運(yùn)行,減少reduce的等待時間。
4、合并小文件:在執(zhí)行mr任務(wù)前將小文件進(jìn)行合并,大量的小文件會產(chǎn)生大量的map任務(wù),增大map任務(wù)裝載次數(shù),而任務(wù)的裝載比較耗時,從而導(dǎo)致mr運(yùn)行較慢。
5、減少spill次數(shù):通過調(diào)整io.sort.mb及sort.spill.percent參數(shù)值,增大觸發(fā)spill的內(nèi)存上限,減少spill次數(shù),從而減少磁盤IO。
6、減少merge次數(shù):通過調(diào)整io.sort.factor參數(shù),增大merge的文件數(shù)目,減少merge的次數(shù),從而縮短mr處理時間。
6.Hadoop會有哪些重大故障,如何應(yīng)對?至少給出5個。
1、namenode單點故障:通過zookeeper搭建HA高可用,可自動切換namenode。
2、ResourceManager單點故障:可通過配置YARN的HA,并在配置的namenode上手動啟動ResourceManager作為Slave,在Master故障后,Slave會自動切換為Master。
3、reduce階段內(nèi)存溢出:是由于單個reduce任務(wù)處理的數(shù)據(jù)量過多,通過增大reducetasks數(shù)目、優(yōu)化partition規(guī)則使數(shù)據(jù)分布均勻進(jìn)行解決。
4、datanode內(nèi)存溢出:是由于創(chuàng)建的線程過多,通過調(diào)整linux的maxuserprocesses參數(shù),增大可用線程數(shù)進(jìn)行解決。
5、集群間時間不同步導(dǎo)致運(yùn)行異常:通過配置內(nèi)網(wǎng)時間同步服務(wù)器進(jìn)行解決。
7.什么情況下會觸發(fā)recovery過程,recover是怎么做的。
當(dāng)jobtracker.restart.recover參數(shù)值設(shè)置為true,jobtracker重啟之時會觸發(fā)recovery。
在JobTracker重啟前,會在historylog中記錄各個作業(yè)的運(yùn)行狀態(tài),這樣在JobTracker關(guān)閉后,系統(tǒng)中所有數(shù)據(jù)目錄、臨時目錄均會被保留,待JobTracker重啟之后,JobTracker自動重新提交這些作業(yè),并只對未運(yùn)行完成的task進(jìn)行重新調(diào)度,這樣可避免已經(jīng)計算完的task重新計算。
8.你認(rèn)為hadoop有哪些設(shè)計不合理的地方。
1、不支持文件的并發(fā)寫入和對文件內(nèi)容的隨機(jī)修改。
2、不支持低延遲、高吞吐的數(shù)據(jù)訪問。
3、存取大量小文件,會占用namenode大量內(nèi)存,小文件的尋道時間超過讀取時間。
4、hadoop環(huán)境搭建比較復(fù)雜。
5、數(shù)據(jù)無法實時處理。
6、mapreduce的shuffle階段IO太多。
7、編寫mapreduce難度較高,實現(xiàn)復(fù)雜邏輯時,代碼量太大。
1.在Hadoop中定義的主要公用InputFormat中,默認(rèn)是哪一個?(A)
A、TextInputFormat
B、KeyValueInputFormat
C、SequenceFileInputFormat
1.下面哪個程序負(fù)責(zé)HDFS數(shù)據(jù)存儲?(C)
A.NameNode
B.JobTracker
C.DataNode
D.SecondaryNameNode
E.tasktracker
2.HDFS中的block默認(rèn)保存幾份?(A)
A.3份
B.2份
C.1份
D.不確定
3.下列哪個程序通常與NameNode在一個節(jié)點啟動?(D)
A.SecondaryNameNode
B.DataNode
C.TaskTracker
D.JobTracker
hadoop的集群是基于master/slave模式,namenode和jobtracker屬于master,datanode和tasktracker屬于slave,master只有一個,而slave有多個.
SecondaryNameNode內(nèi)存需求和NameNode在一個數(shù)量級上,所以通常secondaryNameNode(運(yùn)行在單獨(dú)的物理機(jī)器上)和NameNode運(yùn)行在不同的機(jī)器上。
JobTracker對應(yīng)于NameNode,TaskTracker對應(yīng)于DataNode.
DataNode和NameNode是針對數(shù)據(jù)存放來而言的.JobTracker和TaskTracker是對于MapReduce執(zhí)行而言的.
mapreduce中幾個主要概念,mapreduce整體上可以分為這么幾條執(zhí)行線索:
jobclient,JobTracker與TaskTracker。
1、JobClient會在用戶端通過JobClient類將已經(jīng)配置參數(shù)打包成jar文件的應(yīng)用存儲到hdfs,并把路徑提交到Jobtracker,然后由JobTracker創(chuàng)建每一個Task(即MapTask和ReduceTask)并將它們分發(fā)到各個TaskTracker服務(wù)中去執(zhí)行。
2、JobTracker是一master服務(wù),軟件啟動之后JobTracker接收J(rèn)ob,負(fù)責(zé)調(diào)度Job的每一個子任務(wù)。task運(yùn)行于TaskTracker上,并監(jiān)控它們,如果發(fā)現(xiàn)有失敗的task就重新運(yùn)行它。一般情況應(yīng)該把JobTracker部署在單獨(dú)的機(jī)器上。
3、TaskTracker是運(yùn)行在多個節(jié)點上的slaver服務(wù)。TaskTracker主動與JobTracker通信,接收作業(yè),并負(fù)責(zé)直接執(zhí)行每一個任務(wù)。TaskTracker都需要運(yùn)行在HDFS的DataNode上。
4.關(guān)于SecondaryNameNode哪項是正確的?(C)
A.它是NameNode的熱備
B.它是內(nèi)存沒有要求
C.他的目的使幫助NameNode合并編輯日志,減少NameNode啟動時間
D.SecondaryNameNode應(yīng)與NameNode部署到一個節(jié)點
HDFS默認(rèn)BlockSize是(B)
A.32MB
B.64MB
C.128MB
下列哪項通常是集群的最主要瓶頸(C)
A.CPU
B.網(wǎng)絡(luò)
C.磁盤IO
D.內(nèi)存
1.下列哪項可以作為集群的管理?(ABC)
A.Puppet
B.Pdsh
C.ClouderaManager
D.Zookeeper
2.Client端上傳文件的時候下列哪項正確?(BC)
A.數(shù)據(jù)經(jīng)過NameNode傳遞DataNode
B.Client端將文件切分為Block,依次上傳
C.Client只上傳數(shù)據(jù)到一臺DataNode,然后由NameNode負(fù)責(zé)Block復(fù)制工作
3.下列哪個是Hadoop運(yùn)行的模式?(ABC)
A.單機(jī)版
B.偽分布式
C.分布式
1.列舉幾個hadoop生態(tài)圈的組件并做簡要描述
Zookeeper:是一個開源的分布式應(yīng)用程序協(xié)調(diào)服務(wù),基于zookeeper可以實現(xiàn)同步服務(wù),配置維護(hù),命名服務(wù)。
Flume:一個高可用的,高可靠的,分布式的海量日志采集、聚合和傳輸?shù)南到y(tǒng)。
Hbase:是一個分布式的、面向列的開源數(shù)據(jù)庫,利用HadoopHDFS作為其存儲系統(tǒng).
Hive:基于Hadoop的一個數(shù)據(jù)倉庫工具,可以將結(jié)構(gòu)化的數(shù)據(jù)檔映射為一張數(shù)據(jù)庫表,并提供簡單的sql查詢功能,可以將sql語句轉(zhuǎn)換為MapReduce任務(wù)進(jìn)行運(yùn)行。
Sqoop:將一個關(guān)系型數(shù)據(jù)庫中的數(shù)據(jù)導(dǎo)進(jìn)到Hadoop的HDFS中,也可以將HDFS的數(shù)據(jù)導(dǎo)進(jìn)到關(guān)系型數(shù)據(jù)庫中。
Hadoop中需要哪些配置文件,其作用是什么?
1>.Core-site.xml:
(1)fs.defaultFS:hdfs://cluster1(域名),這里的值指的是默認(rèn)的HDFS路徑。
(2)hadoop.tmp.dir:/export/data/hadoop_tmp,這里的路徑默認(rèn)是NameNode、DataNode、JournalNode等存放數(shù)據(jù)的公共目錄。用戶也可以自己單獨(dú)指定這三類節(jié)點的目錄。
(3)ha.zookeeper.quorum:hadoop101:2181,hadoop102:2181,hadoop103:2181,這里是ZooKeeper集群的地址和端口。注意,數(shù)量一定是奇數(shù),且不少于三個節(jié)點。
2>.Hadoop-env.sh:只需設(shè)置jdk的安裝路徑,如:exportJAVA_HOME=/usr/local/jdk本機(jī)j位置
3>.Hdfs-site.xml:
(1)dfs.replication:他決定著系統(tǒng)里面的文件塊的數(shù)據(jù)備份個數(shù),默認(rèn)為3個。
(2)dfs.data.dir:datanode節(jié)點存儲在文件系統(tǒng)的目錄。
(3)dfs.name.dir:是namenode節(jié)點存儲hadoop文件系統(tǒng)信息的本地系統(tǒng)路徑。
4>.Mapred-site.xml:
(1)mapred.job.tracker:是jobtracker的主機(jī)和端口配置。
4.請列出正常工作的Hadoop集群中Hadoop都分別需要啟動哪些進(jìn)程,它們的作用分別是什么?
a)NameNode它是hadoop中的主服務(wù)器,管理文件系統(tǒng)名稱空間和對集群中存儲的文件的訪問,保存有metadate.
b).SecondaryNameNode它不是namenode的冗余守護(hù)進(jìn)程,而是提供周期檢查點和清理任務(wù)。幫助NN合并editslog,減少NN啟動時間。
c)DataNode它負(fù)責(zé)管理連接到節(jié)點的存儲(一個集群中可以有多個節(jié)點)。每個存
儲數(shù)據(jù)的節(jié)點運(yùn)行一個datanode守護(hù)進(jìn)程。
d)ResourceManager(JobTracker)JobTracker負(fù)責(zé)調(diào)度DataNode上的工作。每個DataNode有一個TaskTracker,它們執(zhí)行實際工作。
e)NodeManager(TaskTracker)執(zhí)行任務(wù)
f)DFSZKFailoverController高可用時它負(fù)責(zé)監(jiān)控NN的狀態(tài),并及時的把狀態(tài)信息寫入ZK。它通過一個獨(dú)立線程周期性的調(diào)用NN上的一個特定接口來獲取NN的健康狀態(tài)。FC也有選擇誰作為ActiveNN的權(quán)利,因為最多只有兩個節(jié)點,目前選擇策略還比較簡單(先到先得,輪換)。
g)JournalNode高可用情況下存放namenode的editlog文件.
HDFS數(shù)據(jù)寫入實現(xiàn)機(jī)制
3.HDFS的存儲機(jī)制?
寫入HDFS過程:
Client調(diào)用DistributedFileSystem對象的create方法,創(chuàng)建一個文件輸出流(FSDataOutputStream)對象,通過DistributedFileSystem對象與Hadoop集群的NameNode進(jìn)行一次RPC遠(yuǎn)程調(diào)用,在HDFS的Namespace中創(chuàng)建一個文件條目(Entry),該條目沒有任何的Block,通過FSDataOutputStream對象,向DataNode寫入數(shù)據(jù),數(shù)據(jù)首先被寫入FSDataOutputStream對象內(nèi)部的Buffer中,然后數(shù)據(jù)被分割成一個個Packet數(shù)據(jù)包,以Packet最小單位,基于Socket連接發(fā)送到按特定算法選擇的HDFS集群中一組DataNode(正常是3個,可能大于等于1)中的一個節(jié)點上,在這組DataNode組成的Pipeline上依次傳輸Packet,這組DataNode組成的Pipeline反方向上,發(fā)送ack,最終由Pipeline中第一個DataNode節(jié)點將Pipelineack發(fā)送給Client,完成向文件寫入數(shù)據(jù),Client在文件輸出流(FSDataOutputStream)對象上調(diào)用close方法,關(guān)閉流.調(diào)用DistributedFileSystem對象的complete方法,通知NameNode文件寫入成功.
讀取文件過程:
使用HDFS提供的客戶端開發(fā)庫Client,向遠(yuǎn)程的Namenode發(fā)起RPC請求;Namenode會視情況返回文件的部分或全部block列表,對于每個block,Namenode都會返回有該block拷貝的DataNode地址;客戶端開發(fā)庫Client會選取離客戶端最接近的DataNode來讀取block;如果客戶端本身就是DataNode,那么將從本地直接獲取數(shù)據(jù).讀取完當(dāng)前block的數(shù)據(jù)后,關(guān)閉與當(dāng)前的DataNode連接,并為讀取下一個block尋找最佳的DataNode;當(dāng)讀完列表的block后,且文件讀取還沒有結(jié)束,客戶端開發(fā)庫會繼續(xù)向Namenode獲取下一批的block列表。讀取完一個block都會進(jìn)行checksum驗證,如果讀取datanode時出現(xiàn)錯誤,客戶端會通知Namenode,然后再從下一個擁有該block拷貝的datanode繼續(xù)讀。
2.HDFS的存儲機(jī)制是什么
客戶端通過把請求發(fā)送給NameNodeactive,NN會把文件切成1個到N個固定大小的block(一般默認(rèn)為128M)并上傳到DN中。當(dāng)所有block拷貝結(jié)束時,NN會立即通知客戶端上傳結(jié)果。但此時上傳的流程還未結(jié)束。DN還需要根據(jù)配置信息的副本數(shù)量,在不同的機(jī)架節(jié)點上通過局域網(wǎng)作數(shù)據(jù)拷貝工作。
6Hadoop是由哪幾個組件組成
hadoop是一套處理大數(shù)據(jù)的生態(tài)系統(tǒng),包括文件存儲HDFS,計算框架MapReduce調(diào)度框架Yarn,數(shù)據(jù)庫Hbase,數(shù)據(jù)倉庫Hive,協(xié)調(diào)與鎖服務(wù)zookeeper,關(guān)系型數(shù)據(jù)庫與Hbase轉(zhuǎn)換工具sqoop,工作流模塊Oozie,機(jī)器學(xué)習(xí)模塊mahout.
1.6hadoop節(jié)點動態(tài)上線下線怎么操作?
節(jié)點上線操作:
當(dāng)要新上線數(shù)據(jù)節(jié)點的時候,需要把數(shù)據(jù)節(jié)點的名字追加在dfs.hosts文件中
一,關(guān)閉新增節(jié)點的防火墻
二,在NameNode節(jié)點的hosts文件中加入新增數(shù)據(jù)節(jié)點的hostname
三,在每個新增數(shù)據(jù)節(jié)點的hosts文件中加入NameNode的hostname
四,在NameNode節(jié)點上增加新增節(jié)點的SSH免密碼登錄的操作
五,在NameNode節(jié)點上的dfs.hosts中追加上新增節(jié)點的hostname,
六,在其他節(jié)點上執(zhí)行刷新操作:hdfsdfsadmin-refreshNodes
七,在NameNode節(jié)點上,更改slaves文件,將要上線的數(shù)據(jù)節(jié)點hostname追加
到slaves文件中
八,啟動DataNode節(jié)點
九,查看NameNode的監(jiān)控頁面看是否有新增加的節(jié)點
節(jié)點下線操作:
一,修改/conf/hdfs-site.xml文件
二,確定需要下線的機(jī)器,dfs.osts.exclude文件中配置好需要下架的機(jī)器,這個是阻
止下架的機(jī)器去連接NameNode
三,配置完成之后進(jìn)行配置的刷新操作./bin/hadoopdfsadmin-refreshNodes,這個
操作的作用是在后臺進(jìn)行block塊的移動
四,當(dāng)執(zhí)行三的命令完成之后,需要下架的機(jī)器就可以關(guān)閉了,可以查看現(xiàn)在集
群上連接的節(jié)點,正在執(zhí)行Decommission,會顯示:
DecommissionStatus:Decommissioninprogress執(zhí)行完畢后,會顯示:
DecommissionStatus:Decommissioned
五,機(jī)器下線完畢,將他們從excludes文件中移除。
10.Hadoop中job和task之間的區(qū)別是什么?
JobTracker是一個master服務(wù),軟件啟動之后JobTracker接收J(rèn)ob,負(fù)責(zé)調(diào)度Job
的每一個子任務(wù)task運(yùn)行于TaskTracker上,并監(jiān)控它們,如果發(fā)現(xiàn)有失敗的task就重新
運(yùn)行它。一般情況應(yīng)該把JobTracker部署在單獨(dú)的機(jī)器上。
TaskTracker是運(yùn)行在多個節(jié)點上的slaver服務(wù)。TaskTracker主動與JobTracker通信,
接收作業(yè),并負(fù)責(zé)直接執(zhí)行每一個任務(wù)11.Hadoop中通過拆分任務(wù)到多個節(jié)點運(yùn)行來實現(xiàn)并行計
算,但某些節(jié)點運(yùn)行較慢會拖慢整個任務(wù)的運(yùn)行,Hadoop
采用何種機(jī)制應(yīng)對這個情況?
答:推測執(zhí)行機(jī)制是Hadoop對“拖后腿”的任務(wù)的一種優(yōu)化機(jī)制,當(dāng)一個作業(yè)的某些任務(wù)
運(yùn)行速度明顯慢于同作業(yè)的其他任務(wù)時,Hadoop會在另一個節(jié)點上為“慢任務(wù)”啟動一
個備份任務(wù),這樣兩個任務(wù)同時處理一份數(shù)據(jù),而Hadoop最終會將優(yōu)先完成的那個任務(wù)
的結(jié)果作為最終結(jié)果,并將另一個任務(wù)殺掉。
2.mapred.job.tracker命令的作用
連接jobtrack服務(wù)器的配置項,默認(rèn)不寫是local,在本地運(yùn)行,默認(rèn)map數(shù)1,reduce數(shù)1。
7如何決定一個job的map和reduce的數(shù)量?
splitSize=max{minSize,min{maxSize,blockSize}}
map數(shù)量由處理的數(shù)據(jù)分成的block數(shù)量決定default_num=total_size/split_size;
reduce的數(shù)量job.setNumReduceTasks(x);x為reduce的數(shù)量.
14.如何為一個Hadoop任務(wù)設(shè)置mappers的數(shù)量?
具體的數(shù)據(jù)分片是這樣的,InputFormat在默認(rèn)情況下會根據(jù)hadoop集群HDFS塊大小進(jìn)行分片,每一個分片會由一個map任務(wù)來進(jìn)行處理,當(dāng)然用戶還是可以通過參數(shù)mapred.min.split.size參數(shù)在作業(yè)提交客戶端進(jìn)行自定義設(shè)置。還有一個重要參數(shù)就是mapred.map.tasks,這個參數(shù)設(shè)置的map數(shù)量僅僅是一個提示,只有當(dāng)InputFormat決定了map任務(wù)的個數(shù)比mapred.map.tasks值小時才起作用。同樣,Map任務(wù)的個數(shù)也能通過使用JobConf的conf.setNumMapTasks(intnum)方法來手動地設(shè)置。這個方法能夠用來增加map任務(wù)的個數(shù),但是不能設(shè)定任務(wù)的個數(shù)小于Hadoop系統(tǒng)通過分割輸入數(shù)據(jù)得到的值。
15.如何為一個Hadoop任務(wù)設(shè)置要創(chuàng)建的reducer的數(shù)量?
純粹的mapreducetask的reducetask數(shù)很簡單,就是參數(shù)mapred.reduce.tasks
的值,hadoop-site.xml文件中和mapreducejob運(yùn)行時。不設(shè)置的話默認(rèn)為1。
10yarn的新特性
ResourceManagerHA:在apachehadoop4.4或者CDH5.0.0版本之后,增加了ResourceMangerHA特性,支持基于Zookeeper的熱主備切換。
磁盤容錯:增加了幾個對多磁盤非常友好地參數(shù),這些參數(shù)允許YARN更好地使用NodeManager上的多塊磁盤.
資源調(diào)度器:FairScheduler增加了允許用戶在線將一個應(yīng)用程序從一個隊列轉(zhuǎn)移到另外一個隊列。
11如何使用mapReduce實現(xiàn)兩個表的join?
reducesidejoin:在map階段,map函數(shù)同時讀取兩個文件File1和File2,為了區(qū)分
兩種來源的key/value數(shù)據(jù)對,對每條數(shù)據(jù)打一個標(biāo)簽(tag),比如:tag=0表示來自文件File1,
tag=2表示來自文件File2。
mapsidejoin:Mapsidejoin是針對以下場景進(jìn)行的優(yōu)化:兩個待連接表中,有一個表非常大,而另一個表非常小,以至于小表可以直接存放到內(nèi)存中。這樣,我們可以將小表復(fù)制多份,讓每個maptask內(nèi)存中存在一份(比如存放到hashtable中),然后只掃描大表:對于大表中的每一條記錄key/value,在hashtable中查找是否有相同的key的記錄,如果有,
則連接后輸出即可。
SemiJoin:SemiJoin,也叫半連接,是從分布式數(shù)據(jù)庫中借鑒過來的方法。它的產(chǎn)生動機(jī)是:對于reducesidejoin,跨機(jī)器的數(shù)據(jù)傳輸量非常大,這成了join操作的一個瓶頸,
如果能夠在map端過濾掉不會參加join操作的數(shù)據(jù),則可以大大節(jié)省網(wǎng)絡(luò)IO。
reducesidejoin+BloomFilter:BloomFilter最常見的作用是:判斷某個元素是否在一個集合里面。它最重要的兩個方法是:add()和contains()。最大的特點是不會存在falsenegative,即:如果contains()返回false,則該元素一定不在集合中,但會存在一定的falsepositive,即:如果contains()返回true,則該元素一定可能在集合中。
參考網(wǎng)址:http://my.oschina.net/leejun2005/blog/95186?fromerr=cDqkUyup
8Hadoop的sequencefile的格式,并說明下什么是java序列化,如何實現(xiàn)java序列化?
SequenceFile文件是Hadoop用來存儲二進(jìn)制形式的key-value對而設(shè)計的一種平面文件;Hadoop的HDFS和MapReduce子框架主要是針對大數(shù)據(jù)文件來設(shè)計的,在小文件的處理上不但效率低下,而且十分消耗磁盤空間(每一個小文件占用一個Block,HDFS默認(rèn)block大小為64M)。
解決辦法通常是選擇一個容器,將這些小文件組織起來統(tǒng)一存儲。HDFS提供了兩種類型的容器,分別是SequenceFile和MapFile。
SequenceFile的每條記錄是可序列化的字符數(shù)組。
序列化是指將結(jié)構(gòu)化的對象轉(zhuǎn)化為字節(jié)流以便在網(wǎng)絡(luò)上傳輸或?qū)懭氲酱疟P進(jìn)行永久存儲的過程,反序列化是指將字節(jié)流轉(zhuǎn)回結(jié)構(gòu)化對象的過程.
9簡述hadoop1與hadoop2的架構(gòu)異同.
加入了yarn解決了資源調(diào)度的問題。
加入了對zookeeper的支持實現(xiàn)比較可靠的高可用.
http://blog.csdn.net/fenglibing/article/details/32916445
13請描述mapReduce二次排序原理
二次排序:就是首先按照第一字段排序,然后再對第一字段相同的行按照第二字段排序,注意不能破壞第一次排序的結(jié)果。
在Hadoop中,默認(rèn)情況下是按照key進(jìn)行排序。對于同一個key,reduce函數(shù)接收到的valuelist是按照value排序的。
有兩種方法進(jìn)行二次排序,分別為:bufferandinmemorysort和value-to-keyconversion。
對于bufferandinmemorysort,主要思想是:在reduce()函數(shù)中,將某個key對應(yīng)的所有value保存下來,然后進(jìn)行排序。這種方法最大的缺點是:可能會造成outofmemory。
對于value-to-keyconversion,主要思想是:將key和部分value拼接成一個組合key(實現(xiàn)WritableComparable接口或者調(diào)用setSortComparatorClass函數(shù)),這樣reduce獲取的結(jié)果便是先按key排序,后按value排序的結(jié)果,需要注意的是,用戶需要自己實現(xiàn)Paritioner,以便只按照key進(jìn)行數(shù)據(jù)劃分。Hadoop顯式的支持二次排序,在Configuration類中有個setGroupingComparatorClass()方法,可用于設(shè)置排序group的key值。
具體參考:http://www.cnblogs.com/xuxm2007/archive/2011/09/03/2165805.html
參考網(wǎng)址:http://my.oschina.net/leejun2005/blog/95186?fromerr=cDqkUyup
14請描述mapReduce中排序發(fā)生的幾個階段
一個是在mapside發(fā)生在spill后partition前。
一個是在reduceside發(fā)生在copy后reduce前。
mapReduce的四個階段:
Splitting:在進(jìn)行map計算之前,mapreduce會根據(jù)輸入文件計算輸入分片(inputsplit),每個輸入分片(inputsplit)針對一個map任務(wù)。輸入分片(inputsplit)存儲的并非數(shù)據(jù)本身,而是一個分片長度和一個記錄數(shù)據(jù)位置的數(shù)組,輸入分片(inputsplit)往往和hdfs的block(塊)關(guān)系很密切,假如我們設(shè)定hdfs的塊的大小是64mb,如果我們輸入有三個文件,大小分別是3mb、65mb和127mb,那么mapreduce會把3mb文件分為一個輸入分片(inputsplit),65mb則是兩個輸入分片(inputsplit)而127mb也是兩個輸入分片(inputsplit),換句話說我們?nèi)绻趍ap計算前做輸入分片調(diào)整,例如合并小文件,那么就會有5個map任務(wù)將執(zhí)行,而且每個map執(zhí)行的數(shù)據(jù)大小不均,這個也是mapreduce優(yōu)化計算的一個關(guān)鍵點。
Mapping:就是程序員編寫好的map函數(shù)了,因此map函數(shù)效率相對好控制,而且一般map操作都是本地化操作也就是在數(shù)據(jù)存儲節(jié)點上進(jìn)行;
Shuffle:描述著數(shù)據(jù)從maptask輸出到reducetask輸入的這段過程。
Reduce:對Map階段多個文件的數(shù)據(jù)進(jìn)行合并。
15請描述mapReduce中shuffle階段的工作流程,如何優(yōu)化shuffle階段
分區(qū),排序,溢寫,拷貝到對應(yīng)reduce機(jī)器上,增加combiner,壓縮溢寫的文
標(biāo)簽:
大數(shù)據(jù)分析
大數(shù)據(jù)培訓(xùn)
大數(shù)據(jù)視頻教程
Hadoop視頻教程
大數(shù)據(jù)開發(fā)工程師