一文了解Spark引擎的優勢及應用場景
Spark引擎誕生的背景
Spark的發展歷程可以追溯到2009年,由加州大學伯克利分校的AMPLab研究團隊發起。成為Apache軟件基金會的孵化項目后,于2012年發布了第一個穩定版本。
以下是Spark的主要發展里程碑:
- 初始版本發布:2010年開發的Matei Zaharia的研究項目成為Spark的前身。在2010年夏季,Spark首次公開亮相。
- Apache孵化項目:2013年,Apache Spark成為Apache軟件基金會的孵化項目。這一舉動增加了Spark的可信度和可靠性,吸引了更多的貢獻者和用戶。
- 發布1.0版本:2014年5月,Spark發布了第一個1.0版本,標志著其正式成熟和穩定可用。
- 成為頂級項目:2014年6月,Spark成為Apache軟件基金會的頂級項目。這個里程碑確認了Spark在大數據處理領域的領導地位。
- Spark Streaming和MLlib:2014年6月,Spark 1.0版本中首次引入了Spark Streaming和MLlib(機器學習庫),豐富了Spark的功能。
- Spark SQL和DataFrame:2015年,Spark 1.3版本中引入了Spark SQL和DataFrame API,使得開發者可以更方便地進行結構化數據處理。
- 發布2.0版本:2016年7月,Spark發布了2.0版本,引入了Dataset API,更加統一了Spark的編程模型。
- 擴展生態系統:Spark逐漸形成了一個龐大的生態系統,包括了許多擴展庫和工具,如GraphX、SparkR、Sparklyr等。
- 運行更靈活:Spark不僅可以運行在獨立模式下,還可以與其他大數據處理框架(如Hadoop YARN和Apache Mesos)集成。
目前,Spark已經成為大數據處理領域的主要引擎之一,并在各個行業和領域得到廣泛應用。它的發展依然持續,持續推出新的功能和改進,以滿足不斷增長的大數據處理需求。
主要功能和hive 相比較的優勢是哪些?
主要功能

