




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第5章Spark编程进阶Spark大数据分析与实战01搭建PySpark开发环境理解RDD0203RDD缓存机制目录CONTENTS04广播变量和累加器05Spark生态和应用程序架构06Spark集群和应用部署01搭建PySpark开发环境PySpark编程环境JupyterNotebook编程环境PyCharm集成开发环境PySpark编程环境在PySpark交互式编程环境中,只要输入一条语句,就会自动提交执行并显示运行结果。在Python软件库中也存在一个名为pyspark的软件包,可以脱离外部Spark运行环境而独立存在,对于第三方开发工具如PyCharm、VScode等更加方便在第1章配置了pip3命令用于管理python3.8的软件包,pip则被设置为管理python3.6的软件包。也可以使用命令sudopython3.6-mpipinstallpyspark==2.4.8py4j==0.10.7PySpark编程环境Spark框架内置的pyspark(PySparkShell)与Python环境中安装的pyspark到底有什么区别,可以从以下3个方面理解
运行环境不同。从pip源安装的pyspark本质是一个Python扩展库,它可在Python交互式编程环境或任何支持Python的集成开发环境中引入和使用。Spark框架内置的pyspark只能通过运行pyspark命令脚本来启动,它实际是一个工具命令程序
功能不同。从pip源安装的pyspark库仅限于在Python环境下使用,需要在代码中通过import导入。Spark框架则提供了多语言版本的交互式编程环境,包括pyspark(Python版)、spark-shell(Scala版,默认)和sparkR(R版)等多种交互式编程工具,它们都是Spark框架提供的命令工具,所以统称为SparkShell,而pyspark只是其中之一
使用方式不同。从pip源安装的pyspark库在导入后,需要手动创建spark和sc入口对象变量,而Spark框架自带的pyspark命令启动后,会自动创建spark和sc入口对象变量,对初学者来说更为方便易用PySpark编程环境安装好pyspark库,就可以在各种Python的编程环境中使用这里必须手动创建SparkContext对象才能进行后续操作,其他Python开发工具使用pyspark库时也是如此JupyterNotebook编程环境JupyterNotebook是一个类似网页笔记形式的Web编程工具,支持在网页中直接编写和运行代码,并能够以文本、图表嵌入等方式输出运行结果,适用于数据清洗、数据可视化、机器学习等场合安装findspark库,它的作用是使pyspark库在JupyterNotebook网页中能够像一个普通Python模块那样导入和使用JupyterNotebook编程环境稍候浏览器中会显示JupyterNotebook的初始界面找到浏览器页面右上角区域,选择New下拉列表中的Python3选项,此时会新打开一个JupyterNotebook页面,Spark代码就是在这个页面中来编写的JupyterNotebook编程环境在JupyterNotebook页面中编写代码的方式,与在普通的Python编程环境中基本一样,唯一不同的是,在执行代码之前,必须先运行一次findspark.init()方法,只需在当前JupyterNotebook页面中执行一次即可,不用重复执行JupyterNotebook编程环境JupyterNotebook页面是由一些称为Cell的格子行构成的,用户可以像在普通文档中一样在格子里编写代码或文本内容当Notebook页面的Cell行代码在运行时,当前Cell行的左端会有一个“[*]”提示,浏览器背后的Linux终端也会显示一些日志信息,在遇到问题时这可以作为一个参考的线索PyCharm集成开发环境PyCharm就是一个功能强大的跨平台开发环境,主要用于Python的开发,支持代码分析、图形化调试,集成测试器、集成版本控制等特性,分为社区版和专业版两种,这里使用的是免费的社区版PyCharm集成开发环境选择PyCharm初始窗体左侧的Projects选项,然后单击右侧的NewProject按钮启动新建Python项目,项目创建完毕,PyCharm会切换至项目开发窗体PyCharm集成开发环境在打开的代码编辑器中将main.py文件的原有代码全部清除,输入下面的Spark测试代码与PySparkShell、Python、JupyterNotebook等交互式编程环境不同的是,PyCharm在运行代码时不能直接通过变量名将它们的内容打印显示,必须使用print()函数PyCharm集成开发环境代码准备完毕,现在可以在PyCharm的源代码编辑器任意空白位置单击鼠标右键,在弹出的快捷菜单中选择Run'×××'命令(×××代表要运行的文件名),就会启动main.py程序的执行02理解RDDRDD基本概念RDD的分区RDD的依赖关系RDD的计算调度RDD基本概念RDD弹性分布式数据集是一种容错的、可被并行操作的数据集合,它允许数据同时跨多个计算节点而存在,但在使用上仍像是一个普通的集合,Spark底层的计算过程都是围绕RDD进行的,RDD计算流程包括初始化RDD、若干次Transformation转换操作、Action行动操作RDD的分区分区(Partition)是RDD的一种内部数据组织单位,就像班级中的小组一样。RDD数据集是由分布在各个节点上的分区构成的,RDD通过分区机制将数据分散到不同节点上进行计算RDD的分区数会影响到Spark计算任务Task线程的数量,每个Task线程负责处理一个或多个分区的数据。RDD分区数对Spark应用程序的运行是有影响的,分区数太少或太多都不合适,同时还可以在运行时动态进行调整,包括coalesce()和repartition()两种调整方法RDD的依赖关系RDD在每次进行转换操作后,都会生成一个新的RDD,这样经过多次转换操作生成的RDD之间就会形成一条类似“流水线”一样的前后链接关系,后一个RDD(子)是依赖于前面的一个或多个RDD(父)生成的RDD的前后依赖关系被划分为两种类型,分别是“窄依赖”(NarrowDependency)和“宽依赖”(WideDependency,或ShuffleDependency)。RDD之间的依赖关系,是以RDD里面的分区数据“前后流向”关系为依据的窄依赖是指父RDD中任意一个分区的数据,至多“流向”子RDD的一个分区,前后RDD的分区之间是“多对一”的关系(n∶1,n≥1)在窄依赖情形下,如果子RDD在执行操作时某个分区计算失败(如数据丢失),此时只需重新计算父RDD的对应分区即可恢复数据。当然,如果父RDD的分区数据也有受损,则再往上追溯计算即可,像map、filter等转换算子生成的RDD,它们之间都是窄依赖的关系RDD的依赖关系宽依赖是指父RDD中分区的数据会同时“流向”子RDD的多个分区,前后RDD的分区之间是“一对多”的关系(1∶n,n≥2)在执行具有宽依赖关系的算子时,来自父RDD的不同分区的数据要进行“洗牌”重组,所以宽依赖也被称为Shuffle依赖。当前后RDD之间是宽依赖关系时,前面RDD的分区数据需要打散,通过计算后再重新组合到后面RDD的分区中(回顾一下词频统计的例子)。在这种情形下,如果子RDD丢失了分区数据,则需要将父RDD的分区全部重新计算一次才能恢复,像reduceByKey、sortByKey等操作就会产生宽依赖关系RDD的依赖关系下面是一个简单的演示RDD宽窄依赖关系的示例RDD的依赖关系RDD的计算调度Spark应用程序要落实到具体计算节点上去运行,还有很多具体工作要做。当用户代码提交给Driver进程时,Spark是如何将这些代码分配到Executor进程上去执行的。由于Spark的核心设计是RDD,因此数据的计算都是围绕RDD为中心展开的。为此,Spark引入了Job(作业)、Stage(阶段)和Task(任务)等几个与计算调度相关的内容(1)Job作业RDD的转换操作采用延迟机制,在调用Transformation算子时并不会启动运行它,直至遇到Action算子才会启动运行。在这种情形下,Spark会将Action操作和之前形成的一系列RDD计算链构成一个完整的Job(作业),然后将这个Job安排到节点上运行,这也是RDD延迟机制的基本实现原理。在一个Job中,通常包含1~n个Transformation操作和1个Action操作Job的划分只是第1步,每个Job还要再继续进行分解,以最终生成一系列能够并行执行的Task线程(Spark集群的最小执行单元)。为了提高计算节点的利用率和执行效率,Spark还会进一步对这些Task进行编组,形成相互独立的Stage。一个Stage包含一组Task线程,即TaskSet。经过这样的处理,这些被精心安排的Task代码和RDD分区数据就通过Driver进程分发到各个节点的Executor进程中执行RDD的计算调度(1)Job作业Spark将Action操作和之前形成的一系列RDD计算链构成一个完整的Job(作业)RDD的计算调度(1)Job作业从Spark提供的WebUI管理页面中可以查看应用程序在运行过程中生成的Job(作业),只需在Ubuntu20.04的浏览器地址栏中输入http://localhost:4040即可(每个Spark应用程序都有一个这样的状态页面,端口号依次为4040、4041、4042等)RDD的计算调度(2)Stage阶段当用户代码在第1步被划分成Job后,第2步就是在Job里面划分Stage。Stage一词的本意是“阶段”,也可将其理解为“片段”,它是Spark计算调度的一个重要环节,这是因为Job的运行粒度还不够细,Job里面的转换算子生成的前后RDD存在不同的宽窄依赖关系,这些RDD的依赖关系会影响到RDD的计算顺序在对Job包含的转换操作划分Stage时,Spark是按照倒序并参考RDD的依赖关系(宽依赖/窄依赖)进行的。在Job中,从第1次出现的Action(行动)操作往回倒推,遇到窄依赖关系的操作将其划分到同一个Stage中,遇到宽依赖关系的操作则划分出一个新的Stage,依次往前类推不同Stage之间形成一连串的前后关系,但因为我们是按照倒推的顺序进行划分的,所以先划分出来的被称为“子Stage”,后划分出来的被称为“父Stage”。经过这样的划分后,就可以从最前面的父Stage开始调度,依次向后执行,“子Stage”需要等所有“父Stage”运行完才能执行。这种不同Stage之间按照先后顺序划分出来的依赖关系,构成了一个网状图形,它就是有向无环图(DirectedAcyclicGraph,DAG)RDD的计算调度(2)Stage阶段下面通过实际的示例代码来看一下Spark是如何在Job中划分Stage的RDD的计算调度(2)Stage阶段在Spark的WebUI管理页面中,点击Job列表中的相应链接即可查看其所包含的Stage点击Stage列表中的相应链接可查看每个Stage的有向无环图RDD的计算调度(3)Task任务Spark按照Action(行动)操作将用户代码分成若干个Job,每个Job再按RDD计算链的宽窄依赖关系进一步划分为若干个Stage,以生成更细致的执行计划。经过这种由粗到细的逐层划分,最后一个环节就是创建Task(任务)以执行代码RDD的计算调度(3)Task任务RDD的计算调度(3)Task任务在Spark的WebUI管理页面,在Stage对应的有向无环图的页面底部可以找到该Stage包含的Task线程列表(Task线程所在的Executor进程也在这里)RDD的计算调度Spark应用程序在运行过程中的计算调度实际是在Driver进程中完成的,具体则是由Driver进程的SparkContext、DAGScheduler、TaskScheduler等组件来负责用户代码提交后,Spark会启动一个Driver进程并创建SparkContext,然后以RDD的行动操作为边界将用户代码划分为若干个Job。在每个Job中,DAGScheduler根据RDD前后宽窄依赖关系建立有向无环图,并将有向无环图拆分为多个Task编组(TaskSet),每组Task就被封装为一个Stage,以TaskSet的形式提交给底层的TaskScheduler调度器执行具体的代码RDD的计算调度Spark应用程序Application在提交运行时,需要启动Driver和Executor进程,在调度时还涉及Job、Stage、Task等几个概念,它们之间的关系可以从物理、逻辑这两个纬度进行理解03RDD缓存机制RDD缓存机制RDD缓存机制在Spark编程时经常会遇到这样的情况:经过一系列计算得到一个RDD数据集,这个RDD数据集在后续的计算中还会被使用到。由于RDD是一个过程性的数据集,不是一直停留在内存中的,如果每次都要重复计算生成这个RDD,则可能要耗费大量时间。为避免这种情形的发生,可以通过Spark的缓存机制来解决RDD缓存机制Spark提供了一个很重要的功能,能将计算过程中生成的数据进行持久化缓存,这样后面的操作就可以直接访问缓存的数据,而不用每次沿着RDD计算链再执行一遍。当一个RDD被持久化时,每个节点上的线程都可以直接使用这个缓存的RDD进行计算RDD的持久化还可以使用不同的存储级别,只需传递一个StorageLevel参数即可。常用的RDD持久化存储级别主要包括以下形式RDD缓存机制Spark还支持使用checkpoint(检查点)机制进行缓存,类似于快照,其作用就是将重要的或需要长时间保存的中间数据设置一个检查点,保存到高可用的存储系统上。比如,使用checkpoint保存在HDFS上。不过,由于checkpoint是将RDD数据存储到磁盘上,因此执行效率相比内存缓存来说要低。另外,checkpoint保存的数据如果不手动删除会一直存在,而缓存是随着Spark应用程序结束就失效了04广播变量和累加器广播变量累加器RDD缓存机制广播变量(BroadcastVariables)是指将数据从一个节点广播发送到其他节点上。比如在Driver端有一张内存数据表,其他节点运行的Executor进程需要查询这张表中的数据,那么Driver会先把这张表发送到其他节点上,这样Executor进程的每个Task计算任务就可以在本地节点上查表RDD缓存机制Spark的广播变量被设计为只读,这样就能保证每个计算任务使用的变量都是一样的值。广播变量可以通过SparkContext.broadcast(v)方法从一个本地变量v进行创建,广播变量在使用上就相当于对普通变量v的一个包装,它的值可以使用value()方法进行访问这个例子中,map算子需要使用变量a,因此Driver进程需要分别将变量a发送给各Task线程。如果线程有4个,那么变量a在节点上就同时存在4个副本RDD缓存机制如果改用广播变量,则只需要将变量a发送到节点的Executor进程中即可,这样Executor进程中的各个线程就可以共享a这个广播变量。我们将上面的代码稍作修改上面的代码,rdd1被划分为4个分区,假定有两个节点,每个节点运行两个Task线程,那么总共有4个Task分别处理rdd1的4个分区数据。如果改成rdd2=rdd1.map(lambdax:x-ba.value)(粗体标识的ba是在Driver进程中定义的一个广播变量),此时Driver进程只需将ba的数据分发给两个节点的Executor进程,每个节点的Task计算任务共享同一份ba数据,总共只需发送两份ba变量的内容即可累加器我们来看一个简单的例子,这个例子是按照常规程序运行的思路编写从运行结果容易看出,num变量的累加结果仍是初始值10,并未把rdd的数据元素加进来,这也是分布式计算引起的一个典型负面效果累加器Spark的累加器(Accumulators)是为了支持在集群的不同节点中进行累加计算的一种手段,比如计数、求和,或者集合元素汇总等,它能实现在Driver端和Executor端的共享变量“写”的功能Spark内置了3种类型的累加器,分别是LongAccumulator、DoubleAccumulator和CollectionAccumulator。其中,LongAccumulator用来累加整数,DoubleAccumulator用来累加浮点数,CollectionAccumulator用来合并集合数据。如果Spark内置的累加器无法满足需求,用户还可以自定义累加器累加器累加器变量可以调用SparkContext.accumulator(v)方法设置,其中,参数v是来自Driver进程的普通变量,它可以是整数、浮点数或集合,或者符合累加器要求的其他自定义类型。累加器变量有一个名为value的属性,它存储了所有节点返回Driver进程的结果汇总数据。另外,累加器的value属性值获取操作只能在Driver端的代码中执行05Spark生态和应用程序架构Spark生态架构Spark应用程序架构Spark生态架构Spark致力于成为一个开源的大数据处理、数据科学、机器学习和数据分析工作的统一引擎,以SparkCore为核心,支持HDFS等多种分布式存储系统,通过SparkStandalone、YARN等集群管理器实现分布式的计算。Spark生态包含SparkCore、SparkSQL、SparkStreaming、MLlib、GraphX四大组件SparkCore是Spark框架的核心模块,实现了Spark的基本功能,包含任务调度、内存管理、错误恢复、与存储系统的交互等。SparkCore的实现依赖于RDD(弹性分布式数据集)这一抽象概念,定义了RDD的相关API接口Spark生态架构SparkSQL是Spark用来处理结构化数据的模块,借助SparkSQL可以构造SQL语句直接查询数据,在底层会将SQL变成一系列分布执行的RDD计算任务SparkStreaming模块主要是针对实时流数据的处理,SparkStreaming把输入数据按照设定的时间片切分为一段一段的数据,每段数据都被转换成RDD数据集,将DStream的转换操作转变为对RDD的转换操作,生成的中间结果保存在内存中MLlib模块主要用于机器学习领域,它实现了一系列常用的机器学习和统计算法,如分类、回归、聚类、主成分分析等,还提供了模型评估、数据导入等额外的功能GraphX模块主要支持图数据的分析和计算,包含了许多广泛应用的图计算算法,比如最短路径、网页排名、最小切割、连通分支等。与其他分布式图计算框架相比,GraphX的最大贡献是在Spark之上提供了一站式的数据解决方案,可以方便高效地完成图计算的一整套流水作业Spark应用程序架构Spark本身主要是由Scala开发的,也包含部分使用Java开发的模块,运行在JVM虚拟机上。Spark对Python的支持是通过一个Py4j库实现的,这是一个功能强大的RPC(RemoteProcedureCall,远程过程调用)库,其实现了Python和JVM之间的交互,可以让Python自由操纵JavaPySpark不仅可以编写Spark封装的API接口代码,还可以编写Python库的代码,不过Python代码只能在Python自己的运行环境中运行。借助Pipe管道机制,Spark会将Python库的代码发送到Python运行环境中运行并获取返回结果,整个过程就像调用一个Spark本地函数一样Spark应用程序架构在一个集群环境中,可以同时运行多个Spark应用程序。所谓Spark应用程序,是指包括用户代码、Driver和Executor在内的若干相关进程,它是一组动态的概念。一个集群环境可以同时运行多个Spark应用,每个应用都有各自的一套进程,不同应用之间的进程互相隔离Spark应用程序架构Spark的应用程序架构涉及很多专业术语,初期理解起来可能会存在一些困难,但以后掌握它们的话将有助于加深对Spark框架体系的理解Spark应用程序架构Spark的应用程序架构涉及很多专业术语,初期理解起来可能会存在一些困难,但以后掌握它们的话将有助于加深对Spark框架体系的理解Spark应用程序架构Spark应用程序的运行可在本地或集群上运行。Spark本地运行方式比较简单,一般只在开发测试下使用,它通过在本地计算机的一个Java进程中同时启动Driver和Executor以实现计算任务的本地运行。Spark集群运行方式支持SparkStandalone、SparkonYARN、SparkonMesos等集群环境,每个Spark应用程序都包括一个Driver进程、一个或多个Executor进程当在集群节点上时,Driver进程运行在集群节点上被称为cluster模式,Driver进程运行在集群之外的计算机上时被称为client模式,此时提交任务的客户端计算机相当于临时加入集群环境中Spark生态架构SparkStreaming模块组件05Spark集群和应用部署Spark伪分布集群的搭建Spark应用程序部署模式Spark应用程序部署实例Spark伪分布集群的搭建我们已经配置了单机伪分布的Hadoop环境,下面继续在此基础上配置Spark的伪分布集群,使用的是自带的SparkStandalone集群管理器。在后续内容中,还会介绍使用3台Linux虚拟机来搭建完全分布式的Spark集群(2)因为更改了主机名,所以还需要修改/etc/hosts文件,在这个文件中设定了IP地址与主机名的对应关系,类似DNS域名服务器的功能(1)首先查看当前虚拟机的默认名称,然后将其修改为vm01Spark伪分布集群的搭建(3)修改Spark的相关配置文件,包括spark-env.sh和slave这两个文件Spark伪分布集群的搭建(3)修改Spark的相关配置文件,包括spark-env.sh和slave这两个文件Spark伪分布集群的搭建(4)使用start-all.sh脚本启动Spark集群的Master主节点和Worker工作节点,并通过jps命令检查Master和Worker两个进程是否存在Spark伪分布集群的搭建(5)在Ubuntu20.04虚拟机中打开浏览器访问Spark集群的WebUI管理页面,地址为localhost:8080Spark伪分布集群的搭建(6)为了验证集群运行是否正常,下面尝试在终端窗体中提交一个Spark应用程序到当前集群环境中运行Spark伪分布集群的搭建除了Linux终端窗体显示的运行结果,在Spark集群的WebUI管理页面中也可以查到这个pi.py示例应用程序的具体运行信息当提交应用程序到Spark集群中运行时,要指定“spark://vm01:7077”参数。集群的WebUI管理页面可以通过http://vm01:8080访问,其中,vm01是集群的Master节点主机名。不过,如果Spark集群服务经过重启,之前运行过的应用程序就不会出现在WebUI管理页面中,不方便事后的分析。因此,为了能够保留Spark应用程序的运行记录,这里需要配置Spark集群的History历史服务器Spark伪分布集群的搭建(7)在spark-defaults.conf文件中增加历史服务器的配置信息Spark伪分布集群的搭建(7)在spark-defaults.conf文件中增加历史服务器的配置信息Spark伪分布集群的搭建(7)在spark-defaults.conf文件中增加历史服务器的配置信息从jps命令列出的进程列表中可以看出,HistoryServer已经在运行,同时Master和Worker进程也在运行,HDFS服务也是正常的Spark伪分布集群的搭建(8)再次在终端窗体中提交Spark应用程序到集群环境中运行,使用虚拟机的浏览器访问历史服务器的管理页面,就可以查看应用程序运行的历史信息Spark应用程序部署模式Spark应用程序的运行途径有很多种,在单机部署时以本地模式运行,在集群部署时可以选择Spark集群或外部YARN资源调度框架等。在使用spark-submit提交计算任务时,可以在命令行指定--master参数选择所运行的集群环境(1)Local模式在Local模式下,Spark应用程序是在本地计算机的Java进程中以线程的方式运行的,如图5-51所示。使用Local模式运行应用程序,也可以指定CPU核数,CPU核数决定了开启的工作线程数量Spark应用程序部署模式(2)SparkStandalone模式SparkStandalone实现的资源调度框架主要包括Master主节点和Worker工作节点,运行的进程分别是Master和WorkerSparkStandalone是最简单和最容易部署的一种模式,尤其适用于开发测试阶段,在提交任务时指定“spark://<IP地址>:7077”格式即可Spark应用程序部署模式(3)SparkonMesos模式SparkonMesos模式是指Spark应用程序运行在ApacheMesos资源管理框架之上,该模式将集群的资源管理功能交给Mesos统一处理,Spark只负责任务调度和计算工作Mesos是与HadoopMapReduce兼容良好的一种资源调度框架,不过在国内的企业中使用不多,这里仅作了解即可Spark应用程序部署模式(4)SparkonYARN模式SparkonYARN模式是Spark应用程序运行在HadoopYARN框架上的一种方式,集群的资源管理由YARN处理,Spark只负责任务调度和计算工作YARN集群与SparkStandalone集群非常相似,其中ResourceManager对应Master进程,负责集群所有资源的统一管理和分配;NodeManager对应Worker进程,负责单个节点资源的管理;ApplicationMaster则相当于Driver进程,负责管理提交运行的应用程序,比如任务调度、任务监控和容错等Spark应用程序部署模式(4)SparkonYARN模式根据Spark提交计算任务的Driver进程在YARN集群中的不同位置,又分为yarn-client和yarn-cluster两种运行模式SparkonYARN模式允许Spark与Hadoop生态圈完美搭配,组成强大的集群环境,因此得到了比较广泛的应用。除了本地模式和集群模式这两大类部署模式,Spark还支持云服务部署模式,比如Kubernetes(K8s)就是一个典型代表,Spark2.3开始支持将应用程序部署到K8s云容器中运行,像亚马逊云AWS、阿里云等云服务企业都推出了EMR(弹性MapReduce计算)的相关技术产品Spark应用程序部署实例(1)Local模式Local模式是在本地计算机上以单进程、多线程的方式运行,不依赖任何集群环境,也不需要什么特别的配置,特别适合在开发调试或简单数据计算任务的场合下使用这里的命令等价于pyspark--masterlocal[1],即开启一个线程在一个CPU核上运行,还可以指定类似local[2]或local[*]这样的参数,但不要超过实际的物理CPU核数。如果pyspark命令不带任何参数,则默认使用全部的CPU核,等价于pyspark--masterlocal[*]Spark应用程序部署实例(1)Local模式通过spark-submit命令提交应用程序时,也可以指定其以Local模式运行,以pi.py示例应用程序为例Spark应用程序部署实例(2)SparkStandalone模式在提交SparkStandalone集群之前,先确保Master进程和Worker进程正常运行。还有一个要特别注意的地方是,在同一节点中无论是使用SparkStandalone还是YARN集群,这两个集群环境都只能运行其中之一,不能同时使用首先检查当前节点配置的YARN集群服务是否处于停止状态,然后确认HDFS服务是否已启动,以及SparkStandalone集群服务是否正在运行Spark应用程序部署实例(2)SparkStandalone模式继续输入下面的命令,以集群模式启动PySparkShell交互式编程环境同样地,可以输入几条简单的代码进行测试。测试完毕后,直接退出PySparkShell交互式编程界面Spark应用程序部署实例(2)SparkStandalone模式如果将这里的命令改为cluster模式,则在启动命令时会出现错误,提示SparkStandalone集群环境不支持Python应用程序的cluster模式Spark应用程序部署实例(2)SparkStandalone模式将示例应用程序pi.py提交到SparkStandalone集群中,并以client模式运行Spark应用程序部署实例(2)SparkStandalone模式如果提交的pi.py到Standalone集群中以cluster模式运行,会提示“SparkStandalone集群环境不支持Python应用程序的cluster模式”错误信息Spark应用程序部署实例(2)SparkStandalone模式这里归纳一下SparkStandalone模式的使用规律
在SparkStandalone集群环境下,只能以client模式运行pyspark交互命令,或以client模式提交PySpark应用程序,比如pi.py。
在SparkStandalone集群环境下,既不支持pyspark这类交互命令以cluster模式运行,也不支持PySpark应用程序以cluster模式提交。也就是说,SparkStandalone集群环境不支持以cluster模式运行任何PySpark应用程序。在SparkStandalone集群环境下,由Scala/Java编写的原生应用程序,既能以client模式提交,也能以cluster模式提交。但spark-shell这类原生交互命令只能以client模式运行。
Standalone集群环境下提交的应用程序,或运行的交互命令,都可以通过集群管理WebUI页面(http://localhost:8080/)来观察其运行状态Spark应用程序部署实例(3)SparkonYARN模式YARN和Standalone都是集群管理器,但在同一个集群的节点中,它们两者不能同时运行。因此,若要将Spark应用程序提交到YARN集群,就必须先停止SparkStandalone集群服务,然后启动YARN服务Spark应用程序部署实例(3)SparkonYARN模式除了确保YARN和HDFS服务正常运行,还有一项准备工作要做。因为提交的Spark计算任务是在YARN集群环境中运行的,在运行时要用到Spark安装目录中的jars依赖库文件,所以应该事先将这些jars依赖库文件放到HDFS上,否则每次提交Spark应用程序时都要上传一遍,要等待较长时间Spark应用程序部署实例(3)SparkonYARN模式继续修改spark-env.sh配置文件Spark应用程序部署实例(3)SparkonYARN模式准备工作就绪,现在以YARN集群模式启动PySparkShell交互式编程环境Spark应用程序部署实例(3)SparkonYARN模式PySparkShell交互式编程界面也不能在YARN中以cluster模式运行Spark应用程序部署实例(3)SparkonYARN模式尝试将示例应用程序pi.py提交到YARN集群中运行Spark应用程序部署实例(3)SparkonYARN模式再来尝试是否能够以cluster模式将示例应用程序pi.py提交到YARN集群中,观察一下执行的过程Spark应用程序部署实例(3)SparkonYARN模式当示例应用程序pi.py提交完毕后,终端窗体还会显示提交的状态信息,但程序运行产生的计算结果不会在Linux终端窗体中输出,这是因为cluster模式的Driver进程是在YARN集群的内部运行的,只能通过YARN集群的WebUI管理页面才能看到(http://localhost:8088/)Spark应用程序部署实例(3)Spark应用的部署参数将Spark应用程序部署到集群节点中运行时,在命令行可以根据需要设置各种运行参数,包括--master、--deploy-mode等,以便灵活控制使用的内存、CPU等资源。下面列出一些常用的Spark部署参数(其中有圆圈标记的使用频率较高)--master◎:集群的Master主节点地址,可以是spark://host:port、yarn、yarn-cluster、yarn-client、local、mesos://host:port等,默认为local,即本地运行。--deploy-mode◎:指定Driver进程所在的节点,可以是client或者cluster。前者是运行在提交任务的客户端,后者是在集群的一个节点上运行。若不指定--deploy-mode参数,则默认以client模式运行。--driver-memory◎:Driver进程使用的内存大小,如5
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 基站建设项目可行性研究报告(案例模板)
- 中国IT冷却系统行业市场调研分析及投资战略规划报告
- 2024年陶瓷阀芯行业市场深度调研分析及投资前景研究预测报告目录
- 2025年脉冲点焊机行业深度研究分析报告
- 2024-2025学年高中历史课时作业4古代中国的经济政策人民版必修2
- 2024-2025学年高中英语Unit4Sharing单元加餐练新人教版选修7
- 2025年可折叠电吹风项目投资可行性研究分析报告
- 2024-2025学年高中数学第三章空间向量与立体几何3.2.1用向量方法解决平行问题练习含解析新人教A版选修2-1
- 2024-2025学年高中地理第6章人类与地理环境的协调发展第2节中国的可持续发展实践练习新人教版必修2
- 2024-2025学年高中生物专题4酶的研究与应用课题2探讨加酶洗衣粉的洗涤效果练习含解析新人教版选修1
- 车辆采购论证方案
- 《ZARA服装品牌策划》课件
- 员工赔偿金保密协议书(2篇)
- GB/T 44828-2024葡萄糖氧化酶活性检测方法
- GB/T 44865-2024物联网基于物联网和传感网技术的动产监管集成平台系统要求
- 燃气公司绩效考核管理制度
- 高中生物课程标准(人教版)
- 第三章-自然语言的处理(共152张课件)
- 2023版初中语文新课程标准
- 人音版音乐一年级上册第3课《国旗国旗真美丽》说课稿
- GB/T 44255-2024土方机械纯电动液压挖掘机能量消耗量试验方法
评论
0/150
提交评论