
# JDBCServer长时间运行导致磁盘空间不足
#### 用户问题
连接Spark的JDBCServer服务提交spark-sql任务到yarn集群上，在运行一段时间以后会出现Core节点的数据盘被占满的情况。
#### 问题现象
客户连接Spark的JDBCServer服务提交spark-sql任务到yarn集群上，在运行一段时间以后会出现Core节点的数据盘被占满的情况。
后台查看磁盘使用情况，主要是JDBCServer服务的APP临时文件（shuffle生成的文件）太多，并且没有进行清理占用了大量内存。
#### 原因分析
查询Core节点有大量文件的目录，发现大部分都是类似"blockmgr-033707b6-fbbb-45b4-8e3a-128c9bcfa4bf"的目录，里面存放了计算过程中产生的shuffle临时文件。
因为JDBCServer启动了Spark的动态资源分配功能，已经将shuffle托管给NodeManager，NodeManager只会按照APP的运行周期来管理这些文件，并不会关注单个executor所在的container是否存在。因此，只有在APP结束的时候才会清理这些临时文件。任务运行时间较长时导致临时文件过多占用了大量磁盘空间。
#### 处理步骤
**MRS 3.2.1-LTS之前的版本：**
启动一个定时任务来清理超过一定时间的shuffle文件，例如每个整点清理超过6个小时的文件：
1. 创建脚本"clean_appcache.sh"，若存在多个数据盘，请根据实际情况修改BASE_LOC中data1的值。 
   - 安全集群
     ```
     #!/bin/bash
     BASE_LOC=/srv/BigData/data1/nm/localdir/usercache/spark2x/appcache/application_*/blockmgr*
     find $BASE_LOC/ -mmin +360 -exec rmdir {} \; 
     find $BASE_LOC/ -mmin +360 -exec rm {} \;
     ```
     
   
   - 普通集群
     ```
     #!/bin/bash 
     BASE_LOC=/srv/BigData/data1/nm/localdir/usercache/omm/appcache/application_*/blockmgr*  
     find $BASE_LOC/ -mmin +360 -exec rmdir {} \; 
     find $BASE_LOC/ -mmin +360 -exec rm {} \;
     ```
     
   
   
   ![](https://support.huaweicloud.com/trouble-mrs/public_sys-resources/caution_3.0-zh-cn.png)
   - 在执行前，需要检查待执行的脚本与文档是否一致，避免人工失误导致其他路径数据被误删。
   
   - 脚本执行前需确认BASE_LOC变量对应的路径在集群中是否存在，不存在需修改为对应的路径。
    
   
   
2. 修改脚本权限。 
   **chmod 755 clean_appcache.sh**
   **dos2unix clean_appcache.sh**
   
   
3. 增加一个定时任务来启动清理脚本，脚本路径请根据实际脚本存放位置修改。 
   查看定时任务：**crontab -l**
   编辑定时任务：**crontab -e**
   ```
   0 * * * * sh /root/clean_appcache.sh > /dev/null 2>&1
   ```
   
   
**MRS 3.2.1-LTS及之后的版本：**
1. 登录Manager界面，选择"集群 \> 服务 \> Spark \> 配置 \> 全部配置 \> JDBCServer\> 自定义 \> custom"，增加自定义配置项：**spark.shuffle.service.removeShuffle** **=true** ，如下图所示：
   
   ![](https://support.huaweicloud.com/trouble-mrs/zh-cn_image_0000002443349556.png "点击放大")
   
   
   
2. 单击"保存"保存配置。选择"集群 \> 服务 \> Spark \> 实例"勾选所有JDBCServer实例，选择"更多 \> 滚动重启实例"，重启所有的JDBCServer实例。
 
