Hadoop 面試總結


1、簡要描述如何安裝配置一個開源的hadoop,只描述即可,列出完整步驟。
a、創建一個用戶和用戶組,用來管理hadoop項目
b、修改確定ip地址:vim /etc/sysconfig/network-scripts/ifcfg-eth0
c、修改主機名:vim /etc/sysconfig/network
d、修改host主機名和ip地址映射:vim /etc/hosts
e、查看防火牆狀態並關閉防火牆:
#查看防火牆狀態
service iptables status
#關閉防火牆
service iptables stop
#查看防火牆開機啟動狀態
chkconfig iptables --list
#關閉防火牆開機啟動
chkconfig iptables off
f、安裝ssh並配置免密碼登錄:ssh-keygen -t rsa
執行完這個命令后,會生成兩個文件id_rsa(私鑰)、id_rsa.pub(公鑰)
將公鑰拷貝到要免登陸的機器上
cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys
ssh-copy-id -i localhost
g、上傳並安裝jdk: tar -zxvf jdk**.tar.gz -C /user/java/ 修改/etc/profile文件,配置java環境變量
h、安裝hadoop: tar -zxvf hadoop....tar.gz
i、配置conf文件下:
對於hadoop1.*版本(hadoop-env.sh,core-site.xml,hdfs-site.xml,mapred-site.xml)
對於hadoop2.*版本(hadoop-env.sh,core-site.xml,hdfs-site.xml,mapred-site.xml,yarn-site.xml,slaves文件)
j、安裝配置zookeeper集群
k、格式namenode
對於hadoop1.*版本 :hadoop namenode -format
對於hadoop2.*版本 :hdfs namenode -format
 
 
2、請列出正常的工作的hadoop集群中hadoop都分別需要啟動哪些進程,他們的作用分別是什么。
對於hadoop1.*版本 :
a. NameNode
它是Hadoop 中的主服務器,管理文件系統名稱空間和對集群中存儲的文件的訪問。
b. SecondaryNameNode
它不是 namenode 的冗余守護進程,而是提供周期檢查點和清理任務。
出於對可擴展性和容錯性等考慮,我們一般將SecondaryNameNode運行在一台非NameNode的機器上。
c. DataNode
它負責管理連接到節點的存儲(一個集群中可以有多個節點)。每個存儲數據的節點運行一個 datanode 守護進程。
d. JobTracker和TaskTracker
JobTracker負責調度 DataNode上的工作。每個 DataNode有一個TaskTracker,它們執行實際工作。
JobTracker和 TaskTracker采用主-從形式,JobTracker跨DataNode分發工作,而TaskTracker執行任務。
JobTracker還檢查請求的工作,如果一個 DataNode由於某種原因失敗,JobTracker會重新調度以前的任務。
 
對於hadoop2.*版本 :
會啟動NameNode、DFSZKFailoverController ,ResourceManager,DataNode、NodeManager、JournalNode
3、
4、請寫出一下的執行命令
1)殺死一個job
kill -9 jobId
2)刪除hdfs上的/tmp/aaa目錄
hadoop fs -rmr /tmp/aaa
3)加入一個新的存儲接口和刪除一個計算機節點需要刷新集群狀態命令
hadoop-daemon.sh start datanode
hadoop-daemon.sh start tasktracker
刪除時:
hadoop mradmin -refreshnodes
hadoop dfsadmin -refreshnodes
 
5、請列出你所知道的hadoop調度器,並且簡要說明其工作方法。
比較流行的三種調度器有:默認調度器FIFO,計算能力調度器Capacity Scheduler ,公平調度器Fair Scheduler
1) 默認調度器FIFO
hadoop中默認的調度器,采用先進先出的原則
2) 計算能力調度器Capacity Scheduler
選擇占用資源小,優先級高的先執行
3) 公平調度器Fair Scheduler
同一隊列中的作業公平共享隊列中所有資源
 
 
6、請列出在你以前的工作中所使用過的開發map/reduce的語言。
java python,scala
 
7、當前的日志采樣格式為:
a,b,c,d
b,b,f,e
a,a,c,f
請用你最熟悉的語言編寫一個map/reduce程序,計算第四列每個元素出現的個數。
 
