
# 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.
#
# Change values below to match the cluster being deployed on
#

# Zookeeper nodes
ZK_QUORUM="zk1:2181,zk2:2181,zk3:2181"

# Resource Manager address (yarn.resourcemanager.address)
RM_ADDRESS="rm1:8050"

# Resource Manager scheduler address (yarn.resourcemanager.scheduler.address)
RM_SCHED_ADDRESS="rm1:8030"

# Default FS (fs.defaultFS)
DEFAULT_FS="hdfs://nn1:8020"


#
# Should not be necessary to change anything below except on new version releases
#

# Slider version
SLIDER_VER="slider-0.30"

# Slider URL
SLIDER_URL="http://public-repo-1.hortonworks.com/slider/0.30/slider-0.30-all.tar"

# HBase Slider App URL
HBASE_APP_URL="http://public-repo-1.hortonworks.com/slider/0.30/apps/hbase_v096.zip"

# Storm Slider App URL
STORM_APP_URL="http://public-repo-1.hortonworks.com/slider/0.30/apps/storm_v091.zip"

# Accumulo Slider App URL
ACCUMULO_APP_URL="http://public-repo-1.hortonworks.com/slider/0.30/apps/accumulo_v151.zip"

# Where to install Slider
SLIDER_INST_DIR="/usr/lib/slider"

# JDK bin to add to PATH
JDK_BIN="/usr/jdk64/jdk1.7.0_45/bin"

# Yarn container classpath (yarn.application.classpath)
YARN_CP="/etc/hadoop/conf,/usr/lib/hadoop/*,/usr/lib/hadoop/lib/*,/usr/lib/hadoop-hdfs/*,/usr/lib/hadoop-hdfs/lib/*,/usr/lib/hadoop-yarn/*,/usr/lib/hadoop-yarn/lib/*,/usr/lib/hadoop-mapreduce/*,/usr/lib/hadoop-mapreduce/lib/*"

