note2

四叶草520發表於2024-07-07

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

苟富貴勿相忘