文章目录

  • 1.spark运行原理简述
  • 2.MapReduce简介
  • 3.MapReduce中的shuffle简述
  • 4.spark与hadoop的性能对比
  • 5.pyspark原理以及与spark的关系


1.spark运行原理简述

pysparkspark的一个python接口,所以在讲pyspark之前,先简单阐述一下spark的运行原理以及相关基础知识。
spark应用程序是以进程集合为单位在分布式集群上运行的,驱动进程(driver程序)通过SparkContext对象与集群进行交互。基本过程如图所示 。

PYSPARK 运行 pyspark运行原理_python

  • Spark根据任务的需要,通过SparkContext对象向Cluster manager(资源管理器)申请所需执行的资源,例如cpu、内存等;
  • Cluster manager分配应用程序执行需要的资源,在Worker节点上创建Executor;
  • SparkContext 将程序代码(jar包或者python文件)和Task任务发送给Executor执行,并收集结果给驱动进程。

任何spark应用程序都会主动分离主节点上单个驱动进程(可以包含多个作业),然后将将执行进程(包含多个任务)分配给多个节点。

2.MapReduce简介

首先Spark是借鉴了mapreduce并在其基础上发展起来的,所以这里有必要先介绍一下mapreduce。这个阶段的输出通过某种组合(shuffle)。shuffle后的结果再被分成小份分发到各个节点进行下一步的处理工作。第二步的处理阶段被称为reduce阶段,reduce的输出就是程序的最终执行结果。
MapReduce的优势在于,它使得程序能够以并行的方式进行。如果集群由10个节点组成,而原先的作业需要10个小时完成,那么应用Mapreduce,该作业在一个小时之后能得到同样的结果。举个例子,给过去100年内中国的每个省每天的天气数据,统计出这段时间内的最高温度,数据格式可以为:(province,date,temp),可以先将这些数据根据节点数分成很多份,每个节点各自寻找本机数据集上的最高温度。这样每个mapper都会产生一个温度,形如(max,temp)的键值对,即所有的mapper都会产生相同的key("max"字符串),那么,最后只需要一个reducer来比较所有的mapper的输出,就能得到全局最高温度值。
不同的作业类型,可能需要不同数目的reducer。还是刚才温度的例子,假如需要统计出每年的最高温度,这样的话,mapper应先找到每年的最大温度并输出,所以中间的数据格式为:(year,temp),还需要保证所有同一年的数据传递给同一个reducer,这又map和reducer阶段中间的sort阶段来完成。最终每个reduer会接受到相同的key值。
从上述例子可以看出,reducer的数量并不是固定的。MapReduce的整个编配工作由主节点(master node)控制,主节点控制整个MapReduce的作业分配,包括每份数据的的存放节点的位置,以及map、sort和reduce的操作。
总结一下,MapReduce:有以下几点:

  • 主节点控制MapReduce的作业流程;
  • map任务之间不做数据交流,reduce任务也是一样;
  • 在map和reduce阶段中间,有一个sort和conbine阶段,也被称为shuffle;
  • 数据被重复存放在不同机器上,以防某个机器失效;
  • map和reduce传输的数据形式都为key/value对;

Apache的Hadoop项目就是MapReduce框架的一个实现。

3.MapReduce中的shuffle简述

上文讲述了map和reduce两个阶段,而shuffle就处在map和reduce的中间过程。可以这样理解shuffle:怎样把map task的输出结果有效地传送到reduce输入端。 Shuffle描述着数据从map task输出到reduce task输入的这段过程。拿上文中统计每年的最高温度来说,mapper首先找到每年的最大温度并输出,然后经过shuffle过程,以较小的代价保证所有同一年的数据传递给同一个reducer,即每一个reduce接受相同的key值。
在Hadoop集群中,大部分map task与reduce task的执行是在不同的节点上,很多情况下Reduce执行时需要跨节点去读取其它节点上的map task结果,并存储到本地,此时,如果集群正在运行的job有很多,那么task的正常执行对集群内部的网络资源消耗会很严重。另外在节点内,相比于内存,磁盘IO对job完成时间的影响也是比较大的,spark 就是基于这点对hadoop做出了改进,将map和reduce的所有任务都在内存中进行,并且中间接过都保存在内存中,从而比hadoop的速度要快100倍以上。
所以shuffle的的作用在于:

  • 完整地从map task端读取数据到reduce 端;
  • 在跨节点读取数据时,尽可能地减少对带宽的不必要消耗;
  • 减少磁盘IO对task执行的影响。

4.spark与hadoop的性能对比

Hadoop是MapReduce的一种实现,而spark是在Mapreduce的基础上发展起来的,继承了其分布式计算的优点并改进了MapReduce明显的缺陷,二者差别主要如下:

  • 从宏观上看,spark和hadoop都属于分布式并行机制,MapReduce应用程序是由多个独立的Task进程组成的,Spark应用程序的运行环境是由多个独立的Executor进程构建的临时资源池构成的。 但从单个节点上多个任务的运行模式来看,Hadoop MapReduce采用了多进程模型,而Spark采用了多线程模型。多进程模型便于细粒度的控制每个任务占用的资源,但会消耗较多的启动时间,不适合运行低延迟类型的作业,而多线程模型则相反,该模型使得Spark很适合运行低延迟类型的作业。
  • 同节点上所有任务运行在一个进程中,有利于共享内存。这非常适合内存密集型任务,尤其对于那些需要加载大量词典的应用程序,可大大节省内存。
  • 同节点上所有任务可运行在一个Executor中,且Executor所占资源可连续被多批任务使用,不会在运行部分任务后释放掉,这避免了每个任务重复申请资源带来的时间开销,对于任务数目非常多的应用,可大大降低运行时间。与之对比的是MapReduce中的Task:每个Task单独 申请资源,用完后马上释放,不能被其他任务重用。
  • spark把运算的中间数据存放在内存,迭代计算效率更高,Spark中除了基于内存计算外,还有DAG有向无环图来切分任务的执行先后顺序;mapreduce的中间结果需要落地,需要保存到磁盘,这样必然会有磁盘io操做,影响性能。
  • spark容错性高,它通过弹性分布式数据集RDD来实现高效容错,RDD是一组分布式的存储在节点内存中的只读性质的数据集,这些集合是弹性的,某一部分丢失或者出错,可以通过整个数据集的计算流程的血缘关系来实现重建;mapreduce的话容错可能只能重新计算了,成本较高。

5.pyspark原理以及与spark的关系

spark底层是用scala语言写的,而scala的运行环境是jvm,也就是说,spark是运行在jvm之上的。而pyspark是spark的一个python接口,可以通过python来调用spark的相关API,实现利用分布式处理海量数据的目的。

PYSPARK 运行 pyspark运行原理_PYSPARK 运行_02

pyspark的整个运行流程大概是这样:py4j是连接python和jvm的桥梁,在Driver端,python创建一个sparkcontext对象,该对象通过py4j最终会在JVM中实例化Scala的SparkContext对象,本质上就是python通过py4j调用Java的方法。py4j只会用在Driver端,在Executor端,则不需要借助Py4j,Executor中运行的可能是python的函数或者句法,java里面是无法运行python语句的,即使是py4j也做不到。所以,为了能在Executor端运行用户所写的python语句,就需要为每个Task单独启一个Python进程,然后通过socket通信方式将Python语句发给Python进程执行。