bigdata hadoop 面試問題一

數據結構
html

1.棧和隊列都是線性數據結構。java

2. 棧(FIlO):只能在一端操做,即棧頂(如出棧、入棧),這種只能從一端操做的性質,意味着棧中的元素只能後進先出(先進後出)(last in first out)。(它的這種一端性,有時會用來實現double-end stack 雙端棧)node

3. 隊列(FIFO): 是一個雙端操做的數據結構,入隊、和出隊分別在一端操做。可以保持先進先出的性質(first in first out). 爲了充分利用的隊列的空間,經常使用來實現循環隊列。mysql


      一、說說大家公司的hadoop項目? 
  二、大家項目的集羣有多大,有幾個節點,總共的數據量是多少? 
  三、 天天大約有多少數據量?
  四、hdfs如何保持數據的一致性?
  五、多線程併發是如何開發的?
  6,、nio有哪些核心的類?
  七、大家是如何解決hive數據傾斜問題的?
  八、mapreduce中shuffle的原理
  還有不少Java基礎的問題,好比java虛擬機,垃圾回收機制等等,有些問題一開始本身並非很懂,都會說這個本身尚未接觸到,可是那個技術我懂,而後就把知識點轉移到你熟悉的領域了,這樣就把握主動了。不管面試成功或失敗,都要總結,把以前被問到,沒有徹底掌握的都熟悉。到下次面試的時候就更有把握,到後面就會越面試越順。程序員

1、內部表和外部表的區別面試

1.在建立表的時候,導入數據到外部表,數據並無移動到本身的數據倉庫下,而在本身建立表指定的路徑下,而對應於內部表數據是移動到本身的數據倉庫下的。
2.在刪除表的時候,hive 會將內部表的元數據和數據所有刪除,而外部表僅僅只是刪除元數據,數據並無刪除。


2、Hbase的行健怎樣建立比較好?列族怎樣建立比較好?算法

Hbase中行健用來檢索表中的記錄:經過如下三種方式:
1.	經過單個的行健訪問
2.	經過行健的範圍進行scan
3.	全表掃描:掃描整張表中的全部行

行健是按照字典順序存儲的,建立行健的時候應對應這個排序特色,常常讀取的數據放在一塊兒,最近可能被訪問的數據放在一塊兒。
	列族:不要在一張表中定義太多的列族,當某個列族flush的時候,臨近的列族也會因關聯效應而被觸發flush。


3、三個datanode當中有一個datanode出錯會怎樣?sql

訪問數據失敗則去其餘備份的機器去讀取,並將這個數據塊再進行復制一次到達備份標準


4、MapReduce的調度模式:數據庫

先按照做業的優先級高低,然後按照做業到達時間的前後進行處理。
	計算能力調度
		支持多個隊列,每一個隊列採用FIFO調度策略,計算每一個隊列中正在運行的任務數和其分得的計算資源的比值,選擇比值最小的隊列,以後採用FIFO策略。
	公平調度
		同一個隊列中的做業共享資源。
	異構集羣調度
	實時調度


5、Hadoop的壓縮算法:apache


1.用一些包含了壓縮而且支持splittable的文件格式,好比Sequence File,RCFile或者Avro文件,這些文件格式咱們以後都會講到。若是爲了快速壓縮可使用lzo,lz4或者snappy壓縮格式。
2.使用提供splittable的壓縮格式,好比,bzip2和索引後能夠支持splittable的lzo。
3.提早把文件分紅幾個塊,每一個塊單獨壓縮,這樣就無需考慮splittable的問題了。


6、Mapreduce怎麼處理數據傾斜的問題?

數據傾斜:在執行mapreduce的時候,reduce節點大部分都已經執行完畢,可是老是存在着一個或者幾個節點運行較慢,致使整個程序處理時間較長,只是由於某一條key的條數比其餘的多不少,因此處理這個條數的節點時間較長,致使某幾個節點遲遲運行不完。
解決:
	設置一個hash份數N,用來打散key值。
	對有重複的key,將1~N添加到key的後面,造成新的key值。
	對於key值平均分發到不一樣的reduce節點,若是須要和其餘數據相關聯,		爲了保證每一個reduce節點上都有相關聯的key,對另外一個key也進行上述處理。 
採用調度策略處理數據傾斜問題。
基於抽樣分區解決數據傾斜問題(一篇碩士論文)


