#  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-rc4
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/lib/spark
yarn.hadoop.home.dir=/etc/hadoop
yarn.master.memoryMB=2048
yarn.worker.memoryMB=2048
mesos.libPath=/usr/lib/libmesos.so
