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" \
"$@"
- 檢查Spark SQL的環境變量,如果沒有設置則退出腳本。
- 設置Spark SQL的類路徑,包含了Spark的jar包和配置文件。
- 使用spark-submit命令啓動Spark SQL的服務。
- 指定啓動類爲HiveThriftServer2,該類負責啓動Spark SQL的Thrift Server。
- 指定服務名稱爲"Spark SQL Thrift Server"。
- 指定Spark運行模式爲yarn,提交任務到yarn集羣中運行。
- 指定部署模式爲client,即客戶端模式。
- 設置Spark SQL的配置項,例如singleSession和incrementalCollect。
- 指定啓動的jar包爲spark-hive-thriftserver.jar。
- 最後傳入用戶輸入的參數。
關注我,緊跟本系列專欄文章,咱們下篇再續!
作者簡介:魔都技術專家兼架構,多家大廠後端一線研發經驗,各大技術社區頭部專家博主。具有豐富的引領團隊經驗,深厚業務架構和解決方案的積累。
負責:
- 中央/分銷預訂系統性能優化
- 活動&優惠券等營銷中臺建設
- 交易平臺及數據中臺等架構和開發設計
- 車聯網核心平臺-物聯網連接平臺、大數據平臺架構設計及優化
目前主攻降低軟件複雜性設計、構建高可用系統方向。
參考:
本文由博客一文多發平臺 OpenWrite 發佈!