答:concurrent 包中線程安全的哈希表,採用分段鎖,能夠理解爲把一個大的 Map 拆分紅 N 個小的 HashTable,根據 key.hashCode() 來決定把 key 放到哪一個 HashTabl 中。在 ConcurrentHashMap 中,就是把 Map 分紅了 N 個 Segment,put 和 get 的時候,都是現根據 key.hashCode() 算出放到哪一個 Segment 中。html
答:都還行,SparkSql 的 DataFrame 或者 DataSet 和 SparkStreaming 的 DStream 都是基於SparkCore 的,最終都會轉化爲 Sparktask 執行。咱們能夠交流一下本質的東西 SparkCore,而SparkCore 的核心又是 RDD。java
答:Spark 的 shuffle 也是一處理問題的思想:分而治之。shuffle 通常稱爲洗牌,通常會有Shuffle。node
Write 階段 和 Shufflepython
Read 階段。在 Spark 中實現 Shuffle 的方式有兩種,一種是 HashShuffle,一種是 SortShuffle。shuffle 的性能是影響 spark 應用程序性能的關鍵。shuffle 發生在 stage 之間,stage 中用的 pipline 的計算模式。mysql
答:(1):Shuffle 的選擇 (2):緩衝區的大小 (3):拉去的數據量的大小 (4):間隔時間重試次數。linux
答:Spark 的緩存機制是 Spark 優化的一個重要點,它將須要重複使用或者共用的 RDD 緩存在內存中,能夠提升 Spark 的性能。Spark 的底層源碼中使用 StorageLevel 來表示緩存機制,其中包括:使用內存,使用磁盤,使用序列化,使用堆外內存。在他的半生對象中基於這幾種方式提供了一些實現:不使用緩存,Memory_Only,Disk_only,offHeap 分別都有相應的序列化,副本,組合的實現提供選擇。持久化的級別 StorageLevel 能夠自定義,可是通常不自定義。如何選擇 RDD 的緩存級別的本質是在內存的利用率和 CPU 的利用率之間的權衡。通常默認選擇的是 Memory_only, 其次是 Memery_only_Ser, 再次是 Memory_only_and_Dis 至於怎麼選擇你得本身權衡。ios
答:要知道區別,首先要知道實現的原理和使用的場景 catche 的就是將共用的或者重複使用的 RDD 按照持久化的級別進行緩存 checkpoint 的是將業務場景很是長的邏輯計算的中間結果緩存到 HDFS 上,它的實現原理是: 首先找到 stage 最後的 finalRDD,而後按照 RDD 的依賴關係進行回溯,找到使用了 checkPoint 的 RDD 而後標記這個使用了 checkPoint 的 RDD 從新的啓動一個線程來將 checkPoint 以前的 RDD 緩存到 HDFS 上面最後將 RDD 的依賴關係從 checkPoint 的位置切斷知道了實現的原理和使用場景後咱們就很容易的知道了 catch 和 checkpoint 的區別了。web
答:該模式被稱爲 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,與您的機器上的邏輯內核同樣多的工做線程。面試
答: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 參數值。算法
答:單獨的用戶只能看本身的進程
參考博客:https://www.cnblogs.com/ggjucheng/archive/2013/01/03/2842860.html 本質:使 map 的輸出數據更均勻的分佈到 reduce 中去,是咱們的最終目標
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 回去。 若是確認業務須要這樣傾斜的邏輯,考慮如下的優化方案: 總結: 一、對於 join,在判斷小表不大於1 G 的狀況下,使用 map join 二、對於 group by 或 distinct,設定 hive.groupby.skewindata=true 三、儘可能使用上述的 SQL 語句調節進行優化
答案:使用鏈表來存儲重複的 hash 值,如何對鏈表進行常數次的查找,須要將鏈表+隨機數再 hash
答:這個你們最好回家準備一個詳細的流程圖而後根據本身的圖講給面試官看
答:根據副本的存放策略,HDFS 是如何知道多個不一樣 node 是否在同一個機架上呢 ?在namenode 啓動時若是 net.topology.script.file.name 配置的參數不爲空,表示已經動機架感知,當 datanode 註冊時和 heartbeat 時,會把 datanode 的 ip 做爲參數傳入,返回信息爲此datanode 的機架信息。若是沒有參數配置,datanode 統一爲默認的機架 /default-rack
答案:存放在當前的 DN 上,其餘的和副本的存放的策略同樣,第二個副本存放在和第一個副本不一樣的機架上的節點上,第三個副本存放在同第二個副本相同的機架的不一樣的節點上
答案:無論是提交到 yarn 上面仍是提交到 standalone 上都分爲 Client 的方式提交和 Cluster 的方式提交
答:通常在項目的初期準確度通常在百分之85左右就能夠了,這個精準度還要根據業務的不斷調整去不斷的調節
答:這一塊你們能夠根據要面試的公司規模來提早準備幾十人幾百人分組均可以,可是薪水必定不要說滴,若是你是10k的工資去面試30k的崗位人家首先會對你產生懷疑的。
這個建議你們在去面試以前必定要緊緊的記住怎麼寫,起碼要本身能加拿大的寫一個小的demo,這樣才能在面試官面前書寫流暢。
答案:標題向量化,數據清洗和降維,計算類似度,推薦
答:消息持久化,消息批量發送,消息有效期,負載均衡方面均可以說,同步異步的問題,可是必定要挑本身熟悉的說
答:先進先出的調度器:最先的 hadoop 採用的是 FIFO(默認-先進先出的)調度器調度用戶提交的做業。做業按照提交的順序被調度,做業必須等待輪詢到本身才能運行。 可是考慮到公平在多用戶之間分配資源,設置了做業的優先級功能,可是不支持搶佔式的。
公平調度器:公平調度器的目標是讓每個用戶公平的共享集羣能力,充分的利用閒置的任務槽,採用「讓用戶公平的共享集羣」的方式分配資源。做業放在做業池之中,每一個用戶擁有本身的做業池。提交的做業越多並不會所以得到更多的資源,公平調度器支持搶佔式的機制,一個做業池中若沒有公平的共享資源,則會將多餘的資源空出來。
容量調度器:集羣中不少的隊列組成的,這些隊列具備必定的層次結構,每一個隊列都有必定的容量。每一個隊列的內部支持 FIIFO 方式。本質上容量調度器容許用戶或則組織模擬出一個使用 FIFO 調度策略的獨立 MApReduce 集羣
java 編寫-經常使用 Hadoop Streaming:使用 unix 標準的輸入和輸出流做爲 hadooop 和應用程序之間的接口,支持像Ruby,python 等不一樣的編程語言編寫 map 和 reduce Hadoop Pipes 是 hadoop 提供的 C++ 的接口的名稱
1:自帶的內存數據庫 Derby 方式保存,只支持單個會話,挺小,不經常使用 2:本地 mysql :經常使用本地調用 3:Remote 遠程 mysql 方式:遠程調用
hadoop 默認的是對 key 進行排序,若是想要再對 value 進行排序,那麼就要使用:二級排序 二級排序的方式: 1:將 reduce 接收到的 value-list 的值緩存,而後作 reduce 內排序,再寫出,這樣排序速度快一些,因爲value-list 的數據可能很龐大,可能會形成內存的溢出 2:將值的一部分或則整個部分加入 key ,生成一個合併的能夠。生成組合 key 的過程很簡單。咱們須要先分析一下,在排序時須要把值的哪些部分考慮在內,而後,把它們加進 key 裏去。隨後,再修改 key 類的 compareTo 方法或是 Comparator 類,確保排序的時候使用這個組合而成的 key。
hive 的內部表和外部表的區別是 hive 的內部表是由 hive 本身管理的,外部表只是管理元數據,當刪除數據的時候,內部表會連數據和元數據所有刪除,而外部表則只會刪除元數據,數據依然存放在 hdfs 中。外部表相對來講更加的安全一些,數據的組織也更加的靈活一些,方便共享源數據.
下面來點數據結構方面的題轉換一下思路 手寫數據結構和算法:比較重要,基礎中的基礎
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; } } } }
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; }
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; } }
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; }
初始時假設第一個記錄自成一個有序序列,其他記錄爲無序序列。接着從第二個記錄開始,按照記錄的大小依次將當前處理的記錄插入到其以前的有序序列中,直至最後一個記錄插入到有序序列中爲止
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 } } } }
把最小或者最大的選擇出來 對於給定的一組記錄,通過第一輪比較後獲得最小的記錄,而後將該記錄與第一個記錄的位置進行交換;接着對不包括第一個記錄之外的其餘記錄進行第二輪比較,獲得最小的記錄並與第二個記錄進行位置交換;重複該過程,直到進行比較的記錄只有一個時爲止
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 方面的面試題
就用過 java 和 hiveQL。 Java 寫 mapreduce 能夠實現許多複雜的邏輯思惟,可是一旦對於簡單的需求來講太過於繁瑣。
HiveQL 基本的針對對象是 hive 上的表,可是一旦遇到很複雜的邏輯的話就去實很難去實現。對於語句書寫方面來講仍是很簡單的。
三種:自帶內嵌數據庫 derby,挺小,不經常使用,最致命的是隻能用於單節點。
第一種方法是,Reducer 將給定 key 的全部值都緩存起來,而後對它們在 Reduce 內部作一個內排序。可是,因爲 Reducer 須要緩存給定 key 的全部值,數據量多的話可能會致使內存不足。
第二種方法是,將值的一部分或整個值鍵入到原始 key 中,從新組合成一個新的 key 。這兩種方法各有各的特色,第一種方法編寫簡單,可是須要較小的併發度,數據量大的話可能會形成內存耗盡卡死的狀態。 第二種方法則是將排序的任務交給 MapReduce 框架進行 shuffle,更符合 Hadoop/Reduce 的設計思想。
答:combiner 是發生在 map 的最後一個階段,其原理也是一個小型的 reducer,主要做用是減小輸出到 reduce 的數據量,提升網絡傳輸瓶頸,提升 reducer 的執行效率。 partition 的主要做用將 map 階段產生的全部 k,v 對分配給不一樣的 reducer task 處理,能夠將 reduce 階段的處理負載進行分攤。
Hive 向內部表導入數據時,會將數據移動到數據倉庫指向的路徑;如果外部表,用戶在建表的時候就要肯定表的位置 在刪除表的時候,內部表的元數據和數據會被一塊兒刪除, 而外部表只刪除元數據,不刪除數據。 這樣外部表相對來講更加安全些,數據組織也更加靈活,方便共享源數據。
答:rowkey 的設計必定要有規則而且有序,經常使用的一些 rowkey 必定要連續連續,而且 rowkey的設計規則最好加入之後要查詢的規則在裏面方便往後校對查詢。
根據業務的特色對數據進行歸類。
本質:讓各個分區的數據均勻分佈,而且根據本身的業務特色設置合適的 partition 策略,具體的設置方法能夠上網查詢一下,這裏就不過多的介紹了。若是事先不知道業務數據的分佈規律,只能利用隨機抽樣以後生成 partition 策略後再作處理
答:能夠從不少方面來進行:好比 hdfs,mapreduce,yarn 的 job 調度,hbase,hive 能夠優化的有太多地方了,具體要在哪裏優化只能看你數據的特色了,根據真實場景來判斷。
答:Hbase 是一個能適應聯機業務的數據庫系統 物理存儲:hbase 的持久化數據是存放在 hdfs 上 存儲管理:一個表是劃分爲不少 region 的,這些 region 分佈式地存放在不少 regionserver 上
版本管理:hbase 中的數據更新本質上是不斷追加新的版本,經過 compact 操做來作版本間的文件合併 Region 的 split 集羣管理:zookeeper + hmaster(職責) + hregionserver(職責)
答:能夠,若是不涉及到有關數據的計算的話仍是能夠省纔去 mapreduce 階段的
答:Lzo,Gzip,Default,Snapyy 若是要是對數據進行壓縮的話最好將數據轉化一下:quenceFile 或者 Parquet File(spark)
答: 公平調度器:爲每一個任務分配資源的方法,按照做業的優先級高低,再按照到達時間的前後選擇被執行的做業
答:Hive 的查詢功能是由 hdfs 和 mapreduce 結合起來實現的,對於大規模數據查詢仍是不建議在 hive 中,由於過大數據量會形成查詢十分緩慢。 Hive 與 mysql 的關係:只是借用 mysql 來存儲 hive 中的表的元數據信息,稱爲 metastore
答:這個就要看你們的功底了,現場問題我也想不出來。
答:在客戶端上傳文件時指定文件副本數量爲1,可是基本咱們作大數據都是設置副本的數量是,這個還要根據本身公司的狀況而定。
答:shuffle 過程當中具體來講,combine 之不過是一個特殊的 reduce 而已,而且發生在本地,累加 map 裏面 key 的值而後發給 reduce 處理
答:集羣架構: namenode datanode secondarynamenode journalnode zkfc 這個是簡單的基本架構,在文章末尾我會找一下架構圖形提供給你們參考。
答:flush 是在內存的基礎上進行的,首先寫入文件的時候,會先將文件寫到內存中,當內存寫滿的時候,一次性的將文件所有都寫到硬盤中去保存,並清空緩存中的文件,
答:就是一種簡單的調度策略,先來先進,先進先出
答案:map,reducebykey,filter,mapPartition,flatmap,cogroup,foreach,first,take, join, sortBy,distinct,等等
答:List 和 Set 都是接口。他們各自有本身的實現類,有無順序的實現類,也有有順序的實現類。 最大的不一樣就是 List 是能夠重複的。而Set是不能重複的。 List 適合常常追加數據,插入,刪除數據。但隨即取數效率比較低。 Set 適合常常地隨即儲存,插入,刪除。可是在遍歷時效率比較低。
答: 第一範式()無重複的列 第二範式(2NF)屬性徹底依賴於主鍵 [消除部分子函數依賴] 第三範式(3NF)屬性不依賴於其它非主屬性 [消除傳遞依賴]
答:Namenode 會第一時間經過心跳發現 datanode 下線,而且經過副本策略將這個 datanode 上的block 快從新發送分配到集羣中而且從新複製一份保持每一個 block 塊的副本數量不變。在此同事運維團隊必定要第一時間被通知處處理這個問題,儘快維修上線
答:FAILED java.util.NoSuchElementException 此錯誤的緣由爲 sqoop 解析文件的字段與 MySql 數據庫的表的字段對應不上形成的。所以須要在執行的時候給 sqoop 增長參數,告訴 sqoop 文件的分隔符,使它可以正確的解析文件字段。 hive 默認的字段分隔符爲 '\001'
答:1.設置合理的 map 和 reduce 的個數。合理設置塊的大小,要注意一個任務對應一個 map 2避免數據傾斜,合理分配數據對應的 key,儘可能對 sql 進行優化 3 combine 函數 4 對數據進行壓縮處理,必要的時候對數據進行拆分。 5小文件處理優化:事先合併成大文件,combineTextInputformat,在 hdfs 上用 mapreduce 將小文件合併成 SequenceFile 大文件(key: 文件名,value:文件內容),而且要按期在非工做時間作一次大合併,可是要提早估算好工做量,由於大合併期間全部任務是沒辦法執行的。 6參數優化,具體什麼參數比較多你們能夠自行百度。
答:/etc/profile 這個文件,主要是用來配置環境變量。讓 hadoop 命令能夠在任意目錄下面執行。可是每一個開發人員都有本身的目錄設置習慣,這個須要根據本身的習慣具體來回答。 /ect/sudoers /etc/hosts /etc/sysconfig/network /etc/inittab
請描述一下開發過程當中如何對上面的程序進行性能分析,對性能分析進行優化的過程。
現有 1 億個整數均勻分佈,若是要獲得前 1K 個最大的數,求最優的算法。
參見《海量數據算法面試大全》
答:主要分爲八個步驟
對文件進行切片,提早想好塊的大小如何分配 啓動相應數量的 maptask 進程 調用 FileInputFormat 中的 RecordReader,讀一行數據並封裝爲 k1v1 調用自定義的 map 函數,並將 k1v1 傳給 map,一個任務對應一個 map 收集 map 的輸出,進行分區和排序,這塊要注意優化。 reduce task 任務啓動,並從 map 端拉取數據 reduce task 調用自定義的 reduce 函數進行處理 調用 outputformat 的 recordwriter 將結果數據輸出 63. 搭建 hadoop 集羣 , master 和 slaves 都運行哪些服務
答:master 是主節點,slaves 是從節點
答:hadoop 的主要由兩部分組成,HDFS 和 mapreduce,HDFS 就是把數據進行分塊存儲。 Mapreduce 的原理就是使用 JobTracker 和 TaskTracke r來進行做業的執行。Map 就是將任務展開,reduce 是彙總處理後的結果。簡單的來講就是提交一個 jar 包,這個時候須要 mapreduce 來處理。
答:HDFS 主要是一個分佈式的文件存儲系統,由 namenode 來接收用戶的操做請求,而後根據文件大小,以及定義的 block 塊的大小,將大的文件切分紅多個 block 塊來進行保存,這裏存在的優化問題點比較多,前期處理很差可能會形成後期的數據傾斜比較嚴重。
自帶的實例 Wordcount,可是最好是本身準備一個寫熟了的例子。
答:有完善的集羣監控體系(ganglia,nagios) Hdfs dfsadmin –report Hdfs haadmin –getServiceState nn1
選擇題(此部分來源於網絡篩選)
a) NameNode b) Jobtracker c) Datanode d) secondaryNameNode e) tasktracker
a) 3 份 b)2 份 c) 1 份 d) 不肯定
a) SecondaryNameNode b) DataNode c) TaskTracker d) Jobtracker e) zkfc
a) Martin Fowler b) Kent Beck c) Doug cutting
a) 32MB b) 64MB c) 128MB
a) CPU b)網絡 c)磁盤 d)內存
a) 它是 NameNode 的熱備 b) 它對內存沒有要求 c) 它的目的是幫助 NameNode 合併編輯日誌,減小 NameNode 啓動時間 d) SecondaryNameNode 應與 NameNode 部署到一個節點
a) 若是一個機架出問題,不會影響數據讀寫 b) 寫入數據的時候會寫到不一樣機架的 DataNode 中 c) MapReduce 會根據機架獲取離本身比較近的網絡數據
a) 數據通過 NameNode 傳遞給 DataNode b) Client 端將文件切分爲 Block,依次上傳 c) Client 只上傳數據到一臺 DataNode,而後由 NameNode 負責 Block 複製工做
a )單機版 b) 僞分佈式 c) 分佈式
a )Cloudera manager b) Tar ball c) Yum d) Rpm
判斷題(此部分來源於網絡篩選):
Ganglia 不只能夠進行監控,也能夠進行告警。( X )
Block Size 是不能夠修改的。( X )
Nagios 不能夠監控 Hadoop 集羣,由於它不提供 Hadoop 支持。( X )
若是 NameNode 意外終止, SecondaryNameNode 會接替它使集羣繼續工做。( X )
Cloudera CDH 是須要付費使用的。( X )
Hadoop 是 Java 開發的,因此 MapReduce 只支持 Java 語言編寫。( X )
Hadoop 支持數據的隨機讀寫。(X )
NameNode 負責管理 metadata, client 端每次讀寫請求,它都會從磁盤中讀取或則 會寫入 metadata 信息並反饋 client 端。(X )
NameNode 本地磁盤保存了 Block 的位置信息。(X )
DataNode 經過長鏈接與 NameNode 保持通訊。( X )
Hadoop 自身具備嚴格的權限管理和安全措施保障集羣正常運行。(X )
Slave節點要存儲數據,因此它的磁盤越大越好。(X )
hadoop dfsadmin –report 命令用於檢測 HDFS 損壞塊。( X)
Hadoop 默認調度器策略爲 FIFO( 正確)
集羣內每一個節點都應該配 RAID,這樣避免單磁盤損壞,影響整個節點運行。(X )
由於 HDFS 有多個副本,因此 NameNode 是不存在單點問題的。(X )
每一個 map 槽(進程)就是一個線程。(X )
Mapreduce 的 input split 就是一個 block。(X )
NameNode的默認 Web UI 端口是 50030,它經過 jetty 啓動的 Web 服務。(X )
Hadoop 環境變量中的 HADOOP_HEAPSIZE 用於設置全部 Hadoop 守護線程的內存。它默認是200 GB。( X )
DataNode 首次加入 cluster 的時候,若是 log中報告不兼容文件版本,那須要 NameNode執行「Hadoop namenode -format 」操做格式化磁盤。(X )
面試面試官問了大家天天有多少數據,用了多少臺機器
答: 通常根據你寫的項目,天天產生的數據量規劃,假如一天數據量100G 通常集羣 規劃是年數據量的3倍還要多一點這樣算下來大概須要60臺左右的機器才能保障運行。
答:通常一個做業10分鐘到-幾個小時不等 通常一個做業也就幾十分鐘。。運行幾天的不多
答:30-50個左右 通常公司不少個做業。。 你能夠說大家部門的,其餘你不清楚就別說,,相應你簡歷上寫的項目,不少模板都有做業。。細化一下 好比推薦的做業,統計彙總的做業,用戶定位的做業
答:通常在測試階段就那部分線上數據測試過了。。 若是在線上還有問題通常 kill 掉做業。。固然能夠作 mapreduce 裏面設計日誌輸出到單獨文件,, 根據 hadoop 異常日誌出什麼問題了。。固然 hadoop 每臺都會有日誌,固然 hadoop 本身的日子很龐大,能夠採用 chukwa(大概看看幹什麼的就行,就是收集方便查看 hadoop 自己的日誌)處理而後分析做業代碼。
答:mapreduce 運行狀態,hadoop 有監控頁面,固然也能夠本身寫監控程序,mapreduce 有做業監聽方法,能夠獲取進度。
答:採用 ganglia,nagios,zabbix 監控工具監控機器磁盤,內存,cpu 你只須要回答採用這些弄得 具體運維部弄得。固然你研究過會更好
答:除了父 RDD 和子 RDD 一對多外,其餘的都是窄依賴
答:沒有什麼區別,yarn 就是一種任務調度框架
答: 通常是在 WEBUI 上 查看,若是問具體怎麼配置的能夠推到運維人員身上
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) } }
答:是一個純java框架,能夠進行快速開發,開發週期較短,而且可以快速創建一個java web所須要的全部內容。
答:implicit
答:會報錯
答:不須要
答:這個你們最好提早本身畫一畫,這樣每一步對應的數據流程都是你本身最熟悉的,這樣才顯的最真實,特別是沒有從事過大數據行業的人不免會內心發虛。我在文章的最上部簡單的畫了一下架構圖,你們能夠照着參考一下。
kafka 不像集羣最少須要三臺機器,假若有三個 kafka,若是壞了兩個,那麼剩下的一個就是主 leader,而且依然正常運行,這就是kafka 的容錯性
這個協議的英文名字是 ZooKeeper Atomic Broadcast,這個協議的主要做用是保證大數據分佈的一致性,經過主備方式保證副本的一致性。
答:rowkey 的做用通常是用來檢索數據用的無非有幾種方式,按照某個固定的鍵值對進行檢索,或者在必定範圍內進行掃描,由於rowkey 是按照字典序存儲的,因此在設計 rowkey 的時候要充分的利用這一點,把常常要查詢的數據設計在一塊兒,而且能夠加上時間戳也是一個辦法。
答:首先咱們來說一下建表時的不一樣,在建立內部表的時候,數據的指向會指向數倉的路徑,可是在建立外部表的時候,僅僅只是記錄數據的一個路徑,數據不會像數倉移動,數據的位置不會改變。 咱們再討論刪除表的不一樣,那就是在刪除內部表的同時,元數據和數據都會被一塊兒刪除,而在刪除外部表的時候只刪除元數據並不會刪除數據,相比之下外部表仍是比較靈活的。 至於從 hdfs 導入 hive 的語法我舉個例子:load data inpath '/////' into table test;
在這裏我找了一個網圖,相信看圖來的更加直接一些。
答:cache 只有一個緩存級別能夠設置,可是 persist 能夠設置多個級別的緩存級別。
123.reduceBykey 和 groupByKey哪一個快?
固然是 reduceBykey 比較快,在到 reduce 端以前會對要傳輸的結果進行一個本地的 merge,這樣到達 reduce端的數據就會大幅度的減小,而 groupbykey 會對每個過來的 RDD 進行一個序列化,而且這個過程是發生在 reduce 端進行執行的,因此會形成一旦數據量過大的時候會形成內存溢出等麻煩,因此建議仍是儘可能少用比較好。
答:在這裏我就說一下通常會用到哪些算法,至於每一個算法的 demo 你們能夠自行百度一下,經常使用的有推薦算法(CB,CF),分類算法(SVM,NB),聚類算法(層次聚類,K-means),迴歸算法。
答:工廠模式通常分爲三種: 簡單工廠模式、工廠方法模式、抽象工廠模式
答:說實話 hive on spark 跟 hive 沒有多大的關係,只不過 hive 一直在用MR這樣在數據量龐大的時候就形成速度過慢的狀況,這個時候就要將邏輯轉換成 RDD 模式,這樣在集羣中跑的話速度明顯就上來了,只不過就是繼續延續了hive的標準而已。
答:這塊涉水比較深,建議你們對答案簡單掠過就好,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; } }
答:一、緩存由 linux 自己進行維護 二、磁盤的順序讀寫速度完勝內存讀寫速度 三、避免佔用內存過大的狀況 四、不害怕系統冷啓動
在這裏我找了一個架構圖你們先直面的看一下:
在非 nimbus 服務器有節點故障時,nimbus 會將這些 task 任務分配出去,好比 worker 掛掉時會快速失敗,而且能保障消息完整性的實現機制。
答: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
答:能夠經過反射的方式來推斷元數據,由於 RDD 自己是沒有元數據的,經過反射就能夠了解這些元數據而且進一步轉換成 dtaframe
答:首先能夠分析一下這個是棧溢出仍是堆溢出,而後再根據溢出類型進一步分析是什麼緣由。
JDK:1.8 SPARK:2.2.0 SCALA:2.11.8 HADOOP:2.6.5
134.zookeeper 腦裂
答:腦裂就是在當只有兩臺 cluster 的時候,會選擇一個做爲 master 可是若是這兩臺機器存在通訊問題的話就會產生兩個 master,這就是腦裂。zookeeper 通常會採用 quorums 的方式,只有當集羣超過半數的時候纔會投票選舉出一個 master 來保障集羣的可用性。
一、runnable 建立 threa 線程 二、callable 建立線程 三、thread 建立線程 四、exctor 建立線程池
答:能夠用後序遍歷二叉樹,層次遍歷二叉樹,遞歸遍歷二叉樹
答:由於kafka是落地磁盤,順序讀取磁盤的速度要遠高於內存讀取。
答:storm是對大量的小型數據塊進行處理,而且是動態數據 spark通常是對大量數據進行進行全集處理,而且側重傳輸數據的過程
答:persits通常是將數據持久化到磁盤上可是一旦進程被停掉的話,在磁盤上的數據也會同時被清空 而checkpoint 是將 RDD 持久化到 HDFS 上的,若是不手動刪除的話是一直存在的。
答:MR 通常處理大量數據的時候通常會存在高延遲,浪費時間,對於一些有時間要求的業務就很不適合。可是若是用 spark 處理的話就很是快了,特別是對於實時動態處理的過程。
下面我會針對人事簡歷方面的問題總結一下個人想法
答:千萬不要寫一堆配置信息,人家覺得你是搞運維的,而且最好寫一些公司的大數據項目,以前的一些java項目就不要往上寫了,而且必定要寫技術細節,業務場景,業務模塊,必定要寫本身最熟悉的。
答:千萬不要說:上家公司外包太累、加班太多、領導很差,能夠從技術發展的角度去談
答:儘可能請教一些技術問題,最好在面試前就針對公司的業務介紹準備一些問題,切記千萬不要問錄用不錄用的問題,對於指望的薪資若是技術回答的不錯能夠適當的多要一點,通常三年工做經驗的都在 16K 以上。
答:面試後回家應該立馬寫總結,今天問了哪些問題,哪些沒有回答好,哪些問題都沒聽過,對應本身的簡歷進行修改更新。寫簡歷就要把本身當成面試官。
答:對於本身熟悉的技能要有本身的側重點,好比 spark 很熟,着重寫spark的着重點,寫上簡歷的必定要會,不然面試官可能認爲你在欺騙他。
答:必定要寫這一項,這一項說明你熱愛技術,善於學習總結,樂於分享,而且利用本身的業餘時間投入到本身的事業當中。
答:分塊寫:好比 1) 按層次寫 2) 好比hadoop 3) 實時計算 4) 機器學習 5) 編程語言等等
答:寫清楚工做經歷 每一個時間段,在哪一個公司工做,什麼職位 項目名稱: 寫爲 XXX公司XXX系統或平臺(必須帶上公司名稱) 項目架構:寫清楚使用到那些技術 好比 flume+kafka+hadoop+hbase+mapreduce+spark等等 整體人數:10人 項目描述:根據項目解決問題,一共有哪些功能寫,功能不必定要寫你都作過,由於這裏只是描述 責任描述: 你負責的模塊,寫大的功能,不要寫實現細節 解決問題:描述這個問題便可,怎麼解決,面試的時候去說 項目最好設計 以 storm spark mahout 相關
答:這個問題很很差回答,最好的回答就是不要回答,談談本身的興趣愛好逐漸轉移到技術點位上
答:這個問題就是面試官想肯定你的工做態度是否穩定,也能夠談談要在某地定居,之後就在某地發展的事。
下面咱們最後來講一下異地災備的問題
如今大多數的公司的數據存儲都是在本地而不是異地,這樣在數據和業務上就存在很大的風險,一旦本地發生火災或者重大人員事故真實想哭都不知道怎麼哭,因此在經濟條件容許的條件下仍是要作異地備份。可是條件不容許怎麼辦,咱們能夠對辦公區進行數據分離,將簡單的備份文件傳輸到不一樣業務區的(除主存儲)的備份機房。這個過程重中之重的就是數據的保密性,安全性,而且敏感數據最好進行數據脫敏,對於數據必定要加密存儲,必定當心不要弄丟密碼。
轉自:https://blog.csdn.net/qq_44868502/article/details/103202702 (手動感謝)