blob: 28e96e3a0f393b4cca69caceba8d9b56f5ba9ecc [file] [log] [blame]
/**
* 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.hcatalog.templeton;
import java.io.File;
import java.net.URL;
import java.util.Map;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.util.VersionInfo;
import org.apache.hcatalog.templeton.tool.JobState;
import org.apache.hcatalog.templeton.tool.ZooKeeperCleanup;
import org.apache.hcatalog.templeton.tool.ZooKeeperStorage;
/**
* The configuration for Templeton. This merges the normal Hadoop
* configuration with the Templeton specific variables.
*
* The Templeton configuration variables are described in
* templeton-default.xml
*
* The Templeton specific configuration is split into two layers
*
* 1. templeton-default.xml - All the configuration variables that
* Templeton needs. These are the defaults that ship with the app
* and should only be changed be the app developers.
*
* 2. templeton-site.xml - The (possibly empty) configuration that the
* system administrator can set variables for their Hadoop cluster.
*
* The configuration files are loaded in this order with later files
* overriding earlier ones.
*
* To find the configuration files, we first attempt to load a file
* from the CLASSPATH and then look in the directory specified in the
* TEMPLETON_HOME environment variable.
*
* In addition the configuration files may access the special env
* variable env for all environment variables. For example, the
* hadoop executable could be specified using:
*<pre>
* ${env.HADOOP_PREFIX}/bin/hadoop
*</pre>
*/
public class AppConfig extends Configuration {
public static final String[] HADOOP_CONF_FILENAMES = {
"core-default.xml", "core-site.xml", "mapred-default.xml", "mapred-site.xml"
};
public static final String[] HADOOP_PREFIX_VARS = {
"HADOOP_PREFIX", "HADOOP_HOME"
};
public static final String TEMPLETON_HOME_VAR = "TEMPLETON_HOME";
public static final String[] TEMPLETON_CONF_FILENAMES = {
"templeton-default.xml",
"templeton-site.xml"
};
public static final String PORT = "templeton.port";
public static final String EXEC_ENCODING_NAME = "templeton.exec.encoding";
public static final String EXEC_ENVS_NAME = "templeton.exec.envs";
public static final String EXEC_MAX_BYTES_NAME = "templeton.exec.max-output-bytes";
public static final String EXEC_MAX_PROCS_NAME = "templeton.exec.max-procs";
public static final String EXEC_TIMEOUT_NAME = "templeton.exec.timeout";
public static final String HADOOP_NAME = "templeton.hadoop";
public static final String HADOOP_CONF_DIR = "templeton.hadoop.conf.dir";
public static final String HCAT_NAME = "templeton.hcat";
public static final String HIVE_ARCHIVE_NAME = "templeton.hive.archive";
public static final String HIVE_PATH_NAME = "templeton.hive.path";
public static final String HIVE_PROPS_NAME = "templeton.hive.properties";
public static final String LIB_JARS_NAME = "templeton.libjars";
public static final String PIG_ARCHIVE_NAME = "templeton.pig.archive";
public static final String PIG_PATH_NAME = "templeton.pig.path";
public static final String STREAMING_JAR_NAME = "templeton.streaming.jar";
public static final String TEMPLETON_JAR_NAME = "templeton.jar";
public static final String OVERRIDE_JARS_NAME = "templeton.override.jars";
public static final String OVERRIDE_JARS_ENABLED = "templeton.override.enabled";
public static final String KERBEROS_SECRET = "templeton.kerberos.secret";
public static final String KERBEROS_PRINCIPAL = "templeton.kerberos.principal";
public static final String KERBEROS_KEYTAB = "templeton.kerberos.keytab";
public static final String CALLBACK_INTERVAL_NAME
= "templeton.callback.retry.interval";
public static final String CALLBACK_RETRY_NAME
= "templeton.callback.retry.attempts";
public static final String HADOOP_END_INTERVAL_NAME = "job.end.retry.interval";
public static final String HADOOP_END_RETRY_NAME = "job.end.retry.attempts";
public static final String HADOOP_END_URL_NAME = "job.end.notification.url";
public static final String HADOOP_SPECULATIVE_NAME
= "mapred.map.tasks.speculative.execution";
private static final Log LOG = LogFactory.getLog(AppConfig.class);
public AppConfig() {
init();
LOG.info("Using Hadoop version " + VersionInfo.getVersion());
}
private void init() {
for (Map.Entry<String, String> e : System.getenv().entrySet())
set("env." + e.getKey(), e.getValue());
String templetonDir = getTempletonDir();
for (String fname : TEMPLETON_CONF_FILENAMES)
if (! loadOneClasspathConfig(fname))
loadOneFileConfig(templetonDir, fname);
String hadoopConfDir = getHadoopConfDir();
for (String fname : HADOOP_CONF_FILENAMES)
loadOneFileConfig(hadoopConfDir, fname);
}
public void startCleanup() {
JobState.getStorageInstance(this).startCleanup(this);
}
public String getHadoopConfDir() {
return get(HADOOP_CONF_DIR);
}
public static String getTempletonDir() {
return System.getenv(TEMPLETON_HOME_VAR);
}
private boolean loadOneFileConfig(String dir, String fname) {
if (dir != null) {
File f = new File(dir, fname);
if (f.exists()) {
addResource(new Path(f.getAbsolutePath()));
LOG.debug("loaded config file " + f.getAbsolutePath());
return true;
}
}
return false;
}
private boolean loadOneClasspathConfig(String fname) {
URL x = getResource(fname);
if (x != null) {
addResource(x);
LOG.debug("loaded config from classpath " + x);
return true;
}
return false;
}
public String templetonJar() { return get(TEMPLETON_JAR_NAME); }
public String libJars() { return get(LIB_JARS_NAME); }
public String clusterHadoop() { return get(HADOOP_NAME); }
public String clusterHcat() { return get(HCAT_NAME); }
public String pigPath() { return get(PIG_PATH_NAME); }
public String pigArchive() { return get(PIG_ARCHIVE_NAME); }
public String hivePath() { return get(HIVE_PATH_NAME); }
public String hiveArchive() { return get(HIVE_ARCHIVE_NAME); }
public String streamingJar() { return get(STREAMING_JAR_NAME); }
public String kerberosSecret() { return get(KERBEROS_SECRET); }
public String kerberosPrincipal(){ return get(KERBEROS_PRINCIPAL); }
public String kerberosKeytab() { return get(KERBEROS_KEYTAB); }
public String[] overrideJars() {
if (getBoolean(OVERRIDE_JARS_ENABLED, true))
return getStrings(OVERRIDE_JARS_NAME);
else
return null;
}
public String overrideJarsString() {
if (getBoolean(OVERRIDE_JARS_ENABLED, true))
return get(OVERRIDE_JARS_NAME);
else
return null;
}
public long zkCleanupInterval() {
return getLong(ZooKeeperCleanup.ZK_CLEANUP_INTERVAL,
(1000L * 60L * 60L * 12L));
}
public long zkMaxAge() {
return getLong(ZooKeeperCleanup.ZK_CLEANUP_MAX_AGE,
(1000L * 60L * 60L * 24L * 7L));
}
public String zkHosts() { return get(ZooKeeperStorage.ZK_HOSTS); }
public int zkSessionTimeout() { return getInt(ZooKeeperStorage.ZK_SESSION_TIMEOUT, 30000); }
}