#  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.
zk=127.0.0.1
version=0.2.0-incubating-rc3
master=192.168.33.11
user=root
mode=yarn
webserver.port=8000
webserver.root=dist
spark.version=2.2.1-bin-hadoop2.7
yarn.queue=default
yarn.jarspath=hdfs:///apps/amaterasu
spark.home=/usr/hdp/current/spark2-client
#spark.home=/opt/cloudera/parcels/SPARK2-2.1.0.cloudera2-1.cdh5.7.0.p0.171658/lib/spark2
yarn.hadoop.home.dir=/etc/hadoop
spark.opts.spark.yarn.am.extraJavaOptions="-Dhdp.version=2.6.1.0-129"
spark.opts.spark.driver.extraJavaOptions="-Dhdp.version=2.6.1.0-129"
