package com.taobao.zeus.jobs.sub.tool; import java.io.File; import java.io.FileInputStream; import java.text.SimpleDateFormat; import java.util.Calendar; import java.util.Date; import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.fs.FileStatus; import org.apache.hadoop.fs.FileSystem; import org.apache.hadoop.fs.Path; import org.springframework.context.ApplicationContext; import com.taobao.zeus.jobs.AbstractJob; import com.taobao.zeus.jobs.JobContext; import com.taobao.zeus.jobs.sub.conf.ConfUtil; import com.taobao.zeus.model.processer.OutputCleanProcesser; public class OutputCleanJob extends AbstractJob{ private OutputCleanProcesser ocp; public OutputCleanJob(JobContext jobContext,OutputCleanProcesser p,ApplicationContext applicationContext) { super(jobContext); this.ocp=p; } @Override public Integer run() throws Exception { if(jobContext.getCoreExitCode()!=0){ log("Job 运行失败,不进行产出目录清理"); return 0; } log("OutputClean 开始进行产出目录清理"); String path=ocp.getPath(); FileSystem fs=FileSystem.get(ConfUtil.getDefaultCoreSite()); FileStatus[] pathFiles=fs.listStatus(new Path(path)); boolean valid=true; for(FileStatus f:pathFiles){ if(f.isDir()){ valid=false; log("产出路径下面有文件夹,怀疑路径设置有错,拒绝执行清理操作"); break; } } if(!valid){ return 0; } String upperPath=path; if(upperPath.endsWith("/")){ upperPath=upperPath.substring(0,path.length()-1); } upperPath=upperPath.substring(0,upperPath.lastIndexOf("/")); Path hdfsPath=new Path(upperPath); SimpleDateFormat format=new SimpleDateFormat("yyyyMMdd"); Calendar cal=Calendar.getInstance(); cal.add(Calendar.DAY_OF_YEAR, ocp.getDays()*(-1)); Date limit=format.parse(format.format(cal.getTime())); FileStatus[] files=fs.listStatus(hdfsPath); for(FileStatus f:files){ String tmpPath=f.getPath().toString(); if(tmpPath.contains("/pt=")){ String yyyyMMdd=tmpPath.substring(tmpPath.indexOf("/pt=")+4,tmpPath.indexOf("/pt=")+12); Date fdate=format.parse(yyyyMMdd); if(fdate.before(limit)){ jobContext.getJobHistory().getLog().appendZeus("删除目录:" +tmpPath); fs.delete(f.getPath(),true); } } } return 0; } @Override public void cancel() { canceled=true; } }