设为首页 收藏本站
查看: 1045|回复: 0

[经验分享] Apache Spark技术实战之8:Standalone部署模式下的临时文件清理

[复制链接]

尚未签到

发表于 2015-7-31 08:15:40 | 显示全部楼层 |阅读模式
  未经本人同意严禁转载,徽沪一郎。

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

部署时的第三方依赖

  再提出具体的疑问之前,先回顾一下standalone的部署模式
  在standalone下又分为client模式和cluster模式,其中client模式下,driver和client运行于同一JVM中,不由worker启动,该JVM进程直到spark application计算完成返回结果后才退出。如下图所示。
DSC0000.png
  而在cluster模式下,driver由worker启动,client在确认spark application成功提交给cluster后直接退出,并不等待spark application运行结果返回。如下图所示
DSC0001.png
  
  从部署图来进行分析,每个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运行时生成的日志信息。
DSC0002.png

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

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

实验2:不进行RDD Cache
DSC0004.png
  进入spark-shell之后运行

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
DSC0005.png
  进入spark-shell之后运行

spark-shell>val rdd1 = sc.textFile(“README.md”).flatMap(l=>l.split(“ “)).map(w=>(w,1)).reduceByKey(_ + _)
spark-shell> rdd1.persist(MEMORY_AND_DISK_SER)
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再去下载一次罢了

find $SPARK_LOCAL_DIRS -max-depth 1 -type f -mtime 1 -exec rm -- {} \;

  而SPARK_WORK_DIR目录下的形如app-timestamp-seqid的文件夹默认不会自动清除。
  那么可以设置哪些选项来自动清除已经停止运行的application的文件夹呢?当然有。
  在spark-env.sh中加入如下内容

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

  注意官方文档中说不管程序是否已经停止,都会删除文件夹,这是不准确的,只有停止掉的程序文件夹才会被删除,我已提交相应的PR.
  如果Spark应用程序需要长时间运行,生成的许多shuffle output何时再清理呢?可以通过配置spark.cleaner.ttl来设置清理的时间。

实验4
  写一个简单的WordCount,然后以Standalone Cluster模式提交运行,察看$SPARK_LOCAL_DIRS下文件内容的变化。

import org.apache.spark._
import org.apache.spark.{SparkConf, SparkContext}
import org.apache.spark.SparkContext._
import java.util.Date
object HelloApp {
def main(args: Array[String]): Unit = {
val conf = new SparkConf()
val sc = new SparkContext()
val fileName = "$SPARK_HOME/README.md"
val rdd1 = sc.textFile(fileName).flatMap(l => l.split(" ")).map(w => (w, 1))
rdd1.reduceByKey(_ + _).foreach(println)
var i: Int = 0
while ( i < 10 ) {
Thread.sleep(10000)
i = i + 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相关。
  

参考资料


  • https://spark.apache.org/docs/1.2.0/submitting-applications.html
  • https://spark.apache.org/docs/1.2.0/spark-standalone.html
  • http://mail-archives.apache.org/mod_mbox/spark-commits/201410.mbox/%3C2c2ce06abc7d48d48f17f8e458a53219@git.apache.org%3E
  • https://issues.apache.org/jira/browse/SPARK-4323
  • https://issues.apache.org/jira/browse/SPARK-2713

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-92449-1-1.html 上篇帖子: The type org.apache.commons.cli.Options cannot be resolved. It is indirectly ref 下篇帖子: Windows下apache php wordpress配置
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表