问题导读

1.在Standalone部署模式下,Spark运行过程中会创建哪些临时性目录及文件?
2.在Standalone部署模式下分为几种模式?
3.在client模式和cluster模式下有什么不同?

概要

在Standalone部署模式下,Spark运行过程中会创建哪些临时性目录及文件,这些临时目录和文件又是在什么时候被清理,本文将就这些问题做深入细致的解答。
从资源使用的方面来看,一个进程运行期间会利用到这四个方面的资源,分别是CPU,内存,磁盘和网络。进程退出之后,CPU,内存和网络都会由操作系统负责释放掉,但是运行过程中产生临时文件如果进程自己不在退出之前有效清除,就会留下一地鸡毛,浪费有效的存储空间。

部署时的第三方依赖

再提出具体的疑问之前,先回顾一下standalone的部署模式
在standalone下又分为client模式和cluster模式,其中client模式下,driver和client运行于同一JVM中,不由worker启动,该JVM进程直到spark application计算完成返回结果后才退出。如下图所示。

而在cluster模式下,driver由worker启动,client在确认spark application成功提交给cluster后直接退出,并不等待spark application运行结果返回。如下图所示

spark访问cassandra

从部署图来进行分析,每个JVM进程在启动时的文件依赖如何得到满足。
  • Master进程最为简单,除了spark jar包之外,不存在第三方库依赖
  • Driver和Executor在运行的时候都有可能存在第三方包依赖,分开来讲
    • Driver比较简单,spark-submit在提交的时候会指定所要依赖的jar文件从哪里读取
    • Executor由worker来启动,worker需要下载Executor启动时所需要的jar文件,那么从哪里下载呢。
为了解决Executor启动时依赖的Jar问题,Driver在启动的时候要启动
HttpFileServer存储第三方jar包,然后由worker从HttpFileServer来获取。为此HttpFileServer需要创建
相应的目录,而Worker也需要创建相应的目录。
HttpFileServer创建目录的过程详见于SparkEnv.scala中create函数。
spark会为每一个提交的application生成一个文件夹,默认位于$SPARK_HOME/work目录下,用以存放从HttpFileServer下载下来的第三方库依赖及Executor运行时生成的日志信息。

实验1

运行spark-shell,查看在/tmp目录下会新产生哪些目录。
#$SPARK_HOME/bin/spark-shell
在/tmp目录下会新增四个与spark-shell相关的文件夹
spark+随机数目录
  分别用于driver本身,driver创建的tmp目录,httpfileserver创建的目录
spark-local目录
  用以存放executor执行过程中生成的shuffle output和cache的内容

运行中的临时文件

Executor在运行的时候,会生成Shuffle Output,如果对RDD进行Cache的话,还有可能会将RDD的内容吐到磁盘中。这些都意味着需要有一个文件夹来容纳这些东西。
上文中提到的形如spark-local-*的目录就是用以存储executor运行时生成的临时文件。
可以通过两个简单的实验来看spark-local-*目录下内容的变化。

实验2:不进行RDD Cache

进入spark-shell之后运行

  1. spark-shell>sc.textFile(“README.md”).flatMap(l=>l.split(“ “)).map(w=>(w,1)).reduceByKey(_ + _).foreach(println)

复制代码

上述指令会生成两个不同的Stage, 所以会有Shuffle Output,具体划分原因就不再细述了。
如果使用的是spark 1.2.x,可以看到有在spark-local-*目录下有index文件生成。

实验3: 进行RDD Cache

进入spark-shell之后运行
  1. spark-shell>val rdd1 = sc.textFile(“README.md”).flatMap(l=>l.split(“ “)).map(w=>(w,1)).reduceByKey(_ + _)
  2. spark-shell> rdd1.persist(MEMORY_AND_DISK_SER)
  3. spark-shell>rdd1.foreach(println)

复制代码

上述指令执行后,不仅会有index文件还会有形如rdd*的文件生成,这些rdd打头的文件就是cache内容。

配置项

可以通过在$SPARK_HOME/conf/spark-env.sh中指定配置内容来更改默认的存储位置。
SPARK_WORK_DIR 指定work目录,默认是$SPARK_HOME/work子目录
SPARK_LOCAL_DIRS 指定executor运行生成的临时文件目录,默认是/tmp,由于/tmp目录有可能是采用了tmpfs,建议在实际部署中将其更改到其它目录

文件的清理