7、Hadoop框架中怎麼來優化?

Hadoop 框架存在着一些問題:
	namenode、jobtracker單點故障,HDFS小文件,jobtracker同時負責監控和調度,負載過大,數據處理的性能。
	框架調優:
(1)	應用程序調優:書寫程序優化
1.	避免沒必要要的reduce任務
2.	外部文件引入:對於一些外部文件,如字典,配置文件等須要在task之間共享,能夠放到分佈式緩存裏面DistributedCache
3.	爲job添加一個combiner:能夠減小shuffle階段從map task遠程拷貝到reduce task的開銷
4.	根據數據特徵選擇使用Writable,也能夠根據本身的實際狀況書寫Writable
5.	重用Writable類型
6.	使用StringBuffer而不是String:SringBuffer是可修改的,String是隻讀的,若是須要修改,會產生臨時對象,StringBuffer不會產生臨時對象。
(2)	對hadoop參數調優
(3)	系統實現角度調優:根據系統實現的要求,可能會修改源碼等方面。


8、shuffle階段:

shuffle階段:將map的輸出做爲reduce的輸入的過程就是shuffle了,這個是mapreduce優化的重點地方。這裏我不講怎麼優化shuffle階段,講講shuffle階段的原理,由於大部分的書籍裏都沒講清楚shuffle階段。Shuffle一開始就是map階段作輸出操做,通常mapreduce計算的都是海量數據,map輸出時候不可能把全部文件都放到內存操做,所以map寫入磁盤的過程十分的複雜,更況且map輸出時候要對結果進行排序,內存開銷是很大的,map在作輸出時候會在內存裏開啓一個環形內存緩衝區,這個緩衝區專門用來輸出的,默認大小是100mb,而且在配置文件裏爲這個緩衝區設定了一個閥值,默認是0.80(這個大小和閥值都是能夠在配置文件裏進行配置的),同時map還會爲輸出操做啓動一個守護線程,若是緩衝區的內存達到了閥值的80%時候,這個守護線程就會把內容寫到磁盤上,這個過程叫spill,另外的20%內存能夠繼續寫入要寫進磁盤的數據,寫入磁盤和寫入內存操做是互不干擾的,若是緩存區被撐滿了,那麼map就會阻塞寫入內存的操做,讓寫入磁盤操做完成後再繼續執行寫入內存操做,前面我講到寫入磁盤前會有個排序操做,這個是在寫入磁盤操做時候進行,不是在寫入內存時候進行的,若是咱們定義了combiner函數,那麼排序前還會執行combiner操做。每次spill操做也就是寫入磁盤操做時候就會寫一個溢出文件,也就是說在作map輸出有幾回spill就會產生多少個溢出文件,等map輸出所有作完後,map會合並這些輸出文件。這個過程裏還會有一個Partitioner操做,對於這個操做不少人都很迷糊,其實Partitioner操做和map階段的輸入分片(Input split)很像,一個Partitioner對應一個reduce做業,若是咱們mapreduce操做只有一個reduce操做,那麼Partitioner就只有一個,若是咱們有多個reduce操做,那麼Partitioner對應的就會有多個,Partitioner所以就是reduce的輸入分片,這個程序員能夠編程控制,主要是根據實際key和value的值,根據實際業務類型或者爲了更好的reduce負載均衡要求進行,這是提升reduce效率的一個關鍵所在。到了reduce階段就是合併map輸出文件了,Partitioner會找到對應的map輸出文件,而後進行復制操做,複製操做時reduce會開啓幾個複製線程,這些線程默認個數是5個,程序員也能夠在配置文件更改複製線程的個數,這個複製過程和map寫入磁盤過程相似,也有閥值和內存大小,閥值同樣能夠在配置文件裏配置,而內存大小是直接使用reduce的tasktracker的內存大小,複製時候reduce還會進行排序操做和合並文件操做,這些操做完了就會進行reduce計算了。


9、sqoop在導入mysql時,如何讓數據不重複導入?

使用--參數進行不重複導入:
sqoop import --connect jdbc:mysql://localhost:3306/hive  --username root 
	--password hadoop --table TBLS --fields-terminated-by '\t'  
	--null-string '**'  -m 1 --append  --hive-import  
	--check-column 'TBL_ID' --incremental append --last-value 6(不重複導入 檢查列參數 增量導入)

	sqoop簡單的操做
