03-SparkSQL入門

公众号-JavaEdge發表於2024-03-23

0 Shark

Spark 的一個元件,用於大規模資料分析的 SQL 查詢引擎。Shark 提供了一種基於 SQL 的互動式查詢方式,可以讓使用者輕鬆地對大規模資料集進行查詢和分析。Shark 基於 Hive 專案,使用 Hive 的後設資料儲存和查詢語法,並基於Hive進行了效能最佳化和擴充套件。

0.1 設計

靈感來自 Google 的 Dremel 系統:

  • 將資料儲存在列式儲存引擎
  • 使用分散式計算引擎進行查詢

Shark 採用類似架構並使用 Spark 作為計算引擎,使 Shark 具有很高查詢效能和可擴充套件性。

0.2 缺陷

Shark 在 Spark 1.0 釋出之後被正式棄用,Shark 的效能和可擴充套件性相對於 Spark SQL 來說存在一些侷限性。以下是一些導致 Shark 被淘汰因素:

① 資料模型

Shark 基於 Hive 資料模型,使用 Hive 的後設資料儲存和查詢語法,導致查詢語句執行效率較低。

② 計算模型

Shark 採用類似 Dremel 的列式儲存引擎,雖能提高查詢效率,但也導致更高記憶體開銷和更復雜程式碼實現。

③ 效能和可擴充套件性

Shark效能和可擴充套件性相對Spark SQL存在一些侷限性,如不支援流計算、新的資料來源。

因此,Spark社群放棄 Shark,轉而對 Spark SQL 更深入研究,以提高查詢效能和可擴充套件性,並支援更多資料來源和計算模型。因此,Spark SQL 取代 Shark 成為 Spark 生態系統的 SQL 查詢引擎。

1 概述

Spark SQL,結構化資料處理的Spark模組。

  • Spark SQL官網
  • 誤區:Spark SQL就是一個SQL處理框架,不僅是處理 SQL

自 Spark 1.0 版本(2014 年 4 月)以來成為核心釋出的一部分。

與基本的Spark RDD API不同,Spark SQL提供的介面為Spark提供了有關資料和正在執行的計算的更多資訊。在內部,Spark SQL使用這些額外的資訊執行額外的最佳化。與Spark SQL互動的幾種方法包括SQL和Dataset API。在計算結果時,無論使用哪種API /語言表達計算,都使用相同的執行引擎。這種統一意味著開發人員可以根據提供最自然的方式表達給定轉換的API輕鬆切換。

2 用途

執行SQL查詢。 Spark SQL也可用於從Hive讀取資料。當從另一種程式語言中執行SQL時,結果將作為Dataset/DataFrame返回。還可使用命令列或透過JDBC/ODBC與SQL介面互動。

3 特性

3.1 整合性

Spark SQL可讓你在Spark程式用SQL或熟悉的DataFrame API查詢結構化資料。可在Java、Scala、Python和R中使用。它可使SQL查詢與Spark程式無縫混合。

3.2 統一資料訪問

DataFrames和SQL提供了一種通用方式訪問各種資料來源如Hive、Avro、Parquet、ORC、JSON和JDBC。甚至可在這些資料來源之間聯接資料。

spark.read.format("json").load(path)
spark.read.format("text").load(path)
spark.read.format("parquet").load(path)
spark.read.format("json").option("...","...").load(path)

3.3 相容Hive

Spark SQL支援HiveQL語法以及Hive SerDes和UDF,使你可以訪問現有的Hive倉庫並在其上執行SQL或HiveQL查詢。
如果你想把Hive的作業遷移到Spark SQL,這樣的話,遷移成本就會低很多

3.4 標準的資料連線

Spark SQL提供了伺服器模式,可為BI提供行業標準的JDBC和ODBC連線功能。透過該功能,可透過JDBC或ODBC連線到Spark SQL並進行資料查詢和操作。

4 架構

5 spark-submit 啟動應用程式

一旦繫結使用者應用程式,就能用spark-submit啟動。該指令碼負責使用 Spark 及其依賴項設定類路徑,並支援 Spark 支援的不同叢集管理器和部署模式:

./bin/spark-submit \
  --class <main-class> \
  --master <master-url> \
  --deploy-mode <deploy-mode> \
  --conf <key>=<value> \
  ... # other options
  <application-jar> \
  [application-arguments]

常用選項:

  • --class:應用程式入口點(如org.apache.spark.examples.SparkPi
  • --master:叢集的主 URLspark://23.195.26.187:7077
  • --deploy-mode: 在工作節點部署你的驅動程式 ( cluster) 還是在本地作為外部客戶端 ( client) (預設: client)
  • --conf:K=V 格式的任意 Spark 配置屬性。對於包含空格的值,將“key=value”括在引號中(如圖所示)。多個配置應作為單獨的引數傳遞。(如--conf <key>=<value> --conf <key2>=<value2>
  • application-jar:包含你的應用程式和所有依賴項的捆綁 jar 的路徑。該 URL 必須在你的叢集內全域性可見,如路徑hdfs://file://存在於所有節點上的路徑
#!/usr/bin/env bash

# 檢查Spark SQL的環境變數
if [[ -z "${SPARK_HOME}" ]]; then
  echo "SPARK_HOME is not set!" >&2
  exit 1
fi

# 設定Spark SQL的類路徑
export SPARK_CLASSPATH="${SPARK_HOME}/jars/*:${SPARK_HOME}/conf"

# 啟動Spark SQL的服務
exec "${SPARK_HOME}/bin/spark-submit" \
  --class org.apache.spark.sql.hive.thriftserver.HiveThriftServer2 \
  --name "Spark SQL Thrift Server" \
  --master yarn \
  --deploy-mode client \
  --conf "spark.sql.hive.thriftServer.singleSession=true" \
  --conf "spark.sql.hive.thriftServer.incrementalCollect=true" \
  "${SPARK_HOME}/jars/spark-hive-thriftserver.jar" \
  "$@"
  1. 檢查Spark SQL的環境變數,如果沒有設定則退出指令碼。
  2. 設定Spark SQL的類路徑,包含了Spark的jar包和配置檔案。
  3. 使用spark-submit命令啟動Spark SQL的服務。
  4. 指定啟動類為HiveThriftServer2,該類負責啟動Spark SQL的Thrift Server。
  5. 指定服務名稱為"Spark SQL Thrift Server"。
  6. 指定Spark執行模式為yarn,提交任務到yarn叢集中執行。
  7. 指定部署模式為client,即客戶端模式。
  8. 設定Spark SQL的配置項,例如singleSession和incrementalCollect。
  9. 指定啟動的jar包為spark-hive-thriftserver.jar。
  10. 最後傳入使用者輸入的引數。

關注我,緊跟本系列專欄文章,咱們下篇再續!

作者簡介:魔都技術專家兼架構,多家大廠後端一線研發經驗,各大技術社群頭部專家博主。具有豐富的引領團隊經驗,深厚業務架構和解決方案的積累。

負責:

  • 中央/分銷預訂系統效能最佳化
  • 活動&優惠券等營銷中臺建設
  • 交易平臺及資料中臺等架構和開發設計
  • 車聯網核心平臺-物聯網連線平臺、大資料平臺架構設計及最佳化

目前主攻降低軟體複雜性設計、構建高可用系統方向。

參考:

  • 程式設計嚴選網

本文由部落格一文多發平臺 OpenWrite 釋出!