8、你認為用java,Streaming,pipe方式開發map/reduce,各有哪些缺點。
9、hive有哪些方式保存元素據,各有哪些特點。
1) 內存數據庫derby,較小,不常用
2) 本地mysql,較常用
3) 遠程mysql,不常用
 
10、請簡述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值
 
11、簡述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相同。
更多關於半連接的介紹,可參考:半連接介紹:
 
4) reduce side join + BloomFilter
在某些情況下,SemiJoin抽取出來的小表的key集合在內存中仍然存放不下,這時候可以使用BloomFiler以節省空間。
BloomFilter最常見的作用是:判斷某個元素是否在一個集合里面。它最重要的兩個方法是:add() 和contains()。
最大的特點是不會存在false negative,即:如果contains()返回false,則該元素一定不在集合中,但會存在一定的true negative,
即:如果contains()返回true,則該元素可能在集合中。
因而可將小表中的key保存到BloomFilter中,在map階段過濾大表,可能有一些不在小表中的記錄沒有過濾掉(但是在小表中的記錄一定不會過濾掉),
這沒關系,只不過增加了少量的網絡IO而已。
 
 
12、請用java實現非遞歸二分查找。
13、請簡述mapReduce中combiner,partiton作用
14、某個目錄下有兩個文件a.txt和b.txt 文件格式為一下,列如:
a.txt
127.0.0.1 zhangsan
127.0.0.1 wangxiaoer
127.1.1.2 lisi
127.0.0.5 wangwu
b.txt
127.0.0.4 lixiaolu
127.0.0.1 lisi
每個文件至少有100萬行,請使用linux命令行完成一下工作:
1)兩個文件各自的ip數,以及總的ip數
2)出現在b.txt而沒有出現在a.txt的ip
3) 每個username出現的次數,以及每個username對應的ip數。
15、hive內部表和外部表的區別
Hive 創建內部表時,會將數據移動到數據倉庫指向的路徑;若創建外部表,僅記錄數據所在的路徑,
不對數據的位置做任何改變。在刪除表的時候,內部表的元數據和數據會被一起刪除,
而外部表只刪除元數據,不刪除數據。這樣外部表相對來說更加安全些,數據組織也更加靈活,方便共享源數據。
 
16、Hbase 的 rowkey 怎么創建比較好?列族怎么創建比較好?
rowkey設計原則
1)Rowkey的長度原則: 是一個二進制碼流,Rowkey 的長度被很多開發者建議說設計在10~100 個字節,不過建議是越短越好,不要超過16 個字節。
2)Rowkey散列原則:如果Rowkey 是按時間戳的方式遞增,不要將時間放在二進制碼的前面,建議將Rowkey的高位作為散列字段,由程序循環生成,低位放時間字段,
這樣將提高數據均衡分布在每個Regionserver 實現負載均衡的幾率。如果沒有散列字段,首字段直接是時間信息將產生所有新數據都在一個 RegionServer 上堆積的熱點現象,
這樣在做數據檢索的時候負載將會集中在個別RegionServer,降低查詢效率。
3)Rowkey唯一原則:必須在設計上保證其唯一性。
列族設計原則
1)一般不建議設計多個列族。具體原因如下
 
