1. 程式人生 > >京東商城大資料面試題

京東商城大資料面試題

Java篇

1、JVM,GC(演算法,新生代,老年代),JVM結構
2、hashcode,hashMap,list,hashSet,equals(結構原理),A extends  B(類的載入順序)
1.父類靜態程式碼塊;
2.子類靜態程式碼塊;
3.父類非靜態程式碼塊;
4.父類建構函式;
5.子類非靜態程式碼塊;
6.子類建構函式;
3、多執行緒,主執行緒,次執行緒,喚醒,睡眠

4、常見演算法:冒泡演算法,排序演算法,二分查詢,時間複雜度

(2)Flume篇
1、資料怎麼採集到Kafka,實現方式
使用官方提供的flumeKafka外掛,外掛的實現方式是自定義了flume的sink,將資料從channle中取出,通過kafka的producer寫入到kafka中,

可以自定義分割槽等。
2、flume管道記憶體,flume宕機了資料丟失怎麼解決
1、Flume的channel分為很多種,可以將資料寫入到檔案
2、防止非首個agent宕機的方法數可以做叢集或者主備
3、flume配置方式,flume叢集(問的很詳細)
Flume的配置圍繞著source、channel、sink敘述,flume的叢集是做在agent上的,而非機器上。
4、flume不採集Nginx日誌,通過Logger4j採集日誌,優缺點是什麼?
優點:Nginx的日誌格式是固定的,但是缺少sessionid,通過logger4j採集的日誌是帶有sessionid的,而session可以通過redis共享,

保證了叢集日誌中的同一session落到不同的tomcat時,sessionId還是一樣的,而且logger4j的方式比較穩定,不會宕機。
缺點:不夠靈活,logger4j的方式和專案結合過於緊密,而flume的方式比較靈活,拔插式比較好,不會影響專案效能。
5、flume和kafka採集日誌區別,採集日誌時中間停了,怎麼記錄之前的日誌。
Flume採集日誌是通過流的方式直接將日誌收集到儲存層,而kafka試講日誌快取在kafka叢集,待後期可以採集到儲存層。
Flume採集中間停了,可以採用檔案的方式記錄之前的日誌,而kafka是採用offset的方式記錄之前的日誌。
(3)Kafka篇
1、容錯機制
分割槽備份,存在主備partition

2、同一topic不同partition分割槽
????
3、kafka資料流向
Producer  leader partition  follower partition(半數以上) consumer
4、kafka+spark-streaming結合丟資料怎麼解決?

spark streaming1.2開始提供了資料的零丟失,想享受這個特性,需要滿足如下條件:

1. 資料輸入需要可靠的sources和可靠的receivers

2. 應用metadata必須通過應用driver checkpoint

3. WALwrite ahead log

1.1. 可靠的sourcesreceivers

spark streaming可以通過多種方式作為資料sources(包括kafka),輸入資料通過receivers接收,通過replication儲存於spark中(為了faultolerance,預設複製到兩個spark executors),如果資料複製完成,receivers可以知道(例如kafka中更新offsetszookeeper中)。這樣當receivers在接收資料過程中crash掉,不會有資料丟失,receivers沒有複製的資料,當receiver恢復後重新接收。

1.2. metadata checkpoint

可靠的sourcesreceivers,可以使資料在receivers失敗後恢復,然而在driver失敗後恢復是比較複雜的,一種方法是通過checkpoint metadataHDFS或者S3metadata包括:

· configuration

· code

