Spark【面試】

2020-10-19 Java幫幫


Spark【面試】

1、簡答說一下hadoop的map-reduce編程模型

首先map task會從本地文件系統讀取數據,轉換成key-value形式的鍵值對集合

使用的是hadoop內置的數據類型,比如longwritable、text等

將鍵值對集合輸入mapper進行業務處理過程,將其轉換成需要的key-value在輸出

之後會進行一個partition分區操作,默認使用的是hashpartitioner,可以通過重寫hashpartitioner的getpartition方法來自定義分區規則

之後會對key進行進行sort排序,grouping分組操作將相同key的value合併分組輸出,在這裡可以使用自定義的數據類型,重寫WritableComparator的Comparator方法來自定義排序規則,重寫RawComparator的compara方法來自定義分組規則

之後進行一個combiner歸約操作,其實就是一個本地段的reduce預處理,以減小後面shufle和reducer的工作量

reduce task會通過網絡將各個數據收集進行reduce處理,最後將數據保存或者顯示,結束整個job

2、hadoop的TextInputFormat作用是什麼,如何自定義實現

InputFormat會在map操作之前對數據進行兩方面的預處理 
1是getSplits,返回的是InputSplit數組,對數據進行split分片,每片交給map操作一次 
2是getRecordReader,返回的是RecordReader對象,對每個split分片進行轉換為key-value鍵值對格式傳遞給map

常用的InputFormat是TextInputFormat,使用的是LineRecordReader對每個分片進行鍵值對的轉換,以行偏移量作為鍵,行內容作為值

自定義類繼承InputFormat接口,重寫createRecordReader和isSplitable方法 
在createRecordReader中可以自定義分隔符

3、hadoop和spark的都是並行計算,那麼他們有什麼相同和區別

兩者都是用mr模型來進行並行計算,hadoop的一個作業稱為job,job裡面分為map task和reduce task,每個task都是在自己的進程中運行的,當task結束時,進程也會結束

spark用戶提交的任務成為application,一個application對應一個sparkcontext,app中存在多個job,每觸發一次action操作就會產生一個job

這些job可以並行或串行執行,每個job中有多個stage,stage是shuffle過程中DAGSchaduler通過RDD之間的依賴關係劃分job而來的,每個stage裡面有多個task,組成taskset有TaskSchaduler分發到各個executor中執行,executor的生命周期是和app一樣的,即使沒有job運行也是存在的,所以task可以快速啟動讀取內存進行計算

hadoop的job只有map和reduce操作,表達能力比較欠缺而且在mr過程中會重複的讀寫hdfs,造成大量的io操作,多個job需要自己管理關係

spark的迭代計算都是在內存中進行的,API中提供了大量的RDD操作如join,groupby等,而且通過DAG圖可以實現良好的容錯

4、為什麼要用flume導入hdfs,hdfs的構架是怎樣的

flume可以實時的導入數據到hdfs中,當hdfs上的文件達到一個指定大小的時候會形成一個文件,或者超過指定時間的話也形成一個文件

文件都是存儲在datanode上面的,namenode記錄著datanode的元數據信息,而namenode的元數據信息是存在內存中的,所以當文件切片很小或者很多的時候會卡死

5、map-reduce程序運行的時候會有什麼比較常見的問題

比如說作業中大部分都完成了,但是總有幾個reduce一直在運行

這是因為這幾個reduce中的處理的數據要遠遠大於其他的reduce,可能是因為對鍵值對任務劃分的不均勻造成的數據傾斜

解決的方法可以在分區的時候重新定義分區規則對於value數據很多的key可以進行拆分、均勻打散等處理,或者是在map端的combiner中進行數據預處理的操作

6、簡單說一下hadoop和spark的shuffle過程

hadoop:map端保存分片數據,通過網絡收集到reduce端 
spark:spark的shuffle是在DAGSchedular劃分Stage的時候產生的,TaskSchedule要分發Stage到各個worker的executor

減少shuffle可以提高性能

7、Hive中存放是什麼?

