主頁 > 後端開發 > 美團點評 Hadoop/Spark 系統實踐

美團點評 Hadoop/Spark 系統實踐

2020-10-25 02:50:06 後端開發

系列文章

  1. 實時存盤引擎和實時計算引擎
  2. 美團點評 Hadoop/Spark 系統實踐

本文目錄

  • 系列文章
  • 一、Hadoop/Spark 定位與應用架構
    • 1.1 功能和定位(是什么)
    • 1.2 在互聯網企業的應用場景和外圍系統(怎么用)
  • 二、Hadoop / Spark 核心架構
    • 2.1 核心架構 review
      • 2.1.1 HDFS 分布式檔案存盤
      • 2.1.2 YARN 分布式資源調度
      • 2.1.3 Spark 通用分布式計算框架
    • 2.2 進一步學習
  • 三、 美團點評架構改造案例
    • 3.1 Hadoop 異地多機房架構改造
    • 3.2 YARN 核心調度流程優化
    • 3.3 資料倉庫SQL引擎Spark替換Hive on MR

美團大資料系統整體架構
在這里插入圖片描述
在這里插入圖片描述

一、Hadoop/Spark 定位與應用架構

1.1 功能和定位(是什么)

Hadoop 開源地址和官網
在這里插入圖片描述
Spark 開源地址和官網
在這里插入圖片描述

簡單來說,拆解之后的 Hadoop/Spark 專案基本分為三層:① 最底層是資源調度和檔案存盤 ② 往上是分布式計算內核 ③最上層是 Spark 衍生的一些框架,今天說的主要是三個黑框的部分,
在這里插入圖片描述
我們可以看到,三個黑框部分有一個共同點——都有“分布式”,那為什么是分布式呢?
以下是一臺單點機器的資料
在這里插入圖片描述
這是美團對于資料存盤和應用的需要:
在這里插入圖片描述
我們可以看到,一塊商用硬碟滿打滿算也就能寫幾十 T 的資料,但是美團每日單表的增量就有 235T 的資料,這是單節點機器遠遠無法滿足的,這是不得已要做分布式的原因,
在這里插入圖片描述
我們想要一個能夠像個人電腦一樣的目錄樹形式的去管理自己的檔案,最好存盤空間沒有限制,操作簡單,平臺無關等等,但是現實卻需要面臨很多問題,節點掛掉、計算失敗等等,那我們通過 Hadoop/Spark 這樣的集群作業系統,通過訪問統一的分布式操作介面,去實作從理想到現實的這樣的一個程序,

這是HDFS暴露的介面,可以去訪問管理集群的檔案

同時提供了 Java 編程的介面,
在這里插入圖片描述
Spark 也提供了同樣類似的介面,支持 Java, Scala 和 Python,安裝后從 bin/spark-shell 可以快速起一個 Spark 環境,同時封裝了提交集群作業的介面,
在這里插入圖片描述
在寫代碼的時候,右邊的是分布式的 “Hello World”—— wordCount,無論資料量有多大,都可以統計出來每個字符的出現次數,左邊一些特性,具體可以參考 API 檔案,
在這里插入圖片描述
YARN 資源調度

有不同的資源劃分模式,可以劃分給不同的組織結構,后面會詳細講到,
在這里插入圖片描述

1.2 在互聯網企業的應用場景和外圍系統(怎么用)

在這里插入圖片描述
直觀的來看,主要分為以上三種應用,主要通過資料倉庫支撐,下面分別舉例講述,

  • 商業智能 —— 經營分析
    一個旅游的漏斗模型,用于整個流量轉化資料的建模和分析支撐,
    在這里插入圖片描述

  • 搜索/推薦/廣告系統——系統架構
    各種資料的存盤和處理和需要很強的分布式支持,
    在這里插入圖片描述

  • 資料挖掘——單車停車點聚合
    通過獲得得各種基礎資料,經過處理,把單車調度到大家可能要騎得地方,
    在這里插入圖片描述
    上述三種應用場景都需要用到資料倉庫的支持,我們常見的資料組織形式是 E-R 模型,即物體關系模型,但是在面對線上業務的時候,我們往往想要看到業務發生了哪些變更,或者需要恢復事實等,使用ER模型可能需要分表、大量連接,所以就產生新的資料組織形式——維度模型,面向分析性系統,
    在這里插入圖片描述
    維度建模的程序簡單來講就是把資料拉到集群上,經過一系列的 sql 處理分別分成維度表、事實表等,
    在這里插入圖片描述
    什么是事實呢?比如下面訂單可能就是一個事實,整個表可能是一個門店的資料,最主要的是 poi_id,
    通常關系型資料庫是為了記錄、修改和查詢資料本身(增刪改差),對資料本身所含有的業務含義并不關心,簡單說是為了記錄,而資料倉庫則是重點關注資料與資料之間的業務含義,如不同統計口徑與分析方式下數值差的意義,簡單說是為了分析,那么為了保證分析結果的準確和有效,必須分解和細化分析口徑,精確定位影響因素,維表和度量值就是定義分析角度和影響因素的一種方式,(參考:資料倉庫為什么要用事實表和維度表)