· 一些排隊等待處理但沒有完成的RDD(僅僅是metadata,而不是data

這樣當driver失敗時,可以通過metadata checkpoint,重構應用程式並知道執行到那個地方。

1.3. 資料可能丟失的場景

可靠的sourcesreceivers,以及metadata checkpoint也不可以保證資料的不丟失,例如:

· 兩個executor得到計算資料,並儲存在他們的記憶體中

· receivers知道資料已經輸入

· executors開始計算資料

· driver突然失敗

· driver失敗,那麼executors都會被kill

· 因為executorkill掉,那麼他們記憶體中得資料都會丟失,但是這些資料不再被處理

· executor中的資料不可恢復

1.4. WAL

為了避免上面情景的出現,spark streaming 1.2引入了WAL。所有接收的資料通過receivers寫入HDFS或者S3checkpoint目錄,這樣當driver失敗後,executor中資料丟失後,可以通過checkpoint恢復。

1.5. At-Least-Once

儘管WAL可以保證資料零丟失,但是不能保證exactly-once,例如下面場景:

· Receivers接收完資料並儲存到HDFSS3

· 在更新offset前,receivers失敗了

· Spark Streaming以為資料接收成功,但是Kafka以為資料沒有接收成功,因為offset沒有更新到zookeeper

· 隨後receiver恢復了

· WAL可以讀取的資料重新消費一次,因為使用的kafka High-Level消費API,從zookeeper中儲存的offsets開始消費

1.6. WAL的缺點

通過上面描述,WAL有兩個缺點:

· 降低了receivers的效能,因為資料還要儲存到HDFS等分散式檔案系統

· 對於一些resources,可能存在重複的資料,比如Kafka,在Kafka中存在一份資料,在Spark Streaming也存在一份(以WAL的形式儲存在hadoop API相容的檔案系統中)

1.7. Kafka direct API

為了WAL的效能損失和exactly-oncespark streaming1.3中使用Kafka direct API。非常巧妙,Spark driver計算下個batchoffsets,指導executor消費對應的topicspartitions。消費Kafka訊息,就像消費檔案系統檔案一樣。

1. 不再需要kafka receiversexecutor直接通過Kafka API消費資料

2. WAL不再需要,如果從失敗恢復,可以重新消費

3. exactly-once得到了保證,不會再從WAL中重複讀取資料

1.8. 總結

主要說的是spark streaming通過各種方式來保證資料不丟失,並保證exactly-once,每個版本都是spark streaming越來越穩定,越來越向生產環境使用發展。

5、kafka中儲存目錄data/dir.....topic1和topic2怎麼儲存的,儲存結構,data.....目錄下有多少個分割槽,每個分割槽的儲存格式是什麼樣的?
1、topic是按照“主題名-分割槽”儲存的
2、分割槽個數由配置檔案決定
3、每個分割槽下最重要的兩個檔案是0000000000.log和000000.index,0000000.log以預設1G大小回滾。
(4)Hive篇
1、hive partition分割槽
分割槽表,動態分割槽
2、insert into 和 override write區別?
insert into:將某一張表中的資料寫到另一張表中
override write:覆蓋之前的內容。
3、假如一個分割槽的資料主部錯誤怎麼通過hivesql刪除hdfs
alter table ptable drop partition (daytime='20140911',city='bj');
元資料,資料檔案都刪除,但目錄daytime= 20140911還在
(5)Storm篇         
 1、開發流程,容錯機制
開發流程:
1、寫主類(設計spout和bolt的分發機制)
2、寫spout收集資料
3、寫bolt處理資料,根據資料量和業務的複雜程度,設計並行度。
容錯機制:採用ack和fail進行容錯,失敗的資料重新發送。
2、storm和spark-streaming:為什麼用storm不同spark-streaming
3、mr和spark區別,怎麼理解spark-rdd
Mr是檔案方式的分散式計算框架,是將中間結果和最終結果記錄在檔案中,map和reduce的資料分發也是在檔案中。
spark是記憶體迭代式的計算框架,計算的中間結果可以快取記憶體,也可以快取硬碟,但是不是每一步計算都需要快取的。
Spark-rdd是一個數據的分割槽記錄集合………………

4、sqoop命令

sqoop import --connect jdbc:mysql://192.168.56.204:3306/sqoop --username hive --password hive --table jobinfo --target-dir /sqoop/test7 --inline-lob-limit 16777216 --fields-terminated-by '\t' -m 2

sqoop create-hive-table --connect jdbc:mysql://192.168.56.204:3306/sqoop --table jobinfo --username hive --password hive --hive-table sqtest --fields-terminated-by "\t" --lines-terminated-by "\n";

(6)Redis篇
1、基本操作,儲存格式

(7)Mysql篇
1、mysql叢集的分散式事務
京東自主開發分散式MYSQL集群系統
2、mysql效能優化(資料方面)
資料的分表、分庫、分割槽
(6)Hadoop篇
1、hadoop HA  兩個namenode和zk之間的通訊,zk的選舉機制?
HA是通過先後獲取zk的鎖決定誰是主
Zk的選舉機制,涉及到全新機群的選主和資料恢復的選主

2、mr執行機制

3、yarn流程


1)使用者向YARN 中提交應用程式, 其中包括ApplicationMaster 程式、啟動ApplicationMaster 的命令、使用者程式等。
2)ResourceManager 為該應用程式分配第一個Container, 並與對應的NodeManager 通訊,要求它在這個Container 中啟動應用程式
的ApplicationMaster。
3)ApplicationMaster 首先向ResourceManager 註冊, 這樣使用者可以直接通過ResourceManage 檢視應用程式的執行狀態,然後它將
為各個任務申請資源,並監控它的執行狀態,直到執行結束,即重複步驟4~7。
4)ApplicationMaster 採用輪詢的方式通過RPC 協議向ResourceManager 申請和領取資源。
5)一旦ApplicationMaster 申請到資源後,便與對應的NodeManager 通訊,要求它啟動任務。
6)NodeManager 為任務設定好執行環境(包括環境變數、JAR 包、二進位制程式等)後,將任務啟動命令寫到一個指令碼中,並通過執行
該指令碼啟動任務。
7)各個任務通過某個RPC 協議向ApplicationMaster 彙報自己的狀態和進度,以讓ApplicationMaster 隨時掌握各個任務的執行狀態,
從而可以在任務失敗時重新啟動任務。在應用程式執行過程中,使用者可隨時通過RPC 向ApplicationMaster 查詢應用程式的當前執行狀態。
8)應用程式執行完成後,ApplicationMaster 向ResourceManager 登出並關閉自己。
(7)Hbase
1、涉及到概念,文件
(8)Spark篇
1、spark原理  

