阿里云對數據可靠性保障的一些思考

  1. 背景

互聯網時代的數據重要性不言而喻,任何數據的丟失都會給企事業單位、政府機關等造成無法計算和無法彌補的損失,尤其隨著云計算和大數據時代的到來,數據中心的規模日益增大,環境更加復雜,云上客戶群體越來越龐大,從而造成硬件故障、軟件失效等錯誤發生的頻率也在猛增,任何架構和流程上的疏漏都可能會造成大面積的數據丟失。由此可見,保證客戶的數據可靠性對云計算服務提供商有多重要。

阿里云自研的盤古作為一個已經演進了近10年的分布式存儲系統,經受了阿里巴巴內部各種產品、各種硬件的磨煉,發布到公有云來普惠大眾,讓每個基于阿里云的用戶都可以享受到世界領先的數據可靠性服務。因此,在此分享一下阿里云自研的分布式存儲系統——盤古針對數據可靠性問題的保障。

  1. 數據可靠性的威脅

說起云環境下的數據可靠性,相信更多的一般云用戶想到的是硬件錯誤,這類錯誤非常多,Firmware引起的靜默數據丟失只是非常罕見的一類錯誤。但是,硬件錯誤只是云環境下威脅數據可靠性的一小部分因素,導致數據丟失的可能會是軟件、運維部分出現錯誤。由此,可以看出在云環境下保證客戶數據可靠性,不單單是硬件或者某一方面的事情,其涉及到存儲系統的方方面面,是一個龐大的系統工程,這就要求云服務提供商在各方面都能提供穩定的、可靠的、有效的措施來保障客戶的數據。

數據可靠性的威脅一般包括硬件、軟件、運維等方面。

硬件威脅:

硬件錯誤類型非常多,包括磁盤壞道、Firmware bug磁盤靜默錯誤導致數據損壞無法及時發現、電壓不穩定導致數據未寫入但返回寫入成功、SSD長時間下線導致數據丟失、網絡傳輸錯誤導致數據通過網卡后產生bits反轉等,。

軟件威脅:

內核bug導致的文件系統數據錯亂、系統Page cache導致的機器重啟和機房掉電丟失數據、野指針、多線程競爭、上層應用程序指針錯亂導致正在被寫入和讀取的數據污染、存儲層軟件在機制上有數據丟失的漏洞等。

運維威脅:

運維是當前丟失數據概率最高的因素,包括客戶的誤操作、誤刪除等因素。

  1. 數據可靠性的保障手段

對于數據可靠性來說,數據副本技術是目前大多數客戶最容易理解的容錯技術了,也是提升分布式系統可靠性、可用性、可擴展性的常用手段之一。目前,阿里云及各家廠商都提供了三副本技術保障數據的可靠,另外阿里云的三副本技術是支持跨可用區的,考慮到跨可用區的成本較高,現在還僅有少數廠商才能做到。但是,數據可靠性保障不是僅數據副本技術就能做到的,其是一個龐大的系統工程,并不是某一項或幾項技術手段就能夠保障的,必須從數據中心的基礎建設開始、一直到整個軟件棧的構建以及多種技術手段共同來保障。下面將詳細分析阿里云在云環境下如何系統保障客戶數據的可靠性。

3.1. 數據中心基礎設施建設

基礎設施硬件一般會在不同時間分批次購買不同廠商的硬件設備,其中就包含各種類型的磁盤設備。之所以這樣做,除了從成本上考慮之外,還需要考慮影響范圍問題。單純一個廠商采購一旦出現類似Firmware的問題就出現大面積數據丟失,影響眾多用戶。另外硬件投入使用中也需要對使用情況進行跟蹤,例如磁盤設備由于組裝、運輸等影響,在初期投入生產使用時出錯率遠遠高于后期正常使用期間的出錯率,所以剛投入使用的硬件應該有一個烤機的過程,將出錯率降低后再投入使用,買來就大面積使用的方式是非常不負責任的一種做法。投入使用后也絲毫不能松懈,需要跟蹤每個批次磁盤的Firmware版本更新通知,一旦發現高危風險更新,需要及時打布丁或者將數據遷移,把數據丟失風險降低到最低。

3.2. 數據可靠的軟件棧構建

