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

##### Storm #####
indexing.workers=1
indexing.acker.executors=0
topology.worker.childopts=
topology.auto-credentials=['']
topology.max.spout.pending=

##### Kafka #####
kafka.zk=node1:2181
kafka.broker=node1:6667
kafka.security.protocol=PLAINTEXT

# One of EARLIEST, LATEST, UNCOMMITTED_EARLIEST, UNCOMMITTED_LATEST
kafka.start=UNCOMMITTED_EARLIEST

indexing.input.topic=indexing
indexing.error.topic=indexing

##### Indexing #####
indexing.writer.class.name=org.apache.metron.elasticsearch.writer.ElasticsearchWriter

##### HDFS #####
bolt.hdfs.rotation.policy=org.apache.storm.hdfs.bolt.rotation.TimedRotationPolicy
bolt.hdfs.rotation.policy.units=DAYS
bolt.hdfs.rotation.policy.count=1
indexing.hdfs.output=/tmp/metron/enriched

##### Parallelism #####
kafka.spout.parallelism=1
indexing.writer.parallelism=1
hdfs.writer.parallelism=1