1.把數據從mysql導入到hdfs(默認是/user/<username>)中
  sqoop import --connect jdbc:mysql://localhost:3306/hive  --username root 
	--password hadoop --table TBLS --fields-terminated-by '\t'  --null-string '**'  
	-m 1 --append  --hive-import 

2.把數據從hdfs導出到mysql中  
  sqoop export --connect jdbc:mysql://localhost:3306/hive  --username root
	--password hadoop --table id(本身先建立表) --fields-terminated-by '\t' 
	--export-dir '/id' (將id文件傳到hdfs上)

3.設置爲做業,運行做業
  sqoop job --create myjob -- import --connect jdbc:mysql://localhost:3306/hive 
	--username root --password hadoop --table TBLS --fields-terminated-by '\t' 
	--null-string '**'  -m 1 --append  --hive-import  

4. 查看做業,運行做業,刪除做業
  sqoop --list
  sqoop --exec myjob
  sqoop --delete myjob

5. 導入導出的事務是以Mapper任務爲單位,有幾個Mapper就有幾個事物。


一. 問答:

1. 簡單描述如何安裝配置一個apache開源版hadoop,只描述便可,無需列出完整步驟,能列出步驟更好。

1) 安裝JDK並配置環境變量(/etc/profile)

2) 關閉防火牆

3) 配置hosts文件,方便hadoop經過主機名訪問(/etc/hosts)

4) 設置ssh免密碼登陸

5) 解壓縮hadoop安裝包,並配置環境變量

6) 修改配置文件($HADOOP_HOME/conf)

hadoop-env.sh  core-site.xml  hdfs-site.xml  mapred-site.xml

7) 格式化hdfs文件系統 (hadoop namenode -format)

8) 啓動hadoop ($HADOOP_HOME/bin/start-all.sh)

9) 使用jps查看進程


2. 請列出正常工做的hadoop集羣中hadoop都分別須要啓動那些進程,他們的做用分別是什麼,儘量寫的全面些。

1) NameNode: HDFS的守護進程,負責記錄文件是如何分割成數據塊,以及這些數據塊分別被存儲到那些數據節點上,它的主要功能是對內存及IO進行集中管理

2) Secondary NameNode:輔助後臺程序,與NameNode進行通訊,以便按期保存HDFS元數據的快照。

3) DataNode:負責把HDFS數據塊讀寫到本地的文件系統。

4) JobTracker:負責分配task,並監控全部運行的task。

5) TaskTracker:負責執行具體的task,並與JobTracker進行交互。


3. 請列出你所知道的hadoop調度器,並簡要說明其工做方法。

比較流行的三種調度器有:默認調度器FIFO,計算能力調度器Capacity Scheduler,公平調度器Fair Scheduler

1) 默認調度器FIFO

hadoop中默認的調度器,採用先進先出的原則

2) 計算能力調度器Capacity Scheduler

選擇佔用資源小,優先級高的先執行

3) 公平調度器Fair Scheduler

同一隊列中的做業公平共享隊列中全部資源


4. Hive有那些方式保存元數據的,各有那些特色。

1) 內存數據庫derby,較小,不經常使用

2) 本地mysql,較經常使用

3) 遠程mysql,不經常使用


5. 請簡述hadoop怎樣實現二級排序。

在Hadoop中,默認狀況下是按照key進行排序,若是要按照value進行排序怎麼辦?

有兩種方法進行二次排序,分別爲:buffer and in memory sort和 value-to-key conversion。

buffer and in memory sort

主要思想是:在reduce()函數中,將某個key對應的全部value保存下來,而後進行排序。 這種方法最大的缺點是:可能會形成out of memory。


value-to-key conversion

主要思想是:將key和部分value拼接成一個組合key(實現WritableComparable接口或者調setSortComparatorClass函數),這樣reduce獲取的結果即是先按key排序,後按value排序的結果,須要注意的是,用戶須要本身實現Paritioner,以便只按照key進行數據劃分。Hadoop顯式的支持二次排序,在Configuration類中有個setGroupingComparatorClass()方法,可用於設置排序group的key值

http://dongxicheng.org/mapreduce/hadoop-join-two-tables/


6. 簡述hadoop實現Join的幾種方法。

1) reduce side join

reduce side join是一種最簡單的join方式,其主要思想以下:

