这次主要讲一下spark的提交具体操作和流程。原来一直用,也没怎么深入查看,那么这次就来仔细看一下提交的学问。跟我们以前一样,我们以官网下手。这里我不在把英文贴上,直接进行。
在spark的bin文件夹下的spark-submit脚本是用来提交应用的。它能够通过一个统一的接口来使用所有spark支持的集群管理器,所以我们不必单独配置每一个应用。
如果你的代码依赖其他的项目,那么你需要与应用程序一起打包他们,为了把代码分布到spark集群中。想要实现这一点,你需要打一个jar包包含你的程序还有他所有的依赖。SBT和Maven都有该组件插件。当创建一个组合jar包时,把spark和hadoop列为provided的依赖。他们之所有被设置为provided是因为在集群管理器运行的时候这些都会被提供。一旦你有了组合jar包,那么你就可以调用bin/spark-submit的脚本来提交你的应用了。
该脚本支持不同的集群管理器和发布模式:
一些通常的用法如下:
1.--class:你程序的入口(就是你的main方法类)
2.--master:集群的主节点URL(比如:spark://主机:IP)
3.--deploy-mode:发布你的应用到集群(cluster)还是本地(client)
4.--conf:任意key=value形式的spark配置属性,如果value包含空格,那么"key=value"要用引号引起
5.application-jar:包含你的应用和其依赖的jar包的路径,url必须在你的集群内部全局可见,不如hdfs://亦或是file://的路径
6.application-arguments:传入你的main方法的参数(如果你需要的话)
一个通用的发布策略是从在地理上就接近你的网关机提交你的应用(白话就是哪台机器离你近就用那台机器提交,都远的话,你随意)。在这种机制下,client模式是合适的。在client模式下,驱动(driver)被直接提交在spark-submit进程内,对于集群来讲,相当于一个客户端。应用的输入和输出被打印在控制台,因此,这种模式非常适合包含REPL(比如spark shell)的应用。
取而代之,如果你的机器离你都非常的远,我们通常使用cluster模式来减少driver和executor之间的延迟。
有几种有效的操作来指明正在使用的spark管理器。比如,在spark单集群的情况下使用cluster发布模式,你同样可以指明--supervise确保driver能够重新启动如果程序以非0得状态结束。想要列出所有的spark-submit有关的操作,使用--help,以下是几个通用操作的例子:
Master URL可使用以下的任意一种方式:
spark-submit可以从属性文件中加载默认的属性并把他们传递给你的应用。默认情况下,他将会从conf/spark-default.conf文件中读取配置。
此种方式读取默认的spark配置能够避免spark-submit的一些标记(意思就是你不用挨个指定他要求指定的一些标签),比如spark.master属性被设置,你能安全的从spark-submit中忽略--master标签.总体来讲,显示的设置sparkConf的值是优先的,接着是spark-submit中的标签,最后才是默认。
当你使用spark-submit的时候,--jars操作后面的所有应用的jar包以及一些其他的jar包都会被自动发送给集群。跟在--jars 后面的urls必须要用逗号隔开。这个list将会在driver和executor上面被包含,--jars并不支持目录扩展。
spark支持如下的jars的模板来传递jars:
1.file:绝对路径和file:/urls被driver的http文件服务器接收。每个executor从文件服务器拉取文件。
2.hdfs,http,https,ftp:这些从期望的uri拉取数据
3.local:以local:/开头的uri指的是每个worker节点本地存在文件,这也就意味着不会存在网络IO问题,同时对于worker之间传送较大的jars文件/凭借NFS/GlusterFS的也能够很好地运行。
jars和文件将会被复制到每个在executor节点上面工作的sparkcontext的工作目录中去。在一定时间内这将会用光相当一部分的空间,需要被清理干净。使用yarn的情况下,清理是自动完成的。spark单节点模式下,自动清理可以通过spark.worker.cleanup.appDataTtl来设置。
用户也许还会通过逗号隔开的maven coordinates(--packages)列表来包含一些其他的依赖,当使用此命令的时候,所有传递的依赖都会被处理。同时也可以使用--repositories 标签来添加库。这些命令在spark包中的pyspark,spark-shell,spark-submit中被使用。
好了,本次的内容就分享这么多,希望对大家有帮助。
感谢开源,让技术走近你我。