在現(xiàn)代計算領域,我們在計算領域取得了很多進步和快速發(fā)展。市場上有如此多的分布式處理軟件,處理模式正在頻繁地變化。這些軟件提供了強大的功能,可以通過高度可擴展的架構(gòu)來處理大量數(shù)據(jù),從而提供根據(jù)處理需求動態(tài)擴展和縮小的靈活性。
許多分布式軟件被組織用作技術(shù)現(xiàn)代化計劃的一部分,以取代舊的遺留應用程序,從而利用可擴展性 和云原生功能并使用現(xiàn)代處理技術(shù)更快地處理數(shù)據(jù)來獲得優(yōu)勢。
現(xiàn)代分布式處理軟件提供了強大且可擴展的功能,用于處理大量數(shù)據(jù)集和數(shù)據(jù)流。用于分析的分布式數(shù)據(jù) 處理是每個大中型創(chuàng)新組織中快速擴展的生態(tài)系統(tǒng)。所有這些企業(yè)都非常重視并專注于這一領域,以擁有可擴展且高性能的系統(tǒng)來處理具有許多復雜數(shù)據(jù)處理需求的大量數(shù)據(jù)集。
雖然這些軟件應用程序是為高性能數(shù)據(jù)處理而設計的,但在某些處理場景中您可能會遇到性能問題。在本文中,我將討論分布式處理應用程序遇到的關(guān)鍵性能挑戰(zhàn)之一以及解決性能瓶頸的一些潛在解決方案。該問題與您的工作中的數(shù)據(jù)分布不均勻有關(guān);它可能導致任務執(zhí)行不平衡和性能瓶頸。這個問題可能出現(xiàn)在任何類型的處理中,例如,數(shù)據(jù)聚合和匯總?cè)蝿眨绶纸M縮減任務或處理任務,在這些任務中,我們加入大數(shù)據(jù)集以在連接大量數(shù)據(jù)集后提取有意義的信息。在這種情況下,要處理的大量數(shù)據(jù)集高度傾斜,這導致處理節(jié)點之間的數(shù)據(jù)分布不均勻,從而導致處理時間線效率低下和退化。這種不均勻的數(shù)據(jù)分布會導致吞吐量較低和端到端延遲較高。管道可能會失敗并可能導致內(nèi)存溢出并最終進入崩潰循環(huán)。
利用現(xiàn)代分布式軟件構(gòu)建的應用程序正在取得成功,并滿足組織支持不斷變化的數(shù)據(jù)動態(tài)的需求,每天都會產(chǎn)生更多的數(shù)據(jù)并進行處理,以提取用于多種目的的有意義的見解。當這些現(xiàn)代技術(shù)堆棧必須處理的數(shù)據(jù)對于分布式處理框架來說不一致和統(tǒng)一并且高度傾斜時,幾乎沒有什么挑戰(zhàn),從而給分布式處理設計帶來挑戰(zhàn)。
本文將特別關(guān)注分布式處理范例中與數(shù)據(jù)偏斜相關(guān)的挑戰(zhàn)。正如摘要部分所提到的,偏度可能會導致嚴重問題,甚至可能導致流程失敗。有多種流行的解決方案可以解決數(shù)據(jù)傾斜問題,并利用底層分布式基礎設施的全部功能以最佳方式處理數(shù)據(jù)。下面列出了幾個最突出的解決方案:
Salting:在此技術(shù)中,通過向密鑰添加隨機值來擴展密鑰,以幫助在任務槽之間均勻分布數(shù)據(jù)以消除偏斜。該技術(shù)可能適用于某些類型的操作(例如組縮減),但對于其他類型的操作(例如連接操作)來說是一個挑戰(zhàn),在連接操作中必須將相同的隨機值添加到兩個數(shù)據(jù)集的鍵中,以確保連接仍然按預期工作。如果我們使用分布式 SQL 進行處理,這是可以完成的,但對于其他場景來說,這將是一個挑戰(zhàn),例如,如果我們編寫了一個帶有通用連接框架的框架來進行分布式處理。
重新洗牌:在此技術(shù)中,對傾斜數(shù)據(jù)集調(diào)用重新洗牌操作,以顯式破壞融合運算符并將數(shù)據(jù)重新分配到未充分利用的節(jié)點。但對這種技術(shù)的一個警告是,僅在必要時才使用重新洗牌,因為它是一把雙刃劍,不應該在任何地方使用。同樣,這可能適用于聚合操作,但對于傾斜的連接操作不是很有效。
重新設計傾斜數(shù)據(jù)集的數(shù)據(jù)分布邏輯:在這種方法中,重新審視用于分布式處理的跨任務槽的數(shù)據(jù)集分布,以采用多步驟分布策略來設計一種分布處理邏輯的方法。這種策略有一個缺點:通過多次移動數(shù)據(jù),我們增加了網(wǎng)絡內(nèi)傳輸更多數(shù)據(jù)的風險,這可能會降低管道的性能。這種方法對于需要對分布式集群中的每個節(jié)點進行大量數(shù)據(jù)處理的用例和情況是有利的,并且與處理數(shù)據(jù)相比,移動數(shù)據(jù)的開銷無關(guān)緊要。同樣,該策略可能適用于特定的處理場景,但不適用于所有場景。
本文將重點討論這些現(xiàn)代分布式處理應用程序遇到的一些主要處理挑戰(zhàn),并提供詳細的用例和示例。另外,我將推薦一些處理策略來解決處理挑戰(zhàn)。本文討論的這些處理挑戰(zhàn)將與利用分布式軟件進行大量數(shù)據(jù)處理有關(guān),其中將分發(fā)和處理大量數(shù)據(jù)集。
以下是基于 Apache Spark、Apache Storm、Apache Hadoop、Flink、Samza、Beam 等軟件構(gòu)建的分布式處理應用程序中遇到的一個主要問題。
根據(jù)我在技術(shù)現(xiàn)代化計劃中的經(jīng)驗,我遇到了處理傾斜數(shù)據(jù)集的挑戰(zhàn)。使用分布式軟件設計應用程序來處理大量數(shù)據(jù)集,并具有主要處理用例,例如大數(shù)據(jù)集的聯(lián)接、復雜的轉(zhuǎn)換以及數(shù)據(jù)聚合以生成匯總輸出。在此類處理用例中,特別是對于大容量數(shù)據(jù)集,數(shù)據(jù)傾斜是處理的主要挑戰(zhàn)。當我們利用應用程序的擴展將處理分布到多個工作節(jié)點時,事實證明,傾斜的數(shù)據(jù)集是一個主要的性能障礙。
至關(guān)重要的是,性能問題可能有多種根本原因,檢測和解決性能問題需要采用協(xié)調(diào)的方法,包括性能分析、監(jiān)控和分析。建議利用監(jiān)控和分析功能來收集性能指標并檢測需要優(yōu)化的問題區(qū)域。
我們將在本文中討論的一個示例是傾斜數(shù)據(jù)集的連接操作,其中跨處理槽的數(shù)據(jù)分布基于連接鍵。這些連接鍵無法跨處理槽均勻分布數(shù)據(jù)集,從而導致基數(shù)峰值。當一些連接鍵具有與其關(guān)聯(lián)的大量數(shù)據(jù)時,就會出現(xiàn)問題。將分配這些鍵的處理槽將具有進入這些槽的所有關(guān)聯(lián)數(shù)據(jù),并且具有與其關(guān)聯(lián)的較少數(shù)據(jù)的連接鍵的剩余較大部分將僅被分配數(shù)據(jù)集的較小部分。這會導致處理槽中的數(shù)據(jù)偏斜和數(shù)據(jù)分布不均勻。數(shù)據(jù)偏斜的主要原因是基數(shù)爆炸,這會導致許多其他不利影響,在最壞的情況下,可能導致流程失敗。
為了更好地解釋問題陳述,我將舉一個例子,其中數(shù)據(jù)集中 85% 的記錄僅鏈接到 10% 的 Join 鍵。在這種情況下,利用多個節(jié)點進行分布式處理,85% 的數(shù)據(jù)將傳輸?shù)?10% 的節(jié)點,因為連接操作將根據(jù)連接鍵將數(shù)據(jù)集分布到處理節(jié)點上。由于連接鍵將均勻分布在處理槽中,因此處理 90% 連接鍵的大多數(shù)節(jié)點將快速完成,因為它們只有來自較大數(shù)據(jù)集的 15% 的數(shù)據(jù)和剩余 10% 的連接鍵,這,我們說有 85% 的與之關(guān)聯(lián)的數(shù)據(jù)集必須處理大量數(shù)據(jù)集的 85% 的傾斜部分。這將導致分配這 10% 連接鍵的處理節(jié)點運行時間更長,并且當分配了 90% 連接鍵的其他節(jié)點在完成處理較小部分的連接鍵后處于空閑狀態(tài)時,將難以用有限的資源處理大量數(shù)據(jù)。大量的數(shù)據(jù)集。這降低了作業(yè)的整體執(zhí)行效率。此外,傾斜的數(shù)據(jù)集可能會導致某些執(zhí)行器內(nèi)存溢出,從而導致作業(yè)失敗。如果少數(shù)連接鍵擁有與其關(guān)聯(lián)的大部分數(shù)據(jù),則可能會發(fā)生內(nèi)存溢出。例如,一個連接鍵包含來自一個數(shù)據(jù)集的 2000 萬條記錄,這些記錄具有相同的連接鍵。在這種情況下,無論處理的并行度有多少,所有 2000 萬條記錄都將進入同一個處理節(jié)點。如果節(jié)點內(nèi)存不足以處理 2000 萬卷,則可能會遇到內(nèi)存溢出并可能導致進程失敗。這對于任何生產(chǎn)運行來說都是最糟糕的結(jié)果,可能需要立即解決。
我們將通過使用實際數(shù)據(jù)場景定義問題陳述來進一步介紹此示例。在下面的問題陳述中,我們有兩個需要連接的大量數(shù)據(jù)集,連接的結(jié)果將用于從兩個數(shù)據(jù)集中選擇所需的屬性以進行后續(xù)處理。
在下面的用例中,我將給出一個示例場景和一些數(shù)字統(tǒng)計數(shù)據(jù)來說明問題。這將有助于我們更好地理解傾斜數(shù)據(jù)集問題造成的影響和瓶頸。我還將提出一個解決方案,可以設想和開發(fā)為該問題的通用且可重用的解決方案,從而消除任何此類必須處理傾斜數(shù)據(jù)集連接問題的用例的瓶頸。
我將從傾斜數(shù)據(jù)集連接處理場景的圖示開始:
在上面兩個數(shù)據(jù)集場景之間的 Join 操作的圖示中,第一個數(shù)據(jù)集大約有 1.7 億條記錄,第二個數(shù)據(jù)集相對較小,大約有 3500 萬條記錄。兩個數(shù)據(jù)集基于標準連接鍵進行連接,并且與第一個數(shù)據(jù)集中的其他連接鍵相比,第二個數(shù)據(jù)集中的一些連接鍵具有過多的具有相同連接鍵值的記錄。當分布式軟件執(zhí)行這兩個數(shù)據(jù)集之間的連接時。數(shù)據(jù)基于連接鍵分布在處理槽中,并且具有相同連接鍵的所有記錄都被分配到兩個數(shù)據(jù)集中的相同處理槽。
這會導致一些處理槽出現(xiàn)偏斜,這些處理槽被分配的鍵具有來自第一數(shù)據(jù)集的不成比例的數(shù)據(jù)量。在上圖中,我們展示了跨多個處理槽發(fā)生的一些連接。讓我們保持簡單,假設每個槽都分配有兩個連接鍵。
任務槽 1 被分配了兩個連接鍵,其中第一個數(shù)據(jù)集分別有 500 萬和 400 萬條記錄,而第二個數(shù)據(jù)集有一條記錄。這導致該任務槽為連接操作處理九百萬條記錄。
對于第二個任務槽和第三個槽之后的剩余任務槽,連接條件不會創(chuàng)建傾斜的數(shù)據(jù)集。第一個數(shù)據(jù)集中的數(shù)據(jù)不是那么高,只有幾百條記錄與第二個數(shù)據(jù)集中的一條記錄具有相同的連接鍵。
同樣,在第三個處理槽中,分配給該任務槽的兩個連接鍵分別擁有 1100 萬條和 900 萬條記錄,與第二個數(shù)據(jù)集中的單個記錄相對應。這導致該任務槽為連接操作處理 2000 萬條記錄。
簡而言之,這種連接操作的問題是在所有可用的處理槽中處理連接操作的數(shù)據(jù)分配不均勻;每個槽都分配有相同數(shù)量的連接鍵?,F(xiàn)在,具有相對于分配的連接鍵的傾斜數(shù)據(jù)集的槽將必須處理具有連接鍵的非傾斜數(shù)據(jù)集的相對槽的大量數(shù)據(jù)。在上圖中,第一個和第三個插槽必須處理這種情況,并且與其他插槽(例如第二個插槽以及第三個插槽之后直到最后第 n 個插槽的所有插槽相比,它們必須處理大量數(shù)據(jù),并且只分配了幾百條記錄) 。所有插槽都具有類似的資源和基礎設施,因此第二個插槽以及第三個插槽之后的所有插槽直到最后一個插槽將快速完成處理并處于空閑狀態(tài)。相比之下,插槽一和插槽三將繼續(xù)在更長的時間內(nèi)處理數(shù)據(jù)。在這種情況下,我們無法最佳地利用分布式基礎設施。我們將不得不處理更長的時間,當我們有空閑的可用插槽但無法利用它們來加速處理和優(yōu)化性能時,會導致性能下降。
在這種情況下,盡管連接鍵的數(shù)量在處理節(jié)點之間均勻分布,但很少有連接鍵具有均勻分布,并且其他組連接鍵具有與連接鍵匹配的數(shù)據(jù)的傾斜部分,從而導致較高的數(shù)據(jù)量數(shù)據(jù)進入那些處理槽。當我們對傾斜數(shù)據(jù)集執(zhí)行連接操作時,這種情況很常見。這種情況會導致處理周期更長。對于處理節(jié)點來說,這將導致背壓和更高的內(nèi)存分配,也可能導致內(nèi)存溢出,因為處理節(jié)點將處理數(shù)據(jù)集的大量部分。
這種情況也會出現(xiàn)在聚合和匯總操作中,我們必須對大量數(shù)據(jù)集進行某些匯總。匯總鍵再次導致傾斜的數(shù)據(jù)集,其中某些鍵將產(chǎn)生與傾斜的匯總鍵匹配的數(shù)據(jù)集的較大部分,而其他鍵集具有與鍵匹配的較小數(shù)據(jù)子集。在這種情況下,我們必須想出一個解決數(shù)據(jù)傾斜的方案。我們將幫助利用所有處理節(jié)點來統(tǒng)一處理數(shù)據(jù),從而提高分布式基礎設施的性能和更高的吞吐量。
為了解決這個問題,我們提出了一些定制的解決方案,可以根據(jù)用例進行思考和思考,并選擇理想的解決方案來解決這些問題。在所提出的方法中,解決難題的關(guān)鍵是確定連接操作中的哪個數(shù)據(jù)集導致了偏度。當某些鍵與其他鍵相比具有過多的記錄時,通常會遇到偏度,這會導致大部分數(shù)據(jù)集鏈接到特定的一組鍵,而數(shù)據(jù)集的其余部分統(tǒng)一鏈接到其余的一組鍵。鍵。第一步是確定那些具有大量記錄的鍵集。
下圖描述和解釋了一種自定義解決方案,其中使用廣播操作將大量數(shù)據(jù)集的傾斜部分均勻分布在所有工作槽上,并使用正常的連接操作處理數(shù)據(jù)集的非傾斜部分,并且由于第二部分是非傾斜的,因此它將均勻分布在所有工作槽中,從而能夠最佳地利用所有槽資源:
根據(jù)用于連接兩個數(shù)據(jù)集的連接鍵,確定第一個數(shù)據(jù)集中具有與其關(guān)聯(lián)的大量記錄的頂級鍵。確定與第一個數(shù)據(jù)集具有傾斜鏈接的所有鍵。
接下來,根據(jù)上面第一步中識別的鍵集,我們可以將第一個數(shù)據(jù)集分為兩部分:第一部分是具有所有傾斜鍵的部分,第二部分是具有所有非傾斜鍵的部分。除上述第一步中識別的鍵之外的鍵的傾斜部分。它看起來像下面這樣:
第一個數(shù)據(jù)集記錄連接鍵屬性所在的位置(所有傾斜的連接鍵都有鏈接到連接鍵的大量數(shù)據(jù))。
第一個數(shù)據(jù)集記錄連接鍵屬性不存在的位置(所有傾斜的連接鍵都有鏈接到連接鍵的大量數(shù)據(jù))。
可以對第二個數(shù)據(jù)集執(zhí)行相同的操作,將數(shù)據(jù)集分成兩部分——第一部分包含具有在上面步驟 1 中標識的連接鍵的記錄,第二部分具有不在上面步驟 1 中標識的連接鍵中的連接鍵。
在識別出第一個較大數(shù)據(jù)集的傾斜部分后,我們需要使用廣播以及上面步驟 2 中第二個數(shù)據(jù)集的匹配記錄來處理它。包含密鑰的第二個數(shù)據(jù)集的體積非常小,因為并非所有數(shù)據(jù)都會傾斜,因此我們設想第二個數(shù)據(jù)集的重要性中只有 1% 到 5% 屬于此類別,并且可以用作廣播和將可供所有任務槽使用。通過這種方式,第一數(shù)據(jù)集的傾斜部分可以均勻分布在任務槽中,并將用于使用廣播連接來連接第二數(shù)據(jù)集。這將導致對傾斜數(shù)據(jù)集的統(tǒng)一處理,平等地利用所有任務槽,從而加速對傾斜數(shù)據(jù)集的處理。
較大數(shù)據(jù)集的剩余部分(未傾斜)可以使用連接鍵與第二個數(shù)據(jù)集進行常規(guī)連接操作來處理。此連接將以最佳方式執(zhí)行,并且來自兩個數(shù)據(jù)集的數(shù)據(jù)將均勻分布在所有任務槽中,因為連接不會傾斜。
使用廣播對傾斜數(shù)據(jù)集執(zhí)行連接操作,并使用常規(guī)連接對非傾斜數(shù)據(jù)集執(zhí)行連接操作后,兩個結(jié)果數(shù)據(jù)集將連接在一起。它們將產(chǎn)生完整的連接數(shù)據(jù)集。
該方法使用混合解決方案,其中使用連接操作和廣播操作來解決完整的數(shù)據(jù)集連接操作。下面詳細解釋了所有上述高級步驟:
使用上述方法解決問題的關(guān)鍵是從較大的數(shù)據(jù)集中確定傾斜數(shù)據(jù)集,并從第二個較小的數(shù)據(jù)集中確定相應的連接鍵記錄。這有助于深入了解數(shù)據(jù)分布,確定如何處理傾斜數(shù)據(jù)集并將數(shù)據(jù)集的傾斜部分與非傾斜數(shù)據(jù)集部分分離。文章來源:http://www.zghlxwxcb.cn/article/478.html
結(jié)論
技術(shù)正在飛速發(fā)展,分布式處理框架正在占據(jù)主導地位,用于處理大量數(shù)據(jù)以提取有意義的信息。雖然這些框架經(jīng)過了高度優(yōu)化,但很少有與大批量處理相關(guān)的挑戰(zhàn)可以通過利用創(chuàng)新技術(shù)和方法來有效解決。本文解釋了一種這樣的方法,通過識別數(shù)據(jù)集的傾斜部分并使用不同的最佳方法解決它,該方法可能被證明對于處理傾斜數(shù)據(jù)集非常有益。解決問題的主要思想是識別關(guān)注點并以不同的方式分離要解決的關(guān)注點,這與傾斜的數(shù)據(jù)集結(jié)構(gòu)一致,均勻分布在集群的所有節(jié)點上,并利用所有節(jié)點來處理數(shù)據(jù)集最優(yōu)。我希望本文討論的方法將幫助組織克服與處理大量傾斜數(shù)據(jù)集相關(guān)的挑戰(zhàn)。文章來源地址http://www.zghlxwxcb.cn/article/478.html
到此這篇關(guān)于大容量分布式數(shù)據(jù)處理中傾斜數(shù)據(jù)集的處理方法的文章就介紹到這了,更多相關(guān)內(nèi)容可以在右上角搜索或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!