hive on spark記憶體模型

来源:https://www.cnblogs.com/lhk20213937/p/18136064
-Advertisement-
Play Games

內容介紹 hive on spark的調優,那必然涉及到這一系列框架的記憶體模型。本章就是來講一下這些框架的記憶體模型。 hive on spark的任務,從開始到結束。總共涉及了3個框架。分別是:yarn、hive、spark 其中,hive只是一個客戶端的角色。就不涉及任務運行時的記憶體。所以這裡主要 ...


內容介紹

hive on spark的調優,那必然涉及到這一系列框架的記憶體模型。本章就是來講一下這些框架的記憶體模型。
hive on spark的任務,從開始到結束。總共涉及了3個框架。分別是:yarn、hive、spark
其中,hive只是一個客戶端的角色。就不涉及任務運行時的記憶體。所以這裡主要講的yarn和spark的記憶體模型。
其中,由於spark是運行在yarn的container中。所以我們從外到內。先將yarn的資源分配。後講spark的記憶體模型。

hive on spark提交流程

hive階段

首先上場的是hive框架。當我們寫了一個SQL語句的時候,會被hive進行解析(hive用的SQL解析框架是Antlr4)。解析的流程是:

  • 解析器將SQL解析成AST(抽象語法樹)
  • 邏輯生成器
  • 邏輯優化器 (這裡主要做一些謂詞下推的操作)
  • 物理生成器
  • 物理優化器(這裡則是做基於代價的優化,簡稱CBO)
  • 執行器 (在這裡就會將Spark任務提交給yarn)
    這裡是進行物理優化器的地方,可以看見,從這裡開始,就已經根據引擎的不同,進行不同的優化了。
    img
    此處就是執行器
    img
    我們進去之後就可以看見 提交Spark任務
    img
    我們可以在這裡看見,把job上傳到yarn上,並且添加了一些監聽器來獲取job的狀態
    img

這樣之後,SQL就會被轉為Spark一系列的RDD。

yarn資源

在hive中,我們已經把spark job提交到yarn上面。現在我們就來看一下yarn的記憶體模型。

yarn的組成很簡單,有ResourceManager和NodeManager,其中ResourceManager是大哥。對客戶端傳來的請求做處理。NodeManager是小弟。負責運行任務。
就此而言,我們就可以做出一個簡單的判斷:對於資源(記憶體和CPU)的分配,我們要多給NodeManager資源。ResourceManager無需很多的資源。因為ResourceManager僅僅是處理客戶端的請求和管理NodeManager。並不進行任務的計算。
NodeManager裡面是很多的Container,我們的Spark任務就是跑在Container裡面的。

yarn中關於資源的參數

由於spark任務是跑在NodeManager下的Container中。所以我們可以對NodeManager和Contaniner進行參數的調整(資源的配置)

NodeManager的參數
  • yarn.nodemanager.resource.memory-mb : NodeManager可以給Container分配記憶體
  • yarn.nodemanager.resource.cpu-vcores :NodeManager可以給Container分配的虛擬核數(因為不同的CPU可能計算能力不同。有可能一個i7的CPU頂兩個i5的。所以就可以把i7的cpu映射為兩個虛擬核。這樣的話,就不會出現因為CPU的差異,而導致的:相同的任務跑多次。每次所耗的時間相差特別大。)
Container的參數
  • yarn.scheduler.maximum-allocation-mb : 單個Container可以使用的最大記憶體
  • yarn.scheduler.minimum-allocation-mb : 單個Container可以使用的最小記憶體

Spark資源

Spark的記憶體模型可以大致分為堆內記憶體和堆外記憶體
img

堆內記憶體

img
動態占用機制:簡單的來說,

  • 存儲執行的記憶體都不足時。存儲會存放到硬碟。
  • 存儲占用了執行的記憶體後,執行想收回記憶體時。存儲會將占用的部分轉存到硬碟。歸還記憶體
  • 執行占用了存儲的記憶體後,存儲想收回記憶體時,執行無法歸還記憶體。需要等到執行使用完畢,才可以歸還記憶體。(朴素的想一想,比較計算重要。不能停止,只好讓存儲等一等。等執行計算完畢,再歸還記憶體)

堆外記憶體

img

在預設情況下,堆外記憶體並不啟用。可以通過spark.memory.offHeap.enabled開啟。
堆外記憶體的大小由spark.memory.offHeap.size指定。
堆外記憶體的優點:

  • Spark直接操作系統堆外記憶體,減少了不必要的記憶體開銷,和頻繁的GC的掃描和回收,提高了性能
  • 可以被精準的申請和釋放。(因為堆內記憶體是由JVM管理的。所以無法實現精準的釋放)

整合yarn和Spark

我們先對一臺伺服器的資源配置做出假設,並根據這些假設,對資源進行合理的分配。

