国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

使用解釋計劃調試 Apache Spark 性能

在數據處理領域,Apache Spark已成為一個強大且多功能的框架。然而,隨著數據量和復雜性不斷增長,確保最佳性能變得至關重要。 

在這篇博文中,我們將探討解釋 計劃如何成為調試和優(yōu)化 Spark 應用程序的秘密武器。我們將深入探討 Spark Scala 的基礎知識并提供清晰的示例,以幫助您了解如何利用這個有價值的工具。

解釋計劃是什么?

解釋計劃是 Spark 處理數據所遵循的邏輯和物理執(zhí)行步驟的全面細分。將其視為指導您完成 Spark 作業(yè)內部運作的路線圖。

Spark 解釋計劃的兩個重要組成部分是:

  1. 邏輯計劃:邏輯計劃代表 Spark 應用程序中指定的高級轉換和操作。它是對您想要對數據執(zhí)行的操作的抽象描述。

  2. 物理計劃:另一方面,物理計劃提供了 Spark 如何將邏輯計劃轉化為一組具體操作的具體細節(jié)。它揭示了 Spark 如何優(yōu)化您的工作以獲得性能。

Explain API還有一些其他重載方法:

  • explain()- 打印物理計劃。

  • explain(extended: Boolean)- 打印計劃(邏輯和物理)。

  • explain(mode: String)- 使用給定解釋模式指定的格式打印計劃(邏輯和物理): 

    • simple僅打印物理計劃。

    • extended:打印邏輯計劃和物理計劃。

    • codegen:打印物理計劃并生成代碼(如果可用)。

    • cost:打印邏輯計劃和統(tǒng)計數據(如果有)。

    • formatted:將解釋輸出分為兩部分:物理計劃大綱和節(jié)點詳細信息。

解釋計劃的使用

我們可以使用explain()DataFrame 或 Dataset 上的方法來做到這一點。這是使用解釋計劃的一個簡單示例:

import org.apache.spark.sql.SparkSession

// 創(chuàng)建 SparkSession
val spark = SparkSession.builder()
  .appName("ExplainPlanExample")
  .getOrCreate()

// 為員工創(chuàng)建一個虛擬 DataFrame
val employeesData = Seq(
  (1, "Alice", "HR"),
  (2, "Bob", "Engineering"),
  (3, "Charlie", "Sales"),
  (4, "David", "Engineering")
)

val employeesDF = employeesData.toDF("employee_id", "employee_name", "department")

// 為工資創(chuàng)建另一個虛擬 DataFrame
val salariesData = Seq(
  (1, 50000),
  (2, 60000),
  (3, 55000),
  (4, 62000)
)

val salariesDF = salariesData.toDF("employee_id", "salary")

// 將 DataFrame 注冊為 SQL 臨時表
employeesDF.createOrReplaceTempView("employees")
salariesDF.createOrReplaceTempView("salaries")

// 使用Spark SQL計算每個部門的平均工資
val avgSalaryDF = spark.sql("""
  SELECT department, AVG(salary) as avg_salary
  FROM employees e
  JOIN salaries s ON e.employee_id = s.employee_id
  GROUP BY department
""")


// 使用擴展模式調用解釋計劃來打印物理和邏輯計劃
avgSalaryDF.explain(true)

// 停止 SparkSession
spark.stop()

在上面的示例中,我們創(chuàng)建了一個實例employeeData和salariesData  DataFrame,并執(zhí)行連接,然后進行聚合以獲得部門的平均工資。以下是給定數據框的解釋計劃。

