一文了解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 相比较的优势是哪些?

主要功能

image


上图是spark 引擎的核心功能,其中包括Spark Core、Spark SQL、Spark Streaming、Spark MLlib、GraphX和Structured Streaming等。

  1. Spark Core:实现了Spark的基本功能,包含了RDD、任务调度、内存管理、错误恢复、与存储系统交互等模块。
  2. Spark SQL:用于操作结构化数据的程序包。通过Spark SQL,我们可以使用SQL操作数据,方便数据分析和处理。
  3. Spark Streaming:提供了对实时数据进行流式计算的组件。Spark Streaming提供了用于操作数据流的API,可以实时处理数据并进行计算。
  4. Spark MLlib:是Spark提供的机器学习功能的程序库。它包括了常见的机器学习算法,如分类、回归、聚类、协同过滤等,还提供了模型评估和数据导入等支持功能。
  5. GraphX:是Spark中用于图计算的API。GraphX具有良好的性能,并提供了丰富的功能和运算符,可以在海量数据上运行复杂的图算法。
  6. 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 的应用场景上的区别。

  1. Hive SQL适用于大规模的离线批处理,而Spark SQL则适用于迭代式计算和交互式数据挖掘。Spark SQL通过使用RDD数据结构和内存存储优化来提高中间结果的计算效率。

  2. 相比之下,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读取的数据都是存入到内存中,因此对机器的内存有要求,且要求内存较大, 相对较贵.

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/712184.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

前后端分离对于后端来说,是利好还是利弊呢?

前后端分离已经成为前端开发的主流模式&#xff0c;这种模式极大的解放了后端&#xff0c;让后端人员不再即当爹又当妈了&#xff0c;那么这种模式对于后端来说是利好还是利弊呢&#xff0c;如何趋利避害呢&#xff0c;贝格前端工场为大家分享一下。 一、什么前后端分离的开发…

值传递和址传递

值传递 上面的代码是想要交换x&#xff0c;y的值&#xff0c;把x&#xff0c;y传递给swap函数之后&#xff0c;执行下面的操作&#xff1a; 在swap中a和b交换了&#xff0c;但是和x&#xff0c;y没有关系&#xff0c;所以x&#xff0c;y在main中不会变。 址传递 下面再看把x…

Windows下的zip压缩包版Mysql8.3.0数据迁移到Mysql8.4.0可以用拷贝data文件夹的方式

Windows下的zip压缩包版Mysql8.3.0数据迁移到Mysql8.4.0可以用拷贝data文件夹的方式 拷贝后, 所有账户和数据都是一样的 步骤 停止MySQL服务 net stop mysql 或 sc.exe stop mysql net stop mysqlsc.exe stop mysql卸载 Mysql8.3.0 的服务 mysqld remove 或 mysqld remove m…

图书管理系统(SpringBoot+SpringMVC+MyBatis)

目录 1.数据库表设计 2.引入MyBatis和MySQL驱动依赖 3.配置数据库&日志 4.Model创建 5.用户登录功能实现 6.实现添加图书功能 7.实现翻页功能 1.数据库表设计 数据库表是应⽤程序开发中的⼀个重要环节, 数据库表的设计往往会决定我们的应⽤需求是否能顺利实现, 甚至决…

探索互联网寻址机制 | 揭秘互联网技术的核心,解析网络寻址

揭秘互联网技术的核心&#xff0c;解析网络寻址题 前提介绍局域网地址IP地址的分配方式动态IP分配机制内部网&#xff08;intranet&#xff09;ICANN负责IP分配DHCP协议获取IP地址 域名系统域名是什么域名工作方式hosts文件存储域名映射关系DNS分布式数据库DNS域名解析 Java进行…

增加软件投入的重要性:提升自动化程度与用户界面设计的价值

一、引言 在许多项目中&#xff0c;硬件系统通常占据了大量预算&#xff0c;而对软件的投入相对较少。这种不平衡往往导致软件自动化程度低、操作不便、界面简陋&#xff0c;过多的人工干预不仅降低了工作效率&#xff0c;还影响了用户体验。特别是对于一些国家项目&#xff0…

【背包题】oj题库

目录 1282 - 简单背包问题 1780 - 采灵芝 1888 - 多重背包&#xff08;1&#xff09;​编辑 1891 - 开心的金明 2073 - 码头的集装箱 1905 - 混合背包 1282 - 简单背包问题 #include <bits/stdc.h> using namespace std; //二维数组:dp[i][j]max(dp[i-1][j],v[i]dp[…

【three.js案例一】智慧星球

直接附上源码: import * as THREE from three; import { OrbitControls } from three/addons/controls/OrbitControls.js;//场景 const scene = new THREE.Scene();const geometry = new THREE.SphereGeometry(50,32,16);console.log(.postion,geometry.attributes.position)…

CorelDraw 2024软件安装包下载 丨不限速下载丨亲测好用