硬件錯誤類型非常多,想要在數量眾多的硬件錯誤中,預期未來會出現哪種錯誤是非常困難的,所以需要在軟件設計上規避掉硬件問題,設計一套優良的軟件棧來防御預期和非預期的錯誤。

clipboard.png

首先軟件需要清晰的劃分層次,層次間通過清晰的接口來協作,實現端到端的保證在每個環節都保證可靠性、無數據污染。

上層應用系統在接收到客戶數據的第一刻起,首先做好數據防錯準備,所有后續操作都依賴于此步驟的準備工作。數據防錯最基本高效方法是對用戶數據產生Checksum數據并傳遞到之后每一個層次,更高可靠性可以利用對數據做MD5進行保護,在之后的說明中用Checksum為例來說明如何對數據進行保護。

層次間傳遞數據的所有接口必須攜帶數據校驗Checksum類型和數據的Checksum值。在本層次對數據加工的過程中,首先通過數據加工產生新數據和數據對應的Checksum,之后對新數據運行逆運算來重新產生原始數據并做驗證對比,保證加工過程并未損壞任何數據,同時給下一個處理步驟提供數據檢查依據,直到數據和對應的Checksum值被存儲到底層盤古系統中。

當系統終端用戶讀取數據時,每個層次逐層檢查下層系統的數據正確性,并依照數據加工流程重新恢復出用戶需要的數據并返回,從而達到了整個阿里云系統對用戶數據的全程無漏洞保護。

3.3. 存儲系統設計要點

當上層業務系統加工完成數據后存盤過程中,盤古需要利用三副本和Erasure Coding編碼存儲技術保證不會由于單點硬件/軟件異常導致數據損壞和不可用。

3.3.1. 跨多可用區的三副本技術

三副本技術

阿里云提供一個扁平的線性存儲空間,在內部會對線性地址進行切片,一個分片稱為一個Chunk。對于每一個Chunk,阿里云會復制出三個副本,并將這些副本按照一定的策略存放在集群中的不同節點上,保證數據的可靠性。

clipboard.png

在阿里云數據存儲系統中,有三類角色,分別稱為Master、Chunk Server和Client。一個寫操作,經過層層轉換,最終會交由Client來執行,執行過程簡要說明如下:

? Client計算出這個寫操作對應的Chunk。

? Client向Master查詢該Chunk的三份副本的存放位置。

? Client根據Master返回的結果,向這3個Chunk Server發出寫請求。

? 如果三份都寫成功,Client向客戶返回成功;反之,Client向客戶返回失敗。

Master的分布策略會綜合考慮集群中所有Chunk Server的硬盤使用情況,在不同交換機機架下的分布情況、電源供電情況、機器負載情況,盡量保證一個Chunk的所有副本分布在不同機架下的不同Chunk Server上,有效防止由于一個Chunk Server或一個機架的故障導致的數據不可用。

數據保護機制

當有數據節點損壞,或者某個數據節點上的部分硬盤發生故障時,集群中部分Chunk的有效副本數就會小于3。一旦發生這種情況,Master就會發起復制機制,在Chunk Server之間復制數據,使集群中所有Chunk的有效副本數達到3份。.

clipboard.png

支持跨多可用區的存儲系統

盤古文件系統在生產系統中采用跨多可用區部署的方式,目前還僅是少數能做到,經典的模式是支持橫跨三個以上可用區,每個可用區距離30公里到50公里。無論是三副本還是EC(糾刪碼)副本,都是均勻分布在三個可用區內。任何一次寫入都在三個可用區數據落盤后才會返回客戶成功。由于各可用區的數據中心有獨立的供電,網絡和冷卻系統等,跨多可用區的存儲提供了數據中心級別的容災能力,在任一可用區完全不服務的情況下,整體服務無縫切換,數據無任何丟失。跨多可用區對阿里云內部核心骨干網絡的要求非常極高,端到端的延遲要求在穩定1毫秒以內,并且有Tb級別帶寬能力。阿里云投入了大量的資源來建設高容錯能力和高性能的多可用區互訪的內部核心骨干網絡。

綜上所述,對云盤上的數據而言,所有用戶層面的操作都會同步到底層三份副本上。因此,無論遇到軟硬件的錯誤,這種模式都能夠保障數據的可靠性和一致性。

3.3.2. 糾刪碼技術(Erasure Coding)

