SparkSubmit object分析
org.apache.spark.deploy.SparkSubmit分析
-
Object SparkSubmit类图分析
结合spark的log4j来说,printStream为error,log4j的配置也是System.error,导致做日志收集的时候莫名其妙。。。。
解决方案如下,采用重新构造log4j的appender:Logger.getRootLogger.removeAllAppenders() Logger.getRootLogger.setLevel(Level.INFO) val console = new ConsoleAppender() console.setTarget("System.out") val patternLayout = new PatternLayout() patternLayout.setConversionPattern("%c{1}: %m%n") console.setLayout(patternLayout) console.setEncoding("UTF-8") console.setName("console") console.activateOptions() Logger.getRootLogger.addAppender(console)
-
main方法执行
- 创建org.apache.spark.deploy.SparkSubmit类,重写parseArguments、logInfo、logWarning、doSubmit方法,执行doSubmit方法。
- 调用duSubmit方法,实际调用org.apache.spark.deploy.SparkSubmit类的submit对象。
-
执行doSubmit方法
- 初始化log4j,查找classloader中org/apache/spark/log4j-defaults.properties,如果存在,PropertyConfigurator.configure("org/apache/spark/log4j-defaults.properties")。如果不在输出Spark was unable to load org/apache/spark/log4j-defaults.properties。
- 解析提交参数,返回SparkSubmitArguments对象,具体实现方式如图:
- 如果verbose=true,输出参数信息
- 通过action,执行不同的启动方法,这里以SparkSubmitAction.SUBMIT为例。
- 执行submit方法。首先判断master.startsWith("spark://") && deployMode == "cluster",这里我们应该是false,执行doRun方法。查看是否设置了proxyUser,如果是设置hdfs的security(一些大数据平台修改了底层认证,如tbds、fi等,应该相对应在这里的源码做了处理)。执行runMain方法。
-
runMain方法
- 执行prepareSubmitEnvironment
- 设置classloader,如果设置了spark.driver.userClassPathFirst=true,创建出ChildFirstURLClassLoader,否则创建出MutableURLClassLoader。
- 把childClasspath加载到当前的classloader
- 利用反射初始化mainclass,根据mainclass的类型创建出不同的SparkApplication,scala.App的是JavaMainApplication,其他的则用SparkApplication
- 执行application start()方法。
-
执行prepareSubmitEnvironment
- 创建SparkConf!!!,将system的spark开头的env参数加载。
- 根据args.master设置clusterManager=1(YARN),根据args.deployMode,如果没有填,默认是client,如果填了cluster,默认是cluster。如果master写了yarn-cluster,默认为yarn,cluster,测试org.apache.spark.deploy.yarn.YarnClusterApplication是否可以被加载。默认情况下可能找不到这个类,因为默认没有加入到maven编译内,尴尬,只能手动加入!!!
- args.sparkProperties加入到sparkConf。
- 创建org.apache.hadoop.conf.Configuration,将sparkConf中以spark.hadoop.开头的参数截取,添加到configuration中,设置默认的io.file.buffer.size为65536。
- 创建临时目录,地址在System.getProperty("java.io.tmpdir"),对于linux系统一般为/tmp目录。目录名称为spark-#{UUID},添加ShutdownHookManager,当程序结束时清理目录。
- 设置principal,keytab。在sparkconf中存入,并且在hdfs登录。
- 如果deployMode是client,移动--jars,--files,--pyFiles,--archives到第5步创建好的目录内,并且将这些参数的地址修改为临时目录下的真是地址。
- 以下就是添加相关参数。
- childMainClass如果是client模式,最终为我们所写的main函数,如果是cluster模式,最终为org.apache.spark.deploy.yarn.YarnClusterApplication。
-
sparkconf内容变化
- 加载系统配置,加载spark.开头的参数
- set命令行加载的参数
- 设置spark.yarn.keytab,spark.yarn.principal参数
- 加载SparkSubmit496-555行的参数,参数的具体值根据命令行设置
- 重复2操作,设置不存在的命令行参数??why??
- 将附件做文件路径解析后的路径set
-
childClasspath变化过程
- 如果是client模式,把提交的jar和--jars的jar加入classpath
- 如果是yarn模式且deploy为cluster时,把提交的jar和--jars的jar加入classpath
-
childArgs变化
- 如果是client模式,把提交命令行的args参数加入到childArgs
- 把所有的OptionAssigner加入childArgs
- 如果是yarn-cluster模式,加入--class参数,--jar参数,把提交命令行的args参数加入到childArgs

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
Maven相关知识总结
Maven相关知识总结 目录 认识Maven Maven下载安装 Maven能用来做什么 Maven核心概念 开发目录 坐标和仓库 POM文件 POM文件内容 Maven依赖管理 构建生命周期 构建多模块系统 聚合 继承 聚合与继承 认识Maven Maven是Apache软件基金会组织维护的一款自动化构建工具, 专注于Java平台工程的项目构建和依赖管理:1:项目构建构建不是创建,创建一个工程并不等于构建一个项目,用Maven可以管理项目开发的整个生命周期2:依赖管理管理项目依赖的所有jar文件,Maven项目依赖于一个库,而这个库又依赖其他库,只需要加上直接依赖的库,间接依赖的库也会加入到项目中假设上图,引入spring-mvc后,spring-mvc依赖的spring-core等库也会加入到项目里面 Maven下载安装 Maven 是一个基于 Java 的工具,所以要做的第一件事情就是安装JDK,下载安装只需要把下载的文件解压到指定目录,然后配置环境变量即可:1:准备依赖的JDK2:下载安装3:配置环境变量4:测试是否安装成功环境变量配置:新建系统变量MAVEN_HOME,设置变...
- 下一篇
【博客大赛】Android 性能优化总结
性能的优化是一个老生常谈的点,也是一个比较重要的点。做过一点性能优化的工作,现在对工作中的优化点做一个总结。如有错误,还请指正。 有哪些方面需要优化 在平时的优化过程中我们需要从哪几个点来优化呢?其实我们平时自己一定也用过软件,在使用软件的过程中有没有什么想吐槽的呢? “这个 app 怎么还没下载完!”、“太卡了吧!”、"图片怎么还没加载出来!"、"怎么刚进去就卡了!"、“这么点了一下就退出了!”等等,是不是有这样的想法?这些想法其实包含了我们今天要说的内容,就是从哪些方面来优化我们的 APP ,我总结了以下几点。 APK 瘦身优化 启动速度优化 稳定性优化 内存的优化 操作流畅度优化 当然,需要优化的不仅仅是这几个方面,我做的比较多的优化是这几个方面,暂时就这几个方面来谈谈优化吧。 APK 瘦身 如何查看 APK 的组成 如果要优化 APK 的大小,我们首先需要知道我们编译出来的 APK 都包含哪些东西,然后针对占用大的做裁剪,或者删除不需要的东西,从而达到瘦身的目的。 查看 APK 的内容占用情况很简单,打开 AS ,把 APK 拖到 AS 里面就可以查看 APK 包含的内容了。 ...
相关文章
文章评论
共有0条评论来说两句吧...