- java會嗎?不會。。。。。
- hdfs讀文件寫文件的流程
數據寫入
1-客戶端向NameNode發起請求
2-NameNode審核權限和剩余空間,滿足條件即允許寫入,并告知客戶端寫入的DataNode地址
3-客戶端向指定的DataNode發送數據包
4-被寫入數據的DataNode同時完成數據副本的復制工作,將其接收到的數據分給其他DataNode
5-DataNode1復制給2,2復制給3,4
6-寫入完成后客戶端會通知NameNode,NameNode負責做好元數據記錄工作(edits和fsimage)
關鍵點:
1-NameNode不負責數據寫入,只負責元數據記錄和權限審批
客2-戶端直接向一臺DataNode寫入數據,這個DataNode通常是離客戶端最近的一個
3-數據塊副本的復制工作由DataNode自行完成,別的節點不參與
數據讀取
1-客戶端想NameNode申請讀取文件
2-NameNode判斷客戶端權限等細節信息,允許其進行讀取,返回此文件的block列表(存儲節點位置)
3-客戶端拿到block列表后到DataNode尋找并讀取即可
關鍵點:
1-數據不由NameNode直接提供
2-NameNode提供的block列表,會基于網絡距離計算盡量給客戶端返回最近的哪一個
3-因為一個塊通常由三個備份,所以可以去尋找最近的一個,通常是通過IP地址和路由表推斷其網絡距離。 - map reduce 兩階段shuffle
1、map結果寫入環形內存緩沖區,當內存不足以存儲所有數據時,將數據批量溢寫到磁盤。為了盡量減少IO消耗,所以在數據寫入磁盤之前會先寫入緩沖區,待緩沖區達到閾值后才批量將數據寫入磁盤
2、partition分區。在數據寫入磁盤之前會先進行分區,一個分區對應一個reducer,期望數據在多個reducer之間達到均衡
3、排序(sort)和合并(combine)。數據經過分區之后,先按照key進行排序,如果用戶指定了Combiner,再進行combine操作
4、溢寫(spill)。經過排序和合并之后的數據會寫入磁盤文件,每次spill都會產生一個文件。一個分區上的文件也叫一個segment
5、歸并(merge)。一個map最終會生成一個磁盤文件,由于多次spill會產生多個文件,所以需要將這些文件進行merge,最終形成一個有序的大文件。merge過程中有可能遇到相同key的數據,如果用戶設置了Combiner,會執行combine操作
以上1-5是map階段的shuffle,以下是reduce階段的shuffle步驟
6、拷貝(copy)。當某個map完成后,reduce不斷拉取map生成的文件到ruduce。和map階段一樣先將數據寫入環形內存緩沖區,當達到閾值時,將數據批量溢寫到磁盤
7、排序(sort)和歸并(merge)。sort是伴隨copy動作時執行的,由于map的輸出是有序的,所以copy是進行sort消耗很低。當溢寫數據到磁盤之前,如果用戶設置了Combiner會先進行combine,然后將數據寫入磁盤文件。當接受完map數據會生成多個溢寫磁盤文件,將這些文件歸并merge,合并成一個有序的大文件
原文鏈接:https://blog.csdn.net/momo898821/article/details/104847599
-
hive內部表外部表區別
-
hive全量表,增量表,快照表,拉鏈表
全量表:記錄每天的所有的最新狀態的數據,有無變化都要上報,每次往全量表里面寫數據都會覆蓋之前的數據
缺點:不能記錄數據的歷史變化,只能截止到當前最新、全量的數據
增量表:記錄每天的新增的數據和改變的數據
快照表:按日分區,記錄截止數據日期的全量數據(每個分區都是記錄截止當前分區日期的全量數據)。
優點:可以反映歷史的變化
缺點:在數據量大的情況下,每個分區存儲的都是全量數據,數據冗余和浪費存儲空間
拉鏈表:
1、概念
記錄一個事物從開始,一直到當前狀態的所有變化的信息。(極限存儲)
優點:能夠解決快照表數據冗余問題,還能維護數據歷史狀態和最新狀態,記錄截止數據日期的全量數據
2、拉鏈表的使用場景
緩慢變化維SCD(表中的部分字段會被update更新操作,如用戶聯系方式,產品的描述信息,訂單的狀態等等;表中的記錄變化的比例和頻率不是很大,比如,總共有10億的用戶,每天新增和發生變化的有200萬左右,變化的比例占的很小。)
數據量很大(比如一張用戶表,大約10億條記錄,50個字段,這種表,即使使用ORC壓縮,單張表的存儲也會超過100G,在HDFS使用雙備份或者三備份的話就更大一些;需要查看某一個時間點或者時間段的歷史快照信息,比如,查看某一個訂單在歷史某一個時間點的狀態) -
spark寬窄依賴
寬依賴就是一個父親rdd被多個子rdd使用,會發生shuffle操作,對應的rdd算子有reducebykey,groupbykey,窄依賴就是一個父親rdd被一個子rdd依賴,經常做轉換傳遞等操作,對應的rdd算子例如map,filter。同時每出現一個寬依賴,會劃分一個新的stage。 -
spark常用算子,那些會引起shuffle
groupByKey():父 RDD 所有分區中相同 key 的數據需匯總到子 RDD 的同一分區(多對 1 依賴)。
reduceByKey(f):按 key 聚合,需收集父 RDD 多個分區的相同 key 數據(多對 1 依賴)。
sortByKey():按 key 排序,需全局重排,依賴父 RDD 所有分區。
distinct():去重需全局比較,依賴父 RDD 所有分區。
repartition(n):重新分區(無論增減),需 Shuffle(多對多依賴)。
?ReduceByKey?:
同時實現?分組與聚合?功能,需傳入自定義聚合函數(如累加、求極值等)。
返回類型為RDD[(K, V)],每個鍵對應聚合后的單一值。??
?GroupByKey?:
僅實現?鍵值分組?功能,不執行聚合。
返回類型為RDD[(K, Iterable[V])],每個鍵對應原始值的迭代器。??
?數據處理流程?
?ReduceByKey?:
?Shuffle前預聚合?:在各分區內對相同鍵值執行局部聚合(Combiner階段)。
?Shuffle階段?:僅傳輸預聚合后的中間結果。
?全局聚合?:在Reduce端合并各分區的預聚合結果。??
?GroupByKey?:
?直接Shuffle?:未經預處理的全量鍵值對直接跨節點傳輸。
?分組階段?:在Reduce端收集所有相同鍵值
原文鏈接:https://blog.csdn.net/2301_76971522/article/details/149782100
-
order by sort by distribute by和cluster by的區別
ORDER BY
?全局排序?:對整個結果集進行排序,僅允許一個Reducer處理數據,因此效率較低,適用于小數據量場景。 ?
?模式限制?:在嚴格模式下(hive.mapred.mode=strict),必須指定LIMIT或分區條件,否則執行會報錯。 ?
SORT BY
?局部排序?:在Reducer內部對數據進行排序,不保證全局有序。 ?
?多Reducer支持?:可設置多個Reducer(如mapreduce.job.reduces=n),每個Reducer處理局部有序數據。 ?
DISTRIBUTE BY
?數據分區?:通過hash算法將數據分發到不同Reducer,類似MR中的Partition。 ?
?結合SORT BY?:通常與SORT BY聯合使用,先分區再局部排序。 ?
CLUSTER BY
?組合功能?:當DISTRIBUTE BY和SORT BY的字段相同時,CLUSTER BY可同時完成分區和排序。 ?
?排序限制?:僅支持升序排序(默認),不支持降序或自定義排序規則。 ? -
數據倉庫的特點,4個
面向主題,可集成,隨時間變化,穩定 -
數倉分層,簡單介紹
結合實習經歷 -
數據倉庫和數據庫的區別
-
星型模型和雪花模型
-
事實表和維度表怎么區分
-
一道思考題
有一張電影表movie,里面包含電影id :movie_id,日期:dt,票房:box,求某個電影過去一周票方,一日電影票房,每個電影每日電影票房,存在一張hive表里面,能一次取出三個粒度的數據,怎么設計?
-- 每日每個電影票房
SELECT'daily' as type,movie_id,dt,SUM(box) as box_sum
FROM movie
WHERE dt >= date_sub(current_date, 7)
GROUP BY movie_id, dtUNION ALL-- 某個電影過去一周票房
SELECT'movie_week' as type,movie_id,NULL as dt,SUM(box) as box_sum
FROM movie
WHERE dt >= date_sub(current_date, 7)
GROUP BY movie_idUNION ALL-- 全部電影過去一周票房
SELECT'all_week' as type,NULL as movie_id,NULL as dt,SUM(box) as box_sum
FROM movie
WHERE dt >= date_sub(current_date, 7);