對于可靠性來說,數據副本技術是最容易理解的容錯技術,目前一般云環境下采用三副本技術。數據副本技術另一大優勢在于數據恢復的過程中對計算資源的消耗極少。由于采用的是直接復制,除了數據的存放位置可能需要計算之外,其它過程對CPU的利用極少。但是,使用數據副本技術也會帶來兩大方面的問題,一個是數據副本所占用的空間太大,對于網絡以及磁盤空間都有著極大的負擔;另一個問題在于維護副本間的數據一致性會帶來極大的資源消耗。

為了提高磁盤的利用率,阿里云的數據中心系統使用冗余糾刪碼的方法來降低所需要的磁盤,并保證相同的容錯能力。Reed Solomon是目前在云存儲系統中最常用的糾刪碼算法。在這個編碼中,假設原始數據為k 個大小相同的塊,糾刪碼通過編碼產生m 個冗余塊,這n = k +m 個塊中如果損壞了不超過m 個塊,則利用剩下的至少k 個塊可以將全部的n 個塊恢復出來。如果采用k=8, m=4的情況下,需要150%存儲空間即可,并且可以容忍4個磁盤的錯誤,糾刪碼技術對副本技術很大的改進。因此,云存儲系統保證數據可靠性,研究糾刪碼極其重要。現在通常采用的副本技術并發讀性能好,數據恢復速度快,但成本較高,通常用于保存熱數據;采用糾刪碼成本低,容錯能力可以進行選擇,但數據恢復代價高,恢復速度慢,通常用于保存冷數據。

傳統的盤古文件系統中的糾刪碼技術醞釀于2012年末,目標旨在通過應用Erasure Codes編碼,在保障數據安全的前提下節省盤古數據的存儲空間,通過使用某種Erasure Codes編碼來達到節省空間的目的,將數據存儲效率提升了100%甚至更多。然而,由于其潛在的網絡流量、空間利用率等方面的局限性,2017年新一代盤古2.0對糾刪碼進行了優化和升級,除保持原有糾刪碼技術的基本功能之外,在設計上,讀寫場景、流量優化、空間效率上都會有大幅提升。

目前盤古2.0的糾刪碼技術對外支持多種存儲業務,被大量而廣泛的使用各種應用場景。阿里云通過采用Cauchy Reed Solomon(CRS)算法編碼,該算法簡單,編解碼效率很高使得相對于盤古三副本模式下3倍的存儲效率提升到了約2倍,同時能保證略好的理論數據安全性。阿里云存儲的metadata需要設置數據塊的數目和校驗塊的數目,以(3,2)配置為例,阿里云將一塊數據拆成3份相同大小的數據塊,并利用ErasureCode計算出2塊校驗塊,將這五份數據分別寫到5塊機器上,如果其中任意2塊數據出現了錯誤,都可以根據存活下來的塊進行數據恢復,從而保證了數據的可靠性。

clipboard.png

另外,盤古將Erasure Codes的能力實現在盤古內部而不是外部。HDFS Raid將Raid功能以contrib包的形式實現,獨立于HDFS核心之外。好處是不會增加核心文件系統的復雜度,壞處是效率和靈活度不足。盤古將Raid功能實現在核心中,通過同各個子模塊的緊密結合實現了最高的效率和靈活度。同時,支持實時編解碼及文件級別指定編碼方法和編碼參數。實時編碼直接寫入Raid文件,無需后臺轉換,能最大程度節省網絡和計算資源。文件級別編碼參數的指定使得盤古能同時適用于在線和離線應用的獨特要求。

綜上所述,阿里云已將糾刪碼技術大量應用在了云存儲環境和產品中,在保障客戶數據可靠性的前提下,提升存儲效率。未來阿里云將繼續深入研究糾刪碼技術的應用,提升編碼速度和數據恢復速度,拓展應用場景。目前,阿里云已和國內外頂尖高校在糾刪碼技術領域開展了廣泛的科研合作,如清華大學、上海交通大學等,研究不同校驗鏈融合的原理與策略和優化方法,盡可能降低跨AZ數據遷移、恢復和校驗修改的資源開銷,大大提高網絡效率,針對不同的應用場景,在同時兼顧性能、成本、可靠性、可用性、可擴展性和管理策略的基礎上進行優化。

3.3.3. 及時檢測和快速恢復技術

