一、Linux
1、常用的高階命令
ps -ef top iotop netstat df -h free tar rpm
2、檢視磁碟使用情況 檢視記憶體 檢視埠號
df -h top jmap -heap 程序號 netstat
二、Shell
1、常用工具
awk sed sort cut 知道對應名稱 =》 python
關注尚矽谷教育公眾號 回覆 python 前端 java
區塊鏈 安卓 運維 ui
大資料
2、手寫過哪些指令碼
1)分發
2)啟動停止
#!/bin/bash
case $1 in
"start")
for i in hadoop102 hadoop103 hadoop104
do
ssh $i "絕對路徑"
done
;;
"stop")
;;
esac
3)與mysql的匯入匯出 datax
4)資料層級內部
ods => ads
#!/bin/bash
定義變數 (app= gmall)x
獲取時間 (如果輸入時間,按照輸入時間走;如果沒有輸入時間,T+1)
sql ="具體邏輯 遇到時間換成$do_date 遇到表 庫名.表 自定義函式 庫名.自定義函式"
執行sql
3、'' ""
'' 不解析裡面變數的值
"" 解析裡面變數的值
巢狀:看誰在最外層。
三、Hadoop
1、入門
1)常用的埠號
2.x 50070 8088 19888 9000/8020
3.x 9870 8088 19888 9820/9000/8020
2)常用配置
2.x core-site.xml hdfs-site.xml mapred-site.xml yarn-site.xml slaves
3.x core-site.xml hdfs-site.xml mapred-site.xml yarn-site.xml workers
2、HDFS
1)HDFS讀寫流程 筆試題裡面出現 有沒有朋友
2)小檔案的危害
(1)儲存
預設情況 一個檔案塊 不管多小都會佔用NN 150位元組左右。
128m 一個檔案塊 =》 150位元組
1位元組 =》 150位元組
小檔案過多 浪費 NN的儲存記憶體
128g的記憶體 能儲存多少檔案塊
128g * 1024m * 1024k * 1024 位元組 / 150位元組 = 9.1億
(2)計算
預設情況的切分規則 ,每個檔案單獨切片。
1位元組 =》 1個maptask => 1g記憶體
128m => 1個maptask => 1g記憶體
3)小檔案怎麼解決
(1)har歸檔 本質減少 NN的儲存壓力
(2)JVM重用(10次)
開始 3s
幹活 2s
.......
幹活 2s
結束 3s
(3)combineTextinputformat 解決計算問題
將多個檔案放到一起統一切片,減少了maptask的個數,進而減少了叢集記憶體
(10個小檔案)
4)預設副本數
3個
5)塊大小
1.x 64m
2.x 3.x 128m
本地 32m 1.1 倍
企業 128m 256m 512m
塊大小取決於什麼?
磁碟的讀寫速度 普通的機械硬碟 100m/s 左右 =》 128m
普通的固態硬碟 200-300m/s => 256m
高階的固態硬碟 500-600m/s => 512m
3、mr
shffle 及其最佳化
map方法之後,reduce方法之前 ,混洗的過程 叫shuffle
4、yarn
1)yarn的工作機制
2)排程器
(1)FIFO 、容量、公平
(2)FIFO特點
支援單佇列 任務執行順序 先進先出 在企業中幾乎不用
(3)容量特點
支援多佇列 資源不夠的時候可以藉資源 執行任務的順序,優先滿足先進入任務的資源
(4)公平特點
支援多佇列 資源不夠的時候可以藉資源 執行任務的順序,每個任務公平享有佇列資源
按照缺額分配。
(5)在生產環境中應該怎麼選擇
如果對併發度要求比較高 ,選擇公平 中大型公司
如果對併發度要求比較低,選擇容量 中小型公司 我們的公司。
(6)預設的佇列有幾個
預設就一個default
按照框架引擎:hive spark flink mr 用的不多
部門 =》 業務線
使用者域 √
流量域 x
交易域 x
互動域 x
工具域 x
一個佇列 公司來了一個菜鳥 寫了一個遞迴死迴圈 整個數倉全部癱瘓
11.11 6.18
四、zookeeper
1、選舉機制 半數機制
2、安裝什麼數臺 安裝奇數臺
3、經驗值:
10臺伺服器安裝多少zk 3臺
20臺伺服器安裝多少zk 5臺
50臺伺服器安裝多少zk 7臺
100臺伺服器安裝多少zk 11臺
100臺伺服器安裝多少zk 11臺
zk臺數越多好處:可靠性高; 壞處 效率低
4、常用命令
create get ls delete deleteall
五、flume (三件事)
1、組成
1)taildir source
(1)斷點續傳、多目錄
(2)CDH1.6 apache 1.7 => 自定義source 實現斷點續傳
(3)重複:
自身想方法 自己採用事務
兄弟幫忙:下游處理 hive dwd spark flink redis 建議採用
2)channel
(1)file channel 磁碟 可靠性高 效率低
(2)memory channel 記憶體 可靠性低 效率高
(3)kafka channel kafka (磁碟) 可靠性高 效率 高
kafka channel 》 memory channel + kafka sink
apache 1.6版本產生的 當時沒有火 1.7之後火了
event(header ,body )
在生產環境中怎麼選擇:
如果下游是kafka ,優先選擇 kafka channel
如果下游不是kafka ,如果追求可靠性 選擇flie channel 和錢相關的
如果追求效率,選擇memory channel 普通的日誌
3)hdfs sink
小檔案 : 控制大小 128m
控制時間 30分鐘
2、三個器
1)攔截器
ETL攔截器。判斷json是否完整
可以不要,下游解析就可以。
時間戳攔截器:解決零點漂移問題。
自定義攔截器步驟:定義類 實現interceptor 重寫四個方法 初始化、關閉、單event、多event
靜態內部類 builder
打包 上傳到flume/lib 在配置檔案中 全類名$builder
2)選擇器
replicating 預設 把資料發往下一級所有通道
mul ... 把資料選擇性發往指定通道
3)監控器
g 如果發現 嘗試提交的次數 遠遠的大於最終 成功的次數。 說明發生了回滾。
增加flume記憶體
flume-env.sh 4-6g 預設記憶體非常小
找兄弟幫忙
增加flume臺數
日誌伺服器配置 8g 16g 32g
3、掛了 及其最佳化
掛了:
如果是memory channel 有可能丟失資料 100個event
最佳化:
1)hdfs sink
小檔案 : 控制大小 128m
控制時間 30分鐘
2)增加flume記憶體
flume-env.sh 4-6g 預設記憶體非常小
找兄弟幫忙
增加flume臺數
六、Hive(10件事)
1、組成
2、與mysql 等關聯式資料庫的區別
mysql hive
資料量 小 大
速度 小 增刪改查 大 查詢
除了語法接近以外,其他都不一樣
3、內部表和外部表區別
後設資料 原始資料
刪除內部表:後設資料 原始資料
刪除外部表:後設資料
在企業中 絕大多數情況建立外部表;
只有自己使用的臨時表,會建立內部表。
4、4個by
order by 全域性排序 容易OOM
sort by 排序
d by 分割槽 sort by + d by => 分割槽內有序
c by 用的比較少
5、系統函式
date_add date_sub next_day dateformat lastday
get_json_object
split substring
explode concat concat_ws collect_list collect_set
map array string
6、自定義函式
1)UDF 一進一出 map
定義類 繼承G..UDF 重寫裡面核心方法 evaluate
2)UDTF 一進多出 flatmap
定義類 繼承G..UDTF 重寫裡面三個方法 初始化(校驗返回值型別及名稱) 關閉 process (核心邏輯)
3)UDAF 多進一出 sum
打包 上傳到 HDFS路徑 在hive客戶端註冊 如果自定義函式在指令碼中出現,需要在自定義函式前面加上庫名
7、視窗函式
over ()
rank
手寫程式碼 =》 http://139.198.163.91:8083/#/list
8、最佳化
1)mapjoin預設開啟不用關閉 大小表join
2)提前進行行列過濾 (謂詞下推)
join where => where join
3)建立分割槽表,防止後續全表掃描
建立分桶表,不是必須的。 是在 對海量未知的資料,提前取樣,主要用來防止資料傾斜
4)小檔案處理
(1)Combinehiveinputformat => combinetextinputformat
將多個檔案放到一起統一切片,減少了maptask的個數,進而減少了叢集記憶體
(2)JVM重用 =》 mr中 jvm重用 道理一致 本週減少JVM開關的時間
(3)merge 如果maponly 任務預設開啟,如果是mr任務需要手動開啟。
單獨開啟一個mr,將小於16m的檔案合併到256m
5)採用壓縮
map (壓縮 快 snappy) reduce 減少磁碟IO
6)列式儲存
id name age
1 zs 18
2 lishi 19
行:1 zs 18 2 lishi 19
列:1 2 zs lishi 18 19
select name from user
7)可以提前進行 combiner at,1 at,1 => at,2
8)合理的設定map個數和reduce個數
128m 資料 =》 1g記憶體 1CU 1CPU =》 4G記憶體
map個數 = 切片個數 切片 =max (0, min(塊大小,long的最大值))
reduce個數 直接設定
9)更換引擎
mr => spark
9、資料傾斜
1)groupby
(1)map-side 開啟 相當於在map階段提前預聚合
(2)開啟 skewindata 在reduce階段自動幫你 底層二次聚合
(先加隨機數 之後 將隨機數去掉 再聚合)
2)join
(1)如果是 大表 和小表join =>mapjoin
(2)大表 大表 => skewjoin =true 預設 10萬個相同key進入一個reduce
(3)大表 大表 =》 SMBjoin 要求兩張表必須是 分桶 且有序的表
(4)大表 大表 =》 不是分桶表 左表隨機 右表擴容
累積型快照事實表
10、雜七雜八
七、Kafka 33件事
1、組成 生產者 broker 消費者 zk 4張圖
2、分割槽器分配策略:
1)如果指定了分割槽,那就把資料傳送到指定的分割槽
2)如果沒有指定分割槽,指定了key,按照key的hashcode值%分割槽數
3)如果沒有指定分割槽,也沒有指定key ,按照粘性分割槽處理
底層採用的是隨機
3、acks 應答
1)0 生產者傳送過來的資料,不需要應答,一直髮送。在生產環境中幾乎不用
2)1 生產者傳送過來的資料 ,Leader收到後,進行應答
3)-1 生產者傳送過來的資料,Leader和isr裡面所有的Follower都收到後,應答。
4、isr
follower和Leader如果在規定的時間30s 能夠正常通訊一次,該follower就會加到isr裡面
超過30s,該follower會進入到osr
5、如何保證資料可靠
acks = -1 + isr裡面最小副本數 》=2 + 副本數大於等於2
isr (Leader follower) 有退化為acks=1
6、如何提高吞吐量
1)32m快取 =》 64m
2)批次大小預設16k => 32k
3)linger.ms 預設是0ms => 5-100ms
4)採用壓縮 snappy zstd
7、如何保證資料有序
單分割槽內有序
我希望 將mysql中某張表 傳送到指定分割槽 key=表名
8、亂序問題
inflightrequest = 1
冪等性 + inflightrequest 《=5
9、重複資料處理
冪等性 + 事務
冪等性(《pid,分割槽號,序列號》)
pid每次kafka重啟後都會重新分配pid, 那也就是一旦kafka重啟後,就不能保證資料不重複了
冪等性只能保證 單會話內資料不重複。
事務 (事務開啟的前提是冪等性開啟) 5個api
初始化事務、啟動事務 、提交事務、事務終止、offset相關
10、Leader選舉規則
在isr裡面活著,按照ar的順序進行分配
11、Kafka底層怎麼儲存資料的
1)segment 1g
.log .index (稀疏索引 每4kb資料記錄一條索引) .time ...
12、刪除策略
資料預設儲存時間 7天
1)delete 超期刪除(segment中所有資料全部過期 刪除)
2)壓縮 key v1 v2 v3 .... => key v1
13、kafka如何做到高效讀寫的
1)kafka本身是叢集 同時支援分割槽
2)採用稀疏索引 每4kb資料記錄一條索引
3)底層採用順序讀寫 能達到 600m/s
4)零複製和頁快取
14、消費策略
7個分割槽 3個消費者
1)range
針對某一個topic
如果topic數比較多 容易產生資料傾斜
2)roundbin
針對所有的topic
採用輪詢的方式, 能夠減少資料傾斜
3)粘性 (協作者粘性)
在企業中 range + 粘性
roundbin + 粘性
在觸發再平衡後,粘性策略可以保證 不改變原來的消費分割槽。 效能要好一些
15、再平衡條件
1)如果消費者 和消費者組協調器 通訊時間超過 45s 會觸發再平衡
2)如果消費者 消費謀批資料的時間超過了 5分鐘,會觸發再平衡
16、每批次最大拉取的資料量 50m
處理資料,一次最大處理500條
17、Kafka裡面資料積壓了怎麼辦
1)增加分割槽數 同時要求消費者 增加 對應的CPU核數
2)增加消費者 50m => 60m
每批次處理的條數 500條 =》 1000 -3000條
18、如何提高Kafka吞吐量
1)32m快取 =》 64m
2)批次大小預設16k => 32k
3)linger.ms 預設是0ms => 5-100ms
4)採用壓縮 snappy zstd
1)增加分割槽數 同時要求消費者 增加 對應的CPU核數
2)增加消費者 50m => 60m
每批次處理的條數 500條 =》 1000 -3000條
19、kafka消費資料時
從頭消費 --from-beginnging
從當前最新位置消費 預設
我想從任意位置消費
seek(offset 50)
20、可以按照時間進行消費
可以將時間轉換為offset 再呼叫 seek(offset 50)
21、安裝多少臺
2 * (生產者峰值生產速率 * 副本 / 100) + 1 = 3臺
22、壓測:生產者峰值生產速率、消費者峰值消費速率
23、副本:預設副本 1個 =》 生產環境中 2-3 個 2個居多
副本多 好處: 可靠性高 壞處:儲存資源增加了 降到傳輸效率
24、速率
100萬日活 每人每天產生 100條左右日誌
100萬日活 * 100條 = 1億條
1億條 / (24小時 * 3600s) = 1150條/s
1條日誌多大 0.5k -2k 1k
1m/s 峰值速率 20m -30m/s
中午小高峰 7-12點
26、Kafka 預設儲存 7天 =》 3天 1天 -》 3年
27、Kafka是否做了監控
kafka eagle manager montor
28、kafka掛了怎麼辦?
1)重啟 zk 是否啟動
2)檢視日誌 磁碟不夠(df -h ) 檢視記憶體 (jmap -heap )
檢視埠號(netstat ) 檢視CPU(top)
3)如果是某個節點誤刪 了
可以重寫服役
29、硬碟選擇
選擇機械硬碟 底層是順序讀寫 可以 600m/s '
30、記憶體選擇
kafka 預設記憶體 1g =》 10g -15g
linux系統要留一部分記憶體 (頁快取)
31、網路頻寬
20m -30m/s
100m頻寬 =》 12.5m/s
需要買千兆頻寬
32、CPU核數選擇
建議 購買 32核 及以上的伺服器
33、分割槽設定多少
期望吞吐量 100m/s t
生產者峰值生產速率 20m/s tp
消費者峰值消費速率 40m/s tc
分割槽數 = t / min(tp, tc) = 100/ 20 = 5個分割槽
企業中通常 3-10個分割槽
34、設定topic
進可能滿足所有消費者 也要用適當的聚合操作
35、自動建立主題
36、Kafka單條日誌傳輸大小
傳輸超過1m大小的日誌 會卡住
調整三個值大小 大於1m 2-10m
八、maxwell
同步資料:
實時同步 : maxwell canal flink cdc ogg d...
批次同步 : datax sqoop
mysql =》 hdfs / kafka
1、為什麼選擇 maxwell
1)支援斷點續傳
2、 為什麼不選擇flink cdc
flink cdc 1.0 有bug 鎖表 =》 2.0以上解決了這個問題 2022年初 才升級完畢。
3、maxwell 底層原理
mysql 的主從複製 模擬的從表
九、datax
批次同步 : datax sqoop
1、為什麼選擇datax 阿里開源的一個版本
datax 底層: 一個程序 多個執行緒 單節點
datax處理的資料量 相對來說要小一些
sqoop底層:4個map 分散式框架
sqoop 處理的資料量,相對來說要大一些
sqoop 在apache中已經不在維護了。
咱們屬於中小公司,資料量不是很大 業務資料每天1-2g
2、在使用datax過程中遇到哪些問題 怎麼解決的
空值問題
mysql hdfs/hive
null \N
datax :改原始碼
讓hive建表時候處理
sqoop: 直接配置引數
hive mysql
\N null
datax :配置引數
sqoop:配置引數
3、datax怎麼調優的
增加記憶體 增加執行緒數
4、datax每天同步多少資料
業務資料:
100萬日活 =》 10萬人下單(50-100元) 10萬 * 10-20條日誌 * 1k = 1-2g
加購、下單、支付、物流、
每天同步時間:業務資料:00:10 同步 10-20分鐘就結束了。
十、ds 海豚排程器
目前非常火(中國人參與的多一些) 當前最新版本 3.x (資料質量監控) 咱們上課用的 2.x
1、什麼實時執行
業務資料:00:10分 開始執行
使用者行為資料:00:30分 開始執行
2、排程器裡面的指標掛了怎麼辦?
整合故障報警:郵件、釘釘、微信、電話 睿象雲(第三方報警平臺)
起床 =》 開啟電腦 =》 遠端連線公司伺服器 =》 看一下任務 以及掛的日誌
=》 手動重寫執行該任務 =》 是否有小檔案、是否有資料傾斜。=》
如果短時間內不好解決,可以把該任務停止掉。 =》 第二天解決
3、排程器 自身掛了
重啟
檢視日誌:
檢查磁碟、CPU、記憶體、。。。
4、排程器裡面每天執行多少任務
平時 不搞活動 100個左右
如果搞活動 150-200之間
元旦、春節、元宵節、情人節(365天)、3.8、清明節、端午節、中秋節、5.1 6.1 7.1 8.1 10.1
1024 11.11 6.18 12.12 星期四 星期五 週末
十一、spark
1、入門
1)spark是解決什麼問題的? 海量資料的 計算問題
hadoop是解決海量資料的儲存和計算
2)spark為什麼有自己的排程器 yarn 產生的比spark晚
3)spark的執行模式
(1)local 本地除錯 測試
(2)standalone 在國內用的少 一般對效率要求比較高的場景
(3)yarn 國內大量使用
(4)m 不會
(5)k8s 是趨勢 只不過目前bug非常多,不建議使用。
4)常用埠號
(1)4040 spark shell
(2)7077 內部通訊埠 8020/9000/9820
(3)8080 8088任務排程
(4)18080 19888 歷史伺服器
5)手寫spark wordcount =》 flink wordcount
2、sparkcore
1)程式碼是在哪執行的 D E (和運算元緊密相關的)
2)rdd五大屬性 一般在筆試題中出現
(1)標記資料是哪個分割槽的
(2)對資料計算
(3)分割槽器
(4)血緣依賴
(5)移動資料不如移動計算
3)轉換運算元
(1)單value
map
mapp
mappw
flatmap
filter
c true 執行shuffle false 不執行shffle 縮減分割槽
repartition true 執行shuffle 重新分割槽
(2)雙value
交併差 zip 拉鍊
(3)key value
partitionby
groupbykey 沒有預聚合
reducebykey 有預聚合
reducebykey 沒有初始值 分割槽內和分割槽間邏輯相同
foldbykey 有初始值 分割槽內和分割槽間邏輯相同
agg..bykey 有初始值 分割槽內和分割槽間邏輯可以不相同
combinebykey 有初始值(可以變換結構) 分割槽內和分割槽間邏輯可以不相同
sortbykey
mapvalues
4)行動運算元
take
first
collect
foreach
foreachp
5)序列化
KRYO
6)血緣依賴
有shuffle 寬依賴
沒有shuffle 窄依賴
7)cache 不改變血緣 資料儲存在記憶體 或者 磁碟中
checkpoint 改變血緣 資料儲存在 第三方資料庫
cache + checkpoint
8)任務怎麼切分的
(1)app spark context
(2)job 行動運算元個數
(3)stage 寬依賴個數 + 1
(4)task 每個階段 最後一個運算元對應的分割槽數
9)廣播變數
10)累加器
3、sparkSQL
1)rdd df ds
2) 後設資料 計算引擎 語法
hive on spark mysql rdd hive
spark on hive mysql df ds spark
內建hive derby
外接hive mysql
4、sparkstreaming
(1)SparkStreaming是純流式處理框架嗎? 他的抽象是誰?
(2)背壓機制原理
(3)Receiver和Direct模式原理
(4)kafka的offset維護在什麼位置( 0.10)__consumeroffset
(5)transform運算元裡面的程式碼都在什麼端執行
(6)UpdateStateByKey狀態儲存在什麼位置? 有什麼缺點
(7)window有三個概念 用wordcount案例畫圖說明
5、核心
6、最佳化
hive on spark
資料傾斜:
1)group by
(1)map-side
(2)skewindate
2)join
(1)大小表 join => mapjoin
(2)大表大表 skewjoin
(3)smbjoin (有條件:分桶有序表)
(4)左表隨機 右表擴容
(5)建模上 採用累積快照事實表
小檔案:
1)combinehiveinputformat
2)merge
謂詞下推
CBO
十二、從0到1
現在我是專案經理 兼 產品經理 不懂大資料
招聘你來 負責大資料相關任務。
你給我出一套詳細的解決方案。出計劃的週期 3天。
1、具體需求
統計日活、新增、留存 等需求
2、資料 業務資料mysql
使用者行為資料 檔案 日誌伺服器
3、目前就你1個
你可以招聘
4、預算 50萬元
5、前期離線 兼顧實時
6、平時每天 100g左右資料
7、專案週期 1個月(3個月 -6個月) 建模(2周的資料調研 搭建 2-3天 =》 2-3天寫sql => 其他預留時間)
8、資料儲存多久 3年
苟富貴勿相忘