Spark 架构-初识

前言:一直想总结关于Spark架构方面的知识,限于所学,到目前也只是浅尝辄止,一方面受限于自我架构意识的欠缺,其次受限于对Scala语言的理解,总之还在不断的探索,实践,和总结中. 本小结简单阐述下笔者现阶段对Spark 的了解,为后续进一步的深入学习做一些准备,而更多的是思想上的理解,而不是细节.

概述:Spark必然听过,现阶段与Hadoop生态系统共同构成大数据的两大阵营,显然Hadoop更适合于大批量数据存储的离线运算,Spark更偏向于近实时的数据处理,基于Spark Streaming + 消息中间件[Kafka,RabbitMQ,Flume]的流处理框架应用非常普遍.

Spark体系:Spark 基于Scala语言开发,充分发挥了面向对象与函数式编程的特性,Scala语言基于Java语言对Java语言有足够的包容性,又极具特色,非常适合于分布式应用的开发,Spark体系涵盖Spark基础,SparkSQL,Spark Streaming,MLlib(机器学习),GraphX(图处理)模块.

 

 

Spark Core:Spark的核心,基于Spark的上层应用都是基于Sparkcore展开,代表性的函数式编程,RDD[分布式数据集]等,一个典型的WorkCount程序:

object WorkCount {

 def main(args: Array[String]): Unit = {

   //Spark Config

   val conf = new SparkConf

   conf.setMaster("local")

   conf.setAppName("WordCount")

   //Spark 应用程序上下文

   val sc = new SparkContext(conf)

   val words = List("hello workd ", "xiao fen","hello xiao fen");

   val input = sc.parallelize(words, 1);

   //函数式编程+链式操作

   val wordcount = input.flatMap { word => word.split(" ")}.map { word => (word, 1) }.countByKey();

   print(wordcount);

 }

}

RDD[ResilientDistributed Datasets],是Spark提供的一种基于分布式内存分区存储的数据模型,Spark定义了若干针对于RDD的转化和行动操作,基于Spark的程序最终都将转化为对于RDD数据集的操作,可以说掌握了对RDD的操作就掌握了Spark语言基础.常见的RDD操作举例:

    map(func)                    对RDD中的数据进行map转换操作,返回一个新的RDD

    filter(func)                  对RDD中的数据元素进行过滤

 

Spark SQL:SparkSQL 用于在集群环境中操作基于SQL源的数据,SparkSQL支持主流SQL引擎的接入及扩展接入.

 

Spark机器学习:这是一个最近很火的行业,Spark为机器学习提供了MLlib类库,用于机器学习研究.据官方说法,Spark的迭代运算性能优于Hadoop大概100X,可想Spark是适合于机器学习的,在此提醒就机器学习而言注意到使用Python似乎是一种潜在的发展趋势,可入手学习.现自我阶段正处于机器学习理论知识储备阶段.

 

 

SparkStreaming: Spark提供的流数据处理框架,配合开源的消息中间件构成阶段主流的流处理架构. Spark Streaming 支持多种数据的接入常见的Kafka,Flume等.Spark Streaming抽取数据基于”批次”和”窗口”的概念将数据收集为基于时间序列的DStream进行处理,Spark对DStream的处理最终也转化为对RDD的处理.可见开发人员并须需要额外学习一些东西.



支持多类别数据接入


基于批的处理流程


基于时间序列的DStream数据模型

 

Spark 图:Spark提供GraphX 作为其图处理框架,基于Spark RDD实现图[顶点集,边集]数据的分布式存储,内置了简单的图算法,开发人员可以使用GraphX API快速构建图数据结构进行图的迭代运算.


Spark 图示例

  val conf = new SparkConf

 conf.setAppName("GRAPH_TEST_01").setMaster("local")

  val sc: SparkContext = new SparkContext(conf)

  // 顶点RDD集

  val users: RDD[(Long, (String, String))] =

    sc.parallelize(Array((3L,("rxin", "student")), (7L, ("jgonzal","postdoc")),

      (5L, ("franklin","prof")), (2L, ("istoica", "prof"))))

  // 边RDD集

  val relationships: RDD[Edge[String]] =

    sc.parallelize(Array(Edge(3L, 7L,"collab"), Edge(5L, 3L, "advisor"),

      Edge(2L, 5L, "colleague"),Edge(5L, 7L, "pi")))

  // 默认的定点属性

  val defaultUser = ("John Doe","Missing")

  // 构建图

  val graph2 = Graph(users, relationships,defaultUser)
 

Spark 集群:通常情况下我们区别对待资源管理器和Spark集群,资源管理器更具一般性,对Spark自身而言Standalone集群管理器仅是Spark集群资源管理的一种自我实现.


Spark架构

|  Spark集群用于保证针基于RDD的分布式作业能够高效有序的执行.每一个Spark应用程序有一个独立的SparkContext对象,Spark Context对象用来连接不同的集群管理器[Standalone 独立集群管理器,YARN资源管理器,Mesos源管理器],为Spark 作业申请执行作业需要的资源

|  SparkContext 在申请到Executors[执行器]后向执行器节点分发作业,在Work 节点中启动Executor[通常是一个或者多个JVM进程] 执行作业任务.

|  Spark 集群中每个应用独立运行,互不影响,在不使用外部存储的情况下不能跨Spark Context共享数据.

|  Spark 应用程序不关注资源管理器的底层实现,只须保证Spark 能获取与之相关的Executors并与之进行通信,这使得Spark 程序能很容易在主流的集群管理器中进行迁移如YARN, Mesos 等.

|  每一个Spark 程序的启动需要一个驱动器节点,用于驱动作业的执行,在作业整个生命周期中与执行器通信,监听作业执行状态.

 

Spark 术语:

|  Application,运行在Spark上的用户程序, 在集群由Driver和Executors构成.

|  Application jar ,应用程序jar,这里可以是一个包含所有依赖的”uber  jar”[超级jar],也允许以其它方式提交应用程序jar.

|  Driver program, Spark作业驱动程序,构建SparkContext,提交和监控作业运行状态.

|  Cluster manager, 群集资源管理器,可以是YARN,Standalone,Mesos.

|  Deploy mode, 应用程序部署模式,区别在于驱动器节点的选择,”cluster”模式中驱动器节点运行与集群中,”client”模式中,驱动器运行于启动节点.

|  Work Node,集群中可以运行作业的集群节点.

|  Executor, 执行器节点,Work Node中的一个或者多个JVM进程.作业的具体执行者,每个应用程序有自己独立的Executors.

|  Task,Sprak执行作业的最小单元,在Exexutor中执行.

|  Job,由多个task集合组成的并行计算,job的划分通常和对RDD执行的Action操作相关.

|  Stage,一个job被划分为多个Stage,每个Stage 包含多个task.

 

猜你喜欢

转载自blog.csdn.net/u010820702/article/details/68959488
今日推荐