// 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]]
= Configuring Apache Kudu

:author: Kudu Team
:imagesdir: ./images
:icons: font
:toc: left
:toclevels: 3
:doctype: book
:backend: html5
:sectlinks:
:experimental:

NOTE: Kudu is easier to configure with link:http://www.cloudera.com/content/www/en-us/products/cloudera-manager.html[Cloudera Manager]
than in a standalone installation. See Cloudera's
link:http://www.cloudera.com/content/www/en-us/documentation/betas/kudu/latest/topics/kudu_installation.html[Kudu documentation]
for more details about using Kudu with Cloudera Manager.

== Configure Kudu

=== Configuration Basics
To configure the behavior of each Kudu process, you can pass command-line flags when
you start it, or read those options from configuration files by passing them using
one or more `--flagfile=<file>` options. You can even include the
`--flagfile` option within your configuration file to include other files. Learn more about gflags
by reading link:http://google-gflags.googlecode.com/svn/trunk/doc/gflags.html[its documentation].

You can place options for masters and tablet servers into the same configuration
file, and each will ignore options that do not apply.

Flags can be prefixed with either one or two `-` characters. This
documentation standardizes on two: `--example_flag`.

=== Discovering Configuration Options
Only the most common configuration options are documented here. For a more exhaustive
list of configuration options, see the link:configuration_reference.html[Configuration Reference].

To see all configuration flags for a given executable, run it with the `--help` option.
Take care when configuring undocumented flags, as not every possible
configuration has been tested, and undocumented options are not guaranteed to be
maintained in future releases.

=== Configuring the Kudu Master
To see all available configuration options for the `kudu-master` executable, run it
with the `--help` option:
----
$ kudu-master --help
----

[cols="m,d,m,d"]
.Supported Configuration Flags for Kudu Masters
|===
| Flag      | Valid Options     | Default     | Description

|--master_addresses | string | localhost |  Comma-separated list of all the RPC
addresses for Master consensus-configuration. If not specified, assumes a standalone Master.
|--fs_data_dirs | string | | Comma-separated list of
directories where the Master will place its data blocks.
|--fs_wal_dir | string | | The directory where the Master will
place its write-ahead logs. May be the same as _one of_ the directories listed in
`--fs_data_dirs`, but not a sub-directory of a data directory.
|--log_dir | string | /var/log/kudu | The directory to store Master log files.
|===

For the full list of flags for masters, see the
link:configuration_reference.html#master_configuration_reference[Kudu Master Configuration Reference].

=== Configuring Tablet Servers
To see all available configuration options for the `kudu-tserver` executable,
run it with the `--help` option:
----
$ kudu-tserver --help
----

.Supported Configuration Flags for Kudu Tablet Servers
|===
| Flag      | Valid Options     | Default     | Description

|--fs_data_dirs | string |  | Comma-separated list
of directories where the Tablet Server will place its data blocks.
|--fs_wal_dir | string | | The directory where the Tablet Server will
place its write-ahead logs. May be the same as _one of_ the directories listed in
`--fs_data_dirs`, but not a sub-directory of a data directory.
|--log_dir | string | /var/log/kudu | The directory to store Tablet Server log files
|--tserver_master_addrs | string | `127.0.0.1:7051` |  Comma separated
addresses of the masters which the tablet server should connect to. The masters
do not read this flag.
|--block_cache_capacity_mb | integer | 512 | Maximum amount of memory allocated to the Kudu Tablet Server's block cache.
|--memory_limit_hard_bytes | integer | 4294967296 | Maximum amount of memory a Tablet Server can consume before it starts rejecting all incoming writes.
|===

For the full list of flags for tablet servers, see the
link:configuration_reference.html#tablet_server_configuration_reference[Kudu Tablet Server Configuration Reference].


== Next Steps
- link:quickstart.html[Get Started With Kudu]
- link:developing.html[Developing Applications With Kudu]