在map階段,map函數同時讀取兩個文件File1和File2,爲了區分兩種來源的key/value數據對,對每條數據打一個標籤(tag),好比:tag=0表示來自文件File1,tag=2表示來自文件File2。即:map階段的主要任務是對不一樣文件中的數據打標籤。

在reduce階段,reduce函數獲取key相同的來自File1和File2文件的value list, 而後對於同一個key,對File1和File2中的數據進行join(笛卡爾乘積)。即:reduce階段進行實際的鏈接操做。


2) map side join

之因此存在reduce side join,是由於在map階段不能獲取全部須要的join字段,即:同一個key對應的字段可能位於不一樣map中。Reduce side join是很是低效的,由於shuffle階段要進行大量的數據傳輸。

Map side join是針對如下場景進行的優化:兩個待鏈接表中,有一個表很是大,而另外一個表很是小,以致於小表能夠直接存放到內存中。這樣,咱們能夠將小表複製多份,讓每一個map task內存中存在一份(好比存放到hash table中),而後只掃描大表:對於大表中的每一條記錄key/value,在hash table中查找是否有相同的key的記錄,若是有,則鏈接後輸出便可。

爲了支持文件的複製,Hadoop提供了一個類DistributedCache,使用該類的方法以下:

(1)用戶使用靜態方法DistributedCache.addCacheFile()指定要複製的文件,它的參數是文件的URI(若是是HDFS上的文件,能夠這樣:hdfs://namenode:9000/home/XXX/file,其中9000是本身配置的NameNode端口號)。JobTracker在做業啓動以前會獲取這個URI列表,並將相應的文件拷貝到各個TaskTracker的本地磁盤上。(2)用戶使用DistributedCache.getLocalCacheFiles()方法獲取文件目錄,並使用標準的文件讀寫API讀取相應的文件。


3) SemiJoin

SemiJoin,也叫半鏈接,是從分佈式數據庫中借鑑過來的方法。它的產生動機是:對於reduce side join,跨機器的數據傳輸量很是大,這成了join操做的一個瓶頸,若是可以在map端過濾掉不會參加join操做的數據,則能夠大大節省網絡IO。

實現方法很簡單:選取一個小表,假設是File1,將其參與join的key抽取出來,保存到文件File3中,File3文件通常很小,能夠放到內存中。在map階段,使用DistributedCache將File3複製到各個TaskTracker上,而後將File2中不在File3中的key對應的記錄過濾掉,剩下的reduce階段的工做與reduce side join相同。

更多關於半鏈接的介紹,可參考:半鏈接介紹:http://wenku.baidu.com/view/ae7442db7f1922791688e877.html


4) reduce side join + BloomFilter

在某些狀況下,SemiJoin抽取出來的小表的key集合在內存中仍然存放不下,這時候可使用BloomFiler以節省空間。

BloomFilter最多見的做用是:判斷某個元素是否在一個集合裏面。它最重要的兩個方法是:add() 和contains()。最大的特色是不會存在false negative,即:若是contains()返回false,則該元素必定不在集合中,但會存在必定的true negative,即:若是contains()返回true,則該元素可能在集合中。

於是可將小表中的key保存到BloomFilter中,在map階段過濾大表,可能有一些不在小表中的記錄沒有過濾掉(可是在小表中的記錄必定不會過濾掉),這不要緊,只不過增長了少許的網絡IO而已。

更多關於BloomFilter的介紹,可參考:http://blog.csdn.net/jiaomeng/article/details/1495500


7. 請簡述MapReduce中combiner、partition的做用。

combiner:

有時一個map可能會產生大量的輸出,combiner的做用是在map端對輸出先作一次合併,以減小網絡傳輸到reducer的數量。

注意:mapper的輸出爲combiner的輸入,reducer的輸入爲combiner的輸出。


partition:

把map任務輸出的中間結果按照key的範圍劃分紅R份(R是預先定義的reduce任務的個數),劃分時一般使用hash函數,如:hash(key) mod R

這樣能夠保證一段範圍內的key,必定會由一個reduce任務來處理。




大數據技術/Hadoop面試題

http://blog.csdn.net/lifuxiangcaohui/article/details/39078657

http://blog.csdn.net/lifuxiangcaohui/article/details/39078847

http://my.oschina.net/winHerson/blog/209420

http://blog.csdn.net/zdp072/article/details/42554431

相關文章
相關標籤/搜索