scala> avgSalaryDF.explain(true)
== Parsed Logical Plan ==
'Aggregate ['department], ['department, 'AVG('salary) AS avg_salary#150]
+- 'Join Inner, ('e.employee_id = 's.employee_id)
   :- 'SubqueryAlias e
   :  +- 'UnresolvedRelation [employees], [], false
   +- 'SubqueryAlias s
      +- 'UnresolvedRelation [salaries], [], false

== Analyzed Logical Plan ==
department: string, avg_salary: double
Aggregate [department#135], [department#135, avg(salary#147) AS avg_salary#150]
+- Join Inner, (employee_id#133 = employee_id#146)
   :- SubqueryAlias e
   :  +- SubqueryAlias employees
   :     +- View (`employees`, [employee_id#133,employee_name#134,department#135])
   :        +- Project [_1#126 AS employee_id#133, _2#127 AS employee_name#134, _3#128 AS department#135]
   :           +- LocalRelation [_1#126, _2#127, _3#128]
   +- SubqueryAlias s
      +- SubqueryAlias salaries
         +- View (`salaries`, [employee_id#146,salary#147])
            +- Project [_1#141 AS employee_id#146, _2#142 AS salary#147]
               +- LocalRelation [_1#141, _2#142]

== Optimized Logical Plan ==
Aggregate [department#135], [department#135, avg(salary#147) AS avg_salary#150]
+- Project [department#135, salary#147]
   +- Join Inner, (employee_id#133 = employee_id#146)
      :- LocalRelation [employee_id#133, department#135]
      +- LocalRelation [employee_id#146, salary#147]

== Physical Plan ==
AdaptiveSparkPlan isFinalPlan=false
+- HashAggregate(keys=[department#135], functions=[avg(salary#147)], output=[department#135, avg_salary#150])
   +- Exchange hashpartitioning(department#135, 200), ENSURE_REQUIREMENTS, [plan_id=271]
      +- HashAggregate(keys=[department#135], functions=[partial_avg(salary#147)], output=[department#135, sum#162, count#163L])
         +- Project [department#135, salary#147]
            +- BroadcastHashJoin [employee_id#133], [employee_id#146], Inner, BuildRight, false
               :- LocalTableScan [employee_id#133, department#135]
               +- BroadcastExchange HashedRelationBroadcastMode(List(cast(input[0, int, false] as bigint)),false), [plan_id=266]
                  +- LocalTableScan [employee_id#146, salary#147]


scala>

正如您在上面看到的,當extended標志設置為 時true,我們有解析的邏輯計劃、分析的邏輯計劃、優(yōu)化的邏輯計劃和物理計劃。 

在嘗試理解計劃之前,我們需要自下而上地閱讀所有計劃。因此我們將在底部看到任何數據幀的創(chuàng)建或讀取。

我們將了解其中的每一項: 

解析邏輯計劃

這是Spark解析用戶提供的SQL或 DataFrame 操作并創(chuàng)建查詢的解析表示的初始階段。使用 Spark SQL 查詢時,任何語法錯誤都會在此處捕獲。如果我們在這里觀察,列名稱尚未解析。

初始階段示意圖

在上面解析的邏輯計劃中,我們可以看到 UnresolvedRelation。這意味著架構尚未解決。解析后的邏輯計劃概述了查詢的邏輯結構,包括聚合和連接操作。employees它還定義別名并標識和DataFrame的源salaries。未解析的關系將在查詢執(zhí)行期間解析為其實際數據源。

分析邏輯計劃

解析之后,Spark 會經歷一個稱為語義分析或解析的過程。在此階段,Spark 根據可用表和列的目錄檢查查詢,解析列名稱,驗證數據類型,并確保查詢在語義上正確。結果是經過分析的邏輯計劃,其中包含有關所涉及的表和列的元數據和信息。

語義分析或解析的過程

該計劃表示解析和語義分析后查詢的初始邏輯結構。它顯示了包含兩列的結果架構,department和avg_salary。該計劃由兩個子查詢e,和組成s,它們對應于employees和salariesDataFrame。employee_id內連接操作作為連接鍵應用于這些子查詢之間。該計劃還包括別名 (e和s) 以及用于選擇特定列的投影操作。

優(yōu)化的邏輯計劃

一旦分析了查詢并且 Spark 對數據和模式有了清晰的了解,它就會繼續(xù)優(yōu)化查詢。在優(yōu)化過程中,Spark會對查詢計劃應用各種邏輯優(yōu)化來提高性能。這可能涉及謂詞下推、常量折疊和基于規(guī)則的轉換等技術。優(yōu)化的邏輯計劃代表了在數據檢索和處理方面更高效的查詢版本。

1.png

優(yōu)化階段簡化了計劃以獲得更好的性能。在這種情況下,計劃被簡化以刪除子查詢和不必要的投影操作。它使用連接鍵直接連接兩個本地關系 (employees和salaries) employee_id,然后應用聚合來計算每個部門的平均工資。

物理計劃

物理計劃也稱為執(zhí)行計劃,是查詢優(yōu)化的最后階段。此時,Spark 會生成一個關于如何在集群上物理執(zhí)行查詢的計劃。它考慮了數據分區(qū)、數據洗牌和跨節(jié)點的任務分配等因素。物理計劃是實際執(zhí)行查詢的藍圖,它考慮了可用資源和并行性以有效地執(zhí)行查詢。

2.png

物理計劃概述了 Spark 執(zhí)行查詢所采取的實際執(zhí)行步驟。它涉及聚合、聯接和數據掃描,以及廣播聯接等優(yōu)化技術以提高效率。該計劃反映了 Spark 將遵循的執(zhí)行策略來計算查詢結果。現在,讓我們仔細檢查每一行以更深入地了解(從下到上)。

  • LocalTableScan:這些是本地表的掃描。在本例中,它們代表表或 DataFrames employee_id#133、department#135、employee_id#146和salary#147。這些掃描從本地分區(qū)檢索數據。

  • BroadcastExchange:此操作將較小的 DataFrame (employee_id#146和salary#147) 廣播到所有工作節(jié)點以進行廣播連接。它將廣播模式指定為HashedRelationBroadcastMode并指示應廣播輸入數據。

  • BroadcastHashJoin:這是兩個數據源(employee_id#133和employee_id#146)之間使用inner join. 它構建連接的右側,因為它被標記為“BuildRight”。此操作執(zhí)行廣播連接,這意味著它將較小的 DataFrame(右側)廣播到較大的 DataFrame(左側)所在的所有節(jié)點。當一個 DataFrame 明顯小于另一個 DataFrame 時,這樣做是為了優(yōu)化目的。

  • 項目:此操作從數據中選擇department和列。salary

  • HashAggregate (partial_avg):這是一個部分聚合操作,計算每個部門的平均工資。它包括附加列 sum#162和count#163L,分別表示工資總和和記錄數。

  • Exchange hashpartitioning:此操作基于列對數據執(zhí)行哈希分區(qū)department#135。它的目標是將數據均勻分布在 200 個分區(qū)中。該ENSURE_REQUIREMENTS屬性表明該操作保證了后續(xù)操作的要求。

  • HashAggregate:avg(salary#147)這是一個聚合操作,計算列中每個唯一值的平均工資 ( ) department。輸出包括兩列:department#135和avg_salary#150。

  • AdaptiveSparkPlan:這表示 Spark 查詢的頂級執(zhí)行計劃。該屬性isFinalPlan=false表明該計劃尚未最終確定,這表明 Spark 可能會在執(zhí)行期間根據運行時統(tǒng)計數據調整該計劃。

結論

了解 Spark SQL 生成的執(zhí)行計劃對于開發(fā)人員來說非常有價值,體現在以下幾個方面:

  • 查詢優(yōu)化:通過檢查物理計劃,開發(fā)人員可以深入了解 Spark 如何優(yōu)化其 SQL 查詢。它可以幫助他們查看查詢是否有效地使用可用資源、分區(qū)和聯接。

  • 性能調優(yōu):開發(fā)人員可以識別計劃中潛在的性能瓶頸。例如,如果他們注意到不必要的改組或數據重新分配,他們可以修改查詢或調整 Spark 配置以提高性能。

  • 調試:當查詢未產生預期結果或發(fā)生錯誤時,物理計劃可以提供有關問題可能出在哪里的線索。開發(fā)人員可以查明計劃中存在問題的階段或轉換。

  • 高效連接:了解廣播連接等連接策略可以幫助開發(fā)人員就廣播哪些表做出明智的決定。這可以顯著減少shuffle并提高查詢性能。


文章來源地址http://www.zghlxwxcb.cn/article/479.html

到此這篇關于使用解釋計劃調試 Apache Spark 性能的文章就介紹到這了,更多相關內容可以在右上角搜索或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網!

原文地址:http://www.zghlxwxcb.cn/article/479.html

如若轉載,請注明出處: 如若內容造成侵權/違法違規(guī)/事實不符,請聯系站長進行投訴反饋,一經查實,立即刪除!

領支付寶紅包贊助服務器費用

相關文章

  • 什么是API網關,解釋API網關的作用和特點?解釋什么是數據流處理,如Apache Flink和Spark Streaming的應用?

    API網關是一種在分布式系統(tǒng)中的組件,用于管理不同系統(tǒng)之間的通信和交互。API網關的作用是在不同系統(tǒng)之間提供統(tǒng)一的接口和協議,從而簡化系統(tǒng)之間的集成和互操作性。 API網關的特點包括: 路由和分發(fā)請求:API網關可以根據請求的URL、方法、參數等信息,將請求分發(fā)到

    2024年02月11日
    瀏覽(26)
  • Apache Spark 練習六:使用Spark分析音樂專輯數據

    本章所分析的數據來自于Kaggle公開的、人工合成的音樂專輯發(fā)行數據(https://www.kaggle.com/datasets/revilrosa/music-label-dataset)。以下,我們只針對albums.csv文件進行分析。該數據具體包括以下字段: id: the album identifier; artist_id: the artist identifier; album_title: the title of the album; genre: the

    2024年02月15日
    瀏覽(34)
  • 使用Apache Spark處理Excel文件的簡易指南

    在日常的工作中,表格內的工具是非常方便的x,但是當表格變得非常多的時候,就需要一些特定的處理。Excel作為功能強大的數據處理軟件,廣泛應用于各行各業(yè),從企業(yè)管理到數據分析,可謂無處不在。然而,面對大型且復雜的數據,Excel的處理能力可能力不從心。 對此,

    2024年01月19日
    瀏覽(26)
  • Azure - 機器學習:使用 Apache Spark 進行交互式數據整理

    Azure - 機器學習:使用 Apache Spark 進行交互式數據整理

    關注TechLead,分享AI全維度知識。作者擁有10+年互聯網服務架構、AI產品研發(fā)經驗、團隊管理經驗,同濟本復旦碩,復旦機器人智能實驗室成員,阿里云認證的資深架構師,項目管理專業(yè)人士,上億營收AI產品研發(fā)負責人。 數據整理已經成為機器學習項目中最重要的步驟之一。

    2024年02月08日
    瀏覽(28)
  • 如何在Amazon EMR上使用RAPIDS加速Apache Spark流水線

    如何在Amazon EMR上使用RAPIDS加速Apache Spark流水線

    : [Amazon Web Services re:Invent 2023, Rapids Spark, Accelerate Apache Spark Pipelines, Amazon Emr, Rapids, Nvidia, Gpu Acceleration] 本文字數: 1000, 閱讀完需: 5 分鐘 如視頻不能正常播放,請前往bilibili觀看本視頻。 https://www.bilibili.com/video/BV1uw41187VA RAPIDS加速器可以為Amazon EMR上的Apache Spark數據處理流

    2024年02月04日
    瀏覽(26)
  • 性能測試工具 ab(Apache Bench)使用詳解

    Apache Bench (ab) 是一個由 Apache 提供的非常流行的、簡單的性能測試工具,用于對 HTTP 服務器進行壓力測試。下面是 ab 工具的一些基本使用方法。 安裝 在大多數 Unix 系統(tǒng)中,ab 通常作為 Apache HTTP 服務器的一部分預裝在系統(tǒng)中。你可以通過在終端中運行 ab -V 來檢查 ab 的版本,

    2024年04月11日
    瀏覽(22)
  • openGauss學習筆記-259 openGauss性能調優(yōu)-使用Plan Hint進行調優(yōu)-指定不使用全局計劃緩存的Hint

    openGauss學習筆記-259 openGauss性能調優(yōu)-使用Plan Hint進行調優(yōu)-指定不使用全局計劃緩存的Hint

    259.1 功能描述 全局計劃緩存打開時,可以通過no_gpc Hint來強制單個查詢語句不在全局共享計劃緩存,只保留會話生命周期的計劃緩存。 259.2 語法格式 說明: 本參數僅在enable_global_plancache=on時對PBE執(zhí)行的語句生效。 259.3 示例 dbe_perf.global_plancache_status視圖中無結果即沒有計劃被

    2024年04月13日
    瀏覽(47)
  • Spark Explain:查看執(zhí)行計劃

    Spark Explain:查看執(zhí)行計劃

    Spark SQL explain 方法有 simple、extended、codegen、cost、formatted 參數,具體如下 從 3.0 開始,explain 方法有一個新的 mode 參數,指定執(zhí)行計劃展示格式 只展示物理執(zhí)行計劃,默認 mode 是 simple spark.sql(sqlstr).explain() 展示物理執(zhí)行計劃和邏輯執(zhí)行計劃 spark.sql(sqlstr).explain(mode=“extended”

    2024年02月16日
    瀏覽(29)
  • unity 使用模擬器進行Profiler性能調試

    unity 使用模擬器進行Profiler性能調試

    這篇文章主要記錄如何實現通過模擬器對打包的app游戲進行Profiler調試。主要記錄一些比較重要的點。 首先你要能夠打包unity的安卓包,如果沒有安裝安卓組件,請先安裝組件。 安裝完成以后,會在unity的安裝目錄找到相應的SDK 這個platform-tools后面會用到,而這些組件設置了

    2024年02月07日
    瀏覽(25)
  • Spark面試整理-解釋Spark Streaming是什么

    Spark?Streaming是Apache?Spark的一個組件,它用于構建可擴展、高吞吐量、容錯的實時數據流處理應用。Spark?Streaming使得可以使用Spark的簡單編程模型來處理實時數據。以下是Spark?Streaming的一些主要特點: 1.?微批處理架構 微批處理: Spark?Streaming的核心是微批處理模型。它將實

    2024年04月13日
    瀏覽(51)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領取紅包,優(yōu)惠每天領

二維碼1

領取紅包

二維碼2

領紅包