在這里插入圖片描述
這是美團點評大資料架構全景圖
在這里插入圖片描述
更加具體或者形象的來說,整個架構可以看作下圖:
在這里插入圖片描述
我們主要講到的部分是最底層的一塊,上層任務暫不細講,(在說到成本優化的時候,老師說美團的利潤非常薄,然后就不好意思的笑了)
下面是一些美團離線工具鏈關鍵模塊:
在這里插入圖片描述
在這里插入圖片描述
在這里插入圖片描述
在這里插入圖片描述
在這里插入圖片描述
在這里插入圖片描述
我們回顧一下第一部分,講了 Hadoop/Spark 的功能和定位(理想和現實),應用場景(三個例子),然后資料倉庫的資料組織形式,

二、Hadoop / Spark 核心架構

2.1 核心架構 review

2.1.1 HDFS 分布式檔案存盤

Hadoop 簡介
在這里插入圖片描述
直觀來看,Hadoop 架構如下:

這種配色的圖呢,圓框代表一個行程,虛框代表一個物理機,虛線代表元資料的訪問或者同步,

整體架構主要分成兩部分,一個是 NameNode, 負責資料的組織管理,一個是 DataNode,負責資料的實際存盤,DataNode 會通過心跳定時向 NameNode 匯報自己還活著,

  • Editslog :保存了所有對 hdfs 中檔案的操作資訊
  • FSImage 是記憶體元資料在本地磁盤的映射,用于維護管理檔案系統樹,即元資料(metadata),
    hadoop 中 FsImage 與 Editslog 合并決議

然后集中精神,最難的一部分來了,就是資料的寫流程,
在這里插入圖片描述
圖中的序號代表執行順序,NN 是 NameNode, DN 是 DataNode,Lease 實際上是時間約束鎖,對檔案寫操作的互斥同步靠Lease實作,

當你寫入一個檔案的時候到底發生了什么呢?

首先你打開的客戶端(可能是我們之前提到的命令列或者連接了 SDK 的其他 IDE)會創建一個邏輯檔案,建立心跳,然后客戶端和NN手拉手建立管道, NameNode 找到空的 DN 分配給新檔案并把分配的DN 的地址回傳,然后客戶端和第一個 DN 手拉手建立資料管道,第一個 DN(主節點)和其他 DNs(從節點,也叫副本,一般兩個,防止資料丟失)手拉手建立資料管道,建好管道之后資料就通車了,把資料塊先寫進第一個DN,第一個DN寫完之后寫入第二個 DN,依次往下直至所有資料寫入,最后一個 DN 寫完之后會回傳 ACK 確認碼,說我終于寫好了,接收到的 DN 繼續傳遞(和烽火狼煙差不多),客戶端接收到確認資訊之后就會關閉 Clint-DN 之間的管道,DN 給 NN 報告,我寫完了,這樣第一個資料塊就寫完了,
然后 NN 會繼續找空的 DN,回傳地址,……等等和以上程序一樣,直到所有資料塊全都寫完,客戶端和 NN 之間的管道關閉,資料寫入結束,
在這里插入圖片描述

如果寫程序懂了,讀程序就不用介紹了,如果沒懂,那就再回去看看寫程序 (笑),

如果在寫入或者讀取的程序,發生了意外情況,我們該怎么辦呢?這就牽扯到容錯處理了,但是這非常復雜,這里就簡單介紹,
在這里插入圖片描述
DN 掛掉一定時間以后,NN 會補上一個新的 DN,NN 掛掉會比較麻煩,為了不讓 NN 掛掉產生可怕的影響,所以進行了一定的安全保障的設計,
在這里插入圖片描述
作為一個小白,這里的設計術語也不是很明白,略過不講,想要了解可以參考美團HDFS NameNode重啟優化,或者參考社區解決方案,
weishen
以上兩張圖主要解決記憶體結點高可用,單節點擴展方法問題,