表。 
存的是和hdfs的映射關係,hive是邏輯上的數據倉庫,實際操作的都是hdfs上的文件,HQL就是用sql語法來寫的mr程序。

8、Hive與關係型資料庫的關係?

沒有關係,hive是數據倉庫,不能和資料庫一樣進行實時的CURD操作。 
是一次寫入多次讀取的操作,可以看成是ETL工具。

9、Flume工作機制是什麼?

核心概念是agent,裡面包括source、chanel和sink三個組件。 
source運行在日誌收集節點進行日誌採集,之後臨時存儲在chanel中,sink負責將chanel中的數據發送到目的地。 
只有成功發送之後chanel中的數據才會被刪除。 
首先書寫flume配置文件,定義agent、source、chanel和sink然後將其組裝,執行flume-ng命令。

10、Sqoop工作原理是什麼?

hadoop生態圈上的數據傳輸工具。 
可以將關係型資料庫的數據導入非結構化的hdfs、hive或者bbase中,也可以將hdfs中的數據導出到關係型資料庫或者文本文件中。 
使用的是mr程序來執行任務,使用jdbc和關係型資料庫進行交互。 
import原理:通過指定的分隔符進行數據切分,將分片傳入各個map中,在map任務中在每行數據進行寫入處理沒有reduce。 
export原理:根據要操作的表名生成一個java類,並讀取其元數據信息和分隔符對非結構化的數據進行匹配,多個map作業同時執行寫入關係型資料庫

11、Hbase行健列族的概念,物理模型,表的設計原則?

行健:是hbase表自帶的,每個行健對應一條數據。 
列族:是創建表時指定的,為列的集合,每個列族作為一個文件單獨存儲,存儲的數據都是字節數組,其中的數據可以有很多,通過時間戳來區分。 
物理模型:整個hbase表會拆分為多個region,每個region記錄著行健的起始點保存在不同的節點上,查詢時就是對各個節點的並行查詢,當region很大時使用.META表存儲各個region的起始點,-ROOT又可以存儲.META的起始點。 
rowkey的設計原則:各個列簇數據平衡,長度原則、相鄰原則,創建表的時候設置表放入regionserver緩存中,避免自動增長和時間,使用字節數組代替string,最大長度64kb,最好16位元組以內,按天分表,兩個字節散列,四個字節存儲時分毫秒。 
列族的設計原則:儘可能少(按照列族進行存儲,按照region進行讀取,不必要的io操作),經常和不經常使用的兩類數據放入不同列族中,列族名字儘可能短。

12、Spark Streaming和Storm有何區別?

一個實時毫秒一個準實時亞秒,不過storm的吞吐率比較低。

13、mllib支持的算法?

大體分為四大類,分類、聚類、回歸、協同過濾。

14、簡答說一下hadoop的map-reduce編程模型?

首先map task會從本地文件系統讀取數據,轉換成key-value形式的鍵值對集合。 
將鍵值對集合輸入mapper進行業務處理過程,將其轉換成需要的key-value在輸出。 
之後會進行一個partition分區操作,默認使用的是hashpartitioner,可以通過重寫hashpartitioner的getpartition方法來自定義分區規則。 
之後會對key進行進行sort排序,grouping分組操作將相同key的value合併分組輸出。 
在這裡可以使用自定義的數據類型,重寫WritableComparator的Comparator方法來自定義排序規則,重寫RawComparator的compara方法來自定義分組規則。 
之後進行一個combiner歸約操作,其實就是一個本地段的reduce預處理,以減小後面shufle和reducer的工作量。 
reduce task會通過網絡將各個數據收集進行reduce處理,最後將數據保存或者顯示,結束整個job。

15、Hadoop平臺集群配置、環境變量設置?

zookeeper:修改zoo.cfg文件,配置dataDir,和各個zk節點的server地址埠,tickTime心跳時間默認是2000ms,其他超時的時間都是以這個為基礎的整數倍,之後再dataDir對應目錄下寫入myid文件和zoo.cfg中的server相對應。