假如HBase表的表設置兩個列族,若已一個列族1000萬行,另一個列族100行。當一個要求region分裂時候,會導致100行的列會同樣分布到多個region中。
這樣就出現基數問題,會導致掃描列族A的性能低下。某個列族在flush的時候,它鄰近的列族也會因關聯效應出發flush,最終導致系統產生更多的I/O。
HBase本身的設計目標是支持稀疏表,而稀疏表通常會有很多列,但是每一行有值的列又比較少。在HBase中Column Family的數量通常很小,
同時HBase建議把經常一起訪問的比較類似的列放在同一個Column Family中,這樣就可以在訪問少數幾個列時,只讀取盡量少的數據。
在設計Hbase schema的時候,要盡量只有一個column family,至於為什么主要從flush和compaction說起,它們觸發的基本單位都是Region級別,
所以當一個column family有大量的數據的時候會觸發整個region里面的其他column family的memstore(其實這些memstore可能僅有少量的數據,
還不需要flush的)也發生flush動作;另外compaction觸發的條件是當store file的個數(不是總的store file的大小)達到一定數量的時候會發生,
而flush產生的大量store file通常會導致compaction,flush/compaction會發生很多IO相關的負載,這對Hbase的整體性能有很大影響,所以選擇合適的column family個數很重要。
2)數據塊緩存配置
如果經常順序訪問或者很少訪問,可以關閉列族的緩存,讓BLOCKCACHE 參數設置false,列族緩存默認打開。
>create 'mytable',{NAME=>'colfam1',BLOCKCACHE=>'false'}
3)激進緩存配置
可以選擇一個列族賦予更高的緩存,該參數IN_MEMORY 設置true。列族默認的關閉的。如果你預期一個列族比另一個列族的隨機讀更多,這個特性遲早用的上。
>create 'mytable',{NAME=>'colfam1',IN_MEMORY=>'true'}
4)布隆過濾器(BLOOMFILTER)設置
減少硬盤讀取數據帶來的開銷。對存儲的數據塊做反向測試,占用額外的空間。
布隆過濾器隨着它們索引的對象數據的增長而增長,所以行級布隆過濾器比列限定符級布隆過濾器占用空間要少。當空間不是問題時,它們可以幫助你“榨干”系統的性能潛力。
>create 'mytable',{NAME=>'colfam1',BLOOMFILTER=>'ROWCOL'}
BLOOMFILTER默認參數為NONE。一個行級布隆過濾器用ROW啟動,列限定級布隆過濾器用ROWCOL啟動。行級布隆過濾器在數據快里檢查特定行鍵是否存在,
列限定符級布隆過濾器檢查行與列限定符組合是否不存在。ROWCOL布隆過濾器的開銷高於ROW布隆過濾器。
5)生產時間配置
超過這個時間設置的就會在下一次大合並中被刪除。TTL =>"18000"。你可以禁用TTL,或者通過設置其值為INT.MAX_VALUE(2147483647)讓它永遠啟用(這是默認值)。
>create 'mytable',{NAME=>'colfam1',TTL=>'1800'}
6)列族壓縮
壓縮可以節省空間,讀寫數據會增加CPU的使用率 LZO,SNAPPY,GZIP(不常用)。
>create 'mytable',{NAME=>'colfam1',COMPRESSION=>'SNAPPY'}
注意,數據只在硬盤上是壓縮的,在內存(MemStore或BlockCache)或通過網絡傳輸是是沒有壓縮的。
7)單元時間版本
默認為3個版本,來保存歷史數據。如果只需要喲個版本,推薦設置表時只維護一個版本。
>create 'mytable',{NAME=>'colfam1',VERSION=>1,TTL=>'1800'}
也可以指定列族存儲的最少時間版本數:
>create 'mytable',{NAME=>'colfam1',VERSION=>5,MIN_VERSIONS=>'1'}
 
17、用 mapreduce 怎么處理數據傾斜問題?
首先要定位到哪些數據 導致數據傾斜。確定完之后常見的處理方法有:
1. 在加個combiner函數,加上combiner相當於提前進行reduce,就會把一個mapper中的相同key進行了聚合,減少shuffle過程中數據量,
以及reduce端的計算量。這種方法可以有效的緩解數據傾斜問題,但是如果導致數據傾斜的key 大量分布在不同的mapper的時候,這種方法就不是很有效了。
2. 局部聚合加全局聚合。第二種方法進行兩次mapreduce,第一次在map階段對那些導致了數據傾斜的key 加上1-n的隨機前綴,
這樣之前相同的key 也會被分到不同的reduce中,進行聚合,這樣的話就有那些傾斜的key進行局部聚合,數量就會大大降低。
然后再進行第二次mapreduce這樣的話就去掉隨機前綴,進行全局聚合。這樣就可以有效地降低mapreduce了。
不過進行兩次mapreduce,性能稍微比一次的差些。自己的想法,還請大家多多討論,
18、Hbase內部機制
客戶端連接hbase依賴於zookeeper,hbase存儲依賴於hadoop
client:
1、包含訪問 hbase 的接口, client 維護着一些 cache(緩存)來加快對 hbase 的訪問,比如 region 的 位置信息。 (經常使用的表的位置信息)
zookeeper:
1、保證任何時候,集群中只有一個 master
2、存貯所有 Region 的尋址入口----root 表在哪台服務器上。 -root-這張表的位置信息
3、實時監控 RegionServer 的狀態,將 RegionServer 的上線和下線信息實時通知給 Master
4、存儲 Hbase 的 schema(表的描述信息),包括有哪些 table,每個 table 有哪些 column family
master職責:
1、為 RegionServer 分配 region
2、負責 RegionServer 的負載均衡
3、發現失效的 RegionServer 並重新分配其上的 region
4、 HDFS 上的垃圾文件( hbase)回收
5、處理 schema 更新請求(增加,刪除,修改)( JDBC:crud)
RegionServer 職責
1、 RegionServer 維護 Master 分配給它的 region,處理對這些 region 的 IO 請求
2、 RegionServer 負責切分在運行過程中變得過大的 region
 