結合三副本和糾刪碼技術確實能夠保證數據一定程度的可靠性,但也需要充分考慮到數據檢測和恢復,才能更大程度地保證客戶的數據可靠性和可用性。因此,阿里云的盤古提供了及時檢測和快速恢復技術,其設計要點:

  1. 在選擇存儲參數時需要根據不同可靠性需求進行定制化。例如元數據的可靠性一定高于數據的可靠性,否則會導致雖然有數據但是數據不知道如何訪問,雖然知道丟失了數據,但是說不清楚給用戶丟了哪些數據等情況出現。所以元數據應該能夠容忍更多的硬件/軟件失效情況,一般類似Firmware磁盤靜默等錯誤不會威脅到元數據的安全。
  2. 在數據存儲位置、介質類型等選擇方面也需要做到精細控制,例如為了數據安全性考慮,多個副本需要盡量多的放置在多種介質類型上,防止某個類型的硬件出現錯誤導致多個副本受到威脅,同時也可以實現數據訪問加速和節約成本的目的,一箭雙雕。
  3. 磁盤存儲完成后還需要防止類似Firmware bug、SSD長期不加電、磁盤壞道等導致的靜默錯誤,所以需要存儲產品定期運行數據全量掃描、高頻次的篩檢等維護任務,防止數據靜默錯誤后不能及時發現的問題。
  4. 及時發現數據損壞后,需要對不同丟失風險的數據做優先級精確控制,保證高風險的數據被優先恢復。

clipboard.png

上面的策略中,及時發現錯誤、快速數據恢復和數據原有的容錯能力配置共同決定的數據可靠性有多高。

在數據存儲格式上也需要非常縝密的設計,需要保證:

出現數據損壞可以高效發現,發現過程可以是在用戶觸發的讀操作,也可能是存儲產品的后臺掃描等過程;

如果出現了元數據丟失、文件系統損壞、運維誤操作等情況或者Firmware導致的文件系統元數據損壞,可以使用掃描落盤數據方式來快速重建元數據,將數據丟失風險降低到最低。這種縝密的設計是盤古系統接近10年的生命期內能保證無數據丟失的安身立命的基本功。

3.3.4. 端到端CRC保護

盤古系統提供端到端的數據校驗,上層的云存儲產品提供數據的CRC,盤古在落盤的時候進行校驗,并且把CRC和數據一起寫入磁盤。后臺任務也一直巡檢,檢查存儲介質可能出現的位跳變(bit rot)錯誤,一旦發現和寫入的CRC不符,找到正確的副本,重新復制一份新的副本。

clipboard.png

任何對數據轉換的操作前后遵循檢查步驟:

? 數據D轉換為D’,計算CRC C’

? 逆轉換D’到D,計算C’’,檢查C ?= C’’

? 進行后續數據傳輸或存儲

防御能力:

? 代碼野指針導致的內存數據污染

? 網絡bits翻轉導致的數據錯誤

? 磁盤靜默錯誤導致的數據損壞

數據塊唯一性特征作為落盤前CRC的初始值:

? 防止內核文件系統錯亂

? 數據丟失后裸盤掃描特征識別

數據節點定期全盤CRC檢查

? 防止數據靜默錯誤

3.3.5. 灰度變更

灰度變更是另外一項保障客戶數據可靠性的關鍵技術。顧名思義,灰度變更是指在黑與白之間,能夠平滑過渡的一種變更方式。這種變更方式類似于A/B test,讓需要變更內容一部分先變更到目標內容,一部分保留,如果變更后的內容在運行一段時間內沒有發生錯誤,再逐漸擴大范圍,把全部內容變更為目標內容。灰度變更可以保證整體系統的穩定,在初始灰度的時候就可以發現、調整問題,以保證其影響度。灰度變更的優勢在于:

? 云服務數據可靠性及可用性優先保障。

? 灰度變更能降低云操作風險,減少影響范圍,并且范圍可控。

? 方便集中監控日志,全量變更由于負載均衡的作用,需要整體跟蹤,效率較低。

? 方便數據回滾。

? 避免出現錯誤給用戶帶來壞的體驗。

clipboard.png

阿里云將灰度變更用于硬件、軟件及備份容災等方面,具體如下:

軟件灰度:

? 操作系統升級

? 軟件版本灰度

硬件灰度:

? 新機型適配

? 新存儲介質適配

跨地域容災備份

? 防止自然災害、戰爭引起的數據丟失

? 增加系統可用性

