| /** |
| * 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); } |
| } |