伺服器的資源情況: 32核CPU,128G記憶體

因為我們的伺服器不可能只是為yarn一個框架提供資源。其他的框架也需要資源。所以我們可用分配給yarn的資源為:16核CPU,64G記憶體

Spark任務分為Driver和Executor。

Executor

由於 Spark 的Executor的CPU建議數量是4~6個。 然後伺服器中yarn可用的CPU資源數是16。

16/4=4;16/5=3...1;16/6=2...4;可以看出。單個Executor的CPU核數為5、6的時候,都會有一些CPU核未使用上,造成CPU的浪費。所以我們選取 單個Executor的CPU核數為4。然後我們根據1CU原則(1個CPU對應4G記憶體)。所以Executor的記憶體數為4*4G。

單個Executo資源情況: 4核CPU,16G記憶體。

根據資源的配置情況可知, 一個節點能運行的Executo數量為 4

這樣,我們對於單個Executor 的資源分配好了。我們再來看Executor內部的記憶體分配。

由上面的Spark的記憶體模型可知。Spark的記憶體分為堆內堆外記憶體。在預設情況下 堆外記憶體=堆內記憶體0.1 (spark.executor.memoryOverhead=spark.executor.memory0.1)
所以簡單的計算一下就可知:

  • spark.executor.memoryOverhead=$\frac{1}{11}*16G(單個Executor的可用的總記憶體)$
  • spark.executor.memory=$\frac{10}{11}*16G(單個Executor的可用總記憶體)$

當然,很多情況下這個結果都不是整數。所以計算出結果後,再進行一些個人的調整就好。

在這裡Executor內部實際的記憶體分配情況如下:

spark.executor.memoryOverhead=2G

spark.executor.memory=14G

到這裡,我們給各個組件的資源就已經分配完畢了。
下麵我們來從Spark任務的角度談一下,一個Spark任務,應該使用多少個Executor合適。

對於一個Spark任務的Executor數量,有靜態分配動態分配兩種選擇。
我們當然是選擇動態分配。(因為靜態分配相比於動態分配,更容易造成資源的浪費或者Spark任務資源的不足。)

動態分配: 根據Spark任務的工作負載,可用動態的調整所占用的資源(Executor的數量)。需要時申請,不需要時釋放。下麵是動態分配的一些參數的設置

#啟動動態分配
spark.dynamicAllocation.enabled    true
#啟用Spark shuffle服務
spark.shuffle.service.enabled    true
#Executor個數初始值
spark.dynamicAllocation.initialExecutors    1
#Executor個數最小值
spark.dynamicAllocation.minExecutors    1
#Executor個數最大值
spark.dynamicAllocation.maxExecutors    12
#Executor空閑時長,若某Executor空閑時間超過此值,則會被關閉
spark.dynamicAllocation.executorIdleTimeout    60s
#積壓任務等待時長,若有Task等待時間超過此值,則申請啟動新的Executor
spark.dynamicAllocation.schedulerBacklogTimeout    1s
#spark shuffle老版本協議
spark.shuffle.useOldFetchProtocol true

$\color{ForestGreen}{為什麼啟動Spark的shuffle}$:作用是將map的輸出文件落盤。供後續的reduce使用。

$\color{ForestGreen}{為什麼落盤}$:因為如果map的輸出的文件不落盤。map就不會被釋放。也就無法釋放這個空閑的Executor。只有將輸出文件落盤後,這個Executor才會被釋放。

Driver

Driver主要的配置參數有spark.driver.memoryspark.driver.memoryOverhead

此處spark.driver.memoryspark.driver.memoryOverhead的分配的記憶體比例和Executor一樣。都是spark.driver.memoryOverhead=spark.driver.memory*0.1

對於Driver的總記憶體,有一個經驗公式:(假定yarn.nodemanager.resource.memory-mb設為$X$)

  • 若$X>50G$,則Driver設為12G
  • 若$12G<X<50G$,則Driver設為4G
  • 若$1G<X<12G$,則Driver設為1G

因為我們的yarn.nodemanager.resource.memory-mb=64G。所以:

  • spark.driver.memory = 10G
  • spark.driver.memoryOverhead = 2G

配置文件的設置

spark-defaults.conf

配置文件的位置:$HivE_HOME/conf/spark-defaults.conf

由於我們多個節點有Spark。所以可能會有一些疑問:$\color{ForestGreen}{這麼多Spark,這麼多配置文件,究竟是Spark任務運行的節點 的配置文件生效呢?還是Hive目錄下的配置文件生效呢?}$
答案:當然是Hive目錄下的配置文件生效。如果我們瞭解過Spark的任務提交流程就知道。當我們運行了一條命令行後。Spark-submit會解析參數。然後再向yarn提交請求。