3.3.6. 防御運維誤操作

? 盤古Pin

支持哪些頂級目錄是不允許刪除的,可以有效防止命令行中的空格導致的頂級目錄被誤刪除的問題。

? 回收站

目錄樹回收站:保證文件刪除后可以在目錄樹的回收站中保留一個可配置時間。

數據節點回收站:在磁盤空間富裕時,盡量保留刪除的數據不被覆蓋,給誤刪除數據恢復留余地。

? 元數據備份

專有云中,定期調用盤古功能對元數據的增量日志進行存儲備份,防止數據被誤刪后恢復時間過長的問題。

? 盤古集群唯一標識

防止運維操作數據節點從一個集群下線后重新上線到其他集群后數據被清空的問題。

? 格式化審批

所有數據盤格式化都必須經過盤古管控模塊確認數據安全的前提下才允許進行下線格式化。

? 下線審批

機器和磁盤下線前需要經過全盤掃描后,保證上面的數據在其他機器上有足后的副本數后才允許下線,防止誤操作導致服務停止。

  1. 總結

綜上所述,阿里云非常重視客戶數據的可靠性,將其作為一個龐大的系統工程進行設計和保障,久經磨練的盤古在經歷了多次軟件重構、架構迭代之后,最終作為統一的存儲平臺支撐各種云產品并推向公共云、專有云,利用跨多可用區的三副本技術、糾刪碼技術、糾刪碼和多副本融合技術、及時檢測、快速恢復、端到端CRC保護、灰度變更、防止運維誤操作等一系列的技術手段,為客戶的數據提供了一套系統的保障方案,保障客戶能夠抵御涉及到硬件、軟件及運維等多方面的錯誤,也保證了阿里云為用戶提供世界領先的數據可靠性。

本文作者:劉晨旭

閱讀原文

本文為云棲社區原創內容,未經允許不得轉載。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/389874.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/389874.shtml
英文地址,請注明出處:http://en.pswp.cn/news/389874.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

linux實驗二

南京信息工程大學實驗報告 實驗名稱 linux 常用命令練習 實驗日期 2018-4-4 得分指導教師 系 計軟院 專業 軟嵌 年級 2015 級 班次 (1) 姓名王江遠 學號20151398006 一、實驗目的 1. 掌握 linux 系統中 shell 的基礎知識 2. 掌握 linux 系統中文件系統的…

個人項目api接口_5個免費有趣的API,可用于學習個人項目等

個人項目api接口Public APIs are awesome!公共API很棒! There are over 50 pieces covering APIs on just the Towards Data Science publication, so I won’t go into too lengthy of an introduction. APIs basically let you interact with some tool or servi…

5918. 統計字符串中的元音子字符串

5918. 統計字符串中的元音子字符串 子字符串 是字符串中的一個連續(非空)的字符序列。 元音子字符串 是 僅 由元音(‘a’、‘e’、‘i’、‘o’ 和 ‘u’)組成的一個子字符串,且必須包含 全部五種 元音。 給你一個字…

咕泡-模板方法 template method 設計模式筆記

2019獨角獸企業重金招聘Python工程師標準>>> 模板方法模式(Template Method) 定義一個操作中的算法的骨架,而將一些步驟延遲到子類中Template Method 使得子類可以不改變一個算法的結構即可重定義該算法的某些特定步驟Template Me…

如何評價強gis與弱gis_什么是gis的簡化解釋

如何評價強gis與弱gisTL;DR — A Geographic Information System is an information system that specializes in the storage, retrieval and display of location data.TL; DR — 地理信息系統 是專門從事位置數據的存儲,檢索和顯示的信息系統。 The standard de…

clone-graph

