<?xml version="1.0"?>
<!--
   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.
-->
<configuration>

<!-- Site specific YARN configuration properties -->
  <property>
    <name>yarn.resourcemanager.address</name>
    <value>ubuntu:8032</value>
  </property>
  <property>
    <name>yarn.resourcemanager.webapp.address</name>
    <value>ubuntu:9081</value>
  </property>
  <property>
    <name>yarn.resourcemanager.resource-tracker.address</name>
    <value>ubuntu:8031</value>
  </property>
  <property>
    <name>yarn.scheduler.minimum-allocation-mb</name>
    <value>1</value>
  </property>
  <property>
    <description>Whether physical memory limits will be enforced for
      containers.
    </description>
    <name>yarn.nodemanager.pmem-check-enabled</name>
    <value>false</value>
  </property>
  <!-- we really don't want checking here-->
  <property>
    <name>yarn.nodemanager.vmem-check-enabled</name>
    <value>false</value>
  </property>
  
  <!-- how long after a failure to see what is left in the directory-->
  <property>
    <name>yarn.nodemanager.delete.debug-delay-sec</name>
    <value>60000</value>
  </property>

  <!--ten seconds before the process gets a -9 -->
  <property>
    <name>yarn.nodemanager.sleep-delay-before-sigkill.ms</name>
    <value>30000</value>
  </property>

  
  
  <!-- security -->
  <property>
    <name>yarn.resourcemanager.keytab</name>
    <value>/home/stevel/conf/yarn.keytab</value>
  </property>
  <property>
    <name>yarn.resourcemanager.principal</name>
    <value>yarn/ubuntu@COTHAM</value>
  </property>

<!-- 
  <property>
    <name>yarn.resourcemanager.webapp.spnego-principal</name>
    <value>yarn/ubuntu@COTHAM</value>
  </property>
  <property>
    <name>yarn.resourcemanager.webapp.spnego-keytab-file</name>
    <value>${yarn.resourcemanager.keytab}</value>
  </property>
-->
  <property>
    <name>yarn.nodemanager.keytab</name>
    <value>/home/stevel/conf/yarn.keytab</value>
  </property>
  <property>
    <name>yarn.nodemanager.principal</name>
    <value>yarn/ubuntu@COTHAM</value>
  </property>
  <property>
    <name>yarn.nodemanager.webapp.spnego-principal</name>
    <value>yarn/ubuntu@COTHAM</value>
  </property>
  <property>
    <name>yarn.nodemanager.webapp.spnego-keytab-file</name>
    <value>${yarn.resourcemanager.keytab}</value>
  </property>


  <property>
    <name>yarn.namenode.kerberos.internal.spnego.principal</name>
    <value>HTTP/ubuntu@COTHAM</value>
  </property>

</configuration>