2.1.2 YARN 分布式資源調度

YARN 這里簡單介紹,
在這里插入圖片描述
YARN 這名字就像是硬湊的(老師說的,與我無瓜),其實就是資源協調器,為了使 Hadoop1.0 版本中資源調度和計算框架進行分析而提出的,YARN 的模塊設計如下,主要包含三個 Manager,
在這里插入圖片描述
任務啟動流程可大致了解,
在這里插入圖片描述
資源調度策略——FairScheduler(公平調度)
在這里插入圖片描述
這是 FairScheduler 的內部實作,
在這里插入圖片描述
具體有哪些資源調度以及什么原理我覺得可以參考這個:Hadoop 的三種調度器
在這里插入圖片描述

2.1.3 Spark 通用分布式計算框架

Spark 自稱 比 Hadoop 有100倍提升,
在這里插入圖片描述
除了支持多語言,也提供了四個框架,包括 Spark SQL,Spark Streaming(流式框架),MLlib(機器學習庫),GraphX(圖計算庫)等,比較完備,

Spark 具體暴露了什么樣的編程介面呢?下圖還是上面提到的 “Hello World” ,通過一個入口命令列啟動自己的程式,自己宣告一個 Spark Session 或者 命令列提供的 Session 去構造 RDD(彈性分布式資料集) 的一個最底層的邏輯抽象,可以把 RDD看作一個大的 list 來用,里面包含各種檔案和資料,RDD 包含兩個算子,一個叫做 Transform,理解為資料的轉換操作;一個叫 Action,理解為對資料的計算操作,
在這里插入圖片描述
這里是一些其他介面:
在這里插入圖片描述
這里舉了一個 wordcount 的例子,右邊的圖使左邊代碼的一個直觀體現,主要對應了左邊紅框部分的運算,
在這里插入圖片描述
在這里插入圖片描述
直觀來看,flatMap,map,reduceByKey 是一個 transform 因為其將語料進行了切分,就是進行了資料的轉換,而 saveAsFile 都是 Action,因為其對資料進行計算了存盤,(個人理解)

我們寫好了程式,又該如何提交呢?我們來看一下 Spark 的提交流程,其實和我們的 YARN 的架構很相似,Driver 相當于 YARN 的 app master,基于自己的調度邏輯和 RM 拿資源, 拿到資源后把 Spark Executer 提起來,
在這里插入圖片描述

這是一個 RDD 的一個描述圖,最左邊可能是一個 Java 程式,然后通過邏輯進行分割成不同的 stages,每一個小框(一個邏輯)包含幾個塊(task),對于每個task,要到集群(Cluster manager )上申請資源,然后調度到實際在跑的結點上去執行該執行的邏輯,這里的 Worker 就是 Executor,
在這里插入圖片描述

這些概念有印象就行,一般也只有 debug 才會用到,
在這里插入圖片描述
前面我們提到了 Stage,那么 Satge 具體怎么拆分的呢?
用戶提交的計算任務是一個由 RDD 構成的 DAG,如果 RDD 在轉換的時候需要做 Shuffle,那么這個 Shuffle 的程序就將這個 DAG 分為了不同的階段(即Stage),由于 Shuffle 的存在,不同的Stage 是不能并行計算的,因為后面 Stage 的計算需要前面 Stage 的 Shuffle 的結果,
在這里插入圖片描述
然后我們來看一個比較完整的包含 shuffle 的 mapreduce 的例子,(大家注意區分 mapredcue 中的 map 和 map func 中的 map 的區別)
在這里插入圖片描述
*藍色是資料流轉的程序,圓角黑框是行程,Memory 部分是記憶體部分