上述过程中生成的临时文件在什么时候会被删除掉呢?
也许第一感觉就是spark application结束运行的时候呗,直觉有时不见得就是对的。
SPARK_LOCAL_DIRS
下的产生的文件夹,确实会在应用程序退出的时候自动清理掉,如果观察仔细的话,还会发现在spark_local_dirs目录有有诸如*_cache
和*_lock的文件,它们没有被自动清除。这是一个BUG,可以会在spark 1.3中加以更正。有关该BUG的具体描述,参考spark-4323
https://issues.apache.org/jira/browse/SPARK-4323
$SPARK_LOCAL_DIRS
下的*_cache文件是为了避免同一台机器中多个executor执行同一application时多次下载第三方依赖的问题而引进的patch,详见
JIRA case spark-2713. 对就的代码见spark/util/Utils.java中的fetchFile函数。https://issues.apache.org/jira/browse/SPARK-2713
如果已经在使用了,有什么办法来清除呢?暴力删除,不管三七二十一,过一段时间将已经存在的cache和lock全部删除。这不会有什么副作用,大不了executor再去下载一次罢了
  1. find $SPARK_LOCAL_DIRS -max-depth 1 -type f -mtime 1 -exec rm -- {} \;

复制代码

而SPARK_WORK_DIR目录下的形如app-timestamp-seqid的文件夹默认不会自动清除。

那么可以设置哪些选项来自动清除已经停止运行的application的文件夹呢?当然有。

在spark-env.sh中加入如下内容

  1. SPARK_WORKER_OPTS=”-Dspark.worker.cleanup.enabled=true”

复制代码

注意官方文档中说不管程序是否已经停止,都会删除文件夹,这是不准确的,只有停止掉的程序文件夹才会被删除,我已提交相应的PR.

实验4

写一个简单的WordCount,然后以Standalone Cluster模式提交运行,察看$SPARK_LOCAL_DIRS下文件内容的变化。
  1. import org.apache.spark._
  2. import org.apache.spark.{SparkConf, SparkContext}
  3. import org.apache.spark.SparkContext._
  4. import java.util.Date
  5. object HelloApp {
  6. def main(args: Array[String]): Unit = {
  7. val conf = new SparkConf()
  8. val sc = new SparkContext()
  9. val fileName = "$SPARK_HOME/README.md"
  10. val rdd1 = sc.textFile(fileName).flatMap(l => l.split(" ")).map(w => (w, 1))
  11. rdd1.reduceByKey(_ + _).foreach(println)
  12. var i: Int = 0
  13. while ( i < 10 ) {
  14. Thread.sleep(10000)
  15. i = i + 1
  16. }
  17. }
  18. }

复制代码

提交运行

  1. spark-submit –class HelloApp –master spark://127.0.0.1:7077  --deploy-mode cluster HelloApp.jar

复制代码

小结

本文通过几个简单易行的实验来观测standalone模式下临时文件的产生和清除,希望有助于理解spark中磁盘资源的申请和释放过程。
Spark部署时相关的配置项比较多,如果先进行分类,然后再去配置会容易许多,分类有CPU、Memory、Network、Security、Disk及Akka相关。

相关文章

Spark技术实战之1 -- KafkaWordCount
http://www.aboutyun.com/thread-9580-1-1.html

Spark技术实战之2 -- Spark Cassandra Connector的安装和使用
http://www.aboutyun.com/thread-9582-1-1.html

Spark技术实战之3 -- 利用Spark将json文件导入Cassandra
http://www.aboutyun.com/thread-9583-1-1.html

Apache Spark技术实战之4 -- SparkR的安装及使用
http://www.aboutyun.com/thread-10082-1-1.html

Apache Spark技术实战之5 -- spark-submit常见问题及其解决
http://www.aboutyun.com/thread-10083-1-1.html

Apache Spark技术实战之6 --Standalone部署模式下的临时文件清理
http://www.aboutyun.com/thread-11862-1-1.html

http://www.tuicool.com/articles/RV3MFz