hadoop:修改 
hadoop-env.sh配置java環境變量 
core-site.xml配置zk地址,臨時目錄等 
hdfs-site.xml配置nn信息,rpc和http通信地址,nn自動切換、zk連接超時時間等 
yarn-site.xml配置resourcemanager地址 
mapred-site.xml配置使用yarn 
slaves配置節點信息 
格式化nn和zk。

hbase:修改 
hbase-env.sh配置java環境變量和是否使用自帶的zk 
hbase-site.xml配置hdfs上數據存放路徑,zk地址和通訊超時時間、master節點 
regionservers配置各個region節點 
zoo.cfg拷貝到conf目錄下

spark: 
安裝Scala 
修改spark-env.sh配置環境變量和master和worker節點配置信息

環境變量的設置:直接在/etc/profile中配置安裝的路徑即可,或者在當前用戶的宿主目錄下,配置在.bashrc文件中,該文件不用source重新打開shell窗口即可,配置在.bash_profile的話只對當前用戶有效。

16、Hadoop性能調優?

調優可以通過系統配置、程序編寫和作業調度算法來進行。 
hdfs的block.size可以調到128/256(網絡很好的情況下,默認為64) 
調優的大頭:mapred.map.tasks、mapred.reduce.tasks設置mr任務數(默認都是1) 
mapred.tasktracker.map.tasks.maximum每臺機器上的最大map任務數 
mapred.tasktracker.reduce.tasks.maximum每臺機器上的最大reduce任務數 
mapred.reduce.slowstart.completed.maps配置reduce任務在map任務完成到百分之幾的時候開始進入 
這個幾個參數要看實際節點的情況進行配置,reduce任務是在33%的時候完成copy,要在這之前完成map任務,(map可以提前完成) 
mapred.compress.map.output,mapred.output.compress配置壓縮項,消耗cpu提升網絡和磁碟io 
合理利用combiner 
注意重用writable對象

17、Hadoop高並發?

首先肯定要保證集群的高可靠性,在高並發的情況下不會掛掉,支撐不住可以通過橫向擴展。 
datanode掛掉了使用hadoop腳本重新啟動。

18、hadoop的TextInputFormat作用是什麼,如何自定義實現?

InputFormat會在map操作之前對數據進行兩方面的預處理。 
1是getSplits,返回的是InputSplit數組,對數據進行split分片,每片交給map操作一次 。 
2是getRecordReader,返回的是RecordReader對象,對每個split分片進行轉換為key-value鍵值對格式傳遞給map。 
常用的InputFormat是TextInputFormat,使用的是LineRecordReader對每個分片進行鍵值對的轉換,以行偏移量作為鍵,行內容作為值。 
自定義類繼承InputFormat接口,重寫createRecordReader和isSplitable方法 。 
在createRecordReader中可以自定義分隔符。

19、hadoop和spark的都是並行計算,那麼他們有什麼相同和區別?

兩者都是用mr模型來進行並行計算,hadoop的一個作業稱為job,job裡面分為map task和reduce task,每個task都是在自己的進程中運行的,當task結束時,進程也會結束。 
spark用戶提交的任務成為application,一個application對應一個sparkcontext,app中存在多個job,每觸發一次action操作就會產生一個job。 
這些job可以並行或串行執行,每個job中有多個stage,stage是shuffle過程中DAGSchaduler通過RDD之間的依賴關係劃分job而來的,每個stage裡面有多個task,組成taskset有TaskSchaduler分發到各個executor中執行,executor的生命周期是和app一樣的,即使沒有job運行也是存在的,所以task可以快速啟動讀取內存進行計算。 
hadoop的job只有map和reduce操作,表達能力比較欠缺而且在mr過程中會重複的讀寫hdfs,造成大量的io操作,多個job需要自己管理關係。 
spark的迭代計算都是在內存中進行的,API中提供了大量的RDD操作如join,groupby等,而且通過DAG圖可以實現良好的容錯。

20、為什麼要用flume導入hdfs,hdfs的構架是怎樣的?

flume可以實時的導入數據到hdfs中,當hdfs上的文件達到一個指定大小的時候會形成一個文件,或者超過指定時間的話也形成一個文件。 
文件都是存儲在datanode上面的,namenode記錄著datanode的元數據信息,而namenode的元數據信息是存在內存中的,所以當文件切片很小或者很多的時候會卡死。