可以看到, client 訪問 hbase 上數據的過程並不需要 master 參與(尋址訪問 zookeeper 和 RegioneServer,數據讀寫訪問 RegioneServer),
master 僅僅維護者 table 和 region 的元數據 信息,負載很低。
.meta. 存的是所有的 region 的位置信息,那么 RegioneServer 當中 region 在進行分裂之后 的新產生的 region,
是由 master 來決定發到哪個 RegioneServer,這就意味着,只有 master 知道 new region 的位置信息,
所以,由 master 來管理.meta.這個表當中的數據的 CRUD
 
19、hdfs數據壓縮算法
Hadoop中常用的壓縮算法有bzip2、gzip、lzo、snappy,其中lzo、snappy需要操作系統安裝native庫才可以支持
下面這張表,是比較官方一點的統計,不同的場合用不同的壓縮算法。bzip2和GZIP是比較消耗CPU的,
壓縮比最高,GZIP不能被分塊並行的處理;Snappy和LZO差不多,稍微勝出一點,cpu消耗的比GZIP少。
 
20、hive 底層與數據庫交互原理
1)用戶接口主要有三個:CLI,Client 和 WUI。其中最常用的是CLI,Cli啟動的時候,會同時啟動一個Hive副本。Client是Hive的客戶端,
用戶連接至Hive Server。在啟動 Client模式的時候,需要指出Hive Server所在節點,並且在該節點啟動Hive Server。 WUI是通過瀏覽器訪問Hive。
2)Hive將元數據存儲在數據庫中,如mysql、derby。Hive中的元數據包括表的名字,表的列和分區及其屬性,表的屬性(是否為外部表等),表的數據所在目錄等。
3)解釋器、編譯器、優化器完成HQL查詢語句從詞法分析、語法分析、編譯、優化以及查詢計划的生成。生成的查詢計划存儲在HDFS中,並在隨后有MapReduce調用執行。
4)Hive的數據存儲在HDFS中,大部分的查詢、計算由MapReduce完成(包含*的查詢,比如select * from tbl不會生成MapRedcue任務)。
Hive將元數據存儲在RDBMS中,
21、hbase 過濾器實現原則
Hbase為篩選數據提供了一組過濾器,通過這個過濾器可以在hbase中的數據的多個維度(行,列,數據版本)上進行對數據的篩選操作,
也就是說過濾器最終能夠篩選的數據能夠細化到具體的一個存儲單元格上(由行鍵,列明,時間戳定位)。通常來說,通過行鍵,
值來篩選數據的應用場景較多。
 
22、datanode 在什么情況下不會備份
設置副本數只有1個時。
23、combine 出現在那個過程?
Combiner 所做的事情:
每一個map都可能會產生大量的本地輸出,Combiner的作用就是對map端的輸出先做一次合並,以減少在map和reduce節點之間的數據傳輸量;
Combiner 的意義:
在MapReduce中,當map生成的數據過大時,帶寬就成了瓶頸,當在發送給 Reduce 時對數據進行一次本地合並,
減少數據傳輸量以提高網絡IO性能;
Combiner 的時機:
Combiner 最基本的是實現本地key的聚合,有本地 Reduce 之稱
,實際上是現實就繼承來 Reducer ,本質上就是一個 Reducer。
24、hdfs的體系結構。
我們首先介紹HDFS的體系結構,HDFS采用了主從(Master/Slave)結構模型,一個HDFS集群是由一個NameNode和若干個DataNode組成的。
其中NameNode作為主服務器,管理文件系統的命名空間和客戶端對文件的訪問操作;集群中的DataNode管理存儲的數據。
HDFS允許用戶以文件的形式存儲數據。從內部來看,文件被分成若干個數據塊,而且這若干個數據塊存放在一組DataNode上。
NameNode執行文件系統的命名空間操作,比如打開、關閉、重命名文件或目錄等,
它也負責數據塊到具體DataNode的映射。DataNode負責處理文件系統客戶端的文件讀寫請求,
並在NameNode的統一調度下進行數據塊的創建、刪除和復制工作。圖1-3給出了HDFS的體系結構。
NameNode和DataNode都被設計成可以在普通商用計算機上運行。
這些計算機通常運行的是GNU/Linux操作系統。HDFS采用Java語言開發,因此任何支持Java的機器都可以部署NameNode和DataNode。
一個典型的部署場景是集群中的一台機器運行一個NameNode實例,其他機器分別運行一個DataNode實例。
當然,並不排除一台機器運行多個DataNode實例的情況。集群中單一的NameNode的設計則大大簡化了系統的架構。
NameNode是所有HDFS元數據的管理者,用戶數據永遠不會經過NameNode。
25、MapReduce的主要的六個類講解
a、InputFormat類。該類的作用是將輸入的文件和數據分割成許多小的split文件,
並將split的每個行通過LineRecorderReader解析成<Key,Value>,通過job.setInputFromatClass()函數來設置,
默認的情況為類TextInputFormat,其中Key默認為字符偏移量,value是該行的值。
b、Map類。根據輸入的<Key,Value>對生成中間結果,默認的情況下使用Mapper類,
該類將輸入的<Key,Value>對原封不動的作為中間按結果輸出,通過job.setMapperClass()實現。實現Map函數。
c、Combine類。實現combine函數,該類的主要功能是合並相同的key鍵,通過job.setCombinerClass()方法設置,
默認為null,不合並中間結果。實現map函數
d、partitioner類。 該該主要在Shuffle過程中按照Key值將中間結果分成R份,其中每份都有一個Reduce去負責,
可以通過job.setPartitionerClass()方法進行設置,默認的使用hashPartitioner類。實現getPartition函數
e、Reducer類。 將中間結果合並,得到中間結果。通過job.setReduceCalss()方法進行設置,默認使用Reducer類,實現reduce方法。
f、OutPutFormat類,該類負責輸出結果的格式。可以通過job.setOutputFormatClass()方法進行設置。
默認使用TextOUtputFormat類,得到<Key,value>對。
note:hadoop主要是上面的六個類進行mapreduce操作,使用默認的類,處理的數據和文本的能力很有限,
具體的項目中,用戶通過改寫這六個類(重載六個類),完成項目的需求。說實話,我剛開始學的時候,
我懷疑過Mapreudce處理數據功能,隨着學習深入,真的很欽佩mapreduce的設計,基本就二個函數,通過重載,
可以完成所有你想完成的工作。
26、WordCount處理過程
本節將對WordCount進行更詳細的講解。詳細執行步驟如下:
 1)將文件拆分成splits,由於測試用的文件較小,所以每個文件為一個split,並將文件按行分割形成<key,value>對,如圖4-1所示。這一步由MapReduce框架自動完成,其中偏移量(即key值)包括了回車所占的字符數(Windows和Linux環境會不同)。
 
image
圖4-1 分割過程
2)將分割好的<key,value>對交給用戶定義的map方法進行處理,生成新的<key,value>對,如圖4-2所示。
 
image
圖4-2 執行map方法
 3)得到map方法輸出的<key,value>對后,Mapper會將它們按照key值進行排序,並執行Combine過程,將key至相同value值累加,得到Mapper的最終輸出結果。如圖4-3所示。
 
image
圖4-3 Map端排序及Combine過程
 4)Reducer先對從Mapper接收的數據進行排序,再交由用戶自定義的reduce方法進行處理,得到新的<key,value>對,並作為WordCount的輸出結果,如圖4-4所示。
 
image
圖4-4 Reduce端排序及輸出結果


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM