/**
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.apache.falcon.retention;
import org.apache.commons.cli.CommandLine;
import org.apache.commons.cli.GnuParser;
import org.apache.commons.cli.Option;
import org.apache.commons.cli.Options;
import org.apache.falcon.entity.FeedHelper;
import org.apache.falcon.entity.Storage;
import org.apache.falcon.workflow.util.OozieActionConfigurationHelper;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.conf.Configured;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.util.Tool;
import org.apache.hadoop.util.ToolRunner;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.io.PrintStream;
import java.util.Arrays;
import java.util.concurrent.atomic.AtomicReference;
/**
* Feed Evictor is called only if the retention policy that applies
* to the feed is that of delete.
*/
public class FeedEvictor extends Configured implements Tool {
private static final Logger LOG = LoggerFactory.getLogger(FeedEvictor.class);
public static final AtomicReference<PrintStream> OUT = new AtomicReference<PrintStream>(System.out);
public static void main(String[] args) throws Exception {
Configuration conf = OozieActionConfigurationHelper.createActionConf();
int ret = ToolRunner.run(conf, new FeedEvictor(), args);
if (ret != 0) {
throw new Exception("Unable to perform eviction action args: " + Arrays.toString(args));
}
}
@Override
public int run(String[] args) throws Exception {
CommandLine cmd = getCommand(args);
String feedPattern = cmd.getOptionValue("feedBasePath")
.replaceAll(Storage.QUESTION_EXPR_START_REGEX, Storage.DOLLAR_EXPR_START_REGEX);
String retentionType = cmd.getOptionValue("retentionType");
String retentionLimit = cmd.getOptionValue("retentionLimit");
String timeZone = cmd.getOptionValue("timeZone");
String frequency = cmd.getOptionValue("frequency"); //to write out smart path filters
String logFile = cmd.getOptionValue("logFile");
String feedStorageType = cmd.getOptionValue("falconFeedStorageType");
LOG.info("Applying retention on {} type: {}, Limit: {}, timezone: {}, frequency: {}, storage: {}",
feedPattern, retentionType, retentionLimit, timeZone, frequency, feedStorageType);
Storage storage = FeedHelper.createStorage(feedStorageType, feedPattern, getConf());
Path path = new Path(logFile);
StringBuilder buffer = storage.evict(retentionLimit, timeZone, path);
int len = buffer.length();
if (len > 0) {
OUT.get().println("instances=" + buffer.substring(0, len - 1));
} else {
OUT.get().println("instances=NULL");
}
return 0;
}
private CommandLine getCommand(String[] args) throws org.apache.commons.cli.ParseException {
Options options = new Options();
Option opt = new Option("feedBasePath", true,
"base path for feed, ex /data/feed/${YEAR}-${MONTH}");
opt.setRequired(true);
options.addOption(opt);
opt = new Option("falconFeedStorageType", true, "feed storage type, FileSystem or Table");
opt.setRequired(true);
options.addOption(opt);
opt = new Option("retentionType", true,
"type of retention policy like delete, archive etc");
opt.setRequired(true);
options.addOption(opt);
opt = new Option("retentionLimit", true,
"time limit for retention, ex hours(5), months(2), days(90)");
opt.setRequired(true);
options.addOption(opt);
opt = new Option("timeZone", true, "timezone for feed, ex UTC");
opt.setRequired(true);
options.addOption(opt);
opt = new Option("frequency", true,
"frequency of feed, ex hourly, daily, monthly, minute, weekly, yearly");
opt.setRequired(true);
options.addOption(opt);
opt = new Option("logFile", true, "log file for capturing size of feed");
opt.setRequired(true);
options.addOption(opt);
return new GnuParser().parse(options, args);
}
}