初识Spark之 基本概念

2018-12-20 17:26 

###概述

Spark是一个基于内存的用于处理、分析大数据的集群计算框架。

###Spark组件
Spark组件层次图
以上为Spark软件栈图

Spark项目包括多个紧密集成的组件,紧密集成的优点则体现在:

  • 如果Spark底层优化了,基于Spark底层的组件也将得到相应优化
  • 节省了各个组件组合使用时的部署、测试等时间
  • 向Spark增加新组件时,其它组件都可立刻享用

Spark Core:
是Spark生态系统的基础,为其它的高级组件提供底层服务。
实现了任务调度、内存管理、容错机制等Spark项目中的基本功能,提供了创建和操作RDD的多个API

Saprk SQL:
是Spark处理结构化数据的库,就像Hive SQL,Mysql一样
应用场景:企业中用来做报表统计

Spark Streaming:
是实时数据流处理组件,类似Storm,Spark Streaming提供了API来操作实时流数据
应用场景:企业中用来从Kafka(或其他的消息队列中)接收数据做实时统计

MLlib:
一个包含通用机器学习功能的包,Machine learning lib包含分类,聚类,回归等,还包括模型评估,和数据导入
MLlib提供上面的这些方法,都支持集群上的横向扩展(在机器学习领域,较于Python的单机和处理数据量的有限性,MLlib能够集群处理 )
应用场景:机器学习

Graphx:
是处理图的库(例如,社交网络图),并进行图的并行计算
像Spark Streaming,Spark SQL一样,它也继承了RDD API
它提供了各种图的操作,和常用的图算法,例如PangeRank算法
应用场景:图计算

Cluster Managers:
就是集群管理,Spark自带一个集群管理是单独调度器
常见集群管理包括Hadoop YARN,Apache Mesos

###主要特点(与Hadoop比较)

  • 使用方便
    Spark提供了比MapReduce更简单的编程模型
    Hadoop MapReduce只有两个操作符,map和reduce。要求任何问题都必须能够分解为一系列的map作业和reduce作业,但并有些算法难以只用这两个操作符来描述
    Spark则提供了丰富的API,有80多个用于处理数据的操作符,处理复杂数据则更简单
  • 快速
    Spark比Hadoop处理数据更快速的原因主要在两方面:
    1、Spark允许应用程序利用内存缓存数据,因此使用Spark实现的同样的应用程序只需要从硬盘读取一次数据即可;而Hadoop需要反复从硬盘读取、写入数据,当数据量巨大时,这样带来的I/O延迟是十分之大的
    2、拥有更先进的作业执行引擎。例如Spark花在磁盘I/O和数据shuffle操作的时间更少(数据的shuffle操作通常会涉及网络间的数据传输,会增加应用程序的执行时间)
  • 通用
    为各种类型的数据处理作业提供一个统一的集成平台。因此可以使用单一的Spark框架,创建一个包含多个不同类型任务的数据处理流水线,而不用学习不同的框架或者部署单独的集群。Spark自带了一系列的库,用于批处理、交互分析、流处理、机器学习、图计算等。越来越多流行的应用和库开始集成到Spark中或添加了对Spark的支持,这说明Spark在未来将更加强大。
  • 可扩展
    Spark集群的数据处理能力可以通过增加更多集群节点的方式得以提升,并且这个特性对于应用程序来说是透明的,往Spark集群扩展节点时,无须改动任何代码。
  • 容错
    Spark能自动处理集群中的节点故障,这样应用程序开发者无须在开发过程中处理这些异常。

###Spark总体架构

这里写图片描述

  • 工作节点-worker:是一个进程,为Spark应用提供CPU、内存和存储资源,把Spark应用当成分布式进程在集群节点上执行
    1.利用自身的内存资源对RDD的某个或某些partition进行存储; 2. 对RDD分配来的partition进行处理和计算

  • 集群管理员-cluster manager(Master):是一个进程,控制整个集群,管理集群中worker节点的计算资源分配、调度,监控,不参与计算!

  • 驱动程序-Driver Program:提交spark程序的机器
    提供数据处理的代码,Spark将在worker节点上执行这些代码。包含程序的main()方法,RDD的定义和操作,管理Executor

  • 执行者-Executor:Spark应用程序运行在worker节点上的一个进程,可以利用多线程的放并发执行应用代码,并且负责将数据存到内存或磁盘上

  • 任务-task:Excutor中的线程,是运行Spark应用程序的基本单位,Spark为每一个数据分区创建一个任务,一个执行者可以并发执行一个或多个任务。任务数量由分区数量决定。对函数进行各种具体的函数操作

执行的顺序:

  1. Driver进程启动后,做一些初始化操作发送请求给Master进行spark应用程序的注册(让Master知道有个新的spark程序要运行)
  2. Master接收到了spark应用程序的注册申请后,向work请求资源调度和分配(资源的分配就是Excutor的分配,因为master根据。。。)

###术语

  • shuffle操作
    在集群节点上对数据进行重新分配,此分配并不是随机的,而是按照某些标准将数据分成不同的集合,每个集合就是一个新的分区。也就是把一组无规则的数据尽量转换成一组具有一定规则的数据(洗牌的逆操作)
    举例:map与reduce操作之间的数据转移过程(key值相同的数据转移到同一个节点上,为reduce操作做准备)

  • 作业-Job
    是一系列计算的集合,本质上就是在Spark集群上运行数据处理算法。一个应用程序可以发起多个Job

  • 阶段-Stage
    每个Job会被拆分成多组Task, 一组Task称为一个Stage。Stage的边界就是发生shuffle的地方,将task规整到不同的阶段。

我们可以描述一个Spark应用在集群节点上并行处理数据的过程。当一个Spark应用开始运行的时候,Spark会连接Cluster Manager,获取在worker Node上的Executor资源。Spark把一个数据处理算法当成一个Job提交,然后把这个Job分解成由若干Stage构成的DAG。并在Executor上调度运行这些Stage,调度操作由Cluster Manager提供的底层调度器实现。Executor即可并行地运行Spark提交的任务

###数据源
Spark作为一个计算框架,并没有存储系统,但是它可以搭配外部存储系统使用,一般会选择搭配能够存储大量数据的分布式存储系统使用。任何Hadoop支持的数据源都可以被Spark Core使用,例如HDFS、HBase、Cassandra等。Spark应用程序也可以读写本地文件系统上的数据并在单机上处理,这个特性对于Spark的学习有着重大意义。

以上,为Mohammed Guller的《Big Data Analytics with Saprk》一书的学习笔记

发表评论

您必须 登录 才能发表留言!