​简介&#xff1a; CorelDRAW Graphics Suite 订阅版拥有配备齐全的专业设计工具包&#xff0c;可以通过非常高的效率提供令人惊艳的矢量插图、布局、照片编辑和排版项目。价格实惠的订阅就能获得令人难以置信的持续价值&#xff0c;即时、有保障地获得独家的新功能和内容、…

【电路笔记】-共集极放大器

共集极放大器 文章目录 共集极放大器1、概述2、等效电路3、电压增益4、偏置方法5、输入阻抗6、输出阻抗7、电流增益8、示例:共集电极放大器的电压、电流和功率增益9、达林顿对10、总结1、概述 本文介绍另一种用于放大信号的双极晶体管架构,通常称为共集电极放大器 (CCA)。 C…

VSCode插件开发之初始化项目

VS code常见组件 在VS Code插件开发中&#xff0c;常用的组件有很多&#xff0c;这些组件可以帮助你实现各种功能和交互。以下是一些常见的组件&#xff1a; Extension API模块: 提供了许多类和方法&#xff0c;用于与VS Code编辑器进行交互&#xff0c;例如vscode.workspace用…

基于Python+Flask+MySQL+HTML的B站数据可视化分析系统

FlaskMySQLVue 基于PythonFlaskMySQLHTML的B站数据可视化分析系统 项目采用前后端分离技术&#xff0c;项目包含完整的前端HTML&#xff0c;以及Flask构成完整的前后端分离系统 爬虫文件基于selenium&#xff0c;需要配合登录账号 简介 主页 登录页面&#xff0c;用户打开浏…

JS读取目录下的所有图片/require动态加载图片/文字高亮

<template class"aa"><div class"demo-image__lazy container"><div class"head"><div class"left-bar"><div><span>综合</span></div><div><span>定位</span><…

ARM32开发--PWM高级定时器

目录 文章目录 前言 目标 学习内容 需求 高级定时器通道互补输出 开发流程 通道配置 打开互补保护电路 完整代码 练习题 总结 前言 在嵌入式软件开发中&#xff0c;PWM&#xff08;脉冲宽度调制&#xff09;技术被广泛应用于控制各种电子设备的亮度、速度等参数。…

分离式网络变压器与传统网络变压器在电路设计中如何选择?

Hqst盈盛&#xff08;华强盛&#xff09;电子导读&#xff1a;今天分享的是&#xff1a;分离式网络变压器与传统网络变压器在电路设计中如何选择&#xff1f; 首先&#xff0c;我们要了解传统网络变压器和分离式网络变压器在设计上主要有以下不同点&#xff1a; 1、传统网络变…

Java GUI编程

引言 图形用户界面&#xff08;GUI&#xff09;编程是使应用程序与用户进行交互的重要部分。Java提供了多种用于GUI开发的工具和库&#xff0c;最常用的是Swing和AWT。本文将详细介绍Java GUI编程的基础知识&#xff0c;包括Swing和AWT框架、事件处理以及高级GUI组件的使用&…

【Pandas驯化-02】pd.read_csv读取中文出现error解决方法

【Pandas】驯化-02pd.read_csv读取中文出现error解决方法 本次修炼方法请往下查看 &#x1f308; 欢迎莅临我的个人主页 &#x1f448;这里是我工作、学习、实践 IT领域、真诚分享 踩坑集合&#xff0c;智慧小天地&#xff01; &#x1f387; 相关内容文档获取 微信公众号 &…

剃头师傅不担心AI大模型 到底谁该担心?

到底学什么&#xff0c;不会被AI替代&#xff1f; 我家附近有一家美容店&#xff0c;已经开了20多年&#xff0c;店里的一位伙计硬是靠着自己的坚持从学徒熬成了门店的合伙人&#xff0c;所以现在去理发时&#xff0c;我都叫他“周董”。 这天&#xff0c;我问他&#xff0c;…

网络通信的两大支柱:TCP与UDP协议详解(非常详细)零基础入门到精通,收藏这一篇就够了

在构建现代互联网通信的基石中&#xff0c;TCP&#xff08;传输控制协议&#xff09;和UDP&#xff08;用户数据报协议&#xff09;起着至关重要的作用。本文将深入探讨两者的区别及应用场景。 1 TCP和UDP的共同点 传输层协议&#xff1a; TCP和UDP都是传输层协议&#xff…

联想电脑电池只能充到80%,就不在充电了,猛一看以为坏了,只是设置了养护模式。

现在电池管理模式有三种&#xff1a; 1&#xff09;常规 2&#xff09;养护 3&#xff09;快充 好久没有用联想的电脑了&#xff0c;猛一看&#xff0c;咱充到了80%不充了&#xff0c;难道电池是坏的&#xff1f;我们要如何设置才可以让其充电到100%呢&#xff1f; 右下角…