热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Spark入门小结(一)

Spark使用小结(一)spark来源历史Spark是一种基于内存计算的大数据并行计算框架。Spark最初是2009年加州大学伯克利分校开发,2010年开源、2013年成为Apache

Spark 使用小结(一)

spark 来源历史

Spark 是一种基于内存计算的大数据并行计算框架。Spark 最初是2009年加州大学伯克利分校开发,2010年开源、2013年成为Apache的开源项目,2014年成为顶级项目。目前使用的主要有2个大的版本1.6 和2.x版本。

Spark 定位

Spark 是一个统一的规模数据分析引擎,是一个基于内存计算的大数据并行计算框架。其主要用于大规模的数据分析运算中。

spark 与MapReduce 区别

在上一节,我们提到spark 是一个基于内存的计算框架。而传统的MR任务却是要将中间数据写入到磁盘的,对同一数据集的多个查询会分别读取数据,产生大量的磁盘读写,导致速度缓慢。关于Spark和MR 的差异,互联网上有很多这方面的比较,这里简单谈点自己的感觉:

  • 更加易用。MR 代码需要大量的样本代码。写代码的时候,必须严格按照map和reduce的思想对数据进行拆分,聚合。一个完整的计算任务,就需要多次重复地编写多个MR 作业来完成整个任务。
  • 性能。根据官网的视图。是传统的MR任务的100倍以上。
  • 迭代处理能力。 每个MR 作业都是把数据写到磁盘里,下一轮迭代再从磁盘里读取数据。而Spark 是在内存中处理了的,效率提高了一个数量级。这里除了内存读写速度更快,还有架构的原因。我们先看下MR框架:
    我们首先看MR 任务中的map操作。map 的主要目的是将原始数据转化为Key-value的样式;reduce主要是左聚合预算,两者都是在不同机器上独立且同步运行的,因此两者中间也必然就存在数据的移动,也就是shuffle。由于数据在不同的机器上,所以每次数据的移动都会涉及大量的网络传输,耗费大量的时间。但由于一个MR任务只能包含一次map和一次reduce,其中间数据只能写回到磁盘中供下次数据使用。如果是做随机梯度下降这样的迭代运算,那就将不断的产生新数据,读取新数据的过程,而每次的读写数据都将进行大量的数据移动,而这些读写实际上都是不太必要的。
    Spark正是基于这些不必要,进行了一些改进。本质上spark也是MR任务。但是,不同的是一个spakr 任务可以不止一个MR任务,而是一组。这样的话,计算的中间结果直接就通过内存的方式传递给了下一个MR任务,而不用再读写一次磁盘了,效率自然也就提高了。

  • 容错能力。spark容错性高,它通过弹性分布式数据集RDD来实现高效容错,RDD是一组分布式的存储在节点内存中的只读性质的数据集,这些集合是弹性的,某一部分丢失或者出错,可以通过整个数据集的计算流程的血缘关系来实现重建;mapreduce的话容错可能只能重新计算了,成本较高。
  • 运行时架构。MR为每个映射器(map)和化简器(reduce)创建单独的JVM,而启动JVM需要时间较长。 Spark的任务都是在一个预先分配的JVM里面运行,省去了启动JVM的过程时间。
  • 执行模式:MR只有批处理。Spark 还有流处理。

Spark 框架组成

Spark的数据分析栈主要包括:Spark(核心组件)、Spark SQL、SparkStreaming(类实时、流处理)、MLib(机器学习)、GraphX(图计算)。

针对这几个模块的介绍,网上有很多,这里就不再一一说明了。

spark 的几个组件

  • Application:Application是指用户编写的Spark应用程序,其中包含一个river功能的代码和分布在集群中多个节点上运行的Executor代码。
  • Driver: 运行Application的main()函数并且创建SparkContext。在Spark中有SparkContext负责与ClusterManager通信,进行资源申请、任务的分配和监控等,当Executor部分运行完毕后,Driver同时负责将SparkContext关闭,所以通常用SparkContext代表driver。
  • Client:用户提交作业的客户端。
  • Worker:集群中任何可以运行Application代码的节点,运行一个或多个Executor进程。(可以简单理解为Spark节点,当然这里的节点多数时候是受Yarn管理的)。
  • Executor:运行在Worker的Task执行器。Executor启动线程池运行Task,并且负责将数据存在内存或者磁盘上。每个Application都会申请各自的Executir来处理任务。
  • SparkContext:整个应用的上下文,控制应用的生命周期。
  • DAG Scheduler: 根据job构建基于Stage的DAG 工作流,并提交Stage给TaskScheduler。
  • Task:被送到某个Executor上的工作单元,多个task组成一个Stage。
  • TaskScheduler:将Task 分发给Executor执行。
  • Stage:每个job会被拆分成多组Task,作为一个TaskSet,其名称为Stage.Stage的边界就是发生shuffle的地方。
  • SparkEnv:线程级别的上下文。

Spark作业提交流程

Client 提交应用,Master(Stabdalone模式下)找到一个Worker启动Driver,Driver向Master或者资源管理器申请资源,之后将应用转化为RDD有向无环图,再由DAGScheduler将RDD有向无环图转化为Stage的有向无环图提交给TaskScheduler,再由TaskScheduler提交任务给Executor执行。
(TaskScheduler此时实际上又是通过Yarn的CluseterManager来执行的具体的分配)