Spark應用轉換流程

1、 spark應用提交後,經歷了一系列的轉換,最後成為task在每個節點上執行

2、 RDD的Action運算元觸發Job的提交,生成RDD DAG

3、 由DAGScheduler將RDD DAG轉化為Stage DAG,每個Stage中產生相應的Task集合

4、 TaskScheduler將任務分發到Executor執行

5、 每個任務對應相應的一個數據塊,只用使用者定義的函式處理資料塊

Driver執行在Worker

   通過org.apache.spark.deploy.Client類執行作業,作業執行命令如下:

作業執行流程描述:

1、客戶端提交作業給Master

2Master讓一個Worker啟動Driver,即SchedulerBackendWorker建立一個DriverRunner執行緒,DriverRunner啟動SchedulerBackend程序。

3、另外Master還會讓其餘Worker啟動Exeuctor,即ExecutorBackendWorker建立一個ExecutorRunner執行緒,ExecutorRunner會啟動ExecutorBackend程序。

4ExecutorBackend啟動後會向DriverSchedulerBackend註冊。SchedulerBackend程序中包含DAGScheduler,它會根據使用者程式,生成執行計劃,並排程執行。對於每個stagetask,都會被存放到TaskScheduler中,ExecutorBackendSchedulerBackend彙報的時候把TaskScheduler中的task排程到ExecutorBackend執行。

5、所有stage都完成後作業結束。

Driver執行在客戶端

作業執行流程描述:

1、客戶端啟動後直接執行使用者程式,啟動Driver相關的工作:DAGSchedulerBlockManagerMaster等。

2、客戶端的DriverMaster註冊。

3Master還會讓Worker啟動ExeuctorWorker建立一個ExecutorRunner執行緒,ExecutorRunner會啟動ExecutorBackend程序。

4ExecutorBackend啟動後會向DriverSchedulerBackend註冊。DriverDAGScheduler解析作業並生成相應的Stage,每個Stage包含的Task通過TaskScheduler分配給Executor執行。

5、所有stage都完成後作業結束。