1.列出安裝Hadoop流程步驟html
a) 建立hadoop帳號java
b) 更改ipnode
c) 安裝Java 更改/etc/profile 配置環境變量python
d) 修改host文件域名mysql
e) 安裝ssh 配置無密碼登陸linux
f) 解壓hadoopios
g) 配置hadoop conf下面的配置文件web
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.一、在導入數據到外部表,數據並無移動到本身的數據倉庫目錄下,也就是說外部表中的數據並非由它本身來管理的!而表則不同;
二、在刪除表的時候,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列的查詢很慢。
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字節的整數倍利用操做系統的最佳特性。
若是Rowkey是按時間戳的方式遞增,不要將時間放在二進制碼的前面,建議將Rowkey的高位做爲散列字段,由程序循環生成,低位放時間字段,這樣將提升數據均衡分佈在每一個Regionserver實現負載均衡的概率。若是沒有散列字段,首字段直接是時間信息將產生全部新數據都在一個 RegionServer上堆積的熱點現象,這樣在作數據檢索的時候負載將會集中在個別RegionServer,下降查詢效率。
必須在設計上保證其惟一性。
基於Rowkey的上述3個原則,應對不一樣應用場景有不一樣的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%的開銷。也許有人要問爲何不將時間字段以主機字節序保存,這樣它也能夠做爲散列字段了。這是由於時間範圍內的數據仍是儘可能保證連續,相同時間範圍內的數據查找的機率很大,對查詢檢索有好的效果,所以使用獨立的散列字段效果更好,對於某些應用,咱們能夠考慮利用散列字段所有或者部分來存儲某些數據的字段信息,只要保證相同散列值在同一時間(毫秒)惟一。
統計數據也是帶時間屬性的,統計數據最小單位只會到分鐘(到秒預統計就沒意義了)。同時對於統計數據咱們也缺省採用按天數據分表,這樣設計的好處無需多說。按天分表後,時間信息只須要保留小時分鐘,那麼0~1400只需佔用兩個字節便可保存時間信息。因爲統計數據某些維度數量很是龐大,所以須要4個字節做爲序列字段,所以將散列字段同時做爲序列字段使用也是6個字節組成惟一Rowkey。以下圖所示:
統計數據Rowkey設計 |
||||||
第0字節 |
第1字節 |
第2字節 |
第3字節 |
第4字節 |
第5字節 |
… |
散列字段(序列字段) |
時間字段(分鐘) |
擴展字段 |
||||
0x00000000~0xFFFFFFFF) |
0~1439(0x0000~0x059F) |
|
一樣這樣的設計從操做系統內存管理層面沒法節省開銷,由於64位操做系統是必須8字節對齊。可是對於持久化存儲中Rowkey部分能夠節省25%的開銷。預統計數據可能涉及到屢次反覆的重計算要求,需確保做廢的數據能有效刪除,同時不能影響散列的均衡效果,所以要特殊處理。
通用數據採用自增序列做爲惟一主鍵,用戶能夠選擇按天建分表也能夠選擇單表模式。這種模式須要確保同時多個入庫加載模塊運行時散列字段(序列字段)的惟一性。能夠考慮給不一樣的加載模塊賦予惟一因子區別。設計結構以下圖所示。
通用數據Rowkey設計 |
||||
第0字節 |
第1字節 |
第2字節 |
第3字節 |
… |
散列字段(序列字段) |
擴展字段(控制在12字節內) |
|||
0x00000000~0xFFFFFFFF) |
可由多個用戶字段組成 |
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,」中國好聲音」,」綜藝」,」浙江衛視」)。此時咱們應該獲得記錄應該有第一、二、三、四、五、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.一、在HDFS之上將數據壓縮好後,再存儲到HDFS
二、在HDFS內部支持數據壓縮,這裏又能夠分爲幾種方法:
2.一、壓縮工做在DataNode上完成,這裏又分兩種方法:
2.1.一、數據接收完後,再壓縮
這個方法對HDFS的改動最小,但效果最低,只須要在block文件close後,調用壓縮工具,將block文件壓縮一下,而後再打開block文件時解壓一下便可,幾行代碼就能夠搞定
2.1.二、邊接收數據邊壓縮,使用第三方提供的壓縮庫
效率和複雜度折中方法,Hook住系統的write和read操做,在數據寫入磁盤以前,先壓縮一下,但write和read對外的接口行爲不變,好比:原始大小爲100KB的數據,壓縮後大小爲10KB,當寫入100KB後,仍對調用者返回100KB,而不是10KB
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 ,本文的內容大部分翻譯自該頁面,期間加入了一些在使用過程當中須要注意到的事項。
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;
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;
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
100612 100865 97cc70d411c18b6f gyvcycy
100078 100087 ecd6026a15ffddf5 qa000100
hive> SHOW TABLES;
hive> SHOW TABLES '.*s';
•增長分區、刪除分區
•重命名錶
•修改列的名字、類型、位置、註釋
•增長/更新列
•增長表的元數據信息
hive> ALTER TABLE pokes ADD COLUMNS (new_col INT);
hive> ALTER TABLE invites ADD COLUMNS (new_col2 INT COMMENT 'a comment');
hive> ALTER TABLE events RENAME TO 3koobecaf;
hive> DROP TABLE pokes;
•增長
ALTER TABLE table_name ADD [IF NOT EXISTS] partition_spec [ LOCATION 'location1' ] partition_spec [ LOCATION 'location2' ] ...
partition_spec:
: PARTITION (partition_col = partition_col_value, partition_col = partiton_col_value, ...)
•刪除
ALTER TABLE table_name DROP partition_spec, partition_spec,...
•ALTER TABLE table_name RENAME TO new_table_name
•ALTER TABLE table_name CHANGE [COLUMN] col_old_name col_new_name column_type [COMMENT col_comment] [FIRST|AFTER column_name]
•這個命令能夠容許改變列名、數據類型、註釋、列位置或者它們的任意組合
hive> ALTER TABLE pokes ADD COLUMNS (new_col INT);
hive> ALTER TABLE invites ADD COLUMNS (new_col2 INT COMMENT 'a comment');
•ALTER TABLE table_name ADD|REPLACE COLUMNS (col_name data_type [COMMENT col_comment], ...)
• ADD是表明新增一字段,字段位置在全部列後面(partition列前)
REPLACE則是表示替換表中全部字段。
•ALTER TABLE table_name SET TBLPROPERTIES table_properties table_properties:
:[property_name = property_value…..]
•用戶能夠用這個命令向表中增長metadata
•ALTER TABLE table_name SET FILEFORMAT file_format
•ALTER TABLE table_name CLUSTERED BY(userid) SORTED BY(viewTime) INTO num_buckets BUCKETS
•這個命令修改了表的物理存儲屬性
•CREATE VIEW [IF NOT EXISTS] view_name [ (column_name [COMMENT column_comment], ...) ][COMMENT view_comment][TBLPROPERTIES (property_name = property_value, ...)] AS SELECT
•增長視圖
•若是沒有提供表名,視圖列的名字將由定義的SELECT表達式自動生成
•若是修改基本表的屬性,視圖中不會體現,無效查詢將會失敗
•視圖是隻讀的,不能用LOAD/INSERT/ALTER
•DROP VIEW view_name
•刪除視圖
•CREATE DATABASE name
•show tables;
•show databases;
•show partitions ;
•show functions
•describe extended table_name dot col_name
hive不支持用insert語句一條一條的進行插入操做,也不支持update操做。數據是以load的方式加載到創建好的表中。數據一旦導入就不能夠修改。
DML包括:INSERT插入、UPDATE更新、DELETE刪除
•向數據表內加載文件
•將查詢結果插入到Hive表中
•0.8新特性 insert into
•LOAD DATA [LOCAL] INPATH 'filepath' [OVERWRITE] INTO TABLE tablename [PARTITION (partcol1=val1, partcol2=val2 ...)]
•Load 操做只是單純的複製/移動操做,將數據文件移動到 Hive 表對應的位置。
•filepath
•相對路徑,例如:project/data1
•絕對路徑,例如: /user/hive/project/data1
•包含模式的完整 URI,例如:hdfs://namenode:9000/user/hive/project/data1
例如:
hive> LOAD DATA LOCAL INPATH './examples/files/kv1.txt' OVERWRITE INTO TABLE pokes;
•加載的目標能夠是一個表或者分區。若是表包含分區,必須指定每個分區的分區名
•filepath 能夠引用一個文件(這種狀況下,Hive 會將文件移動到表所對應的目錄中)或者是一個目錄(在這種狀況下,Hive 會將目錄中的全部文件移動至表所對應的目錄中)
LOCAL關鍵字
•指定了LOCAL,即本地
•load 命令會去查找本地文件系統中的 filepath。若是發現是相對路徑,則路徑會被解釋爲相對於當前用戶的當前路徑。用戶也能夠爲本地文件指定一個完整的 URI,好比:file:///user/hive/project/data1.
•load 命令會將 filepath 中的文件複製到目標文件系統中。目標文件系統由表的位置屬性決定。被複制的數據文件移動到表的數據對應的位置
例如:加載本地數據,同時給定分區信息:
hive> LOAD DATA LOCAL INPATH './examples/files/kv2.txt' OVERWRITE INTO TABLE invites PARTITION (ds='2008-08-15');
• 沒有指定LOCAL
若是 filepath 指向的是一個完整的 URI,hive 會直接使用這個 URI。 不然
•若是沒有指定 schema 或者 authority,Hive 會使用在 hadoop 配置文件中定義的 schema 和 authority,fs.default.name 指定了 Namenode 的 URI
•若是路徑不是絕對的,Hive 相對於 /user/ 進行解釋。 Hive 會將 filepath 中指定的文件內容移動到 table (或者 partition)所指定的路徑中
加載DFS數據 ,同時給定分區信息:
hive> LOAD DATA INPATH '/user/myname/kv2.txt' OVERWRITE INTO TABLE invites PARTITION (ds='2008-08-15');
The above command will load data from an HDFS file/directory to the table. Note that loading data from HDFS will result in moving the file/directory. As a result, the operation is almost instantaneous.
•指定了OVERWRITE
•目標表(或者分區)中的內容(若是有)會被刪除,而後再將 filepath 指向的文件/目錄中的內容添加到表/分區中。
•若是目標表(分區)已經有一個文件,而且文件名和 filepath 中的文件名衝突,那麼現有的文件會被新文件所替代。
•將查詢結果插入Hive表
•將查詢結果寫入HDFS文件系統
•基本模式
INSERT OVERWRITE TABLE tablename1 [PARTITION (partcol1=val1, partcol2=val2 ...)] select_statement1 FROM from_statement
•多插入模式
FROM from_statement
INSERT OVERWRITE TABLE tablename1 [PARTITION (partcol1=val1, partcol2=val2 ...)] select_statement1
[INSERT OVERWRITE TABLE tablename2 [PARTITION ...] select_statement2] ...
•自動分區模式
INSERT OVERWRITE TABLE tablename PARTITION (partcol1[=val1], partcol2[=val2] ...) select_statement FROM from_statement
•INSERT OVERWRITE [LOCAL] DIRECTORY directory1 SELECT ... FROM ...
FROM from_statement
INSERT OVERWRITE [LOCAL] DIRECTORY directory1 select_statement1
[INSERT OVERWRITE [LOCAL] DIRECTORY directory2 select_statement2]
•
•數據寫入文件系統時進行文本序列化,且每列用^A 來區分,\n換行
•INSERT INTO TABLE tablename1 [PARTITION (partcol1=val1, partcol2=val2 ...)] select_statement1 FROM from_statement
SQL操做
•基本的Select 操做
•基於Partition的查詢
•Join
SELECT [ALL | DISTINCT] select_expr, select_expr, ...
FROM table_reference
[WHERE where_condition]
[GROUP BY col_list [HAVING condition]]
[ CLUSTER BY col_list
| [DISTRIBUTE BY col_list] [SORT BY| ORDER BY col_list]
]
[LIMIT number]
•使用ALL和DISTINCT選項區分對重複記錄的處理。默認是ALL,表示查詢全部記錄。DISTINCT表示去掉重複的記錄
•
•Where 條件
•相似咱們傳統SQL的where 條件
•目前支持 AND,OR ,0.9版本支持between
•IN, NOT IN
•不支持EXIST ,NOT EXIST
ORDER BY與SORT BY的不一樣
•ORDER BY 全局排序,只有一個Reduce任務
•SORT BY 只在本機作排序
Limit
•Limit 能夠限制查詢的記錄數
SELECT * FROM t1 LIMIT 5
•實現Top k 查詢
•下面的查詢語句查詢銷售記錄最大的 5 個銷售表明。
SET mapred.reduce.tasks = 1
SELECT * FROM test SORT BY amount DESC LIMIT 5
•REGEX Column Specification
SELECT 語句能夠使用正則表達式作列選擇,下面的語句查詢除了 ds 和 hr 以外的全部列:
SELECT `(ds|hr)?+.+` FROM test
hive> SELECT a.foo FROM invites a WHERE a.ds='<DATE>';
hive> INSERT OVERWRITE DIRECTORY '/tmp/hdfs_out' SELECT a.* FROM invites a WHERE a.ds='<DATE>';
hive> INSERT OVERWRITE LOCAL DIRECTORY '/tmp/local_out' SELECT a.* FROM pokes a;
hive> INSERT OVERWRITE TABLE events SELECT a.* FROM profiles a;
hive> INSERT OVERWRITE TABLE events SELECT a.* FROM profiles a WHERE a.key < 100;
hive> INSERT OVERWRITE LOCAL DIRECTORY '/tmp/reg_3' SELECT a.* FROM events a;
hive> INSERT OVERWRITE DIRECTORY '/tmp/reg_4' select a.invites, a.pokes FROM profiles a;
hive> INSERT OVERWRITE DIRECTORY '/tmp/reg_5' SELECT COUNT(1) FROM invites a WHERE a.ds='<DATE>';
hive> INSERT OVERWRITE DIRECTORY '/tmp/reg_5' SELECT a.foo, a.bar FROM invites a;
hive> INSERT OVERWRITE LOCAL DIRECTORY '/tmp/sum' SELECT SUM(a.pc) FROM pc1 a;
hive> FROM invites a INSERT OVERWRITE TABLE events SELECT a.bar, count(1) WHERE a.foo > 0 GROUP BY a.bar;
hive> INSERT OVERWRITE TABLE events SELECT a.bar, count(1) FROM invites a WHERE a.foo > 0 GROUP BY a.bar;
JOIN
hive> FROM pokes t1 JOIN invites t2 ON (t1.bar = t2.bar) INSERT OVERWRITE TABLE events SELECT t1.bar, t1.foo, t2.foo;
FROM src
INSERT OVERWRITE TABLE dest1 SELECT src.* WHERE src.key < 100
INSERT OVERWRITE TABLE dest2 SELECT src.key, src.value WHERE src.key >= 100 and src.key < 200
INSERT OVERWRITE TABLE dest3 PARTITION(ds='2008-04-08', hr='12') SELECT src.key WHERE src.key >= 200 and src.key < 300
INSERT OVERWRITE LOCAL DIRECTORY '/tmp/dest4.out' SELECT src.value WHERE src.key >= 300;
hive> FROM invites a INSERT OVERWRITE TABLE events SELECT TRANSFORM(a.foo, a.bar) AS (oof, rab) USING '/bin/cat' WHERE a.ds > '2008-08-09';
This streams the data in the map phase through the script /bin/cat (like hadoop streaming). Similarly - streaming can be used on the reduce side (please see the Hive Tutorial or examples)
•通常 SELECT 查詢會掃描整個表,使用 PARTITIONED BY 子句建表,查詢就能夠利用分區剪枝(input pruning)的特性
•Hive 當前的實現是,只有分區斷言出如今離 FROM 子句最近的那個WHERE 子句中,纔會啓用分區剪枝
Syntax
join_table:
table_reference JOIN table_factor [join_condition]
| table_reference {LEFT|RIGHT|FULL} [OUTER] JOIN table_reference join_condition
| table_reference LEFT SEMI JOIN table_reference join_condition
table_reference:
table_factor
| join_table
table_factor:
tbl_name [alias]
| table_subquery alias
| ( table_references )
join_condition:
ON equality_expression ( AND equality_expression )*
equality_expression:
expression = expression
•Hive 只支持等值鏈接(equality joins)、外鏈接(outer joins)和(left semi joins)。Hive 不支持全部非等值的鏈接,由於非等值鏈接很是難轉化到 map/reduce 任務
•LEFT,RIGHT和FULL OUTER關鍵字用於處理join中空記錄的狀況
•LEFT SEMI JOIN 是 IN/EXISTS 子查詢的一種更高效的實現
•join 時,每次 map/reduce 任務的邏輯是這樣的:reducer 會緩存 join 序列中除了最後一個表的全部表的記錄,再經過最後一個表將結果序列化到文件系統
•實踐中,應該把最大的那個表寫在最後
join 查詢時,須要注意幾個關鍵點
•只支持等值join
•SELECT a.* FROM a JOIN b ON (a.id = b.id)
•SELECT a.* FROM a JOIN b
ON (a.id = b.id AND a.department = b.department)
•能夠 join 多於 2 個表,例如
SELECT a.val, b.val, c.val FROM a JOIN b
ON (a.key = b.key1) JOIN c ON (c.key = b.key2)
•若是join中多個表的 join key 是同一個,則 join 會被轉化爲單個 map/reduce 任務
LEFT,RIGHT和FULL OUTER
•例子
•SELECT a.val, b.val FROM a LEFT OUTER JOIN b ON (a.key=b.key)
•若是你想限制 join 的輸出,應該在 WHERE 子句中寫過濾條件——或是在 join 子句中寫
•
•容易混淆的問題是表分區的狀況
• SELECT c.val, d.val FROM c LEFT OUTER JOIN d ON (c.key=d.key)
WHERE a.ds='2010-07-07' AND b.ds='2010-07-07‘
•若是 d 表中找不到對應 c 表的記錄,d 表的全部列都會列出 NULL,包括 ds 列。也就是說,join 會過濾 d 表中不能找到匹配 c 表 join key 的全部記錄。這樣的話,LEFT OUTER 就使得查詢結果與 WHERE 子句無關
•解決辦法
•SELECT c.val, d.val FROM c LEFT OUTER JOIN d
ON (c.key=d.key AND d.ds='2009-07-07' AND c.ds='2009-07-07')
LEFT SEMI JOIN
•LEFT SEMI JOIN 的限制是, JOIN 子句中右邊的表只能在 ON 子句中設置過濾條件,在 WHERE 子句、SELECT 子句或其餘地方過濾都不行
•
•SELECT a.key, a.value
FROM a
WHERE a.key in
(SELECT b.key
FROM B);
能夠被重寫爲:
SELECT a.key, a.val
FROM a LEFT SEMI JOIN b on (a.key = b.key)
UNION ALL
•用來合併多個select的查詢結果,須要保證select中字段須一致
•select_statement UNION ALL select_statement UNION ALL select_statement ...
•SQL中對兩表內聯能夠寫成:
•select * from dual a,dual b where a.key = b.key;
•Hive中應爲
•select * from dual a join dual b on a.key = b.key;
而不是傳統的格式:
SELECT t1.a1 as c1, t2.b1 as c2FROM t1, t2 WHERE t1.a2 = t2.b2
•分號是SQL語句結束標記,在HiveQL中也是,可是在HiveQL中,對分號的識別沒有那麼智慧,例如:
•select concat(key,concat(';',key)) from dual;
•但HiveQL在解析語句時提示:
FAILED: Parse Error: line 0:-1 mismatched input '<EOF>' expecting ) in function specification
•解決的辦法是,使用分號的八進制的ASCII碼進行轉義,那麼上述語句應寫成:
•select concat(key,concat('\073',key)) from dual;
•SQL中null表明空值, 值得警戒的是, 在HiveQL中String類型的字段如果空(empty)字符串, 即長度爲0, 那麼對它進行IS NULL的判斷結果是False.
僅支持覆蓋重寫整個表,示例以下:
1. INSERT OVERWRITE TABLE t1
2. SELECT * FROM t2;
這樣的話,就不要很複雜的鎖機制來讀寫數據。
INSERT INTO syntax is only available starting in version 0.8。INSERT INTO就是在表或分區中追加數據。
如:
1. FROM (
2. MAP doctext USING 'Python wc_mapper.py' AS (word, cnt)
3. FROM docs
4. CLUSTER BY word
5. ) a
6. REDUCE word, cnt USING 'Python wc_reduce.py';
--doctext: 是輸入
--word, cnt: 是map程序的輸出
--CLUSTER BY: 將wordhash後,又做爲reduce程序的輸入
而且map程序、reduce程序能夠單獨使用,如:
1. FROM (
2. FROM session_table
3. SELECT sessionid, tstamp, data
4. DISTRIBUTE BY sessionid SORT BY tstamp
5. ) a
6. REDUCE sessionid, tstamp, data USING 'session_reducer.sh';
--DISTRIBUTE BY: 用於給reduce程序分配行數據
這樣能免除屢次掃描輸入表的開銷。
1. FROM t1
2.
3. INSERT OVERWRITE TABLE t2
4. SELECT t3.c2, count(1)
5. FROM t3
6. WHERE t3.c1 <= 20
7. GROUP BY t3.c2
8.
9. INSERT OVERWRITE DIRECTORY '/output_dir'
10. SELECT t3.c2, avg(t3.c1)
11. FROM t3
12. WHERE t3.c1 > 20 AND t3.c1 <= 30
13. GROUP BY t3.c2
14.
15. INSERT OVERWRITE LOCAL DIRECTORY '/home/dir'
16. SELECT t3.c2, sum(t3.c1)
17. FROM t3
18. WHERE t3.c1 > 30
19. GROUP BY t3.c2;
CREATE TABLE u_data (
userid INT,
movieid INT,
rating INT,
unixtime STRING)
ROW FORMAT DELIMITED
FIELDS TERMINATED BY '/t'
STORED AS TEXTFILE;
下載示例數據文件,並解壓縮
wget http://www.grouplens.org/system/files/ml-data.tar__0.gz
tar xvzf ml-data.tar__0.gz
LOAD DATA LOCAL INPATH 'ml-data/u.data'
OVERWRITE INTO TABLE u_data;
SELECT COUNT(1) FROM u_data;
建立一個 weekday_mapper.py: 文件,做爲數據按周進行分割
import sys
import datetime
for line in sys.stdin:
line = line.strip()
userid, movieid, rating, unixtime = line.split('/t')
weekday = datetime.datetime.fromtimestamp(float(unixtime)).isoweekday()
print '/t'.join([userid, movieid, rating, str(weekday)])
//建立表,按分割符分割行中的字段值
CREATE TABLE u_data_new (
userid INT,
movieid INT,
rating INT,
weekday INT)
ROW FORMAT DELIMITED
FIELDS TERMINATED BY '/t';
//將python文件加載到系統
add FILE weekday_mapper.py;
INSERT OVERWRITE TABLE u_data_new
SELECT
TRANSFORM (userid, movieid, rating, unixtime)
USING 'python weekday_mapper.py'
AS (userid, movieid, rating, weekday)
FROM u_data;
SELECT weekday, COUNT(1)
FROM u_data_new
GROUP BY weekday;
將WEB日誌先用正則表達式進行組合,再按須要的條件進行組合輸入到表中
add jar ../build/contrib/hive_contrib.jar;
CREATE TABLE apachelog (
host STRING,
identity STRING,
user STRING,
time STRING,
request STRING,
status STRING,
size STRING,
referer STRING,
agent STRING)
ROW FORMAT SERDE 'org.apache.hadoop.hive.contrib.serde2.RegexSerDe'
WITH SERDEPROPERTIES (
"input.regex" = "([^ ]*) ([^ ]*) ([^ ]*) (-|//[[^//]]*//]) ([^ /"]*|/"[^/"]*/") (-|[0-9]*) (-|[0-9]*)(?: ([^ /"]*|/"[^/"]*/") ([^ /"]*|/"[^/"]*/"))?",
"output.format.string" = "%1$s %2$s %3$s %4$s %5$s %6$s %7$s %8$s %9$s"
)
STORED AS TEXTFILE;
24.
25.Datanode在什麼狀況下不備份
26.在配置文件中datanode的數量設置爲1時
27.Combiner出如今那個過程
28.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。
|
(點擊查看大圖)圖1-3 HDFS的體系結構圖 |
29.
30.Flush體系結構
31.什麼是列隊 linkedList 隊列
32.List和set去表
33.數據庫三大範式
34.第一範式,又稱1NF,它指的是在一個應用中的數據均可以組織成由行和列的表格形式,且表格的任意一個行列交叉點即單元格,都不可再劃分爲行和列的形式,實際上任意一張表格都知足1NF; 第二範式,又稱2NF,它指的是在知足1NF的基礎上,一張數據表中的任何非主鍵字段都所有依賴於主鍵字段,沒有任何非主鍵字段只依賴於主鍵字段的一部分。即,能夠由主鍵字段來惟一的肯定一條記錄。好比學號+課程號的聯合主鍵,能夠惟一的肯定某個成績是哪一個學員的哪門課的成績,缺乏學號或者缺乏課程號,都不能肯定成績的意義。 第三範式,又稱3NF,它是指在知足2NF的基礎上,數據表的任何非主鍵字段之間都不產生函數依賴,即非主鍵字段之間沒有依賴關係,所有隻依賴於主鍵字段。例如將學員姓名和所屬班級名稱放在同一張表中是不科學的,由於學員依賴於班級,可將學員信息和班級信息單獨存放,以知足3NF。
35.三個datanode 當有一個出現錯誤會怎麼樣
36.Sgoop導入數據到mysql中 如何讓數據不重複導入? 存在數據問題sgoop會怎麼樣
37.
38.
39.Hadop基礎知識和問題分析能力
3.1 描述一下 hadoop 中,有哪些地方使用了緩存機制,做用分別是什麼
3.2 請描述 https://issues.apache.org/jira/browse/HDFS-2379 說的是什麼問題,最終解
決的思路是什麼?
四、MapReduce 開發能力
請參照 wordcount 實現一個本身的 map reduce,需求爲:
a 輸入文件格式:
xxx,xxx,xxx,xxx,xxx,xxx,xxx
b 輸出文件格式:
xxx,20
xxx,30
xxx.40
c 功能:根據命令行參數統計輸入文件中指定關鍵字出現的次數,並展現出來
例如:hadoop jar xxxxx.jar keywordcount xxx,xxx,xxx,xxx(四個關鍵字)
五、MapReduce 優化
請根據第五題中的程序, 提出如何優化 MR 程序運行速度的思路
六、Linux 操做系統知識考察
請列舉曾經修改過的/etc 下的配置文件,並說明修改要解決的問題?
七、Java 開發能力
7.1 寫代碼實現 1G 大小的文本文件,行分隔符爲\x01\x02,統計一下該文件中的總行數,
要求注意邊界狀況的處理
7.2 請描述一下在開發中如何對上面的程序進行性能分析,對性能進行優化的過程。
5、來自*****提供的 hadoop 面試題 21 道:
一、設計一套系統,使之可以從不斷增長的不一樣的數據源中,提取指定格式的數據。
要求:
編者 QQ:1040195253 16
1)、運行結果要能大體得知提取效果,並可據此持續改進提取方法;
2)、因爲數據來源的差別性,請給出可彈性配置的程序框架;
3)、數據來源可能有 Mysql,sqlserver 等;
4)、該系統具有持續挖掘的能力,即,可重複提取更多信息
2. 經典的一道題:
現有 1 億個整數均勻分佈,若是要獲得前 1K 個最大的數,求最優的算法。
(先不考慮內存的限制,也不考慮讀寫外存,時間複雜度最少的算法即爲最優算法)
我先說下個人想法:分塊,好比分 1W 塊,每塊 1W 個,而後分別找出每塊最大值,從這最
大的 1W 個值中找最大 1K 個,
那麼其餘的 9K 個最大值所在的塊便可扔掉,從剩下的最大的 1K 個值所在的塊中找前 1K
個便可。那麼原問題的規模就縮小到了 1/10。
問題:
(1)這種分塊方法的最優時間複雜度。
(2)如何分塊達到最優。好比也可分 10W 塊,每塊 1000 個數。則問題規模可降到原來
1/100。但事實上覆雜度並沒下降。
(3)還有沒更好更優的方法解決這個問題。
3. MapReduce 大體流程?
4. combiner, partition 做用?
5.用 mapreduce 實現 sql 語句 select count(x) from a group by b?
6. 用 mapreduce 如何實現兩張錶鏈接,有哪些方法?
7.知道 MapReduce 大體流程,map, shuffle, reduce
編者 QQ:1040195253 17
8.知道 combiner, partition 做用,設置 compression
9.搭建 hadoop 集羣,master/slave 都運行那些服務
10.HDFS,replica 如何定位
11.版本 0.20.2->0.20.203->0.20.205, 0.21, 0.23, 1.0. 1
新舊 API 有什麼不一樣
12.Hadoop 參數調優,cluster level: JVM, map/reduce slots, job level: reducer
#,memory, use combiner? use compression?
13.pig latin, Hive 語法有什麼不一樣
14.描述 HBase, zookeeper 搭建過程
15.hadoop 運行的原理?
16.mapreduce 的原理?
17.HDFS 存儲的機制?
18.舉一個簡單的例子說明 mapreduce 是怎麼來運行的 ?
19.使用 mapreduce 來實現下面實例
實例 :如今有 10 個文件夾 ,每一個文件夾都有 1000000 個 url.如今讓你找出
top1000000url。
20.hadoop 中 Combiner 的做用?
21.如何確認 Hadoop 集羣的健康情況。
6、來自****提供的 hadoop 面試題 9 道:
1.使用的 hadoop 版本都是什麼?
QQ942609288????,???????QQ??
QQ942609288????,???????QQ??
編者 QQ:1040195253 18
2.mpareduce 原理是什麼?
3.mapreduce 做業,不使用 reduce 來輸出,用什麼能代替 reduce 的功能
4.hive 如何調優?
5.hive 如何權限控制?
6.hbase 寫數據的原理是什麼?
7.hive 能像關係數據庫那樣,建多個庫嗎?
8.hbase 宕機如何處理?
9.假設公司要建一個數據中心,你會如何規劃?
7、hadoop 選擇判斷題 33 道:
單項選擇題
1. 下面哪一個程序負責 HDFS 數據存儲。
a)NameNode b)Jobtracker c)Datanode d)secondaryNameNode e)tasktracker
2. HDfS 中的 block 默認保存幾份?
a)3 份 b)2 份 c)1 份 d)不肯定
3. 下列哪一個程序一般與 NameNode 在一個節點啓動?
a)SecondaryNameNode b)DataNode c)TaskTracker d)Jobtracker
4. Hadoop 做者
a)Martin Fowler b)Kent Beck c)Doug cutting
5. HDFS 默認 Block Size
a)32MB b)64MB c)128MB
6. 下列哪項一般是集羣的最主要瓶頸
QQ942609288????,???????QQ??
QQ942609288????,???????QQ??
編者 QQ:1040195253 19
a)CPU b)網絡 c)磁盤 d)內存
7. 關於 SecondaryNameNode 哪項是正確的?
a)它是 NameNode 的熱備 b)它對內存沒有要求
c)它的目的是幫助 NameNode 合併編輯日誌,減小 NameNode 啓動時間
d)SecondaryNameNode 應與 NameNode 部署到一個節點
多選題:
8. 下列哪項能夠做爲集羣的管理工具
a)Puppet b)Pdsh c)Cloudera Manager d)d)Zookeeper
9. 配置機架感知的下面哪項正確
a)若是一個機架出問題,不會影響數據讀寫
b)寫入數據的時候會寫到不一樣機架的 DataNode 中
c)MapReduce 會根據機架獲取離本身比較近的網絡數據
10. Client 端上傳文件的時候下列哪項正確
a)數據通過 NameNode 傳遞給 DataNode
b)Client 端將文件切分爲 Block,依次上傳
c)Client 只上傳數據到一臺 DataNode,而後由 NameNode 負責 Block 複製工做
11. 下列哪一個是 Hadoop 運行的模式
a)單機版 b)僞分佈式 c)分佈式
12. Cloudera 提供哪幾種安裝 CDH 的方法
a)Cloudera manager b)Tar ball c)Yum d)Rpm
判斷題:
13. Ganglia 不只能夠進行監控,也能夠進行告警。( )
14. Block Size 是不能夠修改的。( )
15. Nagios 不能夠監控 Hadoop 集羣,由於它不提供 Hadoop 支持。( )
16. 若是 NameNode 意外終止,SecondaryNameNode 會接替它使集羣繼續工做。( )
17. Cloudera CDH 是須要付費使用的。( )
18. Hadoop 是 Java 開發的,因此 MapReduce 只支持 Java 語言編寫。( )
19. Hadoop 支持數據的隨機讀寫。( )
20. NameNode 負責管理 metadata,client 端每次讀寫請求,它都會從磁盤中讀取或則
會寫
入 metadata 信息並反饋 client 端。( )
21. NameNode 本地磁盤保存了 Block 的位置信息。( )
22. DataNode 經過長鏈接與 NameNode 保持通訊。( )
23. Hadoop 自身具備嚴格的權限管理和安全措施保障集羣正常運行。( )
24. Slave 節點要存儲數據,因此它的磁盤越大越好。( )
25. hadoop dfsadmin –report 命令用於檢測 HDFS 損壞塊。( )
26. Hadoop 默認調度器策略爲 FIFO( )
27. 集羣內每一個節點都應該配 RAID,這樣避免單磁盤損壞,影響整個節點運行。( )
28. 由於 HDFS 有多個副本,因此 NameNode 是不存在單點問題的。( )
29. 每一個 map 槽就是一個線程。( )
30. Mapreduce 的 input split 就是一個 block。( )
31. NameNode 的 Web UI 端口是 50030,它經過 jetty 啓動的 Web 服務。( )
32. Hadoop 環境變量中的 HADOOP_HEAPSIZE 用於設置全部 Hadoop 守護線程的內
存。它默
認是 200 GB。( )
33. DataNode 首次加入 cluster 的時候,若是 log 中報告不兼容文件版本,那須要
NameNode
執行「Hadoop namenode -format」操做格式化磁盤。( )
8、mr 和 hive 實現手機流量統計面試題 6 道:
1.hive 實現統計的查詢語句是什麼?
2.生產環境中爲何建議使用外部表?
3.hadoop mapreduce 建立類 DataWritable 的做用是什麼?
4.爲何建立類 DataWritable?
5.如何實現統計手機流量?
6.對比 hive 與 mapreduce 統計手機流量的區別?
9、來自 aboutyun 的面試題 1 道:
最近去面試,出了個這樣的題目,你們有興趣也試試。
用 Hadoop 分析海量日誌文件,每行日誌記錄了以下數據:
TableName(表名),Time(時間),User(用戶),TimeSpan(時間開銷)。
要求:
編寫 MapReduce 程序算出高峯時間段(如上午 10 點)哪張表被訪問的最頻繁,以及
10、來自 aboutyun 的面試題 6 道:
前段時間接到阿里巴巴面試雲計算,拿出來給咱們共享下
一、hadoop 運轉的原理?
二、mapreduce 的原理?
三、HDFS 存儲的機制?
四、舉一個簡略的比方闡明 mapreduce 是怎麼來運轉的 ?
五、面試的人給你出一些疑問,讓你用 mapreduce 來完成?
比方 :現在有 10 個文件夾 ,每一個文件夾都有 1000000 個 url.現在讓你找出
top1000000url。
六、hadoop 中 Combiner 的效果?
論壇某網友的回覆:
1.hadoop 便是 mapreduce 的進程,服務器上的一個目錄節點加上多個數據節點,將程序
傳遞到各個節點,再節點上進行計算。
2.mapreduce 便是將數據存儲到不同的節點上,用 map 方法對應辦理,在各個節點上
進行計算,最後由 reduce 進行合併。
3.java 程序和 namenode 合做,把數據存放在不同的數據節點上
4.怎麼運轉用圖來代表最好了。圖沒法畫。谷歌下
5.不思考歪斜,功能,運用 2 個 job,第一個 job 直接用 filesystem 讀取 10 個文件夾做爲
map 輸入,url 作 key,reduce 計算個 url 的 sum,
下一個 job map 頂用 url 做 key,運用-sum 做二次排序,reduce 中取 top10000000
QQ942609288????,???????QQ??
QQ942609288????,???????QQ??
編者 QQ:1040195253 23
第二種方法,建 hive 表 A,掛分區 channel,每一個文件夾是一個分區.
select x.url,x.c from(select url,count(1) as c from A where channel ='' group by
url)x order by x.c desc limie 1000000;
6 combiner 也是一個 reduce,它能夠削減 map 到 reudce 的數據傳輸,進步 shuff 速度。
牢記平均值不要用。需求輸入=map 的輸出,輸出=reduce 的輸入。
11、小蘿蔔(hadoop 月薪 13k)的筆試和麪試題 11 道:
1、筆試
一、java 基礎類:
1)繼承:寫的一段代碼,讓寫出結果;
2)引用對象和值對象;
Java 基礎類記不太清了,有不少都是基礎。
二、linux 基礎:
1)find 用法
2)給出一個文本:好比 http://aaa.com
http://bbb.com
http://bbb.com
http://bbb.com
http://ccc.com
http://ccc.com
讓寫 shell 統計,最後輸出結果:aaa 1
Ccc 2
Bbb 3
要求結果還要排序
還有別的,也是比較基礎的
三、數據庫類:Oracle 查詢語句
2、面試
講項目經驗:問的很細,給紙,筆,讓畫公司 hadoop 的項目架構,最後還讓本身說幾條業
務數據,而後通過平臺後,出來成什麼樣子。
java 方面:io 輸入輸出流裏有哪些經常使用的類,還有 webService,線程相關的知識
linux:問到 jps 命令,kill 命令,問 awk,sed 是幹什麼用的、還有 hadoop 的一些經常使用命
令
hadoop:講 hadoop1 中 map,shuffle,reduce 的過程,其中問到了 map 端和 reduce 端
溢寫的細節(幸虧我以前有研究過)
項目部署:問了項目是怎麼部署,代碼怎麼管理
Hive 也問了一些,外部表,還有就是 hive 的物理模型跟傳統數據庫的不一樣
3、某互聯網公司的面試:
問到分析人行爲的算法:我當時想到咱們作的反洗錢項目中,有用到。我就給舉例:我
們是怎麼篩選出可疑的洗錢行爲的。
12、閃客、找本身、大數等提供的面試題 26 道:
****信 Hadoop 面試筆試題(共 14題,還有一題記不住了)
一、hadoop 集羣搭建過程,寫出步驟。
二、hadoop 集羣運行過程當中啓動那些線程,各自的做用是什麼?
三、/tmp/hadoop-root/dfs/name the path is not exists or is not accessable.
NameNode main 中報錯,該怎麼解決。(大意這樣 一個什麼異常)
四、工做中編寫 mapreduce 用到的語言,編寫一個 mapreduce 程序。
五、hadoop 命令
1)殺死一個 job 任務 (殺死 50030 端口的進程便可)
2)刪除/tmp/aaa 文件目錄
3)hadoop 集羣添加或刪除節點時,刷新集羣狀態的命令
六、日誌的固定格式:
a,b,c,d
a,a,f,e
b,b,d,f
使用一種語言編寫 mapreduce 任務,統計每一列最後字母的個數。
七、hadoop 的調度器有哪些,工做原理。
八、mapreduce 的 join 方法有哪些?
九、Hive 元數據保存的方法有哪些,各有什麼特色?
十、java 實現非遞歸二分法算法。
十一、mapreduce 中 Combiner 和 Partition 的做用。
十二、用 linux 實現下列要求:
ip username
a.txt
210.121.123.12 zhangsan
34.23.56.78 lisi
編者 QQ:1040195253 26
11.56.56.72 wanger
.....
b.txt
58.23.53.132 liuqi
34.23.56.78 liba
.....
a.txt,b.txt 中至少 100 萬行。
1)a.txt,b.txt 中各自的 ip 個數,ip 的總個數。
2)a.txt 中存在的 ip 而 b.txt 中不存在的 ip。
3)每一個 username 出現的總個數,每一個 username 對應的 ip 個數。
1三、大意是 hadoop 中 java、streaming、pipe 處理數據各有特色。
1四、如何實現 mapreduce 的二次排序。
大數遇到的面試題:
1五、面試官上來就問 hadoop 的調度機制;
1六、機架感知;
1七、MR 數據傾斜緣由和解決方案;
1八、集羣 HA。
@找本身 提供的面試題:
1九、若是讓你設計,你以爲一個分佈式文件系統應該如何設計,考慮哪方面內容;
天天百億數據入 hbase,如何保證數據的存儲正確和在規定的時間裏所有錄入完畢,
不殘留數據。
20、對於 hive,你寫過哪些 UDF 函數,做用是什麼
2一、hdfs 的數據壓縮算法
2二、mapreduce 的調度模式
2三、hive 底層與數據庫交互原理
2四、hbase 過濾器實現原則
2五、對於 mahout,如何進行推薦、分類、聚類的代碼二次開發分別實現那些藉口
2六、請問下,直接將時間戳做爲行健,在寫入單個 region 時候會發生熱點問題,爲何呢?
十3、飛哥(hadoop 月薪 13k)提供的面試題 17 道:
一、hdfs 原理,以及各個模塊的職責
二、mr 的工做原理
三、map 方法是如何調用 reduce 方法的
四、shell 如何判斷文件是否存在,若是不存在該如何處理?
五、fsimage 和 edit 的區別?
六、hadoop1 和 hadoop2 的區別?
筆試:
一、hdfs 中的 block 默認報錯幾份?
二、哪一個程序一般與 nn 在一個節點啓動?並作分析
三、列舉幾個配置文件優化?
四、寫出你對 zookeeper 的理解
五、datanode 首次加入 cluster 的時候,若是 log 報告不兼容文件版本,那須要 namenode
執行格式化操做,這樣處理的緣由是?
六、談談數據傾斜,如何發生的,並給出優化方案
七、介紹一下 hbase 過濾器
八、mapreduce 基本執行過程
九、談談 hadoop1 和 hadoop2 的區別
十、hbase 集羣安裝注意事項
十一、記錄包含值域 F 和值域 G,要分別統計相同 G 值的記錄中不一樣的 F 值的數目,簡單編
寫過程。
十4、飛哥(hadoop 月薪 13k)提供的面試題 3 道:
一、算法題:有 2 個桶,容量分別爲 3 升和 5 升,如何獲得 4 升的水,假設水無限使用,寫
出步驟。
二、java 筆試題:忘記拍照了,不少很基礎的 se 知識。後面還有不少 sql 相關的題,經常使用的
查詢 sql 編寫,答題時間一個小時。
三、Oracle 數據庫中有一個表字段 name,name varchar2(10),如何在不改變表數據的狀況
下將此字段長度改成 varchar2(2)?
十5、海量數據處理算法面試題 10 道:
第一部分:十道海量數據處理面試題
一、海量日誌數據,提取出某日訪問百度次數最多的那個 IP。
首先是這一天,而且是訪問百度的日誌中的 IP 取出來,逐個寫入到一個大文件中。注意到
IP 是 32 位的,最多有個 2^32 個 IP。一樣能夠採用映射的方法, 好比模 1000,把整個
大文件映射爲 1000 個小文件,再找出每一個小文中出現頻率最大的 IP(能夠採用 hash_map
QQ942609288????,???????QQ??
QQ942609288????,???????QQ??
編者 QQ:1040195253 29
進行頻率統計,而後再找出頻率最大 的幾個)及相應的頻率。而後再在這 1000 個最大的
IP 中,找出那個頻率最大的 IP,即爲所求。
或者以下闡述(雪域之鷹):
算法思想:分而治之+Hash
(1).IP 地址最多有 2^32=4G 種取值狀況,因此不能徹底加載到內存中處理;
(2).能夠考慮採用「分而治之」的思想,按照 IP 地址的 Hash(IP)%1024 值,把海量 IP
日誌分別存儲到 1024 個小文件中。這樣,每一個小文件最多包含 4MB 個 IP 地址;
(3).對於每個小文件,能夠構建一個 IP 爲 key,出現次數爲 value 的 Hash map,同
時記錄當前出現次數最多的那個 IP 地址;
(4).能夠獲得 1024 個小文件中的出現次數最多的 IP,再依據常規的排序算法獲得整體上
出現次數最多的 IP;
二、搜索引擎會經過日誌文件把用戶每次檢索使用的全部檢索串都記錄下來,每一個查詢串的
長度爲 1-255 字節。
假設目前有一千萬個記錄(這些查詢串的重複度比較高,雖然總數是 1 千萬,但若是
除去重複後,不超過 3 百萬個。一個查詢串的重複度越高,說明查詢它的用戶越多,也就
是越熱門。),請你統計最熱門的 10 個查詢串,要求使用的內存不能超過 1G。
典型的 Top K 算法,仍是在這篇文章裏頭有所闡述,詳情請參見:11、從頭至尾完全解
析 Hash 表算法。
文中,給出的最終算法是:
第一步、先對這批海量數據預處理,在 O(N)的時間內用 Hash 表完成統計(以前寫成了
排序,特此訂正。July、2011.04.27);
第二步、藉助堆這個數據結構,找出 Top K,時間複雜度爲 N‘logK。
即,藉助堆結構,咱們能夠在 log 量級的時間內查找和調整/移動。所以,維護一個 K(該題
目中是 10)大小的小根堆,而後遍歷 300 萬的 Query,分別 和根元素進行對比因此,咱們
最終的時間複雜度是:O(N) + N’*O(logK),(N 爲 1000 萬,N’爲 300 萬)。ok,
更多,詳情,請參考原文。
或者:採用 trie 樹,關鍵字域存該查詢串出現的次數,沒有出現爲 0。最後用 10 個元素的
最小推來對出現頻率進行排序。
三、有一個 1G 大小的一個文件,裏面每一行是一個詞,詞的大小不超過 16 字節,內存限
制大小是 1M。返回頻數最高的 100 個詞。
方案:順序讀文件中,對於每一個詞 x,取 hash(x)%5000,而後按照該值存到 5000 個小文
件(記爲 x0,x1,…x4999)中。這樣每一個文件大概是 200k 左右。
若是其中的有的文件超過了 1M 大小,還能夠按照相似的方法繼續往下分,直到分解獲得
的小文件的大小都不超過 1M。
對每一個小文件,統計每一個文件中出現的詞以及相應的頻率(能夠採用 trie 樹/hash_map 等),
並取出出現頻率最大的 100 個詞(能夠用含 100 個結 點的最小堆),並把 100 個詞及相應
的頻率存入文件,這樣又獲得了 5000 個文件。下一步就是把這 5000 個文件進行歸併(類
似與歸併排序)的過程了。
四、有 10 個文件,每一個文件 1G,每一個文件的每一行存放的都是用戶的 query,每一個文件的
query 均可能重複。要求你按照 query 的頻度排序。
仍是典型的 TOP K 算法,解決方案以下:
方案 1:
順序讀取 10 個文件,按照 hash(query)%10 的結果將 query 寫入到另外 10 個文件(記爲)
中。這樣新生成的文件每一個的大小大約也 1G(假設 hash 函數是隨機的)。
找一臺內存在 2G 左右的機器,依次對用 hash_map(query, query_count)來統計每一個
query 出現的次數。利用快速/堆/歸併排序按照出現次數進行排序。將排序好的 query 和
對應的 query_cout 輸出到文件中。這樣獲得了 10 個排好序的文件(記爲)。
對這 10 個文件進行歸併排序(內排序與外排序相結合)。
方案 2:
通常 query 的總量是有限的,只是重複的次數比較多而已,可能對於全部的 query,一次
性就能夠加入到內存了。這樣,咱們就能夠採用 trie 樹/hash_map等直接來統計每一個 query
出現的次數,而後按出現次數作快速/堆/歸併排序就能夠了。
方案 3:
與方案 1 相似,但在作完 hash,分紅多個文件後,能夠交給多個文件來處理,採用分佈式
的架構來處理(好比 MapReduce),最後再進行合併。
五、 給定 a、b 兩個文件,各存放 50 億個 url,每一個 url 各佔 64 字節,內存限制是 4G,讓
你找出 a、b 文件共同的 url?
方案 1:能夠估計每一個文件安的大小爲 5G×64=320G,遠遠大於內存限制的 4G。因此不
可能將其徹底加載到內存中處理。考慮採起分而治之的方法。
遍歷文件 a,對每一個 url 求取 hash(url)%1000,而後根據所取得的值將 url 分別存儲到 1000
個小文件(記爲 a0,a1,…,a999)中。這樣每一個小文件的大約爲 300M。
遍歷文件 b,採起和 a 相同的方式將 url 分別存儲到 1000 小文件(記爲 b0,b1,…,b999)。
QQ942609288????,???????QQ??
QQ942609288????,???????QQ??
編者 QQ:1040195253 32
這樣處理後,全部可能相同的 url 都在對應的小 文件(a0vsb0,a1vsb1,…,a999vsb999)
中,不對應的小文件不可能有相同的 url。而後咱們只要求出 1000 對小文件中相同的 url
便可。
求每對小文件中相同的 url 時,能夠把其中一個小文件的 url 存儲到 hash_set 中。而後遍
歷另外一個小文件的每一個 url,看其是否在剛纔構建的 hash_set 中,若是是,那麼就是共同
的 url,存到文件裏面就能夠了。
方案 2:若是容許有必定的錯誤率,能夠使用 Bloom filter,4G 內存大概能夠表示 340 億
bit。將其中一個文件中的 url 使用 Bloom filter 映射爲這 340 億 bit,而後挨個讀取另一
個文件的 url,檢查是否與 Bloom filter,若是是,那麼該 url 應該是共同的 url(注意會有
必定的錯誤率)。
Bloom filter 往後會在本 BLOG 內詳細闡述。
六、在 2.5 億個整數中找出不重複的整數,注,內存不足以容納這 2.5 億個整數。
方案 1:採用 2-Bitmap(每一個數分配 2bit,00 表示不存在,01 表示出現一次,10 表示多
次,11 無心義)進行,共需內存 2^32 * 2 bit=1 GB 內存,還能夠接受。而後掃描這 2.5
億個整數,查看 Bitmap 中相對應位,若是是 00 變 01,01 變 10,10 保持不變。所描完
過後,查看 bitmap,把對應位是 01 的整數輸出便可。
方案 2:也可採用與第 1 題相似的方法,進行劃分小文件的方法。而後在小文件中找出不重
復的整數,並排序。而後再進行歸併,注意去除重複的元素。
七、騰訊面試題:給 40 億個不重複的 unsigned int 的整數,沒排過序的,而後再給一個數,
如何快速判斷這個數是否在那 40 億個數當中?
與上第 6 題相似,個人第一反應時快速排序+二分查找。如下是其它更好的方法:
方案 1:oo,申請 512M 的內存,一個 bit 位表明一個 unsigned int 值。讀入 40 億個數,
設置相應的 bit 位,讀入要查詢的數,查看相應 bit 位是否爲 1,爲 1 表示存在,爲 0 表示
不存在。
dizengrong:
方案 2:這個問題在《編程珠璣》裏有很好的描述,你們能夠參考下面的思路,探討一下:
又由於 2^32 爲 40 億多,因此給定一個數可能在,也可能不在其中;
這裏咱們把 40 億個數中的每個用 32 位的二進制來表示
假設這 40 億個數開始放在一個文件中。
而後將這 40 億個數分紅兩類:
1.最高位爲 0
2.最高位爲 1
並將這兩類分別寫入到兩個文件中,其中一個文件中數的個數<=20 億,而另外一個>=20 億
(這至關於折半了);
與要查找的數的最高位比較並接着進入相應的文件再查找
再而後把這個文件爲又分紅兩類:
1.次最高位爲 0
2.次最高位爲 1
並將這兩類分別寫入到兩個文件中,其中一個文件中數的個數<=10 億,而另外一個>=10 億
(這至關於折半了);
與要查找的數的次最高位比較並接着進入相應的文件再查找。
…….
以此類推,就能夠找到了,並且時間複雜度爲 O(logn),方案 2 完。
附:這裏,再簡單介紹下,位圖方法:
使用位圖法判斷整形數組是否存在重複
判斷集合中存在重複是常見編程任務之一,當集合中數據量比較大時咱們一般但願少進行幾
次掃描,這時雙重循環法就不可取了。
位圖法比較適合於這種狀況,它的作法是按照集合中最大元素 max 建立一個長度爲 max+1
的新數組,而後再次掃描原數組,遇到幾就給新數組的第幾位置上 1,如遇到 5 就給新數
組的第六個元素置 1,這樣下次再遇到 5 想置位時發現新數組的第六個元素已是 1 了,這
說明此次的數據確定和之前的數據存在着重複。這 種給新數組初始化時置零其後置一的作
法相似於位圖的處理方法故稱位圖法。它的運算次數最壞的狀況爲 2N。若是已知數組的最
大值即能事先給新數組定長的話效 率還能提升一倍。
歡迎,有更好的思路,或方法,共同交流。
八、怎麼在海量數據中找出重複次數最多的一個?
方案 1:先作 hash,而後求模映射爲小文件,求出每一個小文件中重複次數最多的一個,並
記錄重複次數。而後找出上一步求出的數據中重複次數最多的一個就是所求(具體參考前面
的題)。
九、上千萬或上億數據(有重複),統計其中出現次數最多的錢 N 個數據。
方案 1:上千萬或上億的數據,如今的機器的內存應該能存下。因此考慮採用 hash_map/
搜索二叉樹/紅黑樹等來進行統計次數。而後就是取出前 N 個出現次數最多的數據了,能夠
用第 2 題提到的堆機制完成。
十、一個文本文件,大約有一萬行,每行一個詞,要求統計出其中最頻繁出現的前 10 個詞,
請給出思想,給出時間複雜度分析。
方案 1:這題是考慮時間效率。用 trie 樹統計每一個詞出現的次數,時間複雜度是 O(n*le)(le
表示單詞的平準長度)。而後是找出出現最頻繁的前 10 個詞,能夠用堆來實現,前面的題
中已經講到了,時間複雜度是 O(n*lg10)。因此總的時間複雜度,是 O(n*le)與 O(n*lg10)
中較大的哪一 個。
附、100w 個數中找出最大的 100 個數。
方案 1:在前面的題中,咱們已經提到了,用一個含 100 個元素的最小堆完成。複雜度爲
O(100w*lg100)。
方案 2:採用快速排序的思想,每次分割以後只考慮比軸大的一部分,知道比軸大的一部分
在比 100 多的時候,採用傳統排序算法排序,取前 100 個。複雜度爲 O(100w*100)。
方案 3:採用局部淘汰法。選取前 100 個元素,並排序,記爲序列 L。而後一次掃描剩餘的
元素 x,與排好序的 100 個元素中最小的元素比,若是比這個最小的 要大,那麼把這個最
小的元素刪除,並把 x 利用插入排序的思想,插入到序列 L 中。依次循環,知道掃描了全部
的元素。複雜度爲 O(100w*100)。
致謝:http://www.cnblogs.com/youwang/。
第二部分:十個海量數據處理方法大總結
ok,看了上面這麼多的面試題,是否有點頭暈。是的,須要一個總結。接下來,本文將簡
單總結下一些處理海量數據問題的常見方法,而往後,本 BLOG 內會具體闡述這些方法。
下面的方法所有來自 http://hi.baidu.com/yanxionglu/blog/博客,對海量數據的處理方
法進行了一個通常性的總結,固然這些方法可能並不能徹底覆蓋全部的問題,可是這樣的一
些方法也基本能夠處理絕大多數遇到的問題。下面的一些問題基本直接來源於公司的面試筆
試題目,方法不必定最優,若是你有更好的處理方法,歡迎討論。
1、Bloom filter
適用範圍:能夠用來實現數據字典,進行數據的判重,或者集合求交集
基本原理及要點:
對於原理來講很簡單,位數組+k 個獨立 hash 函數。將 hash 函數對應的值的位數組置 1,
查找時若是發現全部 hash 函數對應位都是 1 說明存在,很明顯這個過程並不保證查找的結
果是 100%正確的。同時也不 支持刪除一個已經插入的關鍵字,由於該關鍵字對應的位會
牽動到其餘的關鍵字。因此一個簡單的改進就是 counting Bloom filter,用一個 counter
數組代替位數組,就能夠支持刪除了。
還有一個比較重要的問題,如何根據輸入元素個數 n,肯定位數組 m 的大小及 hash 函數 個
數。當 hash 函數個數 k=(ln2)*(m/n)時錯誤率最小。在錯誤率不大於 E 的狀況下,m 至少
要等於 n*lg(1/E)才能表示任意 n 個元素的集 合。但 m 還應該更大些,由於還要保證 bit
數組裏至少一半爲 0,則 m 應該>=nlg(1/E)*lge 大概就是 nlg(1/E)1.44 倍(lg 表示以 2 爲
底的對數)。
舉個例子咱們假設錯誤率爲 0.01,則此時 m 應大概是 n 的 13 倍。這樣 k 大概是 8 個。
注意這裏 m 與 n 的單位不一樣,m 是 bit 爲單位,而 n 則是以元素個數爲單位(準確的說是不
同元素的個數)。一般單個元素的長度都是有不少 bit 的。因此使用 bloom filter 內存上通
常都是節省的。
擴展:
Bloom filter 將集合中的元素映射到位數組中,用 k(k 爲哈希函數個數)個映射位是否全
1 表示元素在不在這個集合中。Counting bloom filter(CBF)將位數組中的每一位擴展爲
一個 counter,從而支持了元素的刪除操做。Spectral Bloom Filter(SBF)將其與集合元
素的出現次數關聯。SBF 採用 counter 中的最小值來近似表示元素的出現頻率。
問題實例:給你 A,B 兩個文件,各存放 50 億條 URL,每條 URL 佔用 64 字節,內存限制是
4G,讓你找出 A,B 文件共同的 URL。若是是三個乃至 n 個文件呢?
根據這個問題咱們來計算下內存的佔用,4G=2^32 大概是 40 億*8 大概是 340 億,n=50
億,若是按出錯率 0.01 算須要的大概是 650 億個 bit。如今可用的是 340 億,相差並很少,
這樣可能會使出錯率上升些。另外若是這些 urlip 是一一對應的,就能夠轉換成 ip,則大
大簡單了。
2、Hashing
適用範圍:快速查找,刪除的基本數據結構,一般須要總數據量能夠放入內存
基本原理及要點:
hash 函數選擇,針對字符串,整數,排列,具體相應的 hash 方法。
碰撞處理,一種是 open hashing,也稱爲拉鍊法;另外一種就是 closed hashing,也稱開
地址法,opened addressing。
擴展:
d-left hashing 中的 d 是多個的意思,咱們先簡化這個問題,看一看 2-left hashing。2-left
hashing 指的是將一個哈希表分紅長度相等的兩半,分別叫作 T1 和 T2,給 T1 和 T2 分別
配備一個哈希函數,h1 和 h2。在存儲一個新的 key 時,同 時用兩個哈希函數進行計算,
QQ942609288????,???????QQ??
QQ942609288????,???????QQ??
編者 QQ:1040195253 38
得出兩個地址 h1[key]和 h2[key]。這時須要檢查 T1 中的 h1[key]位置和 T2 中的 h2[key]
位置,哪個 位置已經存儲的(有碰撞的)key 比較多,而後將新 key 存儲在負載少的位
置。若是兩邊同樣多,好比兩個位置都爲空或者都存儲了一個 key,就把新 key 存儲在左
邊的 T1 子表中,2-left 也由此而來。在查找一個 key 時,必須進行兩次 hash,同時查找
兩個位置。
問題實例:
1).海量日誌數據,提取出某日訪問百度次數最多的那個 IP。
IP 的數目仍是有限的,最多 2^32 個,因此能夠考慮使用 hash 將 ip 直接存入內存,而後
進行統計。
3、bit-map
適用範圍:可進行數據的快速查找,判重,刪除,通常來講數據範圍是 int 的 10 倍如下
基本原理及要點:使用 bit 數組來表示某些元素是否存在,好比 8 位電話號碼
擴展:bloom filter 能夠看作是對 bit-map 的擴展
問題實例:
1)已知某個文件內包含一些電話號碼,每一個號碼爲 8 位數字,統計不一樣號碼的個數。
8 位最多 99 999 999,大概須要 99m 個 bit,大概 10 幾 m 字節的內存便可。
2)2.5 億個整數中找出不重複的整數的個數,內存空間不足以容納這 2.5 億個整數。
將 bit-map 擴展一下,用 2bit 表示一個數便可,0 表示未出現,1 表示出現一次,2 表示
出現 2 次及以上。或者咱們不用 2bit 來進行表示,咱們用兩個 bit-map 便可模擬實現這個
2bit-map。
4、堆
適用範圍:海量數據前 n 大,而且 n 比較小,堆能夠放入內存
基本原理及要點:最大堆求前 n 小,最小堆求前 n 大。方法,好比求前 n 小,咱們比較當
前 元素與最大堆裏的最大元素,若是它小於最大元素,則應該替換那個最大元素。這樣最
後獲得的 n 個元素就是最小的 n 個。適合大數據量,求前 n 小,n 的大小比較 小的狀況,
這樣能夠掃描一遍便可獲得全部的前 n 元素,效率很高。
擴展:雙堆,一個最大堆與一個最小堆結合,能夠用來維護中位數。
問題實例:
1)100w 個數中找最大的前 100 個數。
用一個 100 個元素大小的最小堆便可。
5、雙層桶劃分—-其實本質上就是【分而治之】的思想,重在「分」的技巧上!
適用範圍:第 k 大,中位數,不重複或重複的數字
基本原理及要點:由於元素範圍很大,不能利用直接尋址表,因此經過屢次劃分,逐步肯定
範圍,而後最後在一個能夠接受的範圍內進行。能夠經過屢次縮小,雙層只是一個例子。
擴展:
問題實例:
1).2.5 億個整數中找出不重複的整數的個數,內存空間不足以容納這 2.5 億個整數。
有點像鴿巢原理,整數個數爲 2^32,也就是,咱們能夠將這 2^32 個數,劃分爲 2^8 個區
域(好比用單個文件表明一個區域),而後將數據分離到不一樣的區域,而後不一樣的區域在利用
bitmap 就能夠直接解決了。也就是說只要有足夠的磁盤空間,就能夠很方便的解決。
2).5 億個 int 找它們的中位數。
編者 QQ:1040195253 40
這個例子比上面那個更明顯。首先咱們 將 int 劃分爲 2^16 個區域,而後讀取數據統計落
到各個區域裏的數的個數,以後咱們根據統計結果就能夠判斷中位數落到那個區域,同時知
道這個區域中的第 幾大數恰好是中位數。而後第二次掃描咱們只統計落在這個區域中的那
些數就能夠了。
實際上,若是不是 int 是 int64,咱們能夠通過 3 次這樣的劃分便可下降到能夠接受 的程度。
便可以先將 int64 分紅 2^24 個區域,而後肯定區域的第幾大數,在將該區域分紅 2^20 個
子區域,而後肯定是子區域的第幾大數,而後子區域裏 的數的個數只有 2^20,就能夠直
接利用 direct addr table 進行統計了。
6、數據庫索引
適用範圍:大數據量的增刪改查
基本原理及要點:利用數據的設計實現方法,對海量數據的增刪改查進行處理。
7、倒排索引(Inverted index)
適用範圍:搜索引擎,關鍵字查詢
基本原理及要點:爲什麼叫倒排索引?一種索引方法,被用來存儲在全文搜索下某個單詞在一
個文檔或者一組文檔中的存儲位置的映射。
以英文爲例,下面是要被索引的文本:
T0 = 「it is what it is」
T1 = 「what is it」
T2 = 「it is a banana」
咱們就能獲得下面的反向文件索引:
「a」: {2}
「banana」: {2}
「is」: {0, 1, 2}
「it」: {0, 1, 2}
「what」: {0, 1}
檢索的條件」what」,」is」和」it」將對應集合的交集。
正向索引開發出來用來存儲每一個文檔的單詞的列表。正向索引的查詢每每知足每一個文檔有序
頻繁的全文查詢和每一個單詞在校驗文檔中的驗證這樣的查詢。在正向索引中,文檔佔據了中
心的位置,每一個文檔指向了一個它所包含的索引項的序列。也就是說文檔 指向了它包含的
那些單詞,而反向索引則是單詞指向了包含它的文檔,很容易看到這個反向的關係。
擴展:
問題實例:文檔檢索系統,查詢那些文件包含了某單詞,好比常見的學術論文的關鍵字搜索。
8、外排序
適用範圍:大數據的排序,去重
基本原理及要點:外排序的歸併方法,置換選擇敗者樹原理,最優歸併樹
擴展:
問題實例:
1).有一個 1G 大小的一個文件,裏面每一行是一個詞,詞的大小不超過 16 個字節,內存限
制大小是 1M。返回頻數最高的 100 個詞。
這個數據具備很明顯的特色,詞的大小爲 16 個字節,可是內存只有 1m 作 hash 有些不夠,
因此能夠用來排序。內存能夠當輸入緩衝區使用。
9、trie 樹
適用範圍:數據量大,重複多,可是數據種類小能夠放入內存
基本原理及要點:實現方式,節點孩子的表示方式
擴展:壓縮實現。
問題實例:
1).有 10 個文件,每一個文件 1G,每一個文件的每一行都存放的是用戶的 query,每一個文件的
query 均可能重複。要你按照 query 的頻度排序。
2).1000 萬字符串,其中有些是相同的(重複),須要把重複的所有去掉,保留沒有重複的字符
串。請問怎麼設計和實現?
3).尋找熱門查詢:查詢串的重複度比較高,雖然總數是 1 千萬,但若是除去重複後,不超
過 3 百萬個,每一個不超過 255 字節。
10、分佈式處理 mapreduce
適用範圍:數據量大,可是數據種類小能夠放入內存
基本原理及要點:將數據交給不一樣的機器去處理,數據劃分,結果歸約。
擴展:
問題實例:
1).The canonical example application of MapReduce is a process to count the
appearances of
each different word in a set of documents:
2).海量數據分佈在 100 臺電腦中,想個辦法高效統計出這批數據的 TOP10。
3).一共有 N 個機器,每一個機器上有 N 個數。每一個機器最多存 O(N)個數並對它們操做。如
何找到 N^2 個數的中數(median)?
經典問題分析
上千萬 or 億數據(有重複),統計其中出現次數最多的前 N 個數據,分兩種狀況:可一次讀
入內存,不可一次讀入。
可用思路:trie 樹+堆,數據庫索引,劃分子集分別統計,hash,分佈式計算,近似統計,
外排序
所謂的是否能一次讀入內存,實際上應該指去除重複後的數據量。若是去重後數據能夠
放入內存,咱們能夠爲數據創建字典,好比經過 map,hashmap,trie,而後直接進行統
計便可。固然在更新每條數據的出現次數的時候,咱們能夠利用一個堆來維護出現次數最多
的前 N 個數據,當 然這樣致使維護次數增長,不如徹底統計後在求前 N 大效率高。
若是數據沒法放入內存。一方面咱們能夠考慮上面的字典方法可否被改進以適應這種情
形,能夠作的改變就是將字典存放到硬盤上,而不是內存,這能夠參考數據庫的存儲方法。
固然還有更好的方法,就是能夠採用分佈式計算,基本上就是 map-reduce 過程, 首
先能夠根據數據值或者把數據 hash(md5)後的值,將數據按照範圍劃分到不一樣的機子,最
好可讓數據劃分後能夠一次讀入內存,這樣不一樣的機子負責處 理各類的數值範圍,實際
上就是 map。獲得結果後,各個機子只需拿出各自的出現次數最多的前 N 個數據,而後匯
總,選出全部的數據中出現次數最多的前 N 個數 據,這實際上就是 reduce 過程。
QQ942609288????,???????QQ??
QQ942609288????,???????QQ??
編者 QQ:1040195253 44
實際上可能想直接將數據均分到不一樣的機子上進行處理,這樣是沒法獲得正確的解的。
由於一個數據可能被均分到不一樣的機子上,而另外一個則可能徹底彙集到一個機子上,同時還
可能存在具備相同數目的數據。好比咱們要找出現次數最多的前 100 個,我 們將 1000 萬
的數據分佈到 10 臺機器上,找到每臺出現次數最多的前 100 個,歸併以後這樣不能保證
找到真正的第 100 個,由於好比出現次數最多的第 100 個可能有 1 萬個,可是它被分到了
10 臺機子,這樣在每臺上只有 1 千 個,假設這些機子排名在 1000 個以前的那些都是單獨
分佈在一臺機子上的,好比有 1001 個,這樣原本具備 1 萬個的這個就會被淘汰,即便咱們
讓每臺機子選 出出現次數最多的 1000 個再歸併,仍然會出錯,由於可能存在大量個數爲
1001 個的發生彙集。所以不能將數據隨便均分到不一樣機子上,而是要根據 hash 後的值將
它們映射到不一樣的機子上處理,讓不一樣的機器處理一個數值範圍。
而外排序的方法會消耗大量的 IO,效率不會很高。而上面的分佈式方法,也能夠用於
單機版本,也就是將總的數據根據值的範圍,劃分紅多個不一樣的子文件,而後逐個處理。處
理完畢以後再對這些單詞的及其出現頻率進行一個歸併。實際上就能夠利用一個外排序的歸
並過程。
另外,還能夠考慮近似計算,也就是咱們能夠經過結合天然語言屬性,只將那些真正實
際中出現最多的那些詞做爲一個字典,使得這個規模能夠放入內存。
十6、來自 aboutyun 的面試題 6 道:
1.說說值對象與引用對象的區別?
2.談談你對反射機制的理解及其用途?
3.ArrayList、Vector、LinkedList 的區別及其優缺點?HashMap、HashTable 的區別及其
優缺點?
3.列出線程的實現方式?如何實現同步?
4.sql 題,是一個圖表,具體忘了
5.列出至少五種設計模式?用代碼或 UML 類圖描述其中兩種設計模式的原理?
6.談談你最近正在研究的技術,談談你最近項目中用到的技術難點及其解決思路。
十7、來自巴圖提供的算法面試題 1 道:
用戶手機號 出現的地點 出現的時間 逗留的時間
111111111 2 2014-02-18 19:03:56.123445 133
222222222 1 2013-03-14 03:18:45.263536 241
333333333 3 2014-10-23 17:14:23.176345 68
222222222 1 2013-03-14 03:20:47.123445 145
333333333 3 2014-09-15 15:24:56.222222 345
222222222 2 2011-08-30 18:13:58.111111 145
222222222 2 2011-08-30 18:18:24.222222 130
按時間排序
指望結果是:
222222222 2 2011-08-30 18:13:58.111111 145
222222222 2 2011-08-30 18:18:24.222222 130
222222222 1 2013-03-14 03:18:45.263536 24
111111111 ~~~~~~~~
333333333 ~~~~~~~
QQ942609288????,???????QQ??
QQ942609288????,???????QQ??
編者 QQ:1040195253 46
十8、來自象夫提供的面試題 7 道:
Hdfs:
1.文件大小默認爲 64M,改成 128M 有啥影響?
2.RPC 原理?
3.NameNode 與 SecondaryNameNode 的區別與聯繫?
MapReduce:
4.介紹 MadpReduce 整個過程,好比把 WordCount 的例子的細節將清楚(重點講解
Shuffle)?
5.對 Hadoop 有沒有調優經驗,沒有什麼使用心得?(調優從參數調優講起)
6.MapReduce 出現單點負載多大,怎麼負載平衡?(能夠用 Partitioner)
7.MapReduce 怎麼實現 Top10?
十9、來自 mo•mo•ring 提供的面試題 13 道:
xxxx 軟件公司
1.你勝任該職位有什麼優點
2.java 優點及緣由(至少 3 個)
3.jvm 優化
4.寫一個冒泡程序
5.hadoop 底層存儲設計
6.職業規劃
xxx 網絡公司
1.數據庫
1.1 第一範式,第二範式和第三範式
1.2 給出兩張數據表,優化表(具體字段不記得了,是關於商品定單和供應商方面的)
1.3 以你的實際經驗,說下怎樣預防全表掃描
2.網絡七層協議
3.多線程
4.集合 HashTable 和 HashMap 區別
5.操做系統碎片
6.zookeeper 優勢,用在什麼場合
7.Hbase 中的 metastore 用來作什麼的?
二10、來自 Clouds 提供的面試題 18 道:
1,在線安裝 ssh 的命令以及文件解壓的命令?
2,把公鑰都追加到受權文件的命令?該命令是否在 root 用戶下執行?
3,HadoopHA 集羣中哥哥服務的啓動和關閉的順序?
4,HDFS 中的 block 塊默認保存幾份?默認大小多少?
5,NameNode 中的 meta 數據是存放在NameNode 自身,仍是 DataNode 等其餘節點?
DatNOde 節點自身是否有 Meta 數據存在?
6,下列那個程序一般與 NameNode 在一個節點啓動?
7,下面那個程序負責 HDFS 數據存儲?
8, 在 HadoopHA 集羣中國 Zookeeper 的主要做用,以及啓動和查看狀態的命令?
9, HBase 在進行模型設計時重點在什麼地方?一張表中國定義多少個 Column Family
QQ942609288????,???????QQ??
QQ942609288????,???????QQ??
編者 QQ:1040195253 48
最合適?爲何?
10,如何提升 HBase 客戶端的讀寫性能?請舉例說明。
11,基於 HadoopHA 集羣記性 MapReduce 開發時,Configuration 如何設置
hbase.zookeeper,quorum 屬性的值?
12, 在 hadoop 開發過程當中使用過哪些算法?其應用場景是什麼?
13, MapReduce 程序如何發佈?若是 MapReduce 中涉及到了第三方的 jar 包,該如何
處理?
14, 在實際工做中使用過哪些集羣的運維工具,請分別闡述期做用。
15, hadoop 中 combiner 的做用?
16, IO 的原理,IO 模型有幾種?
17, Windows 用什麼樣的模型,Linux 用什麼樣的模型?
18,一臺機器如何應對那麼多的請求訪問,高併發到底怎麼實現,一個請求怎麼產生的,
在服務端怎麼處理的,最後怎麼返回給用戶的,整個的環節操做系統是怎麼控制的?
二11、來自****提供的面試題 11 道:
1.hdfs 的 client 端,複製到第三個副本時宕機,hdfs 怎麼恢復保證下次寫第三副本?block
塊信息是先寫 dataNode 仍是先寫 nameNode?
2.快排現場寫程序實現?
3.jvm 的內存是怎麼分配原理?
4.毒酒問題---1000 桶酒,其中 1 桶有毒。而一旦吃了,毒性會在 1 周後發做。問最少須要
多少隻老鼠可在一週內找出毒酒?
5.用棧實現隊列?
QQ942609288????,???????QQ??
QQ942609288????,???????QQ??
編者 QQ:1040195253 49
6.鏈表倒序實現?
7.多線程模型怎樣(生產,消費者)?平時併發多線程都用哪些實現方式?
8.synchonized 是同步悲觀鎖嗎?互斥?怎麼寫同步提升效率?
9.4 億個數字,找出哪些重複的,要用最小的比較次數,寫程序實現。
10.java 是傳值仍是傳址?
11.java 處理多線程,另外一線程一直等待?
二12、來自****提供的面試題 18 道:
1.一個網絡商城 1 天大概產生多少 G 的日誌?
2.大概有多少條日誌記錄(在不清洗的狀況下)?
3.日訪問量大概有多少個?
4.註冊數大概多少?
5.咱們的日誌是否是除了 apache 的訪問日誌是否是還有其餘的日誌?
6.假設咱們有其餘的日誌是否是能夠對這個日誌有其餘的業務分析?這些業務分析都有什
麼?
七、問:大家的服務器有多少臺?
八、問:大家服務器的內存多大?
九、問:大家的服務器怎麼分佈的?(這裏說地理位置分佈,最好也從機架方面也談談)
十、問:你日常在公司都幹些什麼(一些建議)
下面是 HBASE 我很是不懂的地方:
十一、hbase 怎麼預分區?
QQ942609288????,???????QQ??
QQ942609288????,???????QQ??
編者 QQ:1040195253 50
十二、hbase 怎麼給 web 前臺提供接口來訪問(HTABLE 能夠提供對 HTABLE 的訪問,可是
怎麼查詢同一條記錄的多個版本數據)?
1三、.htable API 有沒有線程安全問題,在程序中是單例仍是多例?
1四、咱們的 hbase 大概在公司業務中(主要是網上商城)大概都幾個表,幾個表簇,大概
都存什麼樣的數據?
1五、hbase 的併發問題?
下面的 Storm 的問題:
1六、metaq 消息隊列 zookeeper 集羣 storm 集羣(包括 zeromq,jzmq,和 storm 自己)
就能夠完成對商城推薦系統功能嗎?還有沒有其餘的中間件?
1七、storm 怎麼完成對單詞的計數?(我的看完 storm 一直都認爲他是流處理,好像沒有
積攢數據的能力,都是處理完以後直接分發給下一個組件)
1八、storm 其餘的一些面試常常問的問題?
二十3、飛哥(hadoop 月薪 13k)提供的面試題 18 道:
一、大家的集羣規模?
開發集羣:10 臺(8 臺可用)8 核 cpu
二、大家的數據是用什麼導入到數據庫的?導入到什麼數據庫?
處理以前的導入:經過 hadoop 命令導入到 hdfs 文件系統
處理完成以後的導出:利用 hive 處理完成以後的數據,經過 sqoop 導出到 mysql 數據庫
中,以供報表層使用。
三、大家業務數據量多大?有多少行數據?(面試了三家,都問這個問題)
開發時使用的是部分數據,不是全量數據,有將近一億行(八、9 千萬,具體不詳,通常開
QQ942609288????,???????QQ??
QQ942609288????,???????QQ??
編者 QQ:1040195253 51
發中也沒人會特別關心這個問題)
四、大家處理數據是直接讀數據庫的數據仍是讀文本數據?
將日誌數據導入到 hdfs 以後進行處理
五、大家寫 hive 的 hql 語句,大概有多少條?
不清楚,我本身寫的時候也沒有作過統計
六、大家提交的 job 任務大概有多少個?這些 job 執行完大概用多少時間?(面試了三家,都
問這個問題)
沒統計過,加上測試的,會與不少
七、hive 跟 hbase 的區別是?
八、你在項目中主要的工做任務是?
利用 hive 分析數據
九、你在項目中遇到了哪些難題,是怎麼解決的?
某些任務執行時間過長,且失敗率太高,檢查日誌後發現沒有執行完就失敗,緣由出在
hadoop 的 job 的 timeout 太短(相對於集羣的能力來講),設置長一點便可
十、你本身寫過 udf 函數麼?寫了哪些?
這個我沒有寫過
十一、你的項目提交到 job 的時候數據量有多大?(面試了三家,都問這個問題)
不清楚是要問什麼
十二、reduce 後輸出的數據量有多大?
1三、一個網絡商城 1 天大概產生多少 G 的日誌? 4tb
1四、大概有多少條日誌記錄(在不清洗的狀況下)? 7-8 百萬條
1五、日訪問量大概有多少個?百萬
QQ942609288????,???????QQ??
QQ942609288????,???????QQ??
編者 QQ:1040195253 52
1六、註冊數大概多少?不清楚 幾十萬吧
1七、咱們的日誌是否是除了 apache 的訪問日誌是否是還有其餘的日誌?關注信息
1八、假設咱們有其餘的日誌是否是能夠對這個日誌有其餘的業務分析?這些業務分析都有
什麼?
二十4、來自 aboutyun 提供的面試題 1 道:
有一千萬條短信,有重複,以文本文件的形式保存,一行一條,有重複。
請用 5 分鐘時間,找出重複出現最多的前 10 條。
分析:
常規方法是先排序,在遍歷一次,找出重複最多的前 10 條。可是排序的算法複雜度最低爲
nlgn。
能夠設計一個 hash_table, hash_map<string, int>,依次讀取一千萬條短信,加載到
hash_table 表中,而且統計重複的次數,與此同時維護一張最多 10 條的短信表。
這樣遍歷一次就能找出最多的前 10 條,算法複雜度爲 O(n)。
二十5、北京-南桑(hadoop 月薪 12k)提供的面試題 5 道:
一、job 的運行流程(提交一個 job 的流程)?
二、Hadoop 生態圈中各類框架的運用場景?
三、還有不少的選擇題
四、面試問到的
hive 中的壓縮格式 RCFile、TextFile、SequenceFile 各有什麼區別?
以上 3 種格式同樣大的文件哪一個佔用空間大小..等等
QQ942609288????,???????QQ??
QQ942609288????,???????QQ??
編者 QQ:1040195253 53
還有 Hadoop 中的一個 HA 壓縮。
五、假如:Flume 收集到的數據不少個小文件,我須要寫 MR 處理時將這些文件合併
(是在 MR 中進行優化,不讓一個小文件一個 MapReduce)
他們公司主要作的是中國電信的流量計費爲主,專門寫 MR。
二十6、來自炎帝初始化提供的面試題 2 道:
如下題目沒必要都作完,挑最擅長的便可。
題一:RTB 廣告 DSP 算法大賽
請按照大賽的要求進行相應的建模和分析,並詳細記錄整個分析處理過程及各步驟成果物。
算法大賽主頁:http://contest.ipinyou.com/cn/index.shtml
算法大賽數據下載地址:
http://pan.baidu.com/share/link?shareid=1069189720&uk=3090262723#dir
題二:cookieID 識別
咱們有 M 個用戶 N 天的的上網日誌:詳見 58.sample
字段結構以下:
ip string 客戶端 IP
ad_id string 寬帶 ADSL 帳號
time_stamp string 上網開始時間
url string URL
ref string referer
ua string User Agent
dest_ip string 目標 IP
cookie string cookie
day_id string 日期
58.com 的 cookie 值如:
bangbigtip2=1; bdshare_firstime=1374654651270;
CNZZDATA30017898=cnzz_eid%3D2077433986-1374654656-http%253A%252F%252Fsh.58.com
%26ntime%3D1400928250%26cnzz_a%3D0%26ltime%3D1400928244483%26rtime%3D63;
Hm_lvt_f5127c6793d40d199f68042b8a63e725=1395547468,1395547513,1395758399,13957594
68; id58=05dvZ1HvkL0TNy7GBv7gAg==;
Hm_lvt_3bb04d7a4ca3846dcc66a99c3e861511=1385294705;
__utma=253535702.2042339925.1400424865.1400424865.1400928244.2;
__utmz=253535702.1400424865.1.1.utmcsr=(direct)|utmccn=(direct)|utmcmd=(none); city=sh;
pup_bubble=1; __ag_cm_=1400424864286; myfeet_tooltip=end; ipcity=sh%7C%u4E0A%u6D77
QQ942609288????,???????QQ??
QQ942609288????,???????QQ??
編者 QQ:1040195253 54
其中有一個屬性能標識一個用戶,咱們稱之爲 cookieID。
請根據樣例數據分析出 58.com 的 cookieID。
要求詳細描述分析過程。
二十7、來自 aboutyun 提供的面試題 7 道:
一、解釋「hadoop」和「hadoop 生態系統」兩個概念。
二、說明 Hadoop 2.0 的基本構成。
三、相比於 HDFS1.0, HDFS 2.0 最主要的改進在哪幾方面?
四、試使用「步驟 1,步驟 2,步驟 3…..」說明 YARN 中運行應用程序的基本流程。
五、「MapReduce 2.0」與「YARN」是否等同,嘗試解釋說明。
六、MapReduce 2.0 中,MRAppMaster 主要做用是什麼,MRAppMaster 如何實現任務
容錯的?
七、爲何會產生 yarn,它解決了什麼問題,有什麼優點?
二十8、來天然月枕流君提供的面試題 6 道:
一、集羣多少臺,數據量多大,吞吐量是多大,天天處理多少 G 的數據?
二、自動化運維瞭解過嗎,大家是不是自動化運維管理?
三、數據備份,大家是多少份,若是數據超過存儲容量,大家怎麼處理?
四、怎麼提高多個 JOB 同時執行帶來的壓力,如何優化,說說思路?
五、大家用 HBASE 存儲什麼數據?
六、大家的 hive 處理數據能達到的指標是多少?
QQ942609288????,???????QQ??
QQ942609288????,???????QQ??
編者 QQ:1040195253 55
二十9、來自夏天提供的面試題 1 道:
一、 請說說 hadoop1 的 HA 如何實現?
三10、來自楓林木雨提供的面試題 18 道:
QQ942609288????,???????QQ??
QQ942609288????,???????QQ??
編者 QQ:1040195253 56