流程如下:

  1. Map 端通過 HDFS Client 讀入資料,執行 Map 端用戶自定義邏輯,
  2. 通過 key 和 用戶定義 Map Func 對資料進行磁區,中間結果寫入快取,
  3. 快取空間不夠時(一般使用到80%)會將快取資料寫入檔案,保存到磁盤,這個程序叫 Spill(這里輸出的資料是根據 key 組織,相對有序的),然后就可以繼續寫入記憶體,直到所有資料被處理,
  4. 對于所有 Spill 得到的檔案(檔案之間無序)和記憶體資料,進行 Merge Sort 按序寫入大檔案,一個 Map 端的結果可能被不同的 Reduce 讀取,所以會有一個 Map 和 Reduce 的映射關系,以及檔案是怎么切分的都會記錄在Spark 中的 MapOutput 元資料中,
  5. 所有 Map 端 task 跑完之后,Reduce 端服務啟動,拉取 Shuffle 之后的 Map 端結果,
  6. 拉取資料先寫快取,
  7. 快取不夠 Spill 到本地磁盤,
  8. 合并所有 Spill 檔案,
  9. 執行 Reduce 端用戶定義邏輯
  10. 按需輸出資料,寫HDFS,

總的來說:
Map 端:map -> partition -> spill -> merge sort -> shuffle
Reduce 端:fetch -> spill -> merge sort -> reduce -> some where

Spark 的容錯相對簡單, 一個 Worker 掛了,就把對應 Task 調度到其他 Worker 就行了,如果 Driver 結點掛掉了,YARN 會幫忙拉起來,
在這里插入圖片描述

2.2 進一步學習

深入學習建議:

  1. 動手搭建
  2. 理論閱讀(如圖)
    在這里插入圖片描述
    Designing Data-Intensive Applications 英文版 emmm

三、 美團點評架構改造案例

(這部分我不太了解,就不詳細注釋了,大家有問題可私我)

3.1 Hadoop 異地多機房架構改造

在這里插入圖片描述
不同顏色代表了不同機房,機房之間可能只用光纖通信,機房之間的通信量遠小于機房之內的機器的,抽象起來就是跨機房帶寬管控,

在這里插入圖片描述
下面藍框和紅框都是交換機,
在這里插入圖片描述
在這里插入圖片描述
在這里插入圖片描述
Zone Server 代表了一個機房的服務,
在這里插入圖片描述
在這里插入圖片描述
在這里插入圖片描述
在這里插入圖片描述
在這里插入圖片描述
在這里插入圖片描述
在這里插入圖片描述

在這里插入圖片描述

3.2 YARN 核心調度流程優化

在這里插入圖片描述
之前的YARN調度圖,平均可能一個機器都跑不滿,
在這里插入圖片描述
在這里插入圖片描述
在這里插入圖片描述
在這里插入圖片描述
在這里插入圖片描述

3.3 資料倉庫SQL引擎Spark替換Hive on MR

在這里插入圖片描述
支持SQL方言不同,不敢全面上線,就把SQL在兩種資料庫上跑一遍,不兼容的情況進一步處理,
在這里插入圖片描述
在這里插入圖片描述
在這里插入圖片描述
Shuffle Service 會有專門的 paper,最近要發,
在這里插入圖片描述
在這里插入圖片描述
在這里插入圖片描述

本人剛學不久,可能有地方注釋不是很清楚或者有錯誤,歡迎大家批評指正,分享交流,

相關資料和參考:

  1. 美團 HDFS NameNode 記憶體詳解
  2. 美團 HDFS NameNode 重啟優化
  3. HDFS Federation 在美團點評的應用與改進
  4. Spark 在美團的實踐
  5. 美團 Spark 性能優化指南——高級篇
  6. Hadoop 的三種調度器
  7. Spark 基本概念、模塊、架構
  8. hadoop中FsImage與Editslog合并決議
  9. Designing Data-Intensive Applications

轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/189689.html

標籤:python

上一篇:漲薪秘籍!阿里技術官嚴選的兩份微服務實戰筆記,已被內部哄搶

