99999久久久久久亚洲,欧美人与禽猛交狂配,高清日韩av在线影院,一个人在线高清免费观看,啦啦啦在线视频免费观看www

熱線電話:13121318867

登錄
首頁大數(shù)據(jù)時代為什么 spark 2.0 底層通信不用 Akka 而轉(zhuǎn)用 netty ?
為什么 spark 2.0 底層通信不用 Akka 而轉(zhuǎn)用 netty ?
2023-04-03
收藏

Apache Spark是一個分布式計算框架,設(shè)計初衷是為了處理大規(guī)模數(shù)據(jù)集的計算。隨著越來越多的企業(yè)開始采用Spark進行數(shù)據(jù)處理和分析,其性能和可靠性變得越來越重要。在這種情況下,底層通信的效率和魯棒性成為了至關(guān)重要的因素。在Spark 2.0中,Spark團隊做出了一個重大決策:底層通信從Akka轉(zhuǎn)向Netty。這篇文章將探討這個決定的背景、原因和影響。

背景

在Spark 1.x版本中,Spark使用Akka作為其底層通信框架。Akka是一種基于Scala語言的消息傳遞框架,它可以輕松地實現(xiàn)分布式系統(tǒng)中的Actor模型,提供了高度并發(fā)的支持。但是,隨著Spark的廣泛應(yīng)用,Akka的一些缺點也逐漸顯露出來。具體來說,Akka存在兩個主要的問題:

  • Akka本身依賴于Java虛擬機(JVM)級別的線程(thread),在大規(guī)模并行化的情況下,線程數(shù)量可能會非常龐大,導致調(diào)度和管理成本增加,進而降低系統(tǒng)的性能。
  • Akka的消息傳遞模型是異步的,這意味著發(fā)送方無法知道消息何時被接收和處理。在某些情況下,這可能會導致消息丟失或延遲,進而降低系統(tǒng)的健壯性。

針對這些問題,Spark團隊考慮替換Akka,尋找更高效、更穩(wěn)定的通信框架。

原因

Spark團隊在選擇新的底層通信框架時,考慮了以下因素:

性能

首先,Spark需要一個高效的通信框架,能夠快速地傳輸大量的數(shù)據(jù)。在大規(guī)模的數(shù)據(jù)集上,通信的開銷往往比計算本身還要高昂,因此通信性能的優(yōu)化對于Spark的性能至關(guān)重要。

Netty是一個高性能的網(wǎng)絡(luò)通信框架,專門設(shè)計用于構(gòu)建高性能、高可靠的網(wǎng)絡(luò)應(yīng)用程序。與Akka相比,Netty采用更高效的I/O模型和線程管理方式,可以更好地利用現(xiàn)代計算機系統(tǒng)的多核心和多線程資源,在高并發(fā)的場景下保持更好的性能表現(xiàn)。

健壯性

其次,Spark需要一個健壯、可靠的通信框架,能夠保證消息正確性和可靠性。在分布式系統(tǒng)中,由于各種網(wǎng)絡(luò)異常和故障,消息的傳輸過程中可能會遇到各種問題。因此,通信框架必須具備足夠的健壯性,能夠自適應(yīng)地應(yīng)對不同的異常情況,并盡可能地保證消息的正確性和可靠性。

Netty提供了諸如心跳檢測、連接超時控制、斷線重連等多種機制,能夠有效地處理各種網(wǎng)絡(luò)異常和故障,保證通信的可靠性和健壯性。

社區(qū)支持

最后,Spark需要一個活躍的社區(qū)和生態(tài)環(huán)境,能夠為其提供良好的支持和反饋。通信框架作為Spark的底層組件之一,必須具備足夠的社區(qū)支持和生

態(tài)環(huán)境,能夠與Spark社區(qū)緊密配合,相互促進。在選擇新的通信框架時,必須考慮到其生態(tài)環(huán)境和社區(qū)支持情況,以確保其能夠長期穩(wěn)定地運行,并為Spark提供長期的支持。

Netty作為一個成熟的開源項目,擁有龐大的用戶和開發(fā)者社區(qū),具備廣泛的應(yīng)用場景和豐富的功能庫。與Akka相比,Netty的生態(tài)環(huán)境更加成熟、穩(wěn)定,能夠為Spark提供更好的支持和反饋。

綜上所述,Spark團隊最終決定將底層通信從Akka轉(zhuǎn)向Netty,以滿足Spark日益增長的性能和可靠性需求。

影響

底層通信框架的改變對于Spark整體的影響十分深遠,主要體現(xiàn)在以下幾個方面:

性能提升

由于Netty采用更高效的I/O模型和線程管理方式,通信性能得到了明顯的提升。根據(jù)Spark官方測試數(shù)據(jù)顯示,使用Netty作為底層通信框架可以使Spark的性能提升10%-30%,特別是在大規(guī)模數(shù)據(jù)處理場景下表現(xiàn)更加優(yōu)秀。

可靠性增強

Netty提供了多種機制來保證消息的正確性和可靠性,如心跳檢測、連接超時控制、斷線重連等,可以有效地避免消息丟失或延遲等問題,提高系統(tǒng)的健壯性和可靠性。

兼容性調(diào)整

由于底層通信框架的改變,Spark 2.0需要進行一定的兼容性調(diào)整,以適應(yīng)新的通信框架。具體地,某些Spark API中與Akka相關(guān)的部分需要進行修改或替換,以適應(yīng)Netty的API設(shè)計。

生態(tài)環(huán)境升級

Netty相對于Akka而言,具備更加成熟、穩(wěn)定的生態(tài)環(huán)境和社區(qū)支持,這也為Spark提供了更好的支持和發(fā)展空間。同時,一些與Netty相關(guān)的生態(tài)組件也開始出現(xiàn),如基于Netty的分布式RPC框架gRPC等,進一步提升了Spark生態(tài)環(huán)境的質(zhì)量和穩(wěn)定性。

總體來說,底層通信框架的轉(zhuǎn)換為Spark帶來了明顯的性能和可靠性提升,同時也需要進行一定的兼容性調(diào)整和生態(tài)環(huán)境升級,為Spark未來的發(fā)展奠定了更加堅實的基礎(chǔ)。

推薦學習書籍
《CDA一級教材》適合CDA一級考生備考,也適合業(yè)務(wù)及數(shù)據(jù)分析崗位的從業(yè)者提升自我。完整電子版已上線CDA網(wǎng)校,累計已有10萬+在讀~

免費加入閱讀:https://edu.cda.cn/goods/show/3151?targetId=5147&preview=0

數(shù)據(jù)分析咨詢請掃描二維碼

若不方便掃碼,搜微信號:CDAshujufenxi

數(shù)據(jù)分析師資訊
更多

OK
客服在線
立即咨詢
客服在線
立即咨詢
') } function initGt() { var handler = function (captchaObj) { captchaObj.appendTo('#captcha'); captchaObj.onReady(function () { $("#wait").hide(); }).onSuccess(function(){ $('.getcheckcode').removeClass('dis'); $('.getcheckcode').trigger('click'); }); window.captchaObj = captchaObj; }; $('#captcha').show(); $.ajax({ url: "/login/gtstart?t=" + (new Date()).getTime(), // 加隨機數(shù)防止緩存 type: "get", dataType: "json", success: function (data) { $('#text').hide(); $('#wait').show(); // 調(diào)用 initGeetest 進行初始化 // 參數(shù)1:配置參數(shù) // 參數(shù)2:回調(diào),回調(diào)的第一個參數(shù)驗證碼對象,之后可以使用它調(diào)用相應(yīng)的接口 initGeetest({ // 以下 4 個配置參數(shù)為必須,不能缺少 gt: data.gt, challenge: data.challenge, offline: !data.success, // 表示用戶后臺檢測極驗服務(wù)器是否宕機 new_captcha: data.new_captcha, // 用于宕機時表示是新驗證碼的宕機 product: "float", // 產(chǎn)品形式,包括:float,popup width: "280px", https: true // 更多配置參數(shù)說明請參見:http://docs.geetest.com/install/client/web-front/ }, handler); } }); } function codeCutdown() { if(_wait == 0){ //倒計時完成 $(".getcheckcode").removeClass('dis').html("重新獲取"); }else{ $(".getcheckcode").addClass('dis').html("重新獲取("+_wait+"s)"); _wait--; setTimeout(function () { codeCutdown(); },1000); } } function inputValidate(ele,telInput) { var oInput = ele; var inputVal = oInput.val(); var oType = ele.attr('data-type'); var oEtag = $('#etag').val(); var oErr = oInput.closest('.form_box').next('.err_txt'); var empTxt = '請輸入'+oInput.attr('placeholder')+'!'; var errTxt = '請輸入正確的'+oInput.attr('placeholder')+'!'; var pattern; if(inputVal==""){ if(!telInput){ errFun(oErr,empTxt); } return false; }else { switch (oType){ case 'login_mobile': pattern = /^1[3456789]\d{9}$/; if(inputVal.length==11) { $.ajax({ url: '/login/checkmobile', type: "post", dataType: "json", data: { mobile: inputVal, etag: oEtag, page_ur: window.location.href, page_referer: document.referrer }, success: function (data) { } }); } break; case 'login_yzm': pattern = /^\d{6}$/; break; } if(oType=='login_mobile'){ } if(!!validateFun(pattern,inputVal)){ errFun(oErr,'') if(telInput){ $('.getcheckcode').removeClass('dis'); } }else { if(!telInput) { errFun(oErr, errTxt); }else { $('.getcheckcode').addClass('dis'); } return false; } } return true; } function errFun(obj,msg) { obj.html(msg); if(msg==''){ $('.login_submit').removeClass('dis'); }else { $('.login_submit').addClass('dis'); } } function validateFun(pat,val) { return pat.test(val); }