數據結構
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