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

####################
### UPDATE THIS! ###
####################
yarn.package.path=<YARN.PACKAGE.PATH>

job.factory.class=org.apache.samza.job.yarn.YarnJobFactory
task.checkpoint.factory=org.apache.samza.checkpoint.kafka.KafkaCheckpointManagerFactory
task.checkpoint.system=kafka
task.checkpoint.replication.factor=1

serializers.registry.string.class=org.apache.samza.serializers.StringSerdeFactory

 # Kafka System
systems.kafka.samza.factory=org.apache.samza.system.kafka.KafkaSystemFactory
systems.kafka.consumer.zookeeper.connect=localhost:2181
systems.kafka.consumer.auto.offset.reset=smallest
systems.kafka.producer.bootstrap.servers=localhost:9092
systems.kafka.samza.key.serde=string
systems.kafka.samza.msg.serde=string

yarn.container.retry.count=-1
yarn.container.retry.window.ms=60000

#Coordinator replication factor
job.coordinator.system=kafka
job.coordinator.replication.factor=1
