一、如何檢查namenode是否正常運行?重啟namenode的命令是什么?
通過節點信息和瀏覽器查看,通過腳本監控
hadoop-daemon.sh start namenode
hdfs-daemon.sh start namenode
二、hdfs存儲機制是怎樣的?
1) client端發送寫文件請求,namenode檢查文件是否存在,如果已存在,直接返回錯誤信息,否則,發送給client一些可用namenode節點
2) client將文件分塊,並行存儲到不同節點上datanode上,發送完成后,client同時發送信息給namenode和datanode
3) namenode收到的client信息后,發送確信信息給datanode
4) datanode同時收到namenode和datanode的確認信息后,提交寫操作。
三、hadoop中combiner的作用是什么?
當map生成的數據過大時,帶寬就成了瓶頸,怎樣精簡壓縮傳給Reduce的數據,又不影響最終的結果呢。有一種方法就是使用Combiner,Combiner號稱本地的Reduce,Reduce最終的輸入,是Combiner的輸出。
四、 你們數據庫怎么導入hive 的,有沒有出現問題
在導入hive的時候,如果數據庫中有blob或者text字段,會報錯,解決方案在sqoop筆記中。在將數據由Oracle數據庫導入到Hive時,發現帶有clob字段的表的數據會錯亂,出現一些字段全為NULL的空行。
由於在項目中CLOB字段沒有實際的分析用途,因此考慮將CLOB字段去掉。
同時,為了防止CLOB字段產生一些問題,因此將HIVE中CLOB字段禁用,禁用的方式如下:
[Hadoop@master sqoop-1.4.5]$ cd $SQOOP_HOME/conf
[hadoop@master conf]$ vi oraoop-site.xml
將以下屬性的注釋去掉,並且將value改為true
oraoop.import.omit.lobs.and.long
true
If true, OraOop will omit BLOB, CLOB, NCLOB and LONG columns during an Import.
有些表中雖然有clob字段,但是不能排除掉,因為其他字段使我們所需要,因此在導入的時候采用指定--columns的方式來進行導入
sqoop import --hive-import --hive-database test --create-hive-table --connect jdbc --username user--password user
--bindir //scratch --outdir /Java --table aaa --columns "ID,NAME" -m 1 --null-string '\\N' --null-non-string '\\N'
五、hdfs-site.xml的3個主要屬性?
dfs.name.dir決定的是元數據存儲的路徑以及DFS的存儲方式(磁盤或是遠端)
dfs.data.dir決定的是數據存儲的路徑
fs.checkpoint.dir用於第二Namenode
1. ConcurrentHashMap 是怎么實現的?
答:concurrent 包中線程安全的哈希表,采用分段鎖,可以理解為把一個大的 Map 拆分成 N 個小的 HashTable,根據 key.hashCode() 來決定把 key 放到哪個 HashTabl 中。在 ConcurrentHashMap 中,就是把 Map 分成了 N 個 Segment,put 和 get 的時候,都是現根據 key.hashCode() 算出放到哪個 Segment 中。
2. sparksql 和 sparkstreaming 哪個比較熟
答:都還行,SparkSql 的 DataFrame 或者 DataSet 和 SparkStreaming 的 DStream 都是基於SparkCore 的,最終都會轉化為 Sparktask 執行。我們可以交流一下本質的東西 SparkCore,而SparkCore 的核心又是 RDD。
3. 說一下 sparkshuffle
答:Spark 的 shuffle 也是一處理問題的思想:分而治之。shuffle 一般稱為洗牌,一般會有Shuffle。
Write 階段 和 Shuffle
Read 階段。在 Spark 中實現 Shuffle 的方式有兩種,一種是 HashShuffle,一種是 SortShuffle。shuffle 的性能是影響 spark 應用程序性能的關鍵。shuffle 發生在 stage 之間,stage 中用的 pipline 的計算模式。
4. Spark Shuffle 的調優點:
1:Shuffle 的選擇 2:緩沖區的大小 3:拉去的數據量的大小 4:間隔時間重試次數。
5. 緩存這塊熟悉嗎,介紹緩存級別
答:Spark 的緩存機制是 Spark 優化的一個重要點,它將需要重復使用或者共用的 RDD 緩存在內存中,可以提高 Spark 的性能。Spark 的底層源碼中使用 StorageLevel 來表示緩存機制,其中包括:使用內存,使用磁盤,使用序列化,使用堆外內存。在他的半生對象中基於這幾種方式提供了一些實現:不使用緩存,Memory_Only,Disk_only,offHeap 分別都有相應的序列化,副本,組合的實現提供選擇。持久化的級別 StorageLevel 可以自定義,但是一般不自定義。如何選擇 RDD 的緩存級別的本質是在內存的利用率和 CPU 的利用率之間的權衡。一般默認選擇的是 Memory_only, 其次是 Memery_only_Ser, 再次是 Memory_only_and_Dis 至於怎么選擇你得自己權衡。
6. 說一下 cache 和 checkpoint 的區別
答:要知道區別,首先要知道實現的原理和使用的場景 catche 的就是將共用的或者重復使用的 RDD 按照持久化的級別進行緩存 checkpoint 的是將業務場景非常長的邏輯計算的中間結果緩存到 HDFS 上,它的實現原理是:
首先找到 stage 最后的 finalRDD,然后按照 RDD 的依賴關系進行回溯,找到使用了 checkPoint 的 RDD 然后標記這個使用了 checkPoint 的 RDD 重新的啟動一個線程來將 checkPoint 之前的 RDD 緩存到 HDFS 上面最后將 RDD 的依賴關系從 checkPoint 的位置切斷知道了實現的原理和使用場景后我們就很容易的知道了 catch 和 checkpoint 的區別了。
7. spark 運行模式 local local[] local[*] 分別是什么
答:該模式被稱為 Local[N] 模式,是用單機的多個線程來模擬 Spark 分布式計算,通常用來驗證開發出來的應用程序邏輯上有沒有問題其中N代表可以使用 N 個線程,每個線程擁有一個 core 。如果不指定 N,則默認是1個線程(該線程有1個 core )。如果是 local[*],則代表 Run Spark locally with as many worker threads as logical cores on your machine: 在本地運行Spark,與您的機器上的邏輯內核一樣多的工作線程。
8. Spark 怎么設置垃圾回收機制 ?
答:Spark 中各個角色的JVM參數設置:http://blog.csdn.net/wuxb2000/article/details/52870198 1)Driver 的 JVM 參數: GC 方式,如果是 yarn-client 模式,默認讀取的是 spark-class 文件中的 JAVAOPTS;如果是 yarn-cluster 模式,則讀取的是 spark-default.conf 文件中的 spark.driver.extraJavaOptions 對應的參數值。 (2)Executor 的 JVM 參數: GC 方式,兩種模式都是讀取的是 spark-default.conf 文件中的spark.executor.extraJavaOptions 對應的 JVM 參數值。
9. 一台節點上以 root 用戶執行一個 spark 程序,以其他非 root 用戶也同時在執行一個 spark 程序,這時以 spark 用戶登錄,這個節點上,使用 Jps 會看到哪些線程?
答:單獨的用戶只能看自己的進程
10. hive 怎么解決數據傾斜的問題?
參考博客:https://www.cnblogs.com/ggjucheng/archive/2013/01/03/2842860.html 本質:使 map 的輸出數據更均勻的分布到 reduce 中去,是我們的最終目標
11. 數據傾斜的原因:
key 分布不均勻 業務數據本身的欠缺性 建表設計方法不對 有些 SQL 難免會有一下數據傾斜不可避免 表現的形式: 任務完成進度卡死在99%,或者進度完成度在100%但是查看任務監控,發現還是有少量(1個或幾個)reduce 子任務未完成。因為其處理的數據量和其他 reduce 差異過大。單一reduce 的記錄數與平均記錄數差異過大,通常可能達到3倍甚至更多。 最長時長遠大於平均時長。
解決方案: 參數調整: hive.map.aggr=true: Map 端部分聚合,相當於 Combiner hive.groupby.skewindata=true: 有數據傾斜的時候進行負載均衡,當選項設定為 true,生成的查詢計划會有兩個 MR Job。第一個 MR Job 中,Map 的輸出結果集合會隨機分布到 Reduce 中,每個 Reduce 做部分聚合操作,並輸出結果,這樣處理的結果是相同的 Group By Key 有可能被分發到不同的 Reduce 中,從而達到負載均衡的目的;第二個 MR Job 再根據預處理的數據結果按照 Group By Key 分布到 Reduce 中(這個過程可以保證相同的 Group By Key 被分布到同一個 Reduce 中),最后完成最終的聚合操作。 2:參數調節: 如何 Join: 關於驅動表的選取,選用 join key 分布最均勻的表作為驅動表 做好列裁剪和 filter 操作,以達到兩表做 join 的時候,數據量相對變小的效果 大小表 Join: 使用 map join 讓小的維度表(1000條以下的記錄條數) 先進內存。在 map 端完成 reduce. 大表 Join 大表: 把空值的 key 變成一個字符串加上隨機數,把傾斜的數據分到不同的 reduce 上,由於 null值關聯不上,處理后並不影響最終結果 count distinct 大量相同特殊值 count distinct 時,將值為空的情況單獨處理,如果是計算 count distinct,可以不用處理,直接過濾,在最后結果中加1。如果還有其他計算,需要進行 group by,可以先將值為空的記錄單獨處理,再和其他計算結果進行 union。 group by 維度過小: 采用 sum() group by 的方式來替換 count(distinct) 完成計算。 特殊情況特殊處理: 在業務邏輯優化效果的不大情況下,有些時候是可以將傾斜的數據單獨拿出來處理。最后 union 回去。 如果確認業務需要這樣傾斜的邏輯,考慮以下的優化方案: 總結: 1、對於 join,在判斷小表不大於1 G 的情況下,使用 map join 2、對於 group by 或 distinct,設定 hive.groupby.skewindata=true 3、盡量使用上述的 SQL 語句調節進行優化
12. 如果鏈表的實現方式中 hash 的值有沖突的話,怎么解決?如果解決以后怎么解決再鏈表的常數次的查詢?
答案:使用鏈表來存儲重復的 hash 值,如何對鏈表進行常數次的查找,需要將鏈表+隨機數再 hash
13. HDFS 的讀寫流程細節?HDFS 中的 fsimage 里面存儲的是什么信息?副本的存放策略?
答:這個大家最好回家准備一個詳細的流程圖然后根據自己的圖講給面試官看
14. HDFS 的機架感知?
答:根據副本的存放策略,HDFS 是如何知道多個不同 node 是否在同一個機架上呢 ?在namenode 啟動時如果 net.topology.script.file.name 配置的參數不為空,表示已經動機架感知,當 datanode 注冊時和 heartbeat 時,會把 datanode 的 ip 作為參數傳入,返回信息為此datanode 的機架信息。如果沒有參數配置,datanode 統一為默認的機架 /default-rack
15. 如果 Client 節點就在 HDFS 中的一台 DataNode 節點上,副本的數據又是如何存儲的?
答案:存放在當前的 DN 上,其他的和副本的存放的策略一樣,第二個副本存放在和第一個副本不同的機架上的節點上,第三個副本存放在同第二個副本相同的機架的不同的節點上
16. Spark 的提交方式?
答案:不管是提交到 yarn 上面還是提交到 standalone 上都分為 Client 的方式提交和 Cluster 的方式提交
17. 項目的模型訓練和項目的准確度是多少?
答:一般在項目的初期准確度一般在百分之85左右就可以了,這個精准度還要根據業務的不斷調整去不斷的調節
18. 項目組多少人?怎么分工的?薪水多少?項目中你負責那一塊?
答:這一塊大家可以根據要面試的公司規模來提前准備幾十人幾百人分組都可以,但是薪水一定不要說滴,如果你是10k的工資去面試30k的崗位人家首先會對你產生懷疑的。
19. 手寫冒泡排序和二分查找?
這個建議大家在去面試之前一定要牢牢的記住怎么寫,起碼要自己能加拿大的寫一個小的demo,這樣才能在面試官面前書寫流暢。
20. 如何將一個標題等在一千萬數據中進行進行 Top10 的推薦?
答案:標題向量化,數據清洗和降維,計算相似度,推薦
21. kafka 用到了什么
答:消息持久化,消息批量發送,消息有效期,負載均衡方面都可以說,同步異步的問題,但是一定要挑自己熟悉的說
22. hadoop 支持三種調度器
答:先進先出的調度器:最早的 hadoop 采用的是 FIFO(默認-先進先出的)調度器調度用戶提交的作業。作業按照提交的順序被調度,作業必須等待輪詢到自己才能運行。 但是考慮到公平在多用戶之間分配資源,設置了作業的優先級功能,但是不支持搶占式的。
公平調度器:公平調度器的目標是讓每一個用戶公平的共享集群能力,充分的利用閑置的任務槽,采用“讓用戶公平的共享集群”的方式分配資源。作業放在作業池之中,每個用戶擁有自己的作業池。提交的作業越多並不會因此獲得更多的資源,公平調度器支持搶占式的機制,一個作業池中若沒有公平的共享資源,則會將多余的資源空出來。
容量調度器:集群中很多的隊列組成的,這些隊列具有一定的層次結構,每個隊列都有一定的容量。每個隊列的內部支持 FIIFO 方式。本質上容量調度器允許用戶或則組織模擬出一個使用 FIFO 調度策略的獨立 MApReduce 集群
23. 編寫 mapreduce 的方式:
java 編寫-常用 Hadoop Streaming:使用 unix 標准的輸入和輸出流作為 hadooop 和應用程序之間的接口,支持像Ruby,python 等不同的編程語言編寫 map 和 reduce Hadoop Pipes 是 hadoop 提供的 C++ 的接口的名稱
24. hive 保存元數據的方式有三種:
1:自帶的內存數據庫 Derby 方式保存,只支持單個會話,挺小,不常用
2:本地 mysql :常用本地調用 3:Remote 遠程 mysql 方式:遠程調用
25. hadoop 二級排序:
hadoop 默認的是對 key 進行排序,如果想要再對 value 進行排序,那么就要使用:二級排序 二級排序的方式: 1:將 reduce 接收到的 value-list 的值緩存,然后做 reduce 內排序,再寫出,這樣排序速度快一些,由於value-list 的數據可能很龐大,可能會造成內存的溢出 2:將值的一部分或則整個部分加入 key ,生成一個合並的可以。生成組合 key 的過程很簡單。我們需要先分析一下,在排序時需要把值的哪些部分考慮在內,然后,把它們加進 key 里去。隨后,再修改 key 類的 compareTo 方法或是 Comparator 類,確保排序的時候使用這個組合而成的 key。
26. 內部表&外部表
hive 的內部表和外部表的區別是 hive 的內部表是由 hive 自己管理的,外部表只是管理元數據,當刪除數據的時候,內部表會連數據和元數據全部刪除,而外部表則只會刪除元數據,數據依然存放在 hdfs 中。外部表相對來說更加的安全一些,數據的組織也更加的靈活一些,方便共享源數據
下面來點數據結構方面的題轉換一下思路 手寫數據結構和算法:比較重要,基礎中的基礎
27. 冒泡排序
private static void bubbleSort(int [] array){ int temp=0; for(int i=0;i<array.length-1;i++){ for(int j=0;j<array.length-1-i;j++){ if(array[j+1]<array[j]){ temp=array[j] array[j]=array[j+1]; array[j+1]=temp; }}}}
28. 二分查找
public static int binarySearch(int srcArray,int des){ int low=0; int height=srcArray.length-1; while(low<=height){ int middle=(low+height)/2; if(des==srcArray[middle]){ return middle; }else if(des<srcArray[middle]){ height=middle-1; }else{ low=middle+1; } } return -1; }
29. 遞歸的方式實現:
public static int binarySearch(int[] dataset;int data,int beginIndex,int endIndex){ int midIndex=(beginIndex+endIndex)/2; if(data<dataset[beginIndex] || data>dataset[endIndex] || beginIndex>endIndex){ return -1; } if(data<dataset[midIndex]){ return binarySearch(dataset,data,beginIndex,midelIndex-1); }else if(data>dataset[midIndex]){ return binarySearch(dataset,data,midIndex+1,endIndex); }else{ return midIndex; } }
30. 單鏈表反轉
class ListNode { int val; ListNode next; ListNode(int x) { val = x; } } public static ListNode reverseList(ListNode head){ ListNode prev=null; while(head != null){ ListNode temp=head.next; head.next=prev; prev =head; head =temp; } return prev; }
31. 插入排序:
初始時假設第一個記錄自成一個有序序列,其余記錄為無序序列。接着從第二個記錄開始,按照記錄的大小依次將當前處理的記錄插入到其之前的有序序列中,直至最后一個記錄插入到有序序列中為止
public static void insertSort(int[] a){ int temp; for(int i=1;i<a.length;i++){ for(int j=i;j>0;j--){ if(a[j-1]>a[j]){ temp=a[j-1] a[j-1]=a[j] a[j]=temp } } } }
32. 選擇排序:
把最小或者最大的選擇出來 對於給定的一組記錄,經過第一輪比較后得到最小的記錄,然后將該記錄與第一個記錄的位置進行交換;接着對不包括第一個記錄以外的其他記錄進行第二輪比較,得到最小的記錄並與第二個記錄進行位置交換;重復該過程,直到進行比較的記錄只有一個時為止。
public static void selectSort(int[] a){ if (a == null || a.length <= 0) { return; } for(int i=0;i<a.length;i++){ int min=i; for(int j=i+1;j<a.length;j++){ if(a[j]<a[min]){ min=j; } } if (i != min) { int tmp = a[min]; a[min] = a[i]; a[i] = tmp; } } }
數據結構在面試方面基本上就是這些內容,下面繼續給大家展示一下有關 hive/hbase 方面的面試題
33. 你認為用 Java、streaming、pipe 方式開發 map/reduce , 各有哪些優點
就用過 java 和 hiveQL。 Java 寫 mapreduce 可以實現許多復雜的邏輯思維,但是一旦對於簡單的需求來說太過於繁瑣。
HiveQL 基本的針對對象是 hive 上的表,但是一旦遇到很復雜的邏輯的話就去實很難去實現。對於語句書寫方面來說還是很簡單的。
34. hive 有哪些方式保存元數據,各有哪些優點
三種:自帶內嵌數據庫 derby,挺小,不常用,最致命的是只能用於單節點。
35. 請簡述 hadoop 怎樣實現二級排序(對 key 和 value 雙排序)
第一種方法是,Reducer 將給定 key 的所有值都緩存起來,然后對它們在 Reduce 內部做一個內排序。但是,由於 Reducer 需要緩存給定 key 的所有值,數據量多的話可能會導致內存不足。
第二種方法是,將值的一部分或整個值鍵入到原始 key 中,重新組合成一個新的 key 。這兩種方法各有各的特點,第一種方法編寫簡單,但是需要較小的並發度,數據量大的話可能會造成內存耗盡卡死的狀態。 第二種方法則是將排序的任務交給 MapReduce 框架進行 shuffle,更符合 Hadoop/Reduce 的設計思想。
36. 請簡述 mapreduce 中的 combine 和 partition 的作用
答:combiner 是發生在 map 的最后一個階段,其原理也是一個小型的 reducer,主要作用是減少輸出到 reduce 的數據量,提高網絡傳輸瓶頸,提高 reducer 的執行效率。 partition 的主要作用將 map 階段產生的所有 k,v 對分配給不同的 reducer task 處理,可以將 reduce 階段的處理負載進行分攤。
37. hive 內部表和外部表的區別
Hive 向內部表導入數據時,會將數據移動到數據倉庫指向的路徑;若是外部表,用戶在建表的時候就要確定表的位置 在刪除表的時候,內部表的元數據和數據會被一起刪除, 而外部表只刪除元數據,不刪除數據。 這樣外部表相對來說更加安全些,數據組織也更加靈活,方便共享源數據。
38. Hbase 的 rowKey 怎么創建比較好?
答:rowkey 的設計一定要有規則並且有序,常用的一些 rowkey 一定要連續連續,並且 rowkey的設計規則最好加入以后要查詢的規則在里面方便日后校對查詢。
39. 列族的創建:
根據業務的特點對數據進行歸類。
40. 用 mapreduce 怎么處理數據傾斜問題
本質:讓各個分區的數據均勻分布,並且根據自己的業務特點設置合適的 partition 策略,具體的設置方法可以上網查詢一下,這里就不過多的介紹了。如果事先不知道業務數據的分布規律,只能利用隨機抽樣之后生成 partition 策略后再做處理
41. hadoop 框架怎么來優化
答:可以從很多方面來進行:比如 hdfs,mapreduce,yarn 的 job 調度,hbase,hive 可以優化的有太多地方了,具體要在哪里優化只能看你數據的特點了,根據真實場景來判斷。
42. hbase 內部機制是什么
答:Hbase 是一個能適應聯機業務的數據庫系統 物理存儲:hbase 的持久化數據是存放在 hdfs 上 存儲管理:一個表是划分為很多 region 的,這些 region 分布式地存放在很多 regionserver 上
版本管理:hbase 中的數據更新本質上是不斷追加新的版本,通過 compact 操作來做版本間的文件合並 Region 的 split 集群管理:zookeeper + hmaster(職責) + hregionserver(職責)
43. 我們在開發分布式計算 job 的時候,是否可以去掉 reduce 階段
答:可以,如果不涉及到有關數據的計算的話還是可以省才去 mapreduce 階段的
44. hadoop 中常用的數據壓縮算法
答:Lzo,Gzip,Default,Snapyy 如果要是對數據進行壓縮的話最好將數據轉化一下:quenceFile 或者 Parquet File(spark)
45. mapreduce 的作業調度模式
答: 公平調度器:為每個任務分配資源的方法,按照作業的優先級高低,再按照到達時間的先后選擇被執行的作業
46. hive 底層與數據庫交互原理
答:Hive 的查詢功能是由 hdfs 和 mapreduce 結合起來實現的,對於大規模數據查詢還是不建議在 hive 中,因為過大數據量會造成查詢十分緩慢。 Hive 與 mysql 的關系:只是借用 mysql 來存儲 hive 中的表的元數據信息,稱為 metastore
47. 現場出問題測試 mapreduce 掌握情況和 hive 的 ql 語言掌握情況
答:這個就要看大家的功底了,現場問題我也想不出來。
48. datanode 在什么情況下不會備份數據
答:在客戶端上傳文件時指定文件副本數量為1,但是基本我們做大數據都是設置副本的數量是,這個還要根據自己公司的情況而定。
49. combine 合並出現在哪個過程
答:shuffle 過程中具體來說,combine 之不過是一個特殊的 reduce 而已,並且發生在本地,累加 map 里面 key 的值然后發給 reduce 處理
50. hdfs 的體系結構
答:集群架構:
namenode datanode secondarynamenode journalnode zkfc 這個是簡單的基本架構,在文章末尾我會找一下架構圖形提供給大家參考。
51. flush 的過程
答:flush 是在內存的基礎上進行的,首先寫入文件的時候,會先將文件寫到內存中,當內存寫滿的時候,一次性的將文件全部都寫到硬盤中去保存,並清空緩存中的文件,
52. 什么是隊列
答:就是一種簡單的調度策略,先來先進,先進先出
53. Spark 都有什么算子?
答案:map,reducebykey,filter,mapPartition,flatmap,cogroup,foreach,first,take, join, sortBy,distinct,等等
54. List 與 set 的區別
答:List 和 Set 都是接口。他們各自有自己的實現類,有無順序的實現類,也有有順序的實現類。 最大的不同就是 List 是可以重復的。而Set是不能重復的。 List 適合經常追加數據,插入,刪除數據。但隨即取數效率比較低。 Set 適合經常地隨即儲存,插入,刪除。但是在遍歷時效率比較低。
55. 數據的三范式
答: 第一范式()無重復的列 第二范式(2NF)屬性完全依賴於主鍵 [消除部分子函數依賴] 第三范式(3NF)屬性不依賴於其它非主屬性 [消除傳遞依賴]
56. 三個 datanode 中當有一個 datanode 出現錯誤時會怎樣?
答:Namenode 會第一時間通過心跳發現 datanode 下線,並且通過副本策略將這個 datanode 上的block 快重新發送分配到集群中並且重新復制一份保持每個 block 塊的副本數量不變。在此同事運維團隊一定要第一時間被通知到處理這個問題,盡快維修上線
57. sqoop 在導入數據到 mysql 中,如何不重復導入數據,如果存在數據問題,sqoop 如何處理?
答:FAILED java.util.NoSuchElementException 此錯誤的原因為 sqoop 解析文件的字段與 MySql 數據庫的表的字段對應不上造成的。因此需要在執行的時候給 sqoop 增加參數,告訴 sqoop 文件的分隔符,使它能夠正確的解析文件字段。 hive 默認的字段分隔符為 '\001'
58. MapReduce 優化經驗
答:1.設置合理的 map 和 reduce 的個數。合理設置塊的大小,要注意一個任務對應一個 map 2避免數據傾斜,合理分配數據對應的 key,盡量對 sql 進行優化 3 combine 函數 4 對數據進行壓縮處理,必要的時候對數據進行拆分。 5小文件處理優化:事先合並成大文件,combineTextInputformat,在 hdfs 上用 mapreduce 將小文件合並成 SequenceFile 大文件(key: 文件名,value:文件內容),並且要定期在非工作時間做一次大合並,但是要提前估算好工作量,因為大合並期間所有任務是沒辦法執行的。 6參數優化,具體什么參數比較多大家可以自行百度。
59. 請列舉出曾經修改過的 /etc/ 下面的文件,並說明修改要解決什么問題?
答:/etc/profile 這個文件,主要是用來配置環境變量。讓 hadoop 命令可以在任意目錄下面執行。但是每個開發人員都有自己的目錄設置習慣,這個需要根據自己的習慣具體來回答。 /ect/sudoers /etc/hosts /etc/sysconfig/network /etc/inittab
60. 請描述一下開發過程中如何對上面的程序進行性能分析,對性能分析進行優化的過程。
61. 現有 1 億個整數均勻分布,如果要得到前 1K 個最大的數,求最優的算法。
參見《海量數據算法面試大全》
62. mapreduce 的大致流程
答:主要分為八個步驟
- 對文件進行切片,提前想好塊的大小如何分配
- 啟動相應數量的 maptask 進程
- 調用 FileInputFormat 中的 RecordReader,讀一行數據並封裝為 k1v1
- 調用自定義的 map 函數,並將 k1v1 傳給 map,一個任務對應一個 map
- 收集 map 的輸出,進行分區和排序,這塊要注意優化。
- reduce task 任務啟動,並從 map 端拉取數據
- reduce task 調用自定義的 reduce 函數進行處理
- 調用 outputformat 的 recordwriter 將結果數據輸出
63. 搭建 hadoop 集群 , master 和 slaves 都運行哪些服務
答:master 是主節點,slaves 是從節點
64. hadoop 運行原理
答:hadoop 的主要由兩部分組成,HDFS 和 mapreduce,HDFS 就是把數據進行分塊存儲。 Mapreduce 的原理就是使用 JobTracker 和 TaskTracke r來進行作業的執行。Map 就是將任務展開,reduce 是匯總處理后的結果。簡單的來說就是提交一個 jar 包,這個時候需要 mapreduce 來處理。
65. HDFS 存儲機制
答:HDFS 主要是一個分布式的文件存儲系統,由 namenode 來接收用戶的操作請求,然后根據文件大小,以及定義的 block 塊的大小,將大的文件切分成多個 block 塊來進行保存,這里存在的優化問題點比較多,前期處理不好可能會造成后期的數據傾斜比較嚴重。
66. 舉一個例子說明 mapreduce 是怎么運行的。
自帶的實例 Wordcount,但是最好是自己准備一個寫熟了的例子。
67. 如何確認 hadoop 集群的健康狀況
答:有完善的集群監控體系(ganglia,nagios) Hdfs dfsadmin –report Hdfs haadmin –getServiceState nn1
選擇題(此部分來源於網絡篩選)
68. 下面哪個程序負責 HDFS 數據存儲。 答案 C
a) NameNode b) Jobtracker c) Datanode d) secondaryNameNode e) tasktracker
69. HDfS 中的 block 默認保存幾份? 答案 A
a) 3 份 b)2 份 c) 1 份 d) 不確定
70. 下列哪個程序通常與 NameNode 在一個節點啟動?
a) SecondaryNameNode b) DataNode c) TaskTracker d) Jobtracker e) zkfc
71. Hadoop 作者 答案 D
a) Martin Fowler b) Kent Beck c) Doug cutting
72. HDFS 默認 Block Size 答案 B
a) 32MB b) 64MB c) 128MB
73. 下列哪項通常是集群的最主要瓶頸 答案 D
a) CPU b)網絡 c)磁盤 d)內存
74. 關於 SecondaryNameNode 哪項是正確的? 答案 C
a) 它是 NameNode 的熱備
b) 它對內存沒有要求 c) 它的目的是幫助 NameNode 合並編輯日志,減少 NameNode 啟動時間 d) SecondaryNameNode 應與 NameNode 部署到一個節點
75. 配置機架感知[M3] 的下面哪項正確 答案 ABC
a) 如果一個機架出問題,不會影響數據讀寫 b) 寫入數據的時候會寫到不同機架的 DataNode 中 c) MapReduce 會根據機架獲取離自己比較近的網絡數據
76. Client 端上傳文件的時候下列哪項正確 答案 BC
a) 數據經過 NameNode 傳遞給 DataNode b) Client 端將文件切分為 Block,依次上傳 c) Client 只上傳數據到一台 DataNode,然后由 NameNode 負責 Block 復制工作
77. 下列哪個是 Hadoop 運行的模式 答案 ABC
a )單機版 b) 偽分布式 c) 分布式
78. Cloudera 提供哪幾種安裝 CDH 的方法 答案 ABCD
a )Cloudera manager b) Tar ball c) Yum d) Rpm
判斷題(此部分來源於網絡篩選):
79. Ganglia 不僅可以進行監控,也可以進行告警。( X )
80. Block Size 是不可以修改的。( X )
81. Nagios 不可以監控 Hadoop 集群,因為它不提供 Hadoop 支持。( X )
82. 如果 NameNode 意外終止, SecondaryNameNode 會接替它使集群繼續工作。( X )
83. Cloudera CDH 是需要付費使用的。( X )
84. Hadoop 是 Java 開發的,所以 MapReduce 只支持 Java 語言編寫。( X )
85. Hadoop 支持數據的隨機讀寫。(X )
86. NameNode 負責管理 metadata, client 端每次讀寫請求,它都會從磁盤中讀取或則 會寫入 metadata 信息並反饋 client 端。(X )
87. NameNode 本地磁盤保存了 Block 的位置信息。(X )
88. DataNode 通過長連接與 NameNode 保持通信。( X )
89. Hadoop 自身具有嚴格的權限管理和安全措施保障集群正常運行。(X )
90. Slave節點要存儲數據,所以它的磁盤越大越好。(X )
91. hadoop dfsadmin –report 命令用於檢測 HDFS 損壞塊。( X)
92. Hadoop 默認調度器策略為 FIFO( X)
93. 集群內每個節點都應該配 RAID,這樣避免單磁盤損壞,影響整個節點運行。(X )
94. 因為 HDFS 有多個副本,所以 NameNode 是不存在單點問題的。(X )
95. 每個 map 槽(進程)就是一個線程。(X )
96. Mapreduce 的 input split 就是一個 block。(X )
97. NameNode的默認 Web UI 端口是 50030,它通過 jetty 啟動的 Web 服務。(X )
98. Hadoop 環境變量中的 HADOOP_HEAPSIZE 用於設置所有 Hadoop 守護線程的內存。它默認是200 GB。( X )
99. DataNode 首次加入 cluster 的時候,如果 log中報告不兼容文件版本,那需要 NameNode執行“Hadoop namenode -format ”操作格式化磁盤。(X )
100. 面試面試官問了你們每天有多少數據,用了多少台機器
答: 一般根據你寫的項目,每天產生的數據量規划,假如一天數據量100G 一般集群 規划是年數據量的3倍還要多一點這樣算下來大概需要60台左右的機器才能保障運行。
101. 每天運行多久
答:一般一個作業10分鍾到-幾個小時不等 一般一個作業也就幾十分鍾。。運行幾天的很少
102. 有多少個 MR
答:30-50個左右 一般公司很多個作業。。 你可以說你們部門的,其他你不清楚就別說,,相應你簡歷上寫的項目,很多模板都有作業。。細化一下 比如推薦的作業,統計匯總的作業,用戶定位的作業
103. 遇到 bug 怎么解決,上線之后的 bug 怎么解決
答:一般在測試階段就那部分線上數據測試過了。。 如果在線上還有問題一般 kill 掉作業。。當然可以做 mapreduce 里面設計日志輸出到單獨文件,, 根據 hadoop 異常日志出什么問題了。。當然 hadoop 每台都會有日志,當然 hadoop 自己的日子很龐大,可以采用 chukwa(大概看看干什么的就行,就是收集方便查看 hadoop 本身的日志)處理然后分析作業代碼。
104. 有沒有關心過運行時候的狀態
答:mapreduce 運行狀態,hadoop 有監控頁面,當然也可以自己寫監控程序,mapreduce 有作業監聽方法,可以獲取進度。
105. 每台機器的負載
答:采用 ganglia,nagios,zabbix 監控工具監控機器磁盤,內存,cpu 你只需要回答采用這些弄得 具體運維部弄得。當然你研究過會更好
106. 寬窄依賴?
答:除了父 RDD 和子 RDD 一對多外,其他的都是窄依賴
107. spark on yarn 和 mapreduce 中 yarn 有什么區別?
答:沒有什么區別,yarn 就是一種任務調度框架
108. spark 運行的 job 在哪里可以看到?
答: 一般是在 WEBUI 上 查看,如果問具體怎么配置的可以推到運維人員身上
109. 用 scala 寫一個 wordcount ?
object ScalaWordCount { def main(args: Array[String]): Unit = { val lines = List("hello java hello python","hello scala","hello scala hello java hello scala") // 切塊 val words = lines.flatMap(_.split(" ")) // 生成pair val tuples = words.map((_,1)) // k,v分組 val grouped = tuples.groupBy(_._1) val sumed = grouped.mapValues(_.size) // 排序 val sorted = sumed.toList.sortBy(_._2) // 降序 val result = sorted.reverse println(result) } }
110. 對 scala 的了解 有用過 play framework 框架嗎
答:是一個純java框架,可以進行快速開發,開發周期較短,並且能夠快速建立一個java web所需要的所有內容。
111. scala 中的隱式函數的關鍵字?
答:implicit
112. val x=y=1 結果是什么?
答:會報錯
113. 編譯好的 scala 程序,運行的時候還需要 scala 環境嗎?
答:不需要
下面是我在網絡上找的思維導圖,介紹的比較詳細,大家可以認真的看一下
114. 機器學習
115. 數據結構與算法
116. 畫下項目的架構圖介紹下項目?介紹下你做的哪些方面?
答:這個大家最好提前自己畫一畫,這樣每一步對應的數據流程都是你自己最熟悉的,這樣才顯的最真實,特別是沒有從事過大數據行業的人難免會心里發虛。我在文章的最上部簡單的畫了一下架構圖,大家可以照着參考一下。
117. 介紹下 kafka 容錯性
kafka 不像集群最少需要三台機器,假如有三個 kafka,如果壞了兩個,那么剩下的一個就是主 leader,並且依然正常運行,這就是kafka 的容錯性
118. zookeeper 原子廣播協議
這個協議的英文名字是 ZooKeeper Atomic Broadcast,這個協議的主要作用是保證大數據分布的一致性,通過主備方式保證副本的一致性。
119. hbase 優化 rowkey 設計
答:rowkey 的作用一般是用來檢索數據用的無非有幾種方式,按照某個固定的鍵值對進行檢索,或者在一定范圍內進行掃描,因為rowkey 是按照字典序存儲的,所以在設計 rowkey 的時候要充分的利用這一點,把經常要查詢的數據設計在一起,並且可以加上時間戳也是一個辦法。
120. 內部表外部表的區別 hdfs 數據導入到 hive 的語法
答:首先我們來講一下建表時的不同,在創建內部表的時候,數據的指向會指向數倉的路徑,但是在創建外部表的時候,僅僅只是記錄數據的一個路徑,數據不會像數倉移動,數據的位置不會改變。 我們再討論刪除表的不同,那就是在刪除內部表的同時,元數據和數據都會被一起刪除,而在刪除外部表的時候只刪除元數據並不會刪除數據,相比之下外部表還是比較靈活的。 至於從 hdfs 導入 hive 的語法我舉個例子:load data inpath '/////' into table test;
121. spark 提交任務的流程
在這里我找了一個網圖,相信看圖來的更加直接一些。
122. cache 和 persist 的區別
答:cache 只有一個緩存級別可以設置,但是 persist 可以設置多個級別的緩存級別。
123.reduceBykey 和 groupByKey哪個快?
當然是 reduceBykey 比較快,在到 reduce 端之前會對要傳輸的結果進行一個本地的 merge,這樣到達 reduce端的數據就會大幅度的減少,而 groupbykey 會對每一個過來的 RDD 進行一個序列化,並且這個過程是發生在 reduce 端進行執行的,所以會造成一旦數據量過大的時候會造成內存溢出等麻煩,所以建議還是盡量少用比較好。
124. 隨便寫一個算法
答:在這里我就說一下一般會用到哪些算法,至於每個算法的 demo 大家可以自行百度一下,常用的有推薦算法(CB,CF),分類算法(SVM,NB),聚類算法(層次聚類,K-means),回歸算法。
125. 工廠模式
答:工廠模式一般分為三種: 簡單工廠模式、工廠方法模式、抽象工廠模式
126. hive on spark 了解過嗎?
答:說實話 hive on spark 跟 hive 沒有多大的關系,只不過 hive 一直在用MR這樣在數據量龐大的時候就造成速度過慢的情況,這個時候就要將邏輯轉換成 RDD 模式,這樣在集群中跑的話速度明顯就上來了,只不過就是繼續延續了hive的標准而已。
127. udf 和 uda f寫過嗎?有什么區別?有一個場景,用 udf 實現一個字段自增怎么弄?
答:這塊涉水比較深,建議大家對答案簡單掠過就好,UDF 是自定義函數,一般是一進一出,而 UDFA 是自定義聚合函數,多進一出。 這個字段自增我就找了一個模板讓大家借鑒一下,最好在面試之前自己准備一下。 import org.apache.hadoop.hive.ql.exec.Description; import org.apache.hadoop.hive.ql.exec.UDF; import org.apache.hadoop.hive.ql.udf.UDFType; import org.apache.hadoop.io.LongWritable; /* * UDF RowSequence */ @Description(name = "autosequence", value = "FUNC_() - Returns a generated row sequence number starting from 1") @UDFType(deterministic = false) public class RowSequence extends UDF { private LongWritable result = new LongWritable(); public RowSequence(){ result.set(0); } public LongWritable evaluate(){ result.set(result.get() + 1); return result; } }
128. kafka 數據落地磁盤有哪些好處?
答:1、緩存由 linux 本身進行維護 2、磁盤的順序讀寫速度完勝內存讀寫速度 3、避免占用內存過大的情況 4、不懼怕系統冷啟動
129. storm 的容錯機制
在非 nimbus 服務器有節點故障時,nimbus 會將這些 task 任務分配出去,比如 worker 掛掉時會快速失敗,並且能保障消息完整性的實現機制。
130. 怎么優化 shffle
答:hashshufflemanager 可以開啟 consolidate 機制、bypass 運行機制、或者修改一些參數如下 spark.shuffle.file.buffer spark.reducer.maxSizeInFlight spark.shuffle.io.maxRetries spark.shuffle.io.retryWait spark.shuffle.memoryFraction spark.shuffle.manager spark.shuffle.sort.bypassMergeThreshold spark.shuffle.consolidateFiles
131. rdd 怎么轉 dataFrame
答:可以通過反射的方式來推斷元數據,因為 RDD 本身是沒有元數據的,通過反射就可以了解這些元數據並且進一步轉換成 dtaframe
132. OOM 的原因?
答:首先可以分析一下這個是棧溢出還是堆溢出,然后再根據溢出類型進一步分析是什么原因。
133. 問我 spark、jdk、scala 的版本
JDK:1.8 SPARK:2.2.0 SCALA:2.11.8 HADOOP:2.6.5
134.zookeeper 腦裂
答:腦裂就是在當只有兩台 cluster 的時候,會選擇一個作為 master 但是如果這兩台機器存在通信問題的話就會產生兩個 master,這就是腦裂。zookeeper 一般會采用 quorums 的方式,只有當集群超過半數的時候才會投票選舉出一個 master 來保障集群的可用性。
135. 多線程有幾種創建方式?
1、runnable 創建 threa 線程 2、callable 創建線程 3、thread 創建線程 4、exctor 創建線程池
136. 代碼怎么確定二叉樹的高度?
答:可以用后序遍歷二叉樹,層次遍歷二叉樹,遞歸遍歷二叉樹
137. 為什么選擇 kafka kafka 為什么快
答:因為kafka是落地磁盤,順序讀取磁盤的速度要遠高於內存讀取。
138. spark 和 storm 的區別?
答:storm是對大量的小型數據塊進行處理,並且是動態數據 spark一般是對大量數據進行進行全集處理,並且側重傳輸數據的過程
139. persist 和 checkpoint 的區別
答:persits一般是將數據持久化到磁盤上但是一旦進程被停掉的話,在磁盤上的數據也會同時被清空 而checkpoint 是將 RDD 持久化到 HDFS 上的,如果不手動刪除的話是一直存在的。
140. spark 和 mapreduce 的對比
答:MR 一般處理大量數據的時候一般會存在高延遲,浪費時間,對於一些有時間要求的業務就很不適合。但是如果用 spark 處理的話就非常快了,特別是對於實時動態處理的過程。
下面我會針對人事簡歷方面的問題總結一下我的想法
141. 對於項目問題如何寫簡歷
答:千萬不要寫一堆配置信息,人家以為你是搞運維的,並且最好寫一些公司的大數據項目,之前的一些java項目就不要往上寫了,並且一定要寫技術細節,業務場景,業務模塊,一定要寫自己最熟悉的。
142. 為什么要從上家公司離職?
答:千萬不要說:上家公司外包太累、加班太多、領導不好,可以從技術發展的角度去談
143. 面試完,面試官問你有什么還需要問我的問題
答:盡量請教一些技術問題,最好在面試前就針對公司的業務介紹准備一些問題,切記千萬不要問錄用不錄用的問題,對於期望的薪資如果技術回答的不錯可以適當的多要一點,一般三年工作經驗的都在 16K 以上。
144. 面試和復習問題
答:面試后回家應該立馬寫總結,今天問了哪些問題,哪些沒有回答好,哪些問題都沒聽過,對應自己的簡歷進行修改更新。寫簡歷就要把自己當成面試官。
145. 專業技能要有側重點
答:對於自己熟悉的技能要有自己的側重點,比如 spark 很熟,着重寫spark的着重點,寫上簡歷的一定要會,否則面試官可能認為你在欺騙他。
146. 是否有自己的博客,個人的技術棧
答:一定要寫這一項,這一項說明你熱愛技術,善於學習總結,樂於分享,並且利用自己的業余時間投入到自己的事業當中。
147. 專業技能,至少寫的有層次感
答:分塊寫:比如 1) 按層次寫 2) 比如hadoop 3) 實時計算 4) 機器學習 5) 編程語言等等
148. 簡歷
答:寫清楚工作經歷 每個時間段,在哪個公司工作,什么職位 項目名稱: 寫為 XXX公司XXX系統或平台(必須帶上公司名稱) 項目架構:寫清楚使用到那些技術 比如 flume+kafka+hadoop+hbase+mapreduce+spark等等 總體人數:10人 項目描述:根據項目解決問題,一共有哪些功能寫,功能不一定要寫你都做過,因為這里只是描述 責任描述: 你負責的模塊,寫大的功能,不要寫實現細節 解決問題:描述這個問題即可,怎么解決,面試的時候去說 項目最好設計 以 storm spark mahout 相關