Spark简介

Spark是一个比MapReduce更高效的计算框架,兼容HDFS和Hadoop生态系统。它通过DAG执行计划避免中间结果存储,支持内存计算和多种计算范式,如SQL、流式和机器学习。此外,Spark具有轻量级、多语言支持、与Hadoop存储兼容及活跃社区等特点。尽管如此,Spark的RDD模型在细粒度计算和某些特定场景下可能不如其他专业系统。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Spark是一个计算框架,是MapReduce的替代方案,而且兼容HDFS、Hive等分布式存储层,可以融入Hadoop生态系统,一笔不缺失MapReduce的不足。

Spark VS MapReduce

1. 中间输出结果

基于MapReduce的计算引擎通常会将中间结果输出到磁盘上,进行存储和容错。出于任务管道承接的考虑,当一些查询翻译到MapReduce任务时,往往会产生多个Stage,而这些串行的Stage又依赖于底层文件系统(如HDFS)来存储每一个Stage的输出结果。

Spark将执行模型抽象为通用的有向无环图执行计划(DAG),这可以将多个Stage的任务串联或并行执行,无须将Stage中间的结果输出到HDFS中。【类似的引擎包括Dryad、Tez】

2. 数据格式和内存布局

由于MapReduce Schema on Read处理方式会引起较大的处理开销。Spark抽象出分布式内存存储结构弹性分布式数据集RDD,进行数据的存储。RDD能支持粗粒度写操作,但对于读取操作,RDD可以精确到每一条记录,这使得RDD可以用来作为分布式索引。

Spark的特性是能够控制数据在不同节点上的分区,用户可以自定义分区策略,如Hash分区等。【Shark和Spark SQL在Spark的基础上实现了列存储和列存储压缩】

3. 执行策略

MapReduce在数据Shuffle之前花费了大量的时间来排序,Spark则可减轻上述问题带来的开销。

因为Spark任务在Shuffle中不是所有情景都需要排序,所有支持基于Hash的分布式聚合,调度中采用更为通用的任务执行计划图(DAG),每一轮次的输出结果在内存缓存。

4. 任务调度的开销

传统的MapReduce系统,如Hadoop,是为了运行长达数小时的批量作业而设计的,在某些极端情况下,提交一个任务的延迟非常高。

Spark采用了事件驱动的类库AKKA来启动任务,通过线程池复用来避免进程或线程启动和切换开销。

Spark优势

1. 打造全栈多计算范式的高效数据流水线

Spark支持复杂查询,在简单map reduce操作之外,Spark还支持SQL查询,流式计算,机器学习和图算法。同时可以在一个工作流中无缝搭建这些计算范式。

2. 轻量级快速处理

Scala语言简洁性是的Spark核心代码少,并且Spark充分利用和集成Hadoop组件。Spark通过将中间结果缓存在内存减少磁盘I/O来达到性能的提升。

3. 易用,Spark支持多种语言

Spark支持Scala,Java,Python编写程序。自带了80多个三字,同时印象在Shell中进行交互式计算。

4. 与HDFS等存储层兼容

Spark可以独立运行,处理可以运行在Yar等集群管理系统之外,可以读取有的任何Hadoop数据。可以运行在任何Hadoop数据源上,如Hive、HBase、HDFS等

这使得用户可以轻易迁移已有的持久层数据

5. 社区活跃

社区活跃很重要

Spark并不完美,RDD模型适合的是粗粒度的全局数据并行计算。不适合细粒度的、需要异步更新的计算。

对一些计算需求,如果要针对特定工作负载达到最优性能,还需要使用一些其他的大数据系统。例如,

  • 图计算领域的GraphLab在特定计算负载性能上由于GraphX
  • 流式计算中的Storm在实时性要求很高的场合要比Spark Streaming更上一筹

    这里写图片描述

### 头歌平台上的 Spark 简介 #### Spark 的定义与特性 Apache Spark 是一种快速通用的大规模数据处理引擎,专为大规模数据处理而设计。Spark 支持多种编程语言,包括 Java、Scala 和 Python,并提供了丰富的API用于操作分布式数据集。其核心功能涵盖了批处理和实时流处理两种模式。 #### Spark Streaming 组件介绍 特别值得注意的是,在头歌平台上提到的 Spark Streaming 功能[^1],这是一个扩展模块,允许开发者构建高吞吐量、可容错的实时应用来处理来自多个源(如 Kafka, Flume 或者简单的 TCP 套接字)的流式输入。它能够持续地从这些源头读取新到达的数据记录,并执行各种转换操作以生成最终的结果输出。 #### 数据传输机制——套接字流 对于具体的实现方式之一即为利用TCP/IP协议栈中的套接字接口来进行网络间进程间的通讯过程。在这个过程中,服务器端会开启特定编号的服务端口等待客户端发起连接请求;一旦建立好稳定可靠的双向通信链路之后,则可以通过此通道源源不断地传递二进制形式的消息体直至任意一方主动断开为止。在实际应用场景下,比如日志收集系统里,就经常采用这种方式把分散于不同物理位置的日志文件汇总起来做进一步分析挖掘工作。 #### 实际案例:黑名单过滤 作为一项典型的应用实例,当涉及到在线社交网站的安全防护措施时,可能会遇到需要动态维护一份敏感词表的需求。此时借助于Spark强大的并行计算能力以及高效的内存管理策略,完全可以轻松应对海量并发访问所带来的挑战。具体做法是从套接字流中不断拉取消息队列里的待审内容项逐一匹配预先设定好的规则库,凡是命中条件的对象都将被即时拦截下来不予转发扩散出去,从而有效保障了整个社区环境下的言论秩序和谐健康向上发展。 ```python from pyspark import SparkContext sc = SparkContext(appName="BlacklistFilter") def filter_blacklisted_users(user_list): blacklist = ["bad_user_1", "bad_user_2"] # Example of a static list; in practice this would be dynamic. filtered_users = [] for user in user_list.collect(): if user not in blacklist: filtered_users.append(user) return sc.parallelize(filtered_users) # Assuming `socket_stream` is the DStream from Socket source filtered_data = socket_stream.transform(filter_blacklisted_users) ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值