大數據面試題

1.講講你做的過的項目。 項目裏有哪些 難點重點注意點呢?

2.講講多線程吧, 要是你,你怎麼實現一個線程池呢?
爲了節省系統在多線程併發情況下不斷的創建新和銷燬線程所帶來的性能浪費,就需要引入線程池
首先寫個簡單的線程池接口繼承Runable,
客戶端可以通過execute(Job)方法將Job提交入線程池來執行,客戶端完全不用等待Job的執行完成。除了execute(Job)方法以外,線程池接口提供了增加/減少工作者線程以及關閉線程池的方法。每個客戶端提交的Job都會進入到一個工作隊列中等待工作者線程的處理。
從線程池的實現中可以看出,當客戶端調用execute(Job)方法時,會不斷地向任務列表jobs中添加Job,而每個工作者線程會不讀的從jobs上獲取Job來執行,當jobs爲空時,工作者線程進入WAITING狀態。
當添加一個Job後,對工作隊列jobs調用其notify()方法來喚醒一個工作者線程。此處我們不調用notifyAll(),避免將等待隊列中的線程全部移動到阻塞隊列中而造成資源浪費。
線程池的本質就是使用了一個線程安全的工作隊列連接工作者線程和客戶端線程。客戶端線程把任務放入工作隊列後便返回,而工作者線程則不端的從工作隊列中取出工作並執行。當工作隊列爲空時,工作者線程進入WAITING狀態,當有客戶端發送任務過來後會通過任意一個工作者線程,隨着大量任務的提交,更多的工作者線程被喚醒。

3.shuffle 是什麼? 怎麼調優?
Shuffle過程是MapReduce的核心,基於map與reduce之間,Shuffle描述着數據從map task輸出到reduce task輸入的這段過程。 其意思是洗牌,

調優:
完整的從map task端拉取數據到reduce端
在跨節點拉取數據是,儘可能的減少對寬帶端的不必要的消耗
減少磁盤IO對Task的影響(減少拉取數據的量及儘量使用內存而不是磁盤)

4.hbase 的特點是什麼?
(1) Hbase一個分佈式的基於列式存儲的數據庫,基於Hadoop的hdfs存儲,zookeeper進行管理。
(2) Hbase適合存儲半結構化或非結構化數據,對於數據結構字段不夠確定或者雜亂無章很難按一個概念去抽取的數據。
(3) Hbase爲null的記錄不會被存儲.
(4)基於的表包含rowkey,時間戳,和列族。新寫入數據時,時間戳更新,同時可以查詢到以前的版本.
(5) hbase是主從架構。hmaster作爲主節點,regionserver作爲從節點。

5.以 start-hbase.sh 爲起點,Hbase 啓動的流程是什麼?
t-hbase.sh 的流程如下:
1. 運行 hbase-config.sh
hbase-config.sh的作用:
1>.裝載相關配置,如HBASE_HOME目錄,conf目錄,regionserver機器列表,JAVA_HOME 目錄等,它會調用$HBASE_HOME/conf/hbase-env.sh .
2>.解析參數(0.96 版本及以後纔可以帶唯一參數 autorestart,作用就是重啓)
3>.調用 hbase-daemon.sh 來啓動 master.
4>.調用 hbase-daemons.sh 來啓動 regionserver zookeeper master-backup.
2. hbase-env.sh 的作用:主要是配置 JVM 及其 GC 參數,還可以配置 log 目錄及參數,配置是否需要 hbase 管
理 ZK,配置進程 id 目錄等.
3. hbase-daemons.sh 的作用:根據需要啓動的進程,
如 zookeeper,則調用 zookeepers.sh
如 regionserver,則調用 regionservers.sh
如 master-backup,則調用 master-backup.sh
4. zookeepers.sh 的作用:如果 hbase-env.sh 中的 HBASE_MANAGES_ZK”=”true”,那麼通過ZKServerTool這個類解析xml配置文件,獲取 ZK 節點列表,然後通過 SSH 向這些節點發送遠程命令執行。
5. regionservers.sh 的作用:與 zookeepers.sh 類似,通過配置文件,獲取 regionserver 機器列表,然後 SSH 向這些機器發送遠程命令:
6. master-backup.sh 的作用:通過 backup-masters 這個配置文件,獲取 backup-masters 機器列表,然後 SSH 向這些機器發送遠程命令。

Scala? Scala的特點? 和Java的區別?
Scala相對Java語法更豐富,更簡潔,寫起來更像腳本,能夠提高開發效率。
使用Java的話代碼會規範些,不過太臃腫,代碼量更大。
另外Spark基本使用函數式編程,使用Java的話可能需要寫一大堆匿名類,而Scala只需要一個lambda表達式。

7.怎麼用spark做數據清洗?
使用spark RDD的轉換

8.Hadoop的機架感配置?
Hadoop在設計時考慮到數據的安全與高效,數據文件默認在HDFS上存放三份,存儲策略爲本地一份,同機架內其它某一節點上一份,不同機架的某一節點上一份。這樣如果本地數據損壞,節點可以從同一機架內的相鄰節點拿到數據,速度肯定比從跨機架節點上拿數據要快;同時,如果整個機架的網絡出現異常,也能保證在其它機架的節點上找到數據。爲了降低整體的帶寬消耗和讀取延時,HDFS會盡量讓讀取程序讀取離它最近的副本。如果在讀取程序的同一個機架上有一個副本,那麼就讀取該副本。如果一個HDFS集羣跨越多個數據中心,那麼客戶端也將首先讀本地數據中心的副本。那麼Hadoop是如何確定任意兩個節點是位於同一機架,還是跨機架的呢?答案就是機架感知。

9.簡答說一下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

10.hadoop的TextInputFormat作用是什麼,如何自定義實現
InputFormat會在map操作之前對數據進行兩方面處理
1是getSplits,返回的是InputSplit數組,對數據進行split分片,每片交給map操作一次
2是getRecordReader,返回的是RecordReader對象,對每個split分片進行轉換爲key-value鍵值對格式傳遞給map

11.hadoop和spark的都是並行計算,那麼他們有什麼相同和區別
hadoop的job有map和reduce操作,表達能力比較欠缺而且在mr過程中會重複的讀寫hdfs,造成大量的io操作,多個job需要自己管理關係

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

12.爲什麼要用flume導入hdfs,hdfs的構架是怎樣的?
flume可以實時的導入數據到hdfs中,當hdfs上的文件達到一個指定大小的時候會形成一個文件,或者超過指定時間的話也形成一個文件

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

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

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

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

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

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

18.Hbase行健列族的概念,物理模型,表的設計原則?
行鍵:是HBase自帶的,每個行鍵對應一條數據
列族:是創建表時制定的,爲列的集合,每個列族作爲一個文件單獨存儲,存儲的數據都是字節數列族,其中的數據可以有很多,通過時間戳來區分。
物理模型:每個Hbase表會拆分多個region,每個region記錄着行鍵的起始點保存在不同的節點上,查詢時就是對個節點的並行查詢,當region很大時使用.META表存儲各個region的起始點,-ROOT又可以存儲.META的起始點。
Rowkey的實際原則

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