天天看點

大資料工程師(開發)面試系列(7)

#MapReduce

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

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

大資料工程師(開發)面試系列(7)

補:至于java版本,蝦皮部落客的一篇文章講解的非常細緻:

Hadoop叢集(第6期)_WordCount運作詳解

##2. 上述寫的程式中

.map((_,1))

的輸出結果是什麼

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

##3. 你能用SQL語句實作上述的MapReduce嗎?要求按照基于某個字段的值的頻次倒序,并且以次元——頻次的形式結果展現?

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

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

大資料工程師(開發)面試系列(7)
大資料工程師(開發)面試系列(7)

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

我:先拆分成若幹小的,然後再排(思路是從希爾排序出發的)

補:内部排序算法:希爾排序

#Spark

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

我:初始化,資源,資料源,并行化,rdd轉化,action算子列印輸出結果或者也可以存至相應的資料存儲媒體

補:具體的可看下圖:

大資料工程師(開發)面試系列(7)

##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實作

##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差不多,訓練邏輯正确,确實數組查詢記錄友善,但訓練廣度有些多樣性不夠。

大資料工程師(開發)面試系列(7)

 算法備忘錄——基礎資料結構與複雜度

常用資料結構和算法操作效率的對比總結

##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的《設計模式》

補:封面如下:

大資料工程師(開發)面試系列(7)

##6. 什麼是Restful API?

我:由于對Restful的了解隻停留在使用層面,給我的感覺像是一種資源的送出擷取,GET擷取,POST/DELETE/PUT都可以看作是一種送出操作

補:

【專業定義】:一種軟體架構風格,設計風格而不是标準,隻是提供了一組設計原則和限制條件。它主要用于用戶端和伺服器互動類的軟體。基于這個風格設計的軟體可以更簡潔,更有層次,更易于實作緩存等機制。

RESTful百度百科

大資料工程師(開發)面試系列(7)

#Devops

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

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

補:讀寫分離的作用

看了上面的文章,減輕負載是首要目的,至于權限控制,更像是一種實作方式,不像目的。

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

我:ZooKeeper是分布式協調元件,非大資料領域,可以用ZooKeeper來做HA或者存儲資料,比如配置資訊啥的。(Znode)

補:ZooKeeper 典型應用場景一覽

繼續閱讀