#
#
# 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.
#
#
#

# The file containing the running pid
PID_FILE=<%=scope.function_hdp_template_var("templeton_pid_dir")%>/webhcat.pid

TEMPLETON_LOG_DIR=<%=scope.function_hdp_template_var("hcat_log_dir")%>/


WEBHCAT_LOG_DIR=<%=scope.function_hdp_template_var("hcat_log_dir")%>/

# The console error log
ERROR_LOG=<%=scope.function_hdp_template_var("hcat_log_dir")%>/webhcat-console-error.log

# The console log
CONSOLE_LOG=<%=scope.function_hdp_template_var("hcat_log_dir")%>/webhcat-console.log

#TEMPLETON_JAR=<%=scope.function_hdp_template_var("templeton_jar_name")%>

#HADOOP_PREFIX=<%=scope.function_hdp_template_var("hadoop_prefix")%>/

#HCAT_PREFIX=<%=scope.function_hdp_template_var("hive_prefix")%>/

# Set HADOOP_HOME to point to a specific hadoop install directory
HADOOP_HOME=/usr/lib/hadoop