下一篇:你總要一個人在會所偷偷補習“分布式服務框架”,最后才能驚艷到所有人!

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • 【C++】Microsoft C++、C 和匯編程式檔案

    ......

    uj5u.com 2020-09-10 00:57:23 more
  • 例外宣告

    相比于斷言適用于排除邏輯上不可能存在的狀態,例外通常是用于邏輯上可能發生的錯誤。 例外宣告 Item 1:當函式不可能拋出例外或不能接受拋出例外時,使用noexcept 理由 如果不打算拋出例外的話,程式就會認為無法處理這種錯誤,并且應當盡早終止,如此可以有效地阻止例外的傳播與擴散。 示例 //不可 ......

    uj5u.com 2020-09-10 00:57:27 more
  • Codeforces 1400E Clear the Multiset(貪心 + 分治)

    鏈接:https://codeforces.com/problemset/problem/1400/E 來源:Codeforces 思路:給你一個陣列,現在你可以進行兩種操作,操作1:將一段沒有 0 的區間進行減一的操作,操作2:將 i 位置上的元素歸零。最終問:將這個陣列的全部元素歸零后操作的最少 ......

    uj5u.com 2020-09-10 00:57:30 more
  • UVA11610 【Reverse Prime】

    本人看到此題沒有翻譯,就附帶了一個自己的翻譯版本 思考 這一題,它的第一個要求是找出所有 $7$ 位反向質數及其質因數的個數。 我們應該需要質數篩篩選1~$10^{7}$的所有數,這里就不慢慢介紹了。但是,重讀題,我們突然發現反向質數都是 $7$ 位,而將它反過來后的數字卻是 $6$ 位數,這就說明 ......

    uj5u.com 2020-09-10 00:57:36 more
  • 統計區間素數數量

    1 #pragma GCC optimize(2) 2 #include <bits/stdc++.h> 3 using namespace std; 4 bool isprime[1000000010]; 5 vector<int> prime; 6 inline int getlist(int ......

    uj5u.com 2020-09-10 00:57:47 more
  • C/C++編程筆記:C++中的 const 變數詳解,教你正確認識const用法

    1、C中的const 1、區域const變數存放在堆疊區中,會分配記憶體(也就是說可以通過地址間接修改變數的值)。測驗代碼如下: 運行結果: 2、全域const變數存放在只讀資料段(不能通過地址修改,會發生寫入錯誤), 默認為外部聯編,可以給其他源檔案使用(需要用extern關鍵字修飾) 運行結果: ......

    uj5u.com 2020-09-10 00:58:04 more
  • 【C++犯錯記錄】VS2019 MFC添加資源不懂如何修改資源宏ID

    1. 首先在資源視圖中,添加資源 2. 點擊新添加的資源,復制自動生成的ID 3. 在解決方案資源管理器中找到Resource.h檔案,編輯,使用整個專案搜索和替換的方式快速替換 宏宣告 4. Ctrl+Shift+F 全域搜索,點擊查找全部,然后逐個替換 5. 為什么使用搜索替換而不使用屬性視窗直 ......

    uj5u.com 2020-09-10 00:59:11 more
  • 【C++犯錯記錄】VS2019 MFC不懂的批量添加資源

    1. 打開資源頭檔案Resource.h,在其中預先定義好宏 ID(不清楚其實ID值應該設定多少,可以先新建一個相同的資源項,再在這個資源的ID值的基礎上遞增即可) 2. 在資源視圖中選中專案資源,按F7編輯資源檔案,按 ID 型別 相對路徑的形式添加 資源。(別忘了先把檔案拷貝到專案中的res檔案 ......

    uj5u.com 2020-09-10 01:00:19 more
  • C/C++編程筆記:關于C++的參考型別,專供新手入門使用

    今天要講的是C++中我最喜歡的一個用法——參考,也叫別名。 參考就是給一個變數名取一個變數名,方便我們間接地使用這個變數。我們可以給一個變數創建N個參考,這N + 1個變數共享了同一塊記憶體區域。(參考型別的變數會占用記憶體空間,占用的記憶體空間的大小和指標型別的大小是相同的。雖然參考是一個物件的別名,但 ......

    uj5u.com 2020-09-10 01:00:22 more
  • 【C/C++編程筆記】從頭開始學習C ++:初學者完整指南

    眾所周知,C ++的學習曲線陡峭,但是花時間學習這種語言將為您的職業帶來奇跡,并使您與其他開發人員區分開。您會更輕松地學習新語言,形成真正的解決問題的技能,并在編程的基礎上打下堅實的基礎。 C ++將幫助您養成良好的編程習慣(即清晰一致的編碼風格,在撰寫代碼時注釋代碼,并限制類內部的可見性),并且由 ......

    uj5u.com 2020-09-10 01:00:41 more
最新发布
  • Rust中的智能指標:Box<T> Rc<T> Arc<T> Cell<T> RefCell<T> Weak

    Rust中的智能指標是什么 智能指標(smart pointers)是一類資料結構,是擁有資料所有權和額外功能的指標。是指標的進一步發展 指標(pointer)是一個包含記憶體地址的變數的通用概念。這個地址參考,或 ” 指向”(points at)一些其 他資料 。參考以 & 符號為標志并借用了他們所 ......

    uj5u.com 2023-04-20 07:24:10 more
  • Java的值傳遞和參考傳遞

    值傳遞不會改變本身,參考傳遞(如果傳遞的值需要實體化到堆里)如果發生修改了會改變本身。 1.基本資料型別都是值傳遞 package com.example.basic; public class Test { public static void main(String[] args) { int ......

    uj5u.com 2023-04-20 07:24:04 more
  • [2]SpinalHDL教程——Scala簡單入門

    第一個 Scala 程式 shell里面輸入 $ scala scala> 1 + 1 res0: Int = 2 scala> println("Hello World!") Hello World! 檔案形式 object HelloWorld { /* 這是我的第一個 Scala 程式 * 以 ......

    uj5u.com 2023-04-20 07:23:58 more
  • 理解函式指標和回呼函式

    理解 函式指標 指向函式的指標。比如: 理解函式指標的偽代碼 void (*p)(int type, char *data); // 定義一個函式指標p void func(int type, char *data); // 宣告一個函式func p = func; // 將指標p指向函式func ......

    uj5u.com 2023-04-20 07:23:52 more
  • Django筆記二十五之資料庫函式之日期函式

    本文首發于公眾號:Hunter后端 原文鏈接:Django筆記二十五之資料庫函式之日期函式 日期函式主要介紹兩個大類,Extract() 和 Trunc() Extract() 函式作用是提取日期,比如我們可以提取一個日期欄位的年份,月份,日等資料 Trunc() 的作用則是截取,比如 2022-0 ......

    uj5u.com 2023-04-20 07:23:45 more
  • 一天吃透JVM面試八股文

    什么是JVM? JVM,全稱Java Virtual Machine(Java虛擬機),是通過在實際的計算機上仿真模擬各種計算機功能來實作的。由一套位元組碼指令集、一組暫存器、一個堆疊、一個垃圾回收堆和一個存盤方法域等組成。JVM屏蔽了與作業系統平臺相關的資訊,使得Java程式只需要生成在Java虛擬機 ......

    uj5u.com 2023-04-20 07:23:31 more
  • 使用Java接入小程式訂閱訊息!

    更新完微信服務號的模板訊息之后,我又趕緊把微信小程式的訂閱訊息給實作了!之前我一直以為微信小程式也是要企業才能申請,沒想到小程式個人就能申請。 訊息推送平臺🔥推送下發【郵件】【短信】【微信服務號】【微信小程式】【企業微信】【釘釘】等訊息型別。 https://gitee.com/zhongfuch ......

    uj5u.com 2023-04-20 07:22:59 more
  • java -- 緩沖流、轉換流、序列化流

    緩沖流 緩沖流, 也叫高效流, 按照資料型別分類: 位元組緩沖流:BufferedInputStream,BufferedOutputStream 字符緩沖流:BufferedReader,BufferedWriter 緩沖流的基本原理,是在創建流物件時,會創建一個內置的默認大小的緩沖區陣列,通過緩沖 ......

    uj5u.com 2023-04-20 07:22:49 more
  • Java-SpringBoot-Range請求頭設定實作視頻分段傳輸

    老實說,人太懶了,現在基本都不喜歡寫筆記了,但是網上有關Range請求頭的文章都太水了 下面是抄的一段StackOverflow的代碼...自己大修改過的,寫的注釋挺全的,應該直接看得懂,就不解釋了 寫的不好...只是希望能給視頻網站開發的新手一點點幫助吧. 業務場景:視頻分段傳輸、視頻多段傳輸(理 ......

    uj5u.com 2023-04-20 07:22:42 more
  • Windows 10開發教程_編程入門自學教程_菜鳥教程-免費教程分享

    教程簡介 Windows 10開發入門教程 - 從簡單的步驟了解Windows 10開發,從基本到高級概念,包括簡介,UWP,第一個應用程式,商店,XAML控制元件,資料系結,XAML性能,自適應設計,自適應UI,自適應代碼,檔案管理,SQLite資料庫,應用程式到應用程式通信,應用程式本地化,應用程式 ......

    uj5u.com 2023-04-20 07:22:35 more