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

########################
# Fluo YARN properties
########################

# NOTE - All properties that have a default are set with it. Uncomment
# a property if you want to use a value different than the default. 
# Properties that have no default are uncommented and must be set by
# the user.

## General properties
## ------------------
## Zookeeper connection string specifying host and chroot where Fluo YARN launcher stores data.
## A chroot directory suffix (with max depth of 1) must be specified but doesn't need to be named '/fluo-yarn'.
#fluo.yarn.zookeepers=localhost/fluo-yarn
## YARN resource manager hostname. Should match 'yarn.resourcemanager.hostname' property in Hadoop's yarn-site.xml
#fluo.yarn.resource.manager=localhost

## Oracle properties
## -----------------
## Number of oracle yarn instances
#fluo.yarn.oracle.instances=1
## Max memory of Oracle yarn containers (in MB)
#fluo.yarn.oracle.max.memory.mb=512
## Number of Oracle virtual cores
#fluo.yarn.oracle.num.cores=1

## Worker properties
## -----------------
## Number of Worker instances
#fluo.yarn.worker.instances=1
## Max memory of worker YARN containers (in MB). If YARN is killing worker processes consider
## increasing twill.java.reserved.memory.mb (which defaults to 200 and is set in yarn-site.xml).
## The twill.java.reserved.memory.mb config determines the gap between the YARN memory limit set
## below and the java -Xmx setting.  For example, if max memory is 1024 and twill reserved memory
## is 200, the java -Xmx setting will be 1024-200 = 824 MB.
#fluo.yarn.worker.max.memory.mb=1024
## Number of worker virtual cores
#fluo.yarn.worker.num.cores=1
