Spark入门学习

注:这篇博客讲的是自己对Spark的初步认识和学习,可能会有错误。参考资料是厦门大学的Spark学习基础,对应网址上有关于Spark运行机制的6个视频的讲解(3.3节),更加通俗易懂。

  首先需要了解Spark中的一些核心概念:

  • RDD,最核心的数据抽象,全称是弹性分布式数据,是高度受限(只读)的共享内存模型
  • DAG,反映了RDD之间的依赖关系
  • Executor,在工作节点(就是单个机器)上的一个进程,会派生很多线程来执行任务
  • application,就是Spark程序
  • 任务,在Executor上运行的工作单元
  • 阶段,作业job的基本调度单元

  然后了解下Spark的架构:
Spark大概可以分为3个部分,第一个是任务控制节点,其实就是程序中的SparkContext(返回一个RDD);第二个是集群资源管理器,一般是用yarn来进行集群的管理;最后一个就是集群上的工作节点work node,每个work node上都包含了一个Executor用来执行部分任务。最后多个work node的结果汇总就可以写到HDFS或者HBase上。
相应的,Spark运行流程大概就是,sparkContext会像资源管理器申请资源,而资源管理器(一般是yarn)会对集群进行调度,并将部分work node分配给申请的SparkContext(资源分配的原则是计算向数据靠拢)。然后我们的SparkContext会被分成多个作业job(分而治之嘛),同时,SparkContext也会输出一个根据RDD依赖关系生成的DAG,这个DAG通过DAG Scheduler将job分为多个阶段,每个阶段会在相应work node上执行任务。最后将所有work node上的工作进行汇总得到最终结果。

  接着了解下RDD的执行过程:
其实Spark运行流程就是RDD执行过程,HDFS上的数据读到内存中生成RDD,RDD经过多次转换(RDD->RDD),然后经过动作(RDD->value)并输出结果。这里我们需要记住的是,整个运行过程遵循着惰性调用机制,直白点说就是转换过程延迟执行,机器只是记住了要如何对RDD进行转换,但不会真正去执行这个转换,只有当遇到动作时RDD才会开始执行所有流程,包括前面的转换和当前的动作,最后得到结果。也就是说,转换只记录数据变换轨迹,机器并不会进行真正的计算,而动作则会触发从头到尾的计算。
Spark对原Hadoop的一大优势就是RDD的优化缩短了程序运行时间,这个优化体现在流水线处理和中间结果不写入磁盘(利用RDD的.cache()将数据存在内存中)。而Spark的另外一个优势就是高效容错性,传统保证容错率的方式是数据备份或者日志,但是在大数据场景下开销太大不合适,而Spark根据DAG得到的计算过程中数据的血缘关系可以很方便的找回丢失数据。
流水线处理就是指让work node自己独立完成尽可能多的工作,而不必要等其他work node工作完一起join一下然后接着后面的处理,这样就可以避免工作快的work node去等待工作慢的work node,节约了很多的等待时间。为了尽可能做到这一点,就需要将每个job分为多个阶段。如果将RDD任务中的转换和动作看做一个个节点,那么如果将这些节点划分到不同阶段里呢?那就得看节点之间是否有数据的shuffle。如果两个节点之间没有数据shuffle,那么这两个节点就划分到同一个阶段,而分到这两个节点对应行为的work node就可以自己独立完成所有行为,不用管其他work node;如果两个节点之间有数据shuffle,那么这个两个节点就划分到不同阶段,对应的所有work node就只能保证都完成节点1行为,shuffle数据,接着完成节点2行为。

  最后了解下RDD的优势和不能做的工作:
RDD是Spark的核心,RDD的关键优势在于避免数据频繁写入磁盘。传统MapReduce一个很大的问题是不断将中间结果写入磁盘,这就带来了IO开销和序列化反序列化开销。而RDD会将中间结果保存在内存中,从而节约大量开销。RDD也是数据的抽象,我们只需要知道读入的数据是RDD,而实际上数据会被分成读个分区保存不同的work node上,但我们不用关注这些底层细节。RDD只能完成粗粒度的数据操作(RDD对所有数据一起做操作,不能只对部分数据做针对性操作),RDD不支持细粒度数据修改,因此不太适合需要频繁更新部分数据的场景(比如网页爬虫的数据更新)。

你可能感兴趣的:(Spark入门学习)