上圖是spark 引擎的核心功能,其中包括Spark Core、Spark SQL、Spark Streaming、Spark MLlib、GraphX和Structured Streaming等。
- Spark Core:實現了Spark的基本功能,包含了RDD、任務調度、內存管理、錯誤恢復、與存儲系統交互等模塊。
- Spark SQL:用于操作結構化數據的程序包。通過Spark SQL,我們可以使用SQL操作數據,方便數據分析和處理。
- Spark Streaming:提供了對實時數據進行流式計算的組件。Spark Streaming提供了用于操作數據流的API,可以實時處理數據并進行計算。
- Spark MLlib:是Spark提供的機器學習功能的程序庫。它包括了常見的機器學習算法,如分類、回歸、聚類、協同過濾等,還提供了模型評估和數據導入等支持功能。
- GraphX:是Spark中用于圖計算的API。GraphX具有良好的性能,并提供了豐富的功能和運算符,可以在海量數據上運行復雜的圖算法。
- Structured Streaming:是用于處理結構化流數據的組件,它可以統一離線和實時數據處理的API。Structured Streaming能夠處理連續的數據流,并提供了更高級、更易用的API。
除了這些子項目,Spark還提供了集群管理器,可以高效地在一個計算節點到數千個計算節點之間伸縮計算。這使得Spark能夠處理大規模的數據,并具有良好的可擴展性。
Spark的子項目和功能的不斷擴展,使得Spark成為一個功能強大且靈活的大數據處理引擎。無論是在離線批處理還是實時流處理方面,Spark都提供了豐富的工具和API,滿足了各種數據處理需求。
為了和hive 想比較,我們重點看看Spark SQL的語法.在Spark SQL中,常見的SQL語法包括以下內容:
1、查詢語句:
SELECT: 用于選擇要查詢的列
FROM: 用于指定要查詢的數據表或視圖
WHERE: 用于設置查詢條件
GROUP BY: 用于對結果進行分組
HAVING: 用于對分組后的結果進行過濾
ORDER BY: 用于對結果進行排序
LIMIT: 用于限制返回的行數
2、表操作語句:
CREATE TABLE: 用于創建表
DROP TABLE: 用于刪除表
ALTER TABLE: 用于修改表結構
TRUNCATE TABLE: 用于清空表數據
3、數據操作語句:
INSERT INTO: 用于向表中插入數據
UPDATE: 用于更新表中的數據
DELETE FROM: 用于刪除表中的數據
4、聚合函數:
COUNT: 統計行數
SUM: 求和
AVG: 求平均值
MIN: 求最小值
MAX: 求最大值
5、條件表達式:
AND, OR: 邏輯與和邏輯或
NOT: 邏輯非
=, <>, <, >, <=, >=: 比較運算符
LIKE, IN, BETWEEN: 字符串匹配和范圍判斷
這些是Spark SQL中最常見的SQL語法,您可以根據需要使用它們來進行數據查詢、表操作和數據操作等操作。并且Spark SQL可以從多種數據源讀取數據。包括但不限于以下幾種:
-
文件系統:Spark SQL可以從本地文件系統或Hadoop分布式文件系統(HDFS)中讀取數據。它支持讀取常見的文件格式,如文本文件(CSV、JSON、XML等)、Parquet文件、Avro文件、ORC文件等。
-
關系型數據庫:Spark SQL可以從關系型數據庫中讀取數據,包括MySQL、PostgreSQL、Oracle等。您可以使用JDBC連接器來連接到數據庫并執行SQL查詢。
-
NoSQL數據庫:Spark SQL也可以通過連接到NoSQL數據庫(如MongoDB、Cassandra、Redis等)來讀取數據。您可以使用相應的連接器來訪問這些數據庫,并使用Spark SQL查詢語言進行查詢。
-
Hive:Spark SQL可以與Hive集成,直接讀取Hive表中的數據。這使得您可以使用Spark SQL查詢來訪問Hive中的數據,而無需寫HiveQL語句。
除了以上幾種常見的數據源,Spark SQL還支持許多其他的數據源,如Kafka、Elasticsearch、Azure Blob存儲、Amazon S3等。您可以根據需要選擇適合的數據源,并使用Spark SQL進行數據讀取和查詢操作。
既然Spark SQL 可以處理數據,那么為什么沒有替代HIVE了?
主要是HIVE 支持一些Spark SQL 不支持的SQL語法。
例如以下是hive SQL 支持,而Spark SQL不支持的語法
1、查詢建表
Create table lvhou_test as selec * from lvhou_test1;
2、Select子查詢
select * from test1 where a,b in (select a,b from test2 where a = 'aa');
select * from test1 where a,b not in (select a,b from test2 where a = 'aa');
3、Select union 查詢
select * from test union all select * from test0;(合一)
select * from test union select * from test0;(去重)
select * from (select * from test union select * from test0) a;
select a from (select * from test union all select * from test0) a;
4、Update 語句
update test1 set b = 'abc' where a = 'aa';
update test1 set a = 'abc';
5、delete/alter 語句
delete from test1 where a = 'aa';
alter table test1 add columns (d string);
6、order by 語句
select a from test order by a desc;
7、sort by 語句
select a,b from test sort by b desc;
8、count 函數
select count(distinct *) from test00;
注意這里說的不支持,是指它不是以sql的形式支持的,和前面說spark SQL支持聚合函數方式是不一樣的,它是以data frame的形式支持
以下是使用count函數的示例:
import org.apache.spark.sql.SparkSession
// 創建SparkSession對象
val spark = SparkSession.builder()
.appName("CountFunctionExample")
.getOrCreate()
// 創建DataFrame
val data = Seq(("Alice", 25), ("Bob", 30), ("Charlie", 35), ("Alice", 40))
val df = spark.createDataFrame(data).toDF("name", "age")
// 使用count函數計算非空值的個數
val count = df.selectExpr("count(name)").as[Long].first()
println(s"Count: $count")
在上述示例中,通過創建一個包含姓名和年齡的DataFrame,然后使用count函數計算姓名列中的非空值的個數,最后打印結果。
請注意,count函數可以用于單列或多列,甚至可以在整個DataFrame上使用,以計算非空行的數量。
以上的語法上的區別就可以說明了hive SQL 和Spark SQL 的應用場景上的區別。
-
Hive SQL適用于大規模的離線批處理,而Spark SQL則適用于迭代式計算和交互式數據挖掘。Spark SQL通過使用RDD數據結構和內存存儲優化來提高中間結果的計算效率。
-
相比之下,Hive SQL會將中間結果數據寫入穩定的文件系統中,這可能會導致數據的復制備份、磁盤I/O和數據的序列化,從而在需要復用中間結果的操作中效率較低。而Spark SQL使用RDD數據結構將中間結果保存在內存中,可以通過控制數據集的分區來實現最優化的數據存儲和處理。同時,Spark SQL還提供了豐富的API來操作數據集。
總結一下,hiveSQL 應用于大規模的離線跑批,但是對時間要求不高,而Spark SQL 應用于迭代式計算和交互式數據挖掘、Spark Streaming 支持流式數據計算、Spark MLlibk提供的機器學習功能的程序庫。它包括了常見的機器學習算法,如分類、回歸、聚類、協同過濾等,還提供了模型評估和數據導入等支持功能。GraphX用于圖計算的API。可以在海量數據上運行復雜的圖算法。
應用場景
Spark SQL 的迭代式計算的應用場景
迭代式計算是一種通過重復執行相同的計算步驟來達到某個目標的計算方法。在迭代式計算中,計算的結果會作為下一次計算的輸入,這樣可以逐步逼近目標值。迭代式計算通常用于解決無法通過單次計算得出精確解的問題,例如優化問題、機器學習算法等。通過多次迭代,可以逐步提高計算的精度和準確性。常見的迭代式計算用于最優化問題,用于求解最大化或最小化目標函數的問題。通過不斷迭代,在每次迭代中找到使目標函數值最優化的參數。
- 在工程優化設計領域。它可以用來優化各種工程系統的設計和維護,例如確定一個復雜機械裝置的尺寸、材料及配制,以最小化能源消耗或者最大化生產效率。
- 在金融領域,迭代式計算可以用于對股票、期權和其他金融資產的價格建模。通過對復雜的財務數據進行分析,迭代式計算可以幫助金融機構做出更好的風險決策,從而更好地保護資產。
- 交通規劃也可以應用迭代式計算,以建立最優的道路和交通網絡。迭代式計算可以考慮到不同的目標,如最小化出行時間、最小化交通擁堵、最小化公共交通成本,以及最小化環境污染等。
Spark Streaming 支持流式數據計算應用場景
Spark Streaming 支持許多流式數據計算應用場景,包括但不限于以下幾個:
-
實時數據處理和分析:Spark Streaming可以處理連續流入的數據,并實時計算、聚合和分析數據。這可用于實時監控、實時報警、網絡流量分析、實時可視化等。
-
基于流的機器學習:Spark Streaming可結合Spark的機器學習庫(如MLlib)進行流式機器學習。通過連續接收數據流,并實時訓練和更新模型,可以構建實時推薦系統、欺詐檢測、實時廣告投放等。
-
事件驅動的應用:Spark Streaming可以用于處理事件驅動的應用,如實時日志處理、社交媒體分析、網絡安全監測等。它可以從事件流中提取有用的信息、進行模式識別和異常檢測。
Spark MLlibk提供的機器學習功能應用場景
Spark MLlib的機器學習算法庫可以在各種應用場景中使用。以下是一些常見的應用場景:
-
分類和回歸:在分類和回歸問題中,MLlib提供了支持向量機(SVM)、邏輯回歸(Logistic Regression)、決策樹(Decision Trees)、隨機森林(Random Forests)、梯度提升樹(Gradient-Boosted Trees)等算法。這些算法可以用于許多領域,如金融、營銷、醫療等,用于預測和分類。
-
聚類:MLlib提供了多種聚類算法,如k均值聚類(K-means)、高斯混合模型(Gaussian Mixture Model)等。這些算法可以用于市場細分、用戶分群、異常檢測等。
-
協同過濾:MLlib提供了基于用戶的協同過濾(User-Based Collaborative Filtering)和基于物品的協同過濾(Item-Based Collaborative Filtering)算法,用于推薦系統。這些算法可以根據用戶的行為數據,如瀏覽記錄或評分,為用戶提供個性化的推薦。
-
特征工程:MLlib提供了一系列特征工程的函數和工具,用于數據的預處理和特征提取。例如,通過特征提取、降維、尺度變換等方法,可以將原始數據轉換為高維特征向量,更好地適應機器學習算法的輸入格式要求。
除了上述應用場景外,MLlib還支持模型評估、參數調優、模型持久化等常見機器學習任務。尤其是由于Spark的分布式計算模型,MLlib在大規模數據集上能夠提供高性能的機器學習解決方案。
Spark GraphX 圖計算框架應用場景
GraphX 是 Spark 提供的圖計算框架,用于處理大規模圖數據。它的應用場景包括但不限于以下幾個方面:
-
社交網絡分析:GraphX 可以用于分析社交網絡中的節點和關系,如查找社交網絡中的影響力最大的節點、查找節點之間的關系強度等。
-
推薦系統:GraphX 可以用于構建用戶和商品之間的關系圖,通過圖算法進行推薦,如基于相似性的協同過濾、基于隨機游走的推薦算法等。
-
路徑分析:GraphX 可以用于分析路徑相關的問題,如查找兩個節點之間的最短路徑、查找節點周圍的節點等。
-
網絡流分析:GraphX 可以用于分析網絡流量,如找出網絡中的瓶頸、計算最大流等。
結論:
當進行大規模數據量的離線跑批的時候,對時間延遲要求不高,成本投入有限的情況下使用Hive SQL,hive sql 對機器的要求不高,因為數據存儲在文件中。而對數據計算復雜(有推薦、分類、聚類算法場景)且時延要求高的場景,如迭代計算, 交互式計算, 流計算、有機器學習算法需求,圖計算需求,且成本投入可以接受的情況下使用Spark SQL,Spark SQL讀取的數據都是存入到內存中,因此對機器的內存有要求,且要求內存較大, 相對較貴.

浙公網安備 33010602011771號