21、map-reduce程序運行的時候會有什麼比較常見的問題?

比如說作業中大部分都完成了,但是總有幾個reduce一直在運行。 
這是因為這幾個reduce中的處理的數據要遠遠大於其他的reduce,可能是因為對鍵值對任務劃分的不均勻造成的數據傾斜。 
解決的方法可以在分區的時候重新定義分區規則對於value數據很多的key可以進行拆分、均勻打散等處理,或者是在map端的combiner中進行數據預處理的操作。

22、簡單說一下hadoop和spark的shuffle過程?

hadoop:map端保存分片數據,通過網絡收集到reduce端。 
spark:spark的shuffle是在DAGSchedular劃分Stage的時候產生的,TaskSchedule要分發Stage到各個worker的executor。 
減少shuffle可以提高性能。

23、RDD機制?

rdd分布式彈性數據集,簡單的理解成一種數據結構,是spark框架上的通用貨幣。 
所有算子都是基於rdd來執行的,不同的場景會有不同的rdd實現類,但是都可以進行互相轉換。 
rdd執行過程中會形成dag圖,然後形成lineage保證容錯性等。 
從物理的角度來看rdd存儲的是block和node之間的映射。

24、spark有哪些組件?

(1)master:管理集群和節點,不參與計算。 
(2)worker:計算節點,進程本身不參與計算,和master匯報。 
(3)Driver:運行程序的main方法,創建spark context對象。 
(4)spark context:控制整個application的生命周期,包括dagsheduler和task scheduler等組件。 
(5)client:用戶提交程序的入口。

25、spark工作機制?

用戶在client端提交作業後,會由Driver運行main方法並創建spark context上下文。 
執行add算子,形成dag圖輸入dagscheduler,按照add之間的依賴關係劃分stage輸入task scheduler。 
task scheduler會將stage劃分為task set分發到各個節點的executor中執行。

26、spark的優化怎麼做?

通過spark-env文件、程序中sparkconf和set property設置。 
(1)計算量大,形成的lineage過大應該給已經緩存了的rdd添加checkpoint,以減少容錯帶來的開銷。 
(2)小分區合併,過小的分區造成過多的切換任務開銷,使用repartition。

27、kafka工作原理?

producer向broker發送事件,consumer從broker消費事件。 
事件由topic區分開,每個consumer都會屬於一個group。 
相同group中的consumer不能重複消費事件,而同一事件將會發送給每個不同group的consumer。

28、ALS算法原理?

答:對於user-product-rating數據,als會建立一個稀疏的評分矩陣,其目的就是通過一定的規則填滿這個稀疏矩陣。 
als會對稀疏矩陣進行分解,分為用戶-特徵值,產品-特徵值,一個用戶對一個產品的評分可以由這兩個矩陣相乘得到。 
通過固定一個未知的特徵值,計算另外一個特徵值,然後交替反覆進行最小二乘法,直至差平方和最小,即可得想要的矩陣。

29、kmeans算法原理?

隨機初始化中心點範圍,計算各個類別的平均值得到新的中心點。 
重新計算各個點到中心值的距離劃分,再次計算平均值得到新的中心點,直至各個類別數據平均值無變化。

30、canopy算法原理?

根據兩個閾值來劃分數據,以隨機的一個數據點作為canopy中心。 
計算其他數據點到其的距離,劃入t1、t2中,劃入t2的從數據集中刪除,劃入t1的其他數據點繼續計算,直至數據集中無數據。

31、樸素貝葉斯分類算法原理?

對於待分類的數據和分類項,根據待分類數據的各個特徵屬性,出現在各個分類項中的概率判斷該數據是屬於哪個類別的。

32、關聯規則挖掘算法apriori原理?

一個頻繁項集的子集也是頻繁項集,針對數據得出每個產品的支持數列表,過濾支持數小於預設值的項,對剩下的項進行全排列,重新計算支持數,再次過濾,重複至全排列結束,可得到頻繁項和對應的支持數。

