大資料面試(hadoop)
hadoop實現二級排序?
在MapReduce中本身就會對我們key進行排序,所以我們要對value進行排序,主要思想為將key和部分value拼接成一個組合key(實現WritableComparable介面或者呼叫 setSortComparatorClass函式),
這樣reduce獲取的結果便是先按key排序,後按value排序的結果,在這個方法中,使用者需 要自己實現Paritioner,繼承Partitioner<>,以便只按照key進行資料劃分。
Hadoop顯式的支援二次排序,在Configuration類中有個 setGroupingComparatorClass()方法,可用於設定排序group的key值。
mapreduce中,combiner,partition作用?
在MapReduce整個過程中,combiner是可有可無的,需要是自己的情況而定,如果只是單純的對map輸出的key-value進行一個統計,則不需要進行combiner,combiner相當於提前做了一個reduce的工作,減輕了reduce端的壓力,
Combiner只應該適用於那種Reduce的輸入(key:value與輸出(key:value)型別完全一致,且不影響最終結果的場景。比如累加,最大值等,也可以用於過濾資料,在 map端將無效的資料過濾掉。
在這些需求場景下,輸出的資料是可以根據key值來作合併的,合併的目的是減少輸出的資料量,減少IO的讀寫,減少網路傳輸,以提高MR的作業效率。
1.combiner的作用就是在map端對輸出先做一次合併,以減少傳輸到reducer的資料量.
2.combiner最基本是實現本地key的歸併,具有類似本地reduce,那麼所有的結果都是reduce完成,效率會相對降低。
3.使用combiner,先完成的map會在本地聚合,提升速度.
--partition意思為分開,分割槽。它分割map每個節點的結果,按照key分別對映給不同的reduce,也是可以自定義的。其實可以理解歸類。也可以理解為根據key或value及reduce的數量來決定當前的這對輸出資料最終應該交由哪個reduce task處理
partition的作用就是把這些資料歸類。每個map任務會針對輸出進行分割槽,及對每一個reduce任務建立一個分割槽。劃分分割槽由使用者定義的partition函式控制,預設使用雜湊函式來劃分分割槽。
HashPartitioner是mapreduce的預設partitioner。計算方法是
which reducer=(key.hashCode() & Integer.MAX_VALUE) % numReduceTasks,得到當前的目的reducer。
RDBMS和Hadoop的主要區別是什麼?
RDBMS用於事務性系統儲存和處理資料,而Hadoop可以用來儲存大量資料。
Hadoop 支援資料的隨機讀寫?
錯誤
Slave 節點要儲存資料,所以它的磁碟越大越好?
一旦Slave節點宕機,資料恢復是一個難題
現在在hadoop叢集當中的配置檔案中有這麼兩個配置,請問假如叢集當中有一個節點宕機,主節點namenode需要多長時間才能感知到?
<property> <name>dfs.heartbeat.interval</name> <value>3</value> </property> <property> <name>heartbeat.recheck.interval</name> <value>2000</value> </property>
timeout = 10 * dfs.heartbeat.interval + 2 * heartbeat.recheck.interval
34
MapReduce的Shuffle過程中哪個操作是最後做的?
MapReduce程式設計模型分為Mapper和Reducer階段,在mapper和reducer的中間還有一個shuffle階段。但是Shuffle也分為MapperShuffle和ReducerShuffler兩個階段。這個Shuffle非常的重要,而且也是導致MapReduce執行效率低的一個重要原因。
shuflle中的執行順序是先分割槽,然後在溢寫之前進行排序,最後溢位的多個磁碟檔案會進行合併成一個大檔案
分割槽--排序--溢寫--合併
一個MapReduce程式中的MapTask的個數由什麼決定?
FileInputFormat.getSplits(JobContext job)計算出的邏輯切片的數量
執行一個job,如果這個job的輸出路徑已經存在,那麼程式會?
丟擲一個異常,然後退出
hadoop排程器?
在Yarn中有三種排程器可以選擇:FIFO Scheduler(佇列排程器) ,Capacity Scheduler(容量排程器),FairScheduler(公平排程器)。
hadoop版本中CDH預設排程器FairScheduler,HDP預設排程器Capacity Scheduler。
FIFO Scheduler: 先進先出的原則。
Capacity Scheduler: 多個佇列, 每個佇列配置一定資源, 每個佇列採用FIFO排程策略。
FairScheduler: 公平排程,所有的 job 具有相同的資源。
spark的shuffle階段和mr的shuffle階段分別是什麼?
mr的shuffle分為map的shuffle和reduce 的shuffle
Map的Shuffle
資料存到hdfs中是以塊進行儲存的,每一個塊對應一個分片,maptask就是從分片中獲取資料的。
在某個節點上啟動了mapTask,mapTask讀取是通過k-v來讀取的,讀取的資料會放到環形快取區,這樣做的目的是為了防止IO的訪問次數,然後環形快取區的記憶體達到一定的閥值的時候會把檔案溢寫到磁碟,溢位的各種小檔案會合併成一個大檔案,這個合併的過程中會進行排序,這個排序叫做歸併排序。
map階段會涉及到
1.sort排序(預設按字典排序)
2.合併(combiner合併)
3.檔案合併(merage合併總共有三種,預設是記憶體到磁碟)
4.壓縮(設定壓縮就會執行)
reduceShuffle
歸併排序完成後reduce端會拉取map端的資料,拉取的這個過程叫做copy過程,拉取的資料合併成一個檔案,GroupComparator(預設,這個我們也可以自定義)是專門對資料夾裡面的key進行分組,然後就形成k-List(v1,v2,v3)的形式,然後reduce經過業務處理,最終輸出到hdfs,如果設定壓縮就會執行,不設定則不執行
reduce階段會涉及到:
1.sort排序
2.分組(將相同的key的value放到一個容器的過程)
3.merage檔案合併
Spark shuffle
與MapReduce完全不一樣的是,MapReduce它必須將所有的資料都寫入本地磁碟檔案以後,才能啟動reduce操作,來拉取資料。為什麼?因為mapreduce要實現預設的根據key的排序!所以要排序,肯定得寫完所有資料,才能排序,然後reduce來拉取。
但是Spark不需要,spark預設情況下,是不會對資料進行排序的。因此ShuffleMapTask每寫入一點資料,ResultTask就可以拉取一點資料,然後在本地執行我們定義的聚合函式和運算元,進行計算。
spark這種機制的好處在於,速度比mapreduce快多了。但是也有一個問題,mapreduce提供的reduce,是可以處理每個key對應的value上的,很方便。但是spark中,由於這種實時拉取的機制,因此提供不了直接處理key對應的values的運算元,只能通過groupByKey,先shuffle,有一個MapPartitionsRDD,然後用map運算元,來處理每個key對應的values。就沒有mapreduce的計算模型那麼方便。