一、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