相關焦點

  • 數據分析工程師面試集錦5——Spark面試指南
    導語本篇文章為大家帶來spark面試指南,文內會有兩種題型,問答題和代碼題,題目大部分來自於網絡上,有小部分是來自於工作中的總結,每個題目會給出一個參考答案。為什麼考察Spark?Spark作為大數據組件中的執行引擎,具備以下優勢特性。
  • 黑馬程式設計師:技術筆記大數據面試題之spark相關(二)
    昨天分享了大數據面試題之spark相關一,看到有很大的反響,今天就分享接下來的二,希望能更好的幫助到大家!2)spark用戶提交的任務成為application,一個application對應一個sparkcontext,app中存在多個job,每觸發一次action操作就會產生一個job。
  • Spark面試高頻考點,必知必會!
    RDD 可是Spark中最基本的數據抽象,我想就算面試不被問到,那自己是不是也應該非常清楚呢!transformationaction        如果面試官問你,那小夥幾,有哪些會引起Shuffle過程的Spark算子呢?
  • 詭異 | Spark使用get_json_object函數
    使用spark命令:/opt/software/spark-2.2.0-bin-hadoop2.6/bin/spark-sql \--master yarn-client \--driver-memory
  • 大數據分析工程師面試集錦3-SQL/SparkSql/HiveQL
    本文將SQL/SparkSql/HiveQL放在一起來梳理一份常見題型的面試題庫。面試題庫01SQL基礎知識考察對於面試初級數據分析師來說,SQL的面試重點會放在基礎知識的考察,如果最基本的基礎概念和語法都不能熟練回答出來的話,通過面試的機率就會很低。
  • ​Spark Core基礎面試題總結(上)
    Spark Core基礎面試題總結(上)1.://https://<k8s-apiserver-host>:<k8s-apiserver-port> \    --deploy-mode cluster \    --name spark-pi \    --class org.apache.spark.examples.SparkPi \    --conf spark.executor.instances
  • 面試必知的 Spark SQL 幾種 Join 實現
    spark提供了三種join實現:sort merge join、broadcast join以及hash join。這個不用我們擔心,spark sql自動幫我們完成,當buildIter的估計大小不超過參數spark.sql.autoBroadcastJoinThreshold設定的值(默認10M),那麼就會自動採用broadcast join,否則採用sort merge join。
  • Spark 2.0系列之SparkSession詳解
    的各項功能,用戶不但可以使用DataFrame和Dataset的各種API,學習Spark的難度也會大大降低。SparkSession的功能首先,我們從一個Spark應用案例入手:SparkSessionZipsExample可以從JSON文件中讀取郵政編碼,通過DataFrame API進行分析,同時還能夠使用Spark SQL語句實施查詢。
  • 一、Spark概述
    2、易用性(可以通過java/scala/python/R開發spark應用程式)3、通用性(可以使用spark sql/spark streaming/mlib/Graphx)4、兼容性(spark程序可以運行在standalone/yarn/mesos)Spark 框架模塊整個Spark 框架模塊包含
  • 『 Spark 』2. spark 基本概念解析
    過程中的理解記錄 + 對參考文章中的一些理解 + 個人實踐spark過程中的一些心得而來。寫這樣一個系列僅僅是為了梳理個人學習spark的筆記記錄,並非為了做什麼教程,所以一切以個人理解梳理為主,沒有必要的細節就不會記錄了。若想深入了解,最好閱讀參考文章和官方文檔。其次,本系列是基於目前最新的 spark 1.6.0 系列開始的,spark 目前的更新速度很快,記錄一下版本好還是必要的。1.
  • 【大數據嗶嗶集20210117】Spark面試題靈魂40問
    13.計算曝光數和點擊數14.分別列出幾個常用的transformation和action算子15.按照需求使用spark編寫以下程序,要求使用scala語言16.spark應用程式的執行命令是什麼?17.Spark應用執行有哪些模式,其中哪幾種是集群模式18.請說明spark中廣播變量的用途19.以下代碼會報錯嗎?
  • 百度大數據三面題:shuffle過程+HBase+Spark優化+kmeans算法
    剛剛收到百度的offer內心激動的同時也挺欣慰,經過幾輪的面試下來心裡其實已經有個底了,不過沒有拿到offer的時候內心還是挺慌的,最後終於如願以償的拿到了offer,也算是對得起這麼久的準備。hadoop和spark的都是並行計算,那麼他們有什麼相同和區別呢?說一說Spark Streaming和Storm有何區別?kafka的數據存在內存還是磁碟Hive與關係型資料庫的關係?
  • 當MongoDB遇見Spark
    MongoDB的話, 那就不用再轉存一份到HDFS上了可以利用MongoDB強大的Aggregate做數據的篩選或預處理MongoDB Spark Connector介紹支持讀取和寫入,即可以將計算後的結果寫入MongoDB將查詢拆分為n個子任務, 如Connector會將一次match,拆分為多個子任務交給spark
  • 一網打盡Spark高頻面試題
    5個,我們企業是4個num-executors —— 啟動executors的數量,默認為2executor-memory ——executor內存大小,默認1Gdriver-cores ——driver使用內核數,默認為1driver-memory —— driver內存大小,默認512M2)給一個提交任務的樣式spark-submit
  • 『 Spark 』13. Spark 2.0 Release Notes 中文版
    過程中的理解記錄 + 對參考文章中的一些理解 + 個人實踐spark過程中的一些心得而來。寫這樣一個系列僅僅是為了梳理個人學習spark的筆記記錄,所以一切以能夠理解為主,沒有必要的細節就不會記錄了,而且文中有時候會出現英文原版文檔,只要不影響理解,都不翻譯了。若想深入了解,最好閱讀參考文章和官方文檔。其次,本系列是基於目前最新的 spark 1.6.0 系列開始的,spark 目前的更新速度很快,記錄一下版本號還是必要的。
  • 『 Spark 』9. 搭建 IPython + Notebook + Spark 開發環境
    過程中的理解記錄 + 對參考文章中的一些理解 + 個人實踐spark過程中的一些心得而來。寫這樣一個系列僅僅是為了梳理個人學習spark的筆記記錄,所以一切以能夠理解為主,沒有必要的細節就不會記錄了,而且文中有時候會出現英文原版文檔,只要不影響理解,都不翻譯了。若想深入了解,最好閱讀參考文章和官方文檔。其次,本系列是基於目前最新的 spark 1.6.0 系列開始的,spark 目前的更新速度很快,記錄一下版本號還是必要的。
  • 使用Golang實現Spark UDF
    組合即將大功告成,但我們需要一個spark jar包用來做編譯。我寫了一個Makefile,它會下載spark jar包、存儲到./spark_jars目錄下。有了spark jar包後就可以編譯Java代碼了:javac -cp \ spark_jars/spark-core_$(VERSION).jar:eventdecoder.jar:spark_jars/spark-sql_$(VERSION).jar \ java/com/community/EventsUDF/Decoder.java
  • Spark SQL重點知識總結
    ,路徑在下面的代碼中case class Person(name:String,age:Int)val peopleDF=spark.sparkContext.textFile("file:///root/spark/spark2.4.1/examples/src/main/resources/people.txt").map(_.split(",")).map(para=>Person(para
  • Spark-TFRecord: Spark將全面支持TFRecord
    Spark-TensorFlow-Connector 是 TensorFlow 生態圈的一部分,並且是由 DataBricks,spark 的創始公司提供。儘管 Spark-TensorFlow-Connector 提供基本的讀寫功能,但是我們在LinkedIn的使用中發現了兩個問題。首先,它基於RelationProvider接口。
  • spark結構化數據處理:Spark SQL、DataFrame和Dataset
    import org.apache.spark.sql.Rowimport org.apache.spark.sql.types.指定數據源通常需要使用數據源全名(如org.apache.spark.sql.parquet),但對於內建數據源,你也可以使用它們的短名(json、parquet和jdbc)。並且不同的數據源類型之間都可以相互轉換。