算法部分
- 1、給定一個大文件(即無法一次性加載到內存中,以下的大文件均爲該定義),每行代表一個訪問IP,統計出現次數最多的IP。
- 1)逐行讀取數據,並將數據映射(如取模)到N個小文件中;
2)以IP爲Key,頻率爲Value,分別統計每個小文件中每個IP出現的次數;
3)找出每個小文件中出現次數最多的IP;
4)對這N個小文件出現次數最多的IP進行排序,得到最終結果。
- 1)逐行讀取數據,並將數據映射(如取模)到N個小文件中;
- 2、在1的基礎上,求出現次數最多的K個IP(top-K問題)
- 1)、2)與上述一致;
3)統計出每個小文件中出現次數最多的K個IP;
4)對這N*K個IP出現的頻率進行排序,得到最終結果。
- 1)、2)與上述一致;
- 3、給定a、b兩個大文件,每行代表一個訪問IP,求出a、b中重複的IP
- 1)將a文件映射到N個小文件中;
2)b文件執行與a文件一致的映射方法;
3)現在問題轉化爲求解N個文件對中的重複IP,可將a文件的每個小文件中的IP通過集合存儲,再遍歷b文件中的小文件,判斷其IP是否在對應的文件中,如在則說明重複。
- 1)將a文件映射到N個小文件中;
大數據工具部分
-
1、spark中的RDD是什麼,有什麼特性?
- RDD全稱爲彈性分佈式數據集,是spark中最基礎的數據抽象,是一個不可變、可分區、可並行的數據集合。
- RDD具有五大特性:
分區列表 RDD的數據存在於一個分區列表中、
每個分區都有一個計算函數、
依賴於其他RDD列表 一個RDD依賴於其他的一個或多個RDD、
如果RDD中存儲的數據爲Key-Value,則可以按Key對RDD進行重新分區
數據本地性。
-
2、概述一下spark中常用的算子
map、mapPartitions、flatMap、foreach、foreachPartitions、reduceByKey、groupByKey、sortByKey、filter、reduce、collect、take、glom、join、union、repartitions、coalesce
transform和action的差別?懶惰操作
(注意對比,如:- 1.map與mapPartitions的區別,map是把函數f作用於每一行,而mapPartitions是把函數f作用於每個分區,再將每個分區的元素以迭代器的方式進行遍歷;
- 2.map和flatMap:
flatMap會做一個扁平化操作 - 3.map和foreache的區別:有無返回值;
- 4.reduceByKey和groupByKey:reduceByKey會先在每一個節點上作聚合,這樣做有利於減少shuffle時的IO操作,所以應儘量 選用reduceByKey;
- 5.repartitions和coalesce:是否具有shuffle
-
3、RDD的依賴關係
- RDD的依賴分爲兩類:寬依賴和窄依賴。其區別爲,如果一個RDD的父RDD的每一個分區只對應一個子RDD,則爲窄依賴(map、filter、mapPartitions、union…);如果一個RDD的父RDD的每一個分區對應多個子RDD,則爲寬依賴(reduceByKey、join…)。
如果依賴關係爲窄依賴,當子RDD的某個分區丟了,通過RDD的血統關係找到該分區對應的父RDD分區,然後重新計算這一部分即可恢復丟失的數據;如果依賴關係爲寬依賴,當子RDD的某個分區丟了,就需要全部重新計算。
- RDD的依賴分爲兩類:寬依賴和窄依賴。其區別爲,如果一個RDD的父RDD的每一個分區只對應一個子RDD,則爲窄依賴(map、filter、mapPartitions、union…);如果一個RDD的父RDD的每一個分區對應多個子RDD,則爲寬依賴(reduceByKey、join…)。
-
4、spark中的DAG是什麼?
- DAG即有向無環圖,spark用DAG來描述RDD之間的依賴關係,這種關係也稱爲血統(lineage)。使用DAG可以對計算進行優化。
-
5、spark的stage是如何劃分的?
- spark遇到一個action操作會產生一個job,DAGScheduler會形成對應的DAG,然後按DAG進行stage劃分,具體劃分方式爲:從DAG末端往前回溯,如遇到寬依賴就劃分出一個stage。
-
6、spark中的對應關係?
- 一個Application(運行一次腳本)中可能存在一個或多個action操作,一個action操作會產生一個job,一個job中遇到一次shuffle會劃分一個stage,一個stage對應一個taskset,一個taskset中有多個task,一個stage的最終RDD有多少個分區taskset中就對應多少個task,一個task交由一個Executor執行,一個Executor一次執行一個task。
-
7、spark內存溢出
- Driver端內存溢出
Driver端運行了SparkContext、DAGScheduler、TaskScheduler,當stage劃分過多等會消耗過多內存資源,此時可以通過spark.driver.memory來增加Driver內存的申請。 - map時產生大量的對象
使用mapPartitions來代替map - RDD分區數據不平衡
如果重新分區不影響計算結果,則可通過repartition重新對數據進行分區,如果數據傾斜是因爲某個key數據量過大,則可參考spark優化。
- Driver端內存溢出
-
8、spark on yarn中,yarn-client和yarn-cluster的區別?
- yarn可以動態協調不同框架之間的資源使用(將不同的框架的資源管理器統一,如MapReduce與Spark同時跑程序,如果MapReduce任務結束了,則可將其資源重新分配給Spark)
- yarn-client模式下,Driver運行在提交代碼的機器上,main函數的輸出結果可以直接通過交互窗口看到,因爲要與yarn進行大量通信,所以該模式可能會造成流量激增,僅適合調試使用。
- yarn-cluster模式下,Driver運行在ApplicationMaster上,該模式下提交完代碼即可退出,無交互,適合生產。
-
9、spark作業的提交流程
-
10、RDD的容錯原理和容錯機制
-
11、spark的共享變量
- 1 廣播broadcast
- 對於全局變量,如果不是使用廣播形式分發,則每個task會收到一份數據,而如果使用廣播方式,則每個節點只接收一份數據。
- 廣播變量只能讀取,無法修改。
- 2 累加器
- 累加器是一個用於全局統計的變量,在executor上只能對累加器進行修改,而無法讀取。Driver端可以讀取累加器的數值。
- 1 廣播broadcast
-
12、Driver的作用
- 每一個spark作業都包括一個Driver進程,用於運行我們提交的main函數。其功能包括創建SparkContext,並負責向集羣申請資源、作業的調度等。
-
13、spark中worker的作用
- 管理節點的資源並與master進行通信。
-
RDD、DataFrame、DataSet之間的區別?
-
hadoop和spark的shuffle區別?
-
高可用性?
- 使用zookeeper