大數據面試題整理

算法部分

  • 1、給定一個大文件(即無法一次性加載到內存中,以下的大文件均爲該定義),每行代表一個訪問IP,統計出現次數最多的IP。
    • 1)逐行讀取數據,並將數據映射(如取模)到N個小文件中;
      2)以IP爲Key,頻率爲Value,分別統計每個小文件中每個IP出現的次數;
      3)找出每個小文件中出現次數最多的IP;
      4)對這N個小文件出現次數最多的IP進行排序,得到最終結果。
  • 2、在1的基礎上,求出現次數最多的K個IP(top-K問題)
    • 1)、2)與上述一致;
      3)統計出每個小文件中出現次數最多的K個IP;
      4)對這N*K個IP出現的頻率進行排序,得到最終結果。
  • 3、給定a、b兩個大文件,每行代表一個訪問IP,求出a、b中重複的IP
    • 1)將a文件映射到N個小文件中;
      2)b文件執行與a文件一致的映射方法;
      3)現在問題轉化爲求解N個文件對中的重複IP,可將a文件的每個小文件中的IP通過集合存儲,再遍歷b文件中的小文件,判斷其IP是否在對應的文件中,如在則說明重複。

大數據工具部分

  • 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的某個分區丟了,就需要全部重新計算。
  • 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優化
  • 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端可以讀取累加器的數值。
  • 12、Driver的作用

    • 每一個spark作業都包括一個Driver進程,用於運行我們提交的main函數。其功能包括創建SparkContext,並負責向集羣申請資源、作業的調度等。
  • 13、spark中worker的作用

    • 管理節點的資源並與master進行通信。
  • RDD、DataFrame、DataSet之間的區別?

  • hadoop和spark的shuffle區別?

  • 高可用性?

    • 使用zookeeper
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章