推荐阅读
  • Hadoop 2.6 主要由 HDFS 和 YARN 两大部分组成,其中 YARN 包含了运行在 ResourceManager 的 JVM 中的组件以及在 NodeManager 中运行的部分。本文深入探讨了 Hadoop 2.6 日志文件的解析方法,并详细介绍了 MapReduce 日志管理的最佳实践,旨在帮助用户更好地理解和优化日志处理流程,提高系统运维效率。 ... [详细]
  • 技术日志:深入探讨Spark Streaming与Spark SQL的融合应用
    技术日志:深入探讨Spark Streaming与Spark SQL的融合应用 ... [详细]
  • Java中不同类型的常量池(字符串常量池、Class常量池和运行时常量池)的对比与关联分析
    在研究Java虚拟机的过程中,笔者发现存在多种类型的常量池,包括字符串常量池、Class常量池和运行时常量池。通过查阅CSDN、博客园等相关资料,对这些常量池的特性、用途及其相互关系进行了详细探讨。本文将深入分析这三种常量池的差异与联系,帮助读者更好地理解Java虚拟机的内部机制。 ... [详细]
  • 第二章:Kafka基础入门与核心概念解析
    本章节主要介绍了Kafka的基本概念及其核心特性。Kafka是一种分布式消息发布和订阅系统,以其卓越的性能和高吞吐量而著称。最初,Kafka被设计用于LinkedIn的活动流和运营数据处理,旨在高效地管理和传输大规模的数据流。这些数据主要包括用户活动记录、系统日志和其他实时信息。通过深入解析Kafka的设计原理和应用场景,读者将能够更好地理解其在现代大数据架构中的重要地位。 ... [详细]
  • 如何高效启动大数据应用之旅?
    在前一篇文章中,我探讨了大数据的定义及其与数据挖掘的区别。本文将重点介绍如何高效启动大数据应用项目,涵盖关键步骤和最佳实践,帮助读者快速踏上大数据之旅。 ... [详细]
  • Zookeeper作为Apache Hadoop生态系统中的一个重要组件,主要致力于解决分布式应用中的常见数据管理难题。它提供了统一的命名服务、状态同步服务以及集群管理功能,有效提升了分布式系统的可靠性和可维护性。此外,Zookeeper还支持配置管理和临时节点管理,进一步增强了其在复杂分布式环境中的应用价值。 ... [详细]
  • HBase在金融大数据迁移中的应用与挑战
    随着最后一台设备的下线,标志着超过10PB的HBase数据迁移项目顺利完成。目前,新的集群已在新机房稳定运行超过两个月,监控数据显示,新集群的查询响应时间显著降低,系统稳定性大幅提升。此外,数据消费的波动也变得更加平滑,整体性能得到了显著优化。 ... [详细]
  • 深入理解Spark框架:RDD核心概念与操作详解
    RDD是Spark框架的核心计算模型,全称为弹性分布式数据集(Resilient Distributed Dataset)。本文详细解析了RDD的基本概念、特性及其在Spark中的关键操作,包括创建、转换和行动操作等,帮助读者深入理解Spark的工作原理和优化策略。通过具体示例和代码片段,进一步阐述了如何高效利用RDD进行大数据处理。 ... [详细]
  • 经过两天的努力,终于成功解决了半平面交模板题POJ3335的问题。原来是在`OnLeft`函数中漏掉了关键的等于号。通过这次训练,不仅加深了对半平面交算法的理解,还提升了调试和代码实现的能力。未来将继续深入研究计算几何的其他核心问题,进一步巩固和拓展相关知识。 ... [详细]
  • 本文介绍了如何利用ObjectMapper实现JSON与JavaBean之间的高效转换。ObjectMapper是Jackson库的核心组件,能够便捷地将Java对象序列化为JSON格式,并支持从JSON、XML以及文件等多种数据源反序列化为Java对象。此外,还探讨了在实际应用中如何优化转换性能,以提升系统整体效率。 ... [详细]
  • Android中将独立SO库封装进JAR包并实现SO库的加载与调用
    在Android开发中,将独立的SO库封装进JAR包并实现其加载与调用是一个常见的需求。本文详细介绍了如何将SO库嵌入到JAR包中,并确保在外部应用调用该JAR包时能够正确加载和使用这些SO库。通过这种方式,开发者可以更方便地管理和分发包含原生代码的库文件,提高开发效率和代码复用性。文章还探讨了常见的问题及其解决方案,帮助开发者避免在实际应用中遇到的坑。 ... [详细]
  • 蓝桥杯算法实战:节点选取策略优化分析
    本文针对蓝桥杯算法竞赛中的节点选取策略进行了深入分析与优化。通过对比不同节点选择方法的效果,提出了基于贪心算法和动态规划的综合优化方案,旨在提高算法效率和准确性。实验结果表明,该优化策略在处理大规模数据集时表现出色,显著提升了算法性能。 ... [详细]
  • FastDFS Nginx 扩展模块的源代码解析与技术剖析
    FastDFS Nginx 扩展模块的源代码解析与技术剖析 ... [详细]
  • 利用 Spring BeanUtils 实现 JavaBean 的深度克隆与属性复制 ... [详细]
  • 在Hive中合理配置Map和Reduce任务的数量对于优化不同场景下的性能至关重要。本文探讨了如何控制Hive任务中的Map数量,分析了当输入数据超过128MB时是否会自动拆分,以及Map数量是否越多越好的问题。通过实际案例和实验数据,本文提供了具体的配置建议,帮助用户在不同场景下实现最佳性能。 ... [详细]
author-avatar
Kira玄玄
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有