1. clone-graph Clone an undirected graph. Each node in the graph contains a label and a list of its neighbors. 思路:dfs,其實就是遞歸。 1 /**2 * Definition for undirected graph.3 * struct UndirectedGraphNode {4 * int label;5 * …

5919. 所有子字符串中的元音

5919. 所有子字符串中的元音 給你一個字符串 word ,返回 word 的所有子字符串中 元音的總數 ,元音是指 ‘a’、‘e’、‘i’、‘o’ 和 ‘u’ 。 子字符串 是字符串中一個連續(非空)的字符序列。 注意:由于對 word …

Scrum沖刺-Ⅳ

第四次沖刺任務 團隊分工 成員:劉鵬芝,羅樟,王小莉,沈興艷,徐棒,彭康明,胡廣鍵 產品用戶:王小莉 需求規約:彭康明,羅樟 UML:劉鵬芝,沈…

Github入門詳情教程

前言 之前我寫了一篇文章《一篇文章了解Github和Git教程》還延伸了幾篇閱讀,對大部分小白很有用,那么我繼續普及下Github頁面及其概念。 定義 GitHub 是一個網站,一個面向開源及私有軟件項目的托管平臺,因為只支持Git作為唯一的版…

機器人影視對接_機器學習對接會

機器人影視對接A simple question like ‘How do you find a compatible partner?’ is what pushed me to try to do this project in order to find a compatible partner for any person in a population, and the motive behind this blog post is to explain my approach…

Android系統啟動系列----init進程

Android系統啟動系列 Android系統啟動系列----init進程Android系統啟動系列----Zygote進程引言 在開發app的過程中,是不是會有疑問: java程序的運行不是從main方法開始么,怎么app入口是Application的onCreate方法?那java的運行環境…

598. 范圍求和 II

598. 范圍求和 II 給定一個初始元素全部為 0&#xff0c;大小為 m*n 的矩陣 M 以及在 M 上的一系列更新操作。 操作用二維數組表示&#xff0c;其中的每個操作用一個含有兩個正整數 a 和 b 的數組表示&#xff0c;含義是將所有符合 0 < i < a 以及 0 < j < b 的元…

mysql 數據庫優化之執行計劃(explain)簡析

數據庫優化是一個比較寬泛的概念&#xff0c;涵蓋范圍較廣。大的層面涉及分布式主從、分庫、分表等&#xff1b;小的層面包括連接池使用、復雜查詢與簡單查詢的選擇及是否在應用中做數據整合等&#xff1b;具體到sql語句執行效率則需調整相應查詢字段&#xff0c;條件字段&…

自我接納_接納預測因子

自我接納現實世界中的數據科學 (Data Science in the Real World) Students are often worried and unaware about their chances of admission to graduate school. This blog aims to help students in shortlisting universities with their profiles using ML model. The p…

距離產生美

那天下午我跟簡坐在學校操作草地上聊天 夕陽的余暉照射著我們 陽光在青草的縫隙間拉長了倒影 溫暖的晚風輕拂著簡劉海前的幾根發絲 淡淡的發香迎面撲來&#xff0c;我望著遠山上的煙囪。 對簡說&#xff1a; 我覺得我們坐得太近了。感覺相距 50cm 比較好。 簡一臉驚訝說&#x…

299. 猜數字游戲

299. 猜數字游戲 你在和朋友一起玩 猜數字&#xff08;Bulls and Cows&#xff09;游戲&#xff0c;該游戲規則如下&#xff1a; 寫出一個秘密數字&#xff0c;并請朋友猜這個數字是多少。朋友每猜測一次&#xff0c;你就會給他一個包含下述信息的提示&#xff1a; 猜測數字…

mysql數據庫中case when 的用法

場景1&#xff1a;比如說我們在數據庫存了性別的字段&#xff0c;一般都是存0 和 1 代表男和女 然后我們會得到0和1之后在java中判斷 &#xff0c;很麻煩有么有&#xff1f;其實我們完全可以在sql中判斷好之后拿來現成的。就是在sql中做判斷就ok SELECT*,CASEWHEN ly app th…

python中knn_如何在python中從頭開始構建knn

python中knnk最近鄰居 (k-Nearest Neighbors) k-Nearest Neighbors (KNN) is a supervised machine learning algorithm that can be used for either regression or classification tasks. KNN is non-parametric, which means that the algorithm does not make assumptions …

CRT配色

http://a0bd2668.wiz03.com/share/s/2wLipE0wJ4Wl28H1oC2BIvEv02vmgz3S_QjT2YHyWG2t2nng轉載于:https://blog.51cto.com/13420391/2164540

5920. 分配給商店的最多商品的最小值

5920. 分配給商店的最多商品的最小值 給你一個整數 n &#xff0c;表示有 n 間零售商店。總共有 m 種產品&#xff0c;每種產品的數目用一個下標從 0 開始的整數數組 quantities 表示&#xff0c;其中 quantities[i] 表示第 i 種商品的數目。 你需要將 所有商品 分配到零售商…