hadoop面試100道收集(帶答案)
1.列出安裝hadoop流程步驟
a) 建立hadoop賬號
b) 更改ip
c) 安裝java 更改/etc/profile 配置環境變數
d) 修改host檔案域名
e) 安裝ssh 配置無密碼登入
f) 解壓hadoop
g) 配置hadoop conf下面的配置檔案
h) Hadoop namenode -format 格式化
i) Start 啟動
2.列出hadoop叢集啟動中的所有程序和程序的作用
a) Namenode 管理叢集 記錄namenode檔案資訊
b) Secondname 可以做備份 對一定範圍內的資料做快照
c) Datanode 儲存資料
d) Jobtarcker 管理任務 分配任務
e) Tasktracker 執行任務
3.啟動報nameNode錯誤 如何解決
a) 檢查hdfs有沒有啟動成功
b) 檢查輸入檔案是不是存在
4.寫出下列執行命令
殺死一個job
Hadoop job -list 取得job id
Hadoop job kill job id
刪除hdfs上的 /temp/aa 目錄
Hadoop -daemon。Sh start datanode
加入一個新的節點或刪除一個節點 重新整理叢集狀態的命令
5.列出你所知道的調肚臍 說明其工作方法
a) Fifo schedular 預設的調肚臍 先進先出
b) Capacity schedular 計算能力調肚臍 選擇佔用記憶體小 優先順序高的
c) Fair schedular 調肚臍 公平調肚臍 所有job 佔用相同資源
6.列出開發map/reduce 元資料儲存
a)
7.用你最熟悉的語言辨析一個map reduce 計算第四個原色的個數
a) Wordcount
8.你認為java streating pipe 開發map reduce 優缺點
a) Java 編寫map reduce可以實現複雜的邏輯 如果需求簡單 則顯得繁瑣
b) Hivesql 基本都是針對hive中表資料進行編寫 對複雜的邏輯很難實現
9.Hive 有哪些儲存元資料的方式 並有哪些特點
a) 記憶體資料庫 derby
b) 本地MySQL 常用
c) 遠端mysql
10.簡述hadoop怎麼樣實現二級快取
11.簡述hadoop實現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.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讀取相應的檔案。
2.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相同。
12.
13.Java 非遞迴 二分查詢
1. public class BinarySearchClass
2. {
3.
4. public static int binary_search(int[] array, int value)
5. {
6. int beginIndex = 0;// 低位下標
7. int endIndex = array.length - 1;// 高位下標
8. int midIndex = -1;
9. while (beginIndex <= endIndex) {
10. midIndex = beginIndex + (endIndex - beginIndex) / 2;//防止溢位
11. if (value == array[midIndex]) {
12. return midIndex;
13. } else if (value < array[midIndex]) {
14. endIndex = midIndex - 1;
15. } else {
16. beginIndex = midIndex + 1;
17. }
18. }
19. return -1;
20. //找到了,返回找到的數值的下標,沒找到,返回-1
21. }
22.
23.
24. //start 提示:自動閱卷起始唯一標識,請勿刪除或增加。
25. public static void main(String[] args)
26. {
27. System.out.println("Start...");
28. int[] myArray = new int[] { 1, 2, 3, 5, 6, 7, 8, 9 };
29. System.out.println("查詢數字8的下標:");
30. System.out.println(binary_search(myArray, 8));
31. }
14.
15.Combiner 和partition的作用
16.combine分為map端和reduce端,作用是把同一個key的鍵值對合並在一起,可以自定義的。
combine函式把一個map函式產生的<key,value>對(多個key,value)合併成一個新的<key2,value2>.將新的<key2,value2>作為輸入到reduce函式中
這個value2亦可稱之為values,因為有多個。這個合併的目的是為了減少網路傳輸。
partition是分割map每個節點的結果,按照key分別對映給不同的reduce,也是可以自定義的。這裡其實可以理解歸類。
我們對於錯綜複雜的資料歸類。比如在動物園裡有牛羊雞鴨鵝,他們都是混在一起的,但是到了晚上他們就各自牛回牛棚,羊回羊圈,雞回雞窩。partition的作用就是把這些資料歸類。只不過在寫程式的時候,mapreduce使用雜湊HashPartitioner幫我們歸類了。這個我們也可以自定義。
shuffle就是map和reduce之間的過程,包含了兩端的combine和partition。
Map的結果,會通過partition分發到Reducer上,Reducer做完Reduce操作後,通過OutputFormat,進行輸出
shuffle階段的主要函式是fetchOutputs(),這個函式的功能就是將map階段的輸出,copy到reduce 節點本地
17.倆個檔案用linux命令完成下列工作
a) 倆個檔案各自的ip數 和綜述
b) 出現在b檔案 沒有出現在a檔案的ip
c) 那個name的次數 和他對一個的ip
1.hive內部表和外部表區別
2.1、在匯入資料到外部表,資料並沒有移動到自己的資料倉庫目錄下,也就是說外部表中的資料並不是由它自己來管理的!而表則不一樣;
2、在刪除表的時候,Hive將會把屬於表的元資料和資料全部刪掉;而刪除外部表的時候,Hive僅僅刪除外部表的元資料,資料是不會刪除的!
那麼,應該如何選擇使用哪種表呢?在大多數情況沒有太多的區別,因此選擇只是個人喜好的問題。但是作為一個經驗,如果所有處理都需要由Hive完成,那麼你應該建立表,否則使用外部表!
3.Hbase rowkey怎麼建立表交好 列祖怎麼建立比較好
HBase是一個分散式的、面向列的資料庫,它和一般關係型資料庫的最大區別是:HBase很適合於儲存非結構化的資料,還有就是它基於列的而不是基於行的模式。
既然HBase是採用KeyValue的列儲存,那Rowkey就是KeyValue的Key了,表示唯一一行。Rowkey也是一段二進位制碼流,最大長度為64KB,內容可以由使用的使用者自定義。資料載入時,一般也是根據Rowkey的二進位制序由小到大進行的。
HBase是根據Rowkey來進行檢索的,系統通過找到某個Rowkey (或者某個 Rowkey 範圍)所在的Region,然後將查詢資料的請求路由到該Region獲取資料。HBase的檢索支援3種方式:
(1) 通過單個Rowkey訪問,即按照某個Rowkey鍵值進行get操作,這樣獲取唯一一條記錄;
(2) 通過Rowkey的range進行scan,即通過設定startRowKey和endRowKey,在這個範圍內進行掃描。這樣可以按指定的條件獲取一批記錄;
(3) 全表掃描,即直接掃描整張表中所有行記錄。
HBASE按單個Rowkey檢索的效率是很高的,耗時在1毫秒以下,每秒鐘可獲取1000~2000條記錄,不過非key列的查詢很慢。
2 HBase的RowKey設計
2.1 設計原則
2.1.1 Rowkey長度原則
Rowkey是一個二進位制碼流,Rowkey的長度被很多開發者建議說設計在10~100個位元組,不過建議是越短越好,不要超過16個位元組。
原因如下:
(1)資料的持久化檔案HFile中是按照KeyValue儲存的,如果Rowkey過長比如100個位元組,1000萬列資料光Rowkey就要佔用100*1000萬=10億個位元組,將近1G資料,這會極大影響HFile的儲存效率;
(2)MemStore將快取部分資料到記憶體,如果Rowkey欄位過長記憶體的有效利用率會降低,系統將無法快取更多的資料,這會降低檢索效率。因此Rowkey的位元組長度越短越好。
(3)目前作業系統是都是64位系統,記憶體8位元組對齊。控制在16個位元組,8位元組的整數倍利用作業系統的最佳特性。
2.1.2 Rowkey雜湊原則
如果Rowkey是按時間戳的方式遞增,不要將時間放在二進位制碼的前面,建議將Rowkey的高位作為雜湊欄位,由程式迴圈生成,低位放時間欄位,這樣將提高資料均衡分佈在每個Regionserver實現負載均衡的機率。如果沒有雜湊欄位,首欄位直接是時間資訊將產生所有新資料都在一個 RegionServer上堆積的熱點現象,這樣在做資料檢索的時候負載將會集中在個別RegionServer,降低查詢效率。
2.1.3 Rowkey唯一原則
必須在設計上保證其唯一性。
2.2 應用場景
基於Rowkey的上述3個原則,應對不同應用場景有不同的Rowkey設計建議。
2.2.1 針對事務資料Rowkey設計
事務資料是帶時間屬性的,建議將時間資訊存入到Rowkey中,這有助於提示查詢檢索速度。對於事務資料建議預設就按天為資料建表,這樣設計的好處是多方面的。按天分表後,時間資訊就可以去掉日期部分只保留小時分鐘毫秒,這樣4個位元組即可搞定。加上雜湊欄位2個位元組一共6個位元組即可組成唯一 Rowkey。如下圖所示:
事務資料Rowkey設計 |
||||||
第0位元組 |
第1位元組 |
第2位元組 |
第3位元組 |
第4位元組 |
第5位元組 |
… |
雜湊欄位 |
時間欄位(毫秒) |
擴充套件欄位 |
||||
0~65535(0x0000~0xFFFF) |
0~86399999(0x00000000~0x05265BFF) |
這樣的設計從作業系統記憶體管理層面無法節省開銷,因為64位作業系統是必須8位元組對齊。但是對於持久化儲存中Rowkey部分可以節省25%的開銷。也許有人要問為什麼不將時間欄位以主機位元組序儲存,這樣它也可以作為雜湊欄位了。這是因為時間範圍內的資料還是儘量保證連續,相同時間範圍內的資料查詢的概率很大,對查詢檢索有好的效果,因此使用獨立的雜湊欄位效果更好,對於某些應用,我們可以考慮利用雜湊欄位全部或者部分來儲存某些資料的欄位資訊,只要保證相同雜湊值在同一時間(毫秒)唯一。
2.2.2 針對統計資料的Rowkey設計
統計資料也是帶時間屬性的,統計資料最小單位只會到分鐘(到秒預統計就沒意義了)。同時對於統計資料我們也預設採用按天資料分表,這樣設計的好處無需多說。按天分表後,時間資訊只需要保留小時分鐘,那麼0~1400只需佔用兩個位元組即可儲存時間資訊。由於統計資料某些維度數量非常龐大,因此需要4個位元組作為序列欄位,因此將雜湊欄位同時作為序列欄位使用也是6個位元組組成唯一Rowkey。如下圖所示:
統計資料Rowkey設計 |
||||||
第0位元組 |
第1位元組 |
第2位元組 |
第3位元組 |
第4位元組 |
第5位元組 |
… |
雜湊欄位(序列欄位) |
時間欄位(分鐘) |
擴充套件欄位 |
||||
0x00000000~0xFFFFFFFF) |
0~1439(0x0000~0x059F) |
同樣這樣的設計從作業系統記憶體管理層面無法節省開銷,因為64位作業系統是必須8位元組對齊。但是對於持久化儲存中Rowkey部分可以節省25%的開銷。預統計資料可能涉及到多次反覆的重計算要求,需確保作廢的資料能有效刪除,同時不能影響雜湊的均衡效果,因此要特殊處理。
2.2.3 針對通用資料的Rowkey設計
通用資料採用自增序列作為唯一主鍵,使用者可以選擇按天建分表也可以選擇單表模式。這種模式需要確保同時多個入庫載入模組執行時雜湊欄位(序列欄位)的唯一性。可以考慮給不同的載入模組賦予唯一因子區別。設計結構如下圖所示。
通用資料Rowkey設計 |
||||
第0位元組 |
第1位元組 |
第2位元組 |
第3位元組 |
… |
雜湊欄位(序列欄位) |
擴充套件欄位(控制在12位元組內) |
|||
0x00000000~0xFFFFFFFF) |
可由多個使用者欄位組成 |
2.2.4 支援多條件查詢的RowKey設計
HBase按指定的條件獲取一批記錄時,使用的就是scan方法。 scan方法有以下特點:
(1)scan可以通過setCaching與setBatch方法提高速度(以空間換時間);
(2)scan可以通過setStartRow與setEndRow來限定範圍。範圍越小,效能越高。
通過巧妙的RowKey設計使我們批量獲取記錄集合中的元素挨在一起(應該在同一個Region下),可以在遍歷結果時獲得很好的效能。
(3)scan可以通過setFilter方法新增過濾器,這也是分頁、多條件查詢的基礎。
在滿足長度、三列、唯一原則後,我們需要考慮如何通過巧妙設計RowKey以利用scan方法的範圍功能,使得獲取一批記錄的查詢速度能提高。下例就描述如何將多個列組合成一個RowKey,使用scan的range來達到較快查詢速度。
例子:
我們在表中儲存的是檔案資訊,每個檔案有5個屬性:檔案id(long,全域性唯一)、建立時間(long)、檔名(String)、分類名(String)、所有者(User)。
我們可以輸入的查詢條件:檔案建立時間區間(比如從20120901到20120914期間建立的檔案),檔名(“中國好聲音”),分類(“綜藝”),所有者(“浙江衛視”)。
假設當前我們一共有如下檔案:
ID |
CreateTime |
Name |
Category |
UserID |
1 |
20120902 |
中國好聲音第1期 |
綜藝 |
1 |
2 |
20120904 |
中國好聲音第2期 |
綜藝 |
1 |
3 |
20120906 |
中國好聲音外卡賽 |
綜藝 |
1 |
4 |
20120908 |
中國好聲音第3期 |
綜藝 |
1 |
5 |
20120910 |
中國好聲音第4期 |
綜藝 |
1 |
6 |
20120912 |
中國好聲音選手採訪 |
綜藝花絮 |
2 |
7 |
20120914 |
中國好聲音第5期 |
綜藝 |
1 |
8 |
20120916 |
中國好聲音錄製花絮 |
綜藝花絮 |
2 |
9 |
20120918 |
張瑋獨家專訪 |
花絮 |
3 |
10 |
20120920 |
加多寶涼茶廣告 |
綜藝廣告 |
4 |
這裡UserID應該對應另一張User表,暫不列出。我們只需知道UserID的含義:
1代表 浙江衛視; 2代表 好聲音劇組; 3代表 XX微博; 4代表贊助商。呼叫查詢介面的時候將上述5個條件同時輸入find(20120901,20121001,”中國好聲音”,”綜藝”,”浙江衛視”)。此時我們應該得到記錄應該有第1、2、3、4、5、7條。第6條由於不屬於“浙江衛視”應該不被選中。我們在設計RowKey時可以這樣做:採用 UserID + CreateTime + FileID組成RowKey,這樣既能滿足多條件查詢,又能有很快的查詢速度。
需要注意以下幾點:
(1)每條記錄的RowKey,每個欄位都需要填充到相同長度。假如預期我們最多有10萬量級的使用者,則userID應該統一填充至6位,如000001,000002…
(2)結尾新增全域性唯一的FileID的用意也是使每個檔案對應的記錄全域性唯一。避免當UserID與CreateTime相同時的兩個不同檔案記錄相互覆蓋。
按照這種RowKey儲存上述檔案記錄,在HBase表中是下面的結構:
rowKey(userID 6 + time 8 + fileID 6) name category ….
00000120120902000001
00000120120904000002
00000120120906000003
00000120120908000004
00000120120910000005
00000120120914000007
00000220120912000006
00000220120916000008
00000320120918000009
00000420120920000010
怎樣用這張表?
在建立一個scan物件後,我們setStartRow(00000120120901),setEndRow(00000120120914)。
這樣,scan時只掃描userID=1的資料,且時間範圍限定在這個指定的時間段內,滿足了按使用者以及按時間範圍對結果的篩選。並且由於記錄集中儲存,效能很好。
然後使用 SingleColumnValueFilter(org.apache.hadoop.hbase.filter.SingleColumnValueFilter),共4個,分別約束name的上下限,與category的上下限。滿足按同時按檔名以及分類名的字首匹配。
4.
5.Mapreduce怎麼處理資料傾斜
6.map /reduce程式執行時,reduce節點大部分執行完畢,但是有一個或者幾個reduce節點執行很慢,導致整個程式的處理時間很長,這是因為某一個key的條數比其他key多很多(有時是百倍或者千倍之多),這條key所在的reduce節點所處理的資料量比其他節點就大很多,從而導致某幾個節點遲遲執行不完,此稱之為資料傾斜。
用hadoop程式進行資料關聯時,常碰到資料傾斜的情況,這裡提供一種解決方法。
(1)設定一個hash份數N,用來對條數眾多的key進行打散。
(2)對有多條重複key的那份資料進行處理:從1到N將數字加在key後面作為新key,如果需要和另一份資料關聯的話,則要重寫比較類和分發類(方法如上篇《hadoop job解決大資料量關聯的一種方法》)。如此實現多條key的平均分發。
int iNum = iNum % iHashNum;
String strKey = key + CTRLC + String.valueOf(iNum) + CTRLB + “B”;
(3)上一步之後,key被平均分散到很多不同的reduce節點。如果需要和其他資料關聯,為了保證每個reduce節點上都有關聯的key,對另一份單一key的資料進行處理:迴圈的從1到N將數字加在key後面作為新key
for(int i = 0; i < iHashNum; ++i){
String strKey =key + CTRLC + String.valueOf(i) ;
output.collect(new Text(strKey), new Text(strValues));}
以此解決資料傾斜的問題,經試驗大大減少了程式的執行時間。但此方法會成倍的增加其中一份資料的資料量,以增加shuffle資料量為代價,所以使用此方法時,要多次試驗,取一個最佳的hash份數值。
======================================
用上述的方法雖然可以解決資料傾斜,但是當關聯的資料量巨大時,如果成倍的增長某份資料,會導致reduce shuffle的資料量變的巨大,得不償失,從而無法解決執行時間慢的問題。
有一個新的辦法可以解決 成倍增長資料 的缺陷:
在兩份資料中找共同點,比如兩份資料裡除了關聯的欄位以外,還有另外相同含義的欄位,如果這個欄位在所有log中的重複率比較小,則可以用這個欄位作為計算hash的值,如果是數字,可以用來模hash的份數,如果是字元可以用hashcode來模hash的份數(當然數字為了避免落到同一個reduce上的資料過多,也可以用hashcode),這樣如果這個欄位的值分佈足夠平均的話,就可以解決上述的問題。-
7.Hadoop框架中怎麼優化
Storm用於處理高速、大型資料流的分散式實時計算系統。為Hadoop添加了可靠的實時資料處理功能
Spark採用了記憶體計算。從多迭代批處理出發,允許將資料載入記憶體作反覆查詢,此外還融合資料倉庫,流處理和圖形計算等多種計算正規化。Spark構建在HDFS上,能與Hadoop很好的結合。它的RDD是一個很大的特點。
Hadoop當前大資料管理標準之一,運用在當前很多商業應用系統。可以輕鬆地整合結構化、半結構化甚至非結構化資料集。
8.
9.Hbase內部是什麼機制
在HBase 中無論是增加新行還是修改已有的行,其內部流程都是相同的。HBase 接到命令後存下變化資訊,或者寫入失敗丟擲異常。預設情況下,執行寫入時會寫到兩個地方:預寫式日誌(write-ahead log,也稱HLog)和MemStore(見圖2-1)。HBase 的預設方式是把寫入動作記錄在這兩個地方,以保證資料持久化。只有當這兩個地方的變化資訊都寫入並確認後,才認為寫動作完成。
MemStore 是記憶體裡的寫入緩衝區,HBase 中資料在永久寫入硬碟之前在這裡累積。當MemStore 填滿後,其中的資料會刷寫到硬碟,生成一個HFile。HFile 是HBase 使用的底層儲存格式。HFile 對應於列族,一個列族可以有多個HFile,但一個HFile 不能儲存多個列族的資料。在叢集的每個節點上,每個列族有一個MemStore。
大型分散式系統中硬體故障很常見,HBase 也不例外。設想一下,如果MemStore還沒有刷寫,伺服器就崩潰了,記憶體中沒有寫入硬碟的資料就會丟失。HBase 的應對辦法是在寫動作完成之前先寫入WAL。HBase 叢集中每臺伺服器維護一個WAL 來記錄發生的變化。WAL 是底層檔案系統上的一個檔案。直到WAL 新記錄成功寫入後,寫動作才被認為成功完成。這可以保證HBase 和支撐它的檔案系統滿足永續性。大多數情況下,HBase 使用Hadoop 分散式檔案系統(HDFS)來作為底層檔案系統。
如果HBase 伺服器宕機,沒有從MemStore 裡刷寫到HFile 的資料將可以通過回放WAL 來恢復。你不需要手工執行。Hbase 的內部機制中有恢復流程部分來處理。每臺HBase 伺服器有一個WAL,這臺伺服器上的所有表(和它們的列族)共享這個WAL。
你可能想到,寫入時跳過WAL 應該會提升寫效能。但我們不建議禁用WAL,除非你願意在出問題時丟失資料。如果你想測試一下,如下程式碼可以禁用WAL:
注意:不寫入WAL 會在RegionServer 故障時增加丟失資料的風險。關閉WAL,出現故障時HBase 可能無法恢復資料,沒有刷寫到硬碟的所有寫入資料都會丟失。
10.
11.我們在開發分散式計算jiob的是不是可以去掉reduce
由於MapReduce計算輸入和輸出都是基於HDFS檔案,所以大多數公司的做法是把mysql或sqlserver的資料匯入到HDFS,計算完後再匯出到常規的資料庫中,這是MapReduce不夠靈活的地方之一。 MapReduce優勢在於提供了比較簡單的分散式計算程式設計模型,使開發此類程式變得非常簡單,像之前的MPI程式設計就相當複雜。
狹隘的來講,MapReduce是把計算任務給規範化了,它可以等同於小和尚中Worker的業務邏輯部分。 MapReduce把業務邏輯給拆分成2個大部分,Map和Reduce,可以先在Map部分把任務計算一半後,扔給Reduce部分繼續後面的計算。 當然在Map部分把計算任務全做完也是可以的。 關於Mapreduce實現細節部分不多解釋,有興趣的同學可以查相關資料或看下樓主之前的C#模擬實現的部落格【探索C#之微型MapReduce】。
如果把小明產品經理的需求放到Hadoop來做,其處理流程大致如下:
1. 把100G資料匯入到HDFS
2. 按照Mapreduce的介面編寫處理邏輯,分Map、Reduce兩部分。
3. 把程式包提交到Mapreduce平臺上,儲存在HDFS裡。
4. 平臺中有個叫Jobtracker程序的角色進行分發任務。 這個類似小和尚的Master負載排程管理。
5. 如果有5臺機器進行計算的話,就會提前執行5個叫TaskTracker的slave程序。 這類似小和尚worker的分離版,平臺把程式和業務邏輯進行分離了, 簡單來說就是在機器上執行個獨立程序,它能動態載入、執行jar或dll的業務邏輯程式碼。
6. Jobtracker把任務分發到TaskTracker後,TaskTracker把開始動態載入jar包,建立個獨立程序執行Map部分,然後把結果寫入到HDFS上。
7. 如果有Reduce部分,TaskTracker會建立個獨立程序把Map輸出的HDFS檔案,通過RPC方式遠端拉取到本地,拉取成功後,Reduce開始計算後續任務。
8. Reduce再把結果寫入到HDFS中
9. 從HDFS中把結果匯出。
這樣一看好像是把簡單的計算任務給
12.
13.Hdfs資料壓縮演算法
14.1、在HDFS之上將資料壓縮好後,再儲存到HDFS
2、在HDFS內部支援資料壓縮,這裡又可以分為幾種方法:
2.1、壓縮工作在DataNode上完成,這裡又分兩種方法:
2.1.1、資料接收完後,再壓縮
這個方法對HDFS的改動最小,但效果最低,只需要在block檔案close後,呼叫壓縮工具,將block檔案壓縮一下,然後再開啟block檔案時解壓一下即可,幾行程式碼就可以搞定
2.1.2、邊接收資料邊壓縮,使用第三方提供的壓縮庫
效率和複雜度折中方法,Hook住系統的write和read操作,在資料寫入磁碟之前,先壓縮一下,但write和read對外的介面行為不變,比如:原始大小為100KB的資料,壓縮後大小為10KB,當寫入100KB後,仍對呼叫者返回100KB,而不是10KB
2.2、壓縮工作交給DFSClient做,DataNode只接收和儲存
這個方法效果最高,壓縮分散地推給了HDFS客戶端,但DataNode需要知道什麼時候一個block塊接收完成了。
推薦最終實現採用2.2這個方法,該方法需要修改的HDFS程式碼量也不大,但效果最高。
15.Mapreduce排程模式
MapReduce是hadoop提供一個可進行分散式計算的框架或者平臺,顯然這個平臺是多使用者的,每個合法的使用者可以向這個平臺提交作業,那麼這就帶來一個問題,就是作業排程。
任何排程策略都考慮自己平臺排程需要權衡的幾個維度,例如作業系統中的程序排程,他需要考慮的維度就是資源(CPU)的最大利用率(吞吐)和實時性,作業系統對實時性的要求很高,所以作業系統往往採用基於優先順序的、可搶佔式的排程策略,並且賦予IO密集型(相對於計算密集型)的程序較高的優先順序,扯的有點遠。
回到hadoop平臺,其實MapReduce的作業排程並沒有很高的實時性的要求,本著最大吞吐的原則去設計的,所以MapReduce預設採用的排程策略是FIFO(基於優先順序佇列實現的FIFO,不是純粹的FIFO,這樣每次h),這種策略顯然不是可搶佔式的排程,所以帶來的問題就是高優先順序的任務會被先前已經在執行並且還要執行很久的低優先順序的作業給堵塞住。
16.
17.Hive底層和資料庫互動原理
Hive和Hbase有各自不同的特徵:hive是高延遲、結構化和麵向分析的,hbase是低延遲、非結構化和麵向程式設計的。Hive資料倉庫在hadoop上是高延遲的。Hive整合Hbase就是為了使用hbase的一些特性。如下是hive和hbase的整合架構:
圖1 hive和hbase架構圖
Hive整合HBase可以有效利用HBase資料庫的儲存特性,如行更新和列索引等。在整合的過程中注意維持HBase jar包的一致性。Hive整合HBase需要在Hive表和HBase表之間建立對映關係,也就是Hive表的列(columns)和列型別(column types)與HBase表的列族(column families)及列限定詞(column qualifiers)建立關聯。每一個在Hive表中的域都存在於HBase中,而在Hive表中不需要包含所有HBase中的列。HBase中的RowKey對應到Hive中為選擇一個域使用:key來對應,列族(cf:)對映到Hive中的其它所有域,列為(cf:cq)。例如下圖2為Hive表對映到HBase表:
圖2 Hive表對映HBase表
18.
19.Hbase過濾器實現原則
到現在為止你瞭解到HBase擁有靈活的邏輯模式和簡單的物理模型,它們允許應用系統的計算工作更接近硬碟和網路,並
在這個層次進行優化。設計有效的模式是使用HBase的一個方面,你已經掌握了一堆概念用來做到這點。你可以設計行鍵
以使訪問的資料在硬碟上也存放在一起,所以讀寫操作時可以節省硬碟尋道時間。在讀取資料時,你經常需要基於某種標
準進行操作,你可以進一步優化資料訪問。過濾器就是在這種情況下使用的一種強大的功能。
我們還沒有談到使用過濾器的真實使用場景;一般來說調整表設計就可以優化訪問模式。但是有時你已經把表設計調整得
儘可能好了,為不同訪問模式優化得儘可能好了。當你仍然需要減少返回客戶端的資料時,這就是考慮使用過濾器的時候
了。有時侯過濾器也被稱為下推判斷器(push-down predicates),支援你把資料過濾標準從客戶端下推到伺服器(如圖
4.16)。這些過濾邏輯在讀操作時使用,對返回客戶端的資料有影響。這樣通過減少網路傳輸的資料來節省網路IO。但是
資料仍然需要從硬碟讀進RegionServer,過濾器在RegionServer裡發揮作用。因為你有可能在HBase表裡儲存大量資料,
網路IO的節省是有重要意義的,並且先讀出全部資料送到客戶端再過濾出有用的資料,這種做法開銷很大。
圖 4.16 在客戶端完成資料過濾:從RegionServer把資料讀取到客戶端,在客戶端使用過濾器邏輯處理資料;或者在服務
器端完成資料過濾:把過濾邏輯下推到RegionServer,因此減少了在網路上傳輸到客戶端的資料量。實質上過濾器節省了
網路IO的開銷,有時甚至是硬碟IO的開銷。
HBase提供了一個API,你可以用來實現定製過濾器。多個過濾器也可以捆綁在一起使用。可以在讀過程最開始的地方,基
於行健進行過濾處理。此後,也可以基於HFile讀出的KeyValues進行過濾處理。過濾器必須實現HBase Jar包中的Filter
介面,或者繼承擴充套件一個實現了該介面的抽象類。我們推薦繼承擴充套件FilterBase抽象類,這樣你不需要寫樣板程式碼。繼承
擴充套件其他諸如CompareFilter類也是一個選擇,同樣可以正常工作。當讀取一行時該介面有下面的方法在多個地方可以調
用(順序如圖4.17)。它們總是按照下面描述的順序來執行:
1 這個方法第一個被呼叫,基於行健執行過濾:
boolean filterRowKey(byte[] buffer, int offset, int length)
基於這裡的邏輯,如果行被過濾掉了(不出現在傳送結果集合裡)返回true,否則如果傳送給客戶端則返回false。
2 如果該行沒有在上一步被過濾掉,接著呼叫這個方法處理當前行的每個KeyValue物件:
ReturnCode filterKeyValue(KeyValue v)
這個方法返回一個ReturnCode,這是在Filter介面中定義的一個列舉(enum)型別。返回的ReturnCode判斷某個KeyValue
物件發生了什麼。
3 在第2步過濾KeyValues物件後,接著是這個方法:
void filterRow(List kvs)
這個方法被傳入成功通過過濾的KeyValue物件列表。倘若這個方法訪問到這個列表,此時你可以在列表裡的元素上執行任
何轉換或運算。
4 如果你選擇過濾掉某些行,此時這個方法再一次提供了這麼做的機會:
boolean filterRow()
過濾掉考慮中的行,則返回true。
5 你可以在過濾器裡構建邏輯來提早停止一次掃描。你可以把該邏輯放進這個方法:
boolean filterAllRemaining()
當你掃描很多行,在行健、列識別符號或單元值裡查詢指定東西時,一旦找到目標,你就不再關心剩下的行了。此時這個方
法用起來很方便。這是過濾流程中最後呼叫的方法。
圖 4.17 過濾流程的各個步驟。掃描器物件掃描範圍裡的每行都會執行這個流程。
另一個有用的方法是reset()。它會重置過濾器,在被應用到整行後由伺服器呼叫。
注意 這個API很強大,但是我們不覺得它是在應用系統裡大量使用的。許多情況下,如果模式設計改變了,使用過濾器的
20.
21.Reduce後輸出的量有多大
22.找到離存資料最近的一臺機器執行和這個資料相關的map任務,reduce是按照你整理出的key有多少個來決定的。一個機器很難說,處理的快的處理多一點,保持所有機器使用平衡。
上面你都自己寫了20個map,和檔案大小個數有關,和資料條數無關。
要看你選擇的輸入格式是什麼,預設是行偏移量,然後由你編寫map函式,指定key和value是什麼。相同的key整合起來傳給reduce,由reduce進行下一步處理,最後輸出到指定的地方。
23.Mapreduce掌握情況 和 hive hsql掌握情況
Hive 是基於Hadoop 構建的一套資料倉庫分析系統,它提供了豐富的SQL查詢方式來分析儲存在Hadoop 分散式檔案系統中的資料,可以將結構
化的資料檔案對映為一張資料庫表,並提供完整的SQL查詢功能,可以將SQL語句轉換為MapReduce任務進行執行,通過自己的SQL 去查詢分析需
要的內容,這套SQL 簡稱Hive SQL,使不熟悉mapreduce 的使用者很方便的利用SQL 語言查詢,彙總,分析資料。而mapreduce開發人員可以把
己寫的mapper 和reducer 作為外掛來支援Hive 做更復雜的資料分析。
它與關係型資料庫的SQL 略有不同,但支援了絕大多數的語句如DDL、DML 以及常見的聚合函式、連線查詢、條件查詢。HIVE不適合用於聯機
online)事務處理,也不提供實時查詢功能。它最適合應用在基於大量不可變資料的批處理作業。
HIVE的特點:可伸縮(在Hadoop的叢集上動態的新增裝置),可擴充套件,容錯,輸入格式的鬆散耦合。
Hive 的官方文件中對查詢語言有了很詳細的描述,請參考:http://wiki.apache.org/hadoop/Hive/LanguageManual ,本文的內容大部分翻譯自該頁面,期間加入了一些在使用過程中需要注意到的事項。
1. DDL 操作
DDL
•建表
•刪除表
•修改表結構
•建立/刪除檢視
•建立資料庫
•顯示命令
建表:
CREATE [EXTERNAL] TABLE [IF NOT EXISTS] table_name
[(col_name data_type [COMMENT col_comment], ...)]
[COMMENT table_comment]
[PARTITIONED BY (col_name data_type [COMMENT col_comment], ...)]
[CLUSTERED BY (col_name, col_name, ...)
[SORTED BY (col_name [ASC|DESC], ...)] INTO num_buckets BUCKETS]
[ROW FORMAT row_format]
[STORED AS file_format]
[LOCATION hdfs_path]
•CREATE TABLE 建立一個指定名字的表。如果相同名字的表已經存在,則丟擲異常;使用者可以用 IF NOT EXIST 選項來忽略這個異常
•EXTERNAL 關鍵字可以讓使用者建立一個外部表,在建表的同時指定一個指向實際資料的路徑(LOCATION)
•LIKE 允許使用者複製現有的表結構,但是不復制資料
•COMMENT可以為表與欄位增加描述
•ROW FORMAT
DELIMITED [FIELDS TERMINATED BY char] [COLLECTION ITEMS TERMINATED BY char]
[MAP KEYS TERMINATED BY char] [LINES TERMINATED BY char]
| SERDE serde_name [WITH SERDEPROPERTIES (property_name=property_value, property_name=property_value, ...)]
使用者在建表的時候可以自定義 SerDe 或者使用自帶的 SerDe。如果沒有指定 ROW FORMAT 或者 ROW FORMAT DELIMITED,將會使用自帶的 SerDe。在建表的時候,使用者還需要為表指定列,使用者在指定表的列的同時也會指定自定義的 SerDe,Hive 通過 SerDe 確定表的具體的列的資料。
•STORED AS
SEQUENCEFILE
| TEXTFILE
| RCFILE
| INPUTFORMAT input_format_classname OUTPUTFORMAT output_format_classname
如果檔案資料是純文字,可以使用 STORED AS TEXTFILE。如果資料需要壓縮,使用 STORED AS SEQUENCE 。
建立簡單表:
hive> CREATE TABLE pokes (foo INT, bar STRING);
建立外部表:
CREATE EXTERNAL TABLE page_view(viewTime INT, userid BIGINT,
page_url STRING, referrer_url STRING,
ip STRING COMMENT 'IP Address of the User',
country STRING COMMENT 'country of origination')
COMMENT 'This is the staging page view table'
ROW FORMAT DELIMITED FIELDS TERMINATED BY '\054'
STORED AS TEXTFILE
LOCATION '<hdfs_location>';
建分割槽表
CREATE TABLE par_table(viewTime INT, userid BIGINT,
page_url STRING, referrer_url STRING,
ip STRING COMMENT 'IP Address of the User')
COMMENT 'This is the page view table'
PARTITIONED BY(date STRING, pos STRING)
ROW FORMAT DELIMITED ‘\t’
FIELDS TERMINATED BY '\n'
STORED AS SEQUENCEFILE;
建Bucket表
CREATE TABLE par_table(viewTime INT, userid BIGINT,
page_url STRING, referrer_url STRING,
ip STRING COMMENT 'IP Address of the User')
COMMENT 'This is the page view table'
PARTITIONED BY(date STRING, pos STRING)
CLUSTERED BY(userid) SORTED BY(viewTime) INTO 32 BUCKETS
ROW FORMAT DELIMITED ‘\t’
FIELDS TERMINATED BY '\n'
STORED AS SEQUENCEFILE;
建立表並建立索引欄位ds
hive> CREATE TABLE invites (foo INT, bar STRING) PARTITIONED BY (ds STRING);
複製一個空表
CREATE TABLE empty_key_value_store
LIKE key_value_store;
例子
create table user_info (user_id int, cid string, ckid string, username string)
row format delimited
fields terminated by '\t'
lines terminated by '\n';
匯入資料表的資料格式是:欄位之間是tab鍵分割,行之間是斷行。
及要我們的檔案內容格式:
100636 100890 c5c86f4cddc15eb7 yyyvybtvt