1. 程式人生 > >大資料開發工程師面試題(附答案)

大資料開發工程師面試題(附答案)

之前採訪畢業生的時候,有小夥伴提出意見,想看小編分享一些面試的乾貨,於是小編不負眾望,今天給大家帶來了一篇大神級面經,希望可以幫助即將畢業或正在找工作的小夥伴兒們,祝你們早日找到心儀的工作!

在這裡我還是要推薦下我自己建的大資料學習交流qq裙:458345782, 裙 裡都是學大資料開發的,如果你正在學習大資料 ,小編歡迎你加入,大家都是軟體開發黨,不定期分享乾貨(只有大資料開發相關的),包括我自己整理的一份2018最新的大資料進階資料和高階開發教程,歡迎進階中和進想深入大資料的小夥伴
 

MapReduce

 

1. 不指定語言,寫一個WordCount的MapReduce

我:最近剛學了scala,並且就有scala版本的WordCount,剛好學以致用了一下:

 


 

補:至於java版本,蝦皮博主的一篇文章講解的非常細緻: 
Hadoop叢集(第6期)_WordCount執行詳解

http://www.cnblogs.com/xia520pi/archive/2012/05/16/2504205.html

 

2. 上述寫的程式中.map((_,1))的輸出結果是什麼

我:通過flatMap將其扁平化,而.map((_,1)) 則是每個出現單詞,1這樣的形式展現,此時還沒歸併。

 

3. 你能用SQL語句實現上述的MapReduce嗎?要求按照基於某個欄位的值的頻次倒序,並且以維度——頻次的形式結果展現?

 

我:基於某個欄位——決定了要用group By,頻次要用count聚合,倒序自然少不了desc。 


補:框架搭好就是往裡塞了:

 

 

4.給你一份亂序的100萬個數字的檔案,你如何來排序?

 

我:先拆分成若干小的,然後再排(思路是從希爾排序出發的) 
補:內部排序演算法:希爾排序

 

Spark

 

1. 說一說Spark程式編寫的一般步驟?

我:初始化,資源,資料來源,並行化,rdd轉化,action運算元列印輸出結果或者也可以存至相應的資料儲存介質 


補:具體的可看下圖:

 

 

2. Spark有哪兩種運算元?

我:Transformation(轉化)運算元和Action(執行)運算元。

 

3. Spark提交你的jar包時所用的命令是什麼?

我:submit。 
面試官:spark-submit? 
我:嗯,spark-submit。

 

4. Spark有哪些聚合類的運算元,我們應該儘量避免什麼型別的運算元?

我:aggeragate 
面試官:還有呢? 
我:記不清了。。。 


面試官:還有你剛剛寫的那個groupByKey哈 


補:

 

在我們的開發過程中,能避免則儘可能避免使用reduceByKey、join、distinct、repartition等會進行shuffle的運算元,儘量使用map類的非shuffle運算元。這樣的話,沒有shuffle操作或者僅有較少shuffle操作的Spark作業,可以大大減少效能開銷。

 

5. 你所理解的Spark的shuffle過程?

我:spark shuffle處於一個寬依賴,可以實現類似混洗的功能,將相同的Key分發至同一個Reducer上進行處理。 


補:詳細探究Spark的shuffle實現

http://blog.csdn.net/johnny_lee/article/details/22619585

 

6. 你如何從Kafka中獲取資料?

我:topic 
補:分散式訊息系統:Kafka

 

7. 對於Spark中的資料傾斜問題你有什麼好的方案?

我:可以先分析基數大造成資料傾斜的維度,將其適當的拆分。 


補:Spark效能優化指南:高階篇

 

程式設計

 

1.如果我有兩個list,如何用Python語言取出這兩個list中相同的元素?

我:list(set(list1).intersection(set(list2))),通過set 的intersection取交集的函式實現相同元素的提取。

 

2.請你給出在Python中較快獲取一個元素的資料結構,並且說出其時間複雜度以及它的缺陷是什麼?

 

我:因為之前也在做一些leetcode上的題目,多多少少重溫了下資料結構,當時腦海裡呈現的是陣列方便查詢,佇列和棧方便插入刪除,所以一聽到較快獲取果斷陣列了。 


面試官:dict(字典) 
我:厲害!! 


面試官:那它的時間複雜度你曉得嘛? 
我:不是特別瞭解,O(1),常數時間複雜度? 


面試官:嗯,那你知道它的缺陷嗎? 
我:(中午吃撐了,TradeOff哈)不曉得 


面試官:空間複雜度較高哈 


補: 反思了一下,之所以說錯,可能和以前學習演算法時,起承轉合的過度,並未將棧、佇列和map,或者dict直接比較,而是從陣列切換到佇列和棧,所以就和之前的那個PUT和POST差不多,訓練邏輯正確,確實陣列查詢記錄方便,但訓練廣度有些多樣性不夠。 



演算法備忘錄——基礎資料結構與複雜度 
常用資料結構和演算法操作效率的對比總結

 

3. 做幾道OJ的題目(英文的),說一說這個問題的要求和注意點,以及可以獲得正確結果的你的思路?

 

恢復IP地址

 

 

Given a string containing only digits, restore it by returning all possible valid IP address combinations. 
Example 
Given “25525511135”, return 
[ 
“255.255.11.135”, 
“255.255.111.35” 
] 
Order does not matter.

 

我:思考了一會兒,沒想出來,只能想出個不通用的思路。 
面試官:給你個提示,嘗試用樹這個資料結構。 


補:此處埋一個坑,學完樹的資料結構再回來解決。

快樂數

 

 

Write an algorithm to determine if a number is happy. 
A happy number is a number defined by the following process: Starting with any positive integer, replace the number by the sum of the squares of its digits, and repeat the process until the number equals 1 (where it will stay), or it loops endlessly in a cycle which does not include 1. Those numbers for which this process ends in 1 are happy numbers. 
Example 
19 is a happy number 
1^2 + 9^2 = 82 
8^2 + 2^2 = 68 
6^2 + 8^2 = 100 
1^2 + 0^2 + 0^2 = 1

 

我:思路是模擬過程法,即按照它驗證一個數是否是快樂數的方式進行模擬,當然也有些取巧的方式,如果某個中間結果曾出現過,妥妥滴死迴圈嘛,即刻跳出。 


面試官:思路是對的 
我:我覺得這會TLE,肯定有取巧的方法(這道題目之前好像接觸過) 


補:回去搜了一下,發現之前一直求助的一個大神的部落格通過模擬過程用Python實現的: 
Happy Number (之前的懷疑有更巧方法在於時常保持偷懶的思維也是必要的)

 

4. 你常用的IDE有哪些?

我:Java:Eclipse;Python:PyCharm;Scala:IntelliJ IDEA;Shell:VIM

 

5. 你瞭解設計模式嗎?

我:不瞭解,但以後回去買本O’Really的《設計模式》 
補:封面如下:

 

 

6. 什麼是Restful API?

我:由於對Restful的瞭解只停留在使用層面,給我的感覺像是一種資源的提交獲取,GET獲取,POST/DELETE/PUT都可以看作是一種提交操作 


補:

【專業定義】:一種軟體架構風格,設計風格而不是標準,只是提供了一組設計原則和約束條件。它主要用於客戶端和伺服器互動類的軟體。基於這個風格設計的軟體可以更簡潔,更有層次,更易於實現快取等機制。

 

RESTful百度百科

 

 

Devops

 

1. 資料庫讀寫分離的目的是什麼?

我:①減輕負載;②許可權控制 


補:讀寫分離的作用 
看了上面的文章,減輕負載是首要目的,至於許可權控制,更像是一種實現方式,不像目的。

 

2. ZooKeeper是什麼?非大資料領域,我們可以用ZooKeeper來做些什麼?

 

我:ZooKeeper是分散式協調元件,非大資料領域,可以用ZooKeeper來做HA或者儲存資料,比如配置資訊啥的。(Znode) 
補:ZooKeeper 典型應用場景一覽

在這裡我還是要推薦下我自己建的大資料學習交流qq裙:458345782, 裙 裡都是學大資料開發的,如果你正在學習大資料 ,小編歡迎你加入,大家都是軟體開發黨,不定期分享乾貨(只有大資料開發相關的),包括我自己整理的一份2018最新的大資料進階資料和高階開發教程,歡迎進階中和進想深入大資料的小夥伴