Apache Spark技术实战之6 --Standalone部署模式下的临时文件清理的更多相关文章

  1. Apache Spark技术实战之8:Standalone部署模式下的临时文件清理

    未经本人同意严禁转载,徽沪一郎. 概要 在Standalone部署模式下,Spark运行过程中会创建哪些临时性目录及文件,这些临时目录和文件又是在什么时候被清理,本文将就这些问题做深入细致的解答. 从 ...

  2. Apache Spark源码走读之15 -- Standalone部署模式下的容错性分析

    欢迎转载,转载请注明出处,徽沪一郎. 概要 本文就standalone部署方式下的容错性问题做比较细致的分析,主要回答standalone部署方式下的包含哪些主要节点,当某一类节点出现问题时,系统是如 ...

  3. Apache Spark技术实战之4 -- 利用Spark将json文件导入Cassandra

    欢迎转载,转载请注明出处. 概要 本文简要介绍如何使用spark-cassandra-connector将json文件导入到cassandra数据库,这是一个使用spark的综合性示例. 前提条件 假 ...

  4. Apache Spark技术实战之3 -- Spark Cassandra Connector的安装和使用

    欢迎转载,转载请注明出处,徽沪一郎. 概要 前提 假设当前已经安装好如下软件 jdk sbt git scala 安装cassandra 以archlinux为例,使用如下指令来安装cassandra ...

  5. Apache Spark技术实战之9 -- 日志级别修改

    摘要 在学习使用Spark的过程中,总是想对内部运行过程作深入的了解,其中DEBUG和TRACE级别的日志可以为我们提供详细和有用的信息,那么如何进行合理设置呢,不复杂但也绝不是将一个INFO换为TR ...

  6. Apache Spark技术实战之6 -- spark-submit常见问题及其解决

    除本人同意外,严禁一切转载,徽沪一郎. 概要 编写了独立运行的Spark Application之后,需要将其提交到Spark Cluster中运行,一般会采用spark-submit来进行应用的提交 ...

  7. Apache Spark技术实战之1 -- KafkaWordCount

    欢迎转载,转载请注明出处,徽沪一郎. 概要 Spark应用开发实践性非常强,很多时候可能都会将时间花费在环境的搭建和运行上,如果有一个比较好的指导将会大大的缩短应用开发流程.Spark Streami ...

  8. Apache Spark技术实战之7 -- CassandraRDD高并发数据读取实现剖析

    未经本人同意,严禁转载,徽沪一郎. 概要 本文就 spark-cassandra-connector 的一些实现细节进行探讨,主要集中于如何快速将大量的数据从cassandra 中读取到本地内存或磁盘 ...

  9. Apache Spark技术实战之5 -- SparkR的安装及使用

    欢迎转载,转载请注明出处,徽沪一郎. 概要 根据论坛上的信息,在Sparkrelease计划中,在Spark 1.3中有将SparkR纳入到发行版的可能.本文就提前展示一下如何安装及使用SparkR. ...

随机推荐

  1. 【Tomcat】Tomcat的类加载机制

    在Tomcat中主要有以下几种类加载器:(图片来自网络) tomcat启动时,会创建几种类加载器: 1 Bootstrap 引导类加载器 加载JVM启动所需的类,以及标准扩展类,位于jre/lib/e ...

  2. python面向对象学习(六)类属性、类方法、静态方法

    目录 1. 类的结构 1.1 术语 -- 实例 1.2 类是一个特殊的对象 2. 类属性和实例属性 2.1 概念和使用 2.2 属性的获取机制 3. 类方法和静态方法 3.1 类方法 3.2 静态方法 ...

  3. youtube link for review STAT(1)

    Confidence Interval: https://www.youtube.com/watch?v=bekNKJoxYbQ Introduction to confidence interval ...

  4. 1.创建和销毁对象_EJ

    在这里记录<Effective Java>学习笔记.该书介绍了java编程中70多种极具实用价值的经验规则,揭示了该做什么,不该做什么才能产生清晰.健壮和高效的代码. 第1条: 考虑用静态 ...

  5. js 属性增改删操作

    js 属性增改删操作,可参看菜鸟教程,这里记录一个小问题:disabled属性 使用setAttribute操作无法 禁用disabled属性,需使用removeAttribute操作,原因是只要有d ...

  6. JavaScript易错知识点整理[转]

    前言 本文是我学习JavaScript过程中收集与整理的一些易错知识点,将分别从变量作用域,类型比较,this指向,函数参数,闭包问题及对象拷贝与赋值这6个方面进行由浅入深的介绍和讲解,其中也涉及了一 ...

  7. 洛谷P4841 城市规划(生成函数 多项式求逆)

    题意 链接 Sol Orz yyb 一开始想的是直接设\(f_i\)表示\(i\)个点的无向联通图个数,枚举最后一个联通块转移,发现有一种情况转移不到... 正解是先设\(g(n)\)表示\(n\)个 ...

  8. Tomcat post参数长处理

    如下图所示:增加maxPostSize="-1"属性即可

  9. [IB]Integration Broker 是如何处理传入的请求(Part 2)

    让我们讨论一下集成代理如何处理传入的请求.可以先阅读(理解PeopleSoft集成代理 Part1). 当PeopleSoft集成代理接收传入请求时,会发生一系列事件. 当侦听连接器(Listenin ...

  10. Android Dialog对话框

    Dialog的基本方法 //创建Dialog AlertDialog.Builder builder = new AlertDialog.Builder(MainActivity.this); //设 ...