spark.master                               yarn
spark.eventLog.enabled                   true
spark.eventLog.dir    hdfs://myNameService1/spark-history
spark.executor.cores    4
spark.executor.memory    14g
spark.executor.memoryOverhead    2g
spark.driver.memory    10g
spark.driver.memoryOverhead    2g
spark.dynamicAllocation.enabled  true
spark.shuffle.service.enabled  true
spark.dynamicAllocation.executorIdleTimeout  60s
spark.dynamicAllocation.initialExecutors    1
spark.dynamicAllocation.minExecutors  1
spark.dynamicAllocation.maxExecutors  12
spark.dynamicAllocation.schedulerBacklogTimeout 1s
spark.shuffle.useOldFetchProtocol    true

spark-shullfe

Spark的shullfe會因為Cluster Manager(standalone、Mesos、Yarn)的不同而不同。
此處我們是yarn。

步驟如下:

  • 拷貝$SPARK_HOME/yarn/spark-3.0.0-yarn-shuffle.jar$HADOOP_HOME/share/hadoop/yarn/lib
  • 向集群分發$HADOOP_HOME/share/hadoop/yarn/lib/spark-3.0.0-yarn-shuffle.jar
  • 修改$HADOOP_HOME/etc/hadoop/yarn-site.xml
<property>
    <name>yarn.nodemanager.aux-services</name>
    <value>mapreduce_shuffle,spark_shuffle</value>
</property>

<property>
    <name>yarn.nodemanager.aux-services.spark_shuffle.class</name>
    <value>org.apache.spark.network.yarn.YarnShuffleService</value>
</property>
  • 分發$HADOOP_HOME/etc/hadoop/yarn-site.xml
  • 重啟yarn

您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 在實際項目中,從Kafka到HDFS的數據是每天自動生成一個文件,按日期區分。而且Kafka在不斷生產數據,因此看看kettle是不是需要時刻運行?能不能按照每日自動生成數據文件? 為了測試實際項目中的海豚定時調度從Kafka到HDFS的Kettle任務情況,特地提前跑一下海豚定時調度這個任務,看看 ...
  • 在當前快速發展的技術格局中,企業尋求創新解決方案來簡化運營並提高效率成為一種趨勢。 Apache DolphinScheduler作為一個強大的工具,允許跨分散式系統進行複雜的工作流任務調度。本文將深入探討如何將Apache DolphinScheduler適配並整合進現代IT環境,提升其在雲原生部 ...
  • 本文分享自華為雲社區《DTC2024,華為雲資料庫創新融合大發展,打造世界級資料庫!》,作者:GaussDB 資料庫。 4月12日-13日,以“智能·雲原生·一體化——DB與Al協同創新,模型與架構融合發展”為主題的第十三屆數據技術嘉年華(DTC 2024)在北京新雲南皇冠假日酒店成功舉行。作為本次 ...
  • 何為半連接? 半連接是在GreatSQL內部採用的一種執行子查詢的方式,semi join不是語法關鍵字,不能像使用inner join、left join、right join這種語法關鍵字一樣提供給用戶來編寫SQL語句。 兩個表t1表和t2表進行半連接的含義是:對於t1表的某條記錄來說,我們只關 ...
  • 版本說明 由於作者目前接觸當前最新版本為2.3.4 但是官方提供的web版本未1.0.0,不相容2.3.4,因此這裡仍然使用2.3.3版本。 可以自定義相容處理,官方提供了文檔:https://mp.weixin.qq.com/s/Al1VmBoOKu2P02sBOTB6DQ 因為大部分用戶使用Se ...
  • 目錄一、什麼是哨兵模式1、為什麼需要哨兵機制2、哨兵架構拓撲3、Redis Sentinel的功能:二、搭建哨兵架構1、涉及主機2、拓撲結構3、設置一主兩從4、master伺服器狀態5、編輯哨兵的配置文件6、啟動哨兵7、驗證哨兵埠8、查看哨兵日誌9、驗證當前sentinel狀態三、故障轉移1、re ...
  • 近日,由新一代信息技術產業研究院、賽迪未來產業研究中心共同主辦,中國電子學會區塊鏈分會、至頂科技聯合承辦的“2024未來信息技術大會暨首屆數據要素創新發展論壇”於北京成功舉辦。大會公佈了“2023年度數據要素價值創新標桿示範案例”評選結果,天翼雲“海南省數據產品超市公共數據資源開發利用平臺”與“福州... ...
  • 在當今快速發展的世界中,數據被視為新的石油。隨著對數據驅動洞察的日益依賴,大數據工程師的角色比以往任何時候都更為關鍵。 這些專業人員在管理和優化組織內的數據操作中扮演著至關重要的角色。在本文中,我們將探索2024年大數據工程師必須具備的十項技能。 理解大數據工程師的角色 在深入技能之前,瞭解大數據工 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...