Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with HTTPS or Subversion.

Download ZIP
branch: lahosken_clean…
Fetching contributors…

Cannot retrieve contributors at this time

1 lines (1 sloc) 25.714 kb
{"name":"Iago","body":"<a name=\"Top\"></a>\r\n\r\n# Iago, A Load Generator README (April 29, 2012)\r\n\r\n* <a href=\"#Iago Quick Start\">Iago Quick Start</a>\r\n - <a href=\"#Iago Prerequisites\">Iago Prerequisites</a>\r\n - <a href=\"#Preparing Your Test\">Preparing Your Test</a>\r\n - <a href=\"#Executing Your Test\">Executing Your Test</a>\r\n* <a href=\"#Iago Overview\">Iago Overview</a>\r\n - <a href=\"#Supported Services\">Supported Services</a>\r\n - <a href=\"#Transaction Requirements\">Transaction Requirements</a>\r\n - <a href=\"#Sources of Transactions\">Sources of Transactions</a>\r\n* <a href=\"#Iago Architecture Overview\">Iago Architecture Overview</a>\r\n* <a href=\"#Implementing Your Test\">Implementing Your Test</a>\r\n - <a href=\"#Scala Example\">Scala Example</a>\r\n - <a href=\"#Java Example\">Java Example</a>\r\n - <a href=\"#Code Annotations for the Examples\">Code Annotations for the Examples</a> \r\n* <a href=\"#Configuring Your Test\">Configuring Your Test</a>\r\n\r\n<a name=\"Iago Quick Start\"></a>\r\n\r\n## Iago Quick Start\r\n\r\nIf you are already familiar with the Iago Load Generation tool, follow these steps to get started; otherwise, start with the <a href=\"#Iago Overview\">Iago Overview</a>. For questions, please contact <a href=\"mailto:parrot-users@twitter.com\">parrot-users@twitter.com</a>.\r\n\r\n<a name=\"Iago Prerequisites\"></a>\r\n\r\n### Iago Prerequisites\r\n\r\n1. Download and unpack the Iago distribution: <a href=\"http://confluence.local.twitter.com/download/attachments/8947619/parrot-0.4.1.zip?version=1&modificationDate=1317267372000\">parrot-0.4.1.zip</a>.\r\n2. Configure your Mesos environment for non-production or smf-d cluster access; see <a href=\"http://confluence.local.twitter.com/display/ENG/Tutorial\">Mesos Tutorial</a> for more information.\r\n\r\n**Note:** In the steps above, the key issues are getting the SSH proxy configured and getting added to the mesos-visitors-non-prod-team group. Although, you can run Parrot without the SSH proxy, it is not recommended because you would not be able to monitor your Mesos jobs. A second option for Mesos access will be SMF-D in the near future, and for some services it may work today.\r\n\r\n<a name=\"Preparing Your Test\"></a>\r\n\r\n### Preparing Your Test\r\n\r\n1. Identify your transaction source; see <a href=\"#Transaction Requirements\">Transaction Requirements</a> and <a href=\"#Sources of Transactions\">Sources of Transactions</a> for more information.\r\n2. In Scala, extend the Parrot server's `RecordProcessor` class, or in Java, extend `LoadTest`; see <a href=\"#Implementing Your Test\">Implementing Your Test</a> for more information.\r\n3. Create a `launcher.scala` file in your Parrot `config` directory with the appropriate settings; see <a href=\"#Configuring Your Test\">Configuring Your Test</a> for more information.\r\n\r\n<a name=\"Executing Your Test\"></a>\r\n\r\n### Executing Your Test\r\n\r\nLaunch Parrot from the distribution with `java` `-jar` *parrot_jar* `-f` *your_config*. This will create the Mesos jobs for you and configure Parrot to use your transactions. To kill a running job, add `-k` to your launch parameters: `java` `-jar` *parrot_jar* `-f` *your_config* `-k`.\r\n\r\nIf you are using Parrot as a library, for example, in the case of testing over the Thrift protocol or building more complex tests with HTTP or Memcached/Kestrel, you should instead add a task to your project's configuration. See <a href=\"#Configuring Your Test\">Configuring Your Test</a> for more information.\r\n\r\n[Top](#Top)\r\n\r\n<a name=\"Iago Overview\"></a>\r\n\r\n## Iago Overview\r\n\r\nIago is a load generation tool that replays production traffic against a given target. Among other things, it differs from other load generation tools in that it attempts to hold constant the transaction rate. For example, if you want to test your service at 100K requests per minute, Parrot attempts to achieve that rate. \r\n\r\nBecause Parrot replays traffic, you must specify the source of the traffic. You use a transaction log as the source of traffic, in which each transaction generates a _request_ to your service that your service processes.\r\n\r\nReplaying transactions, and thus processing requests at a fixed rate, enables you to study the behavior of your service under an anticipated load. If your anticipated load represents what you expect to be your peak load, Parrot allows you to identify bottlenecks or other issues that may not be easily observable in a production environment in which your maximum anticipated load occurs only rarely.\r\n\r\nParrot is related to Canary in the sense that both measure performance against load. However, Parrot's primary purpose is to predict performance under load, while Canary provides a _final test_ environment for your service against current traffic. \r\n\r\n[Top](#Top)\r\n\r\n<a name=\"Supported Services\"></a>\r\n\r\n### Supported Services\r\n\r\nIago understands service requests in the following formats:\r\n\r\n* HTTP\r\n* Thrift\r\n* Memcached / Kestrel\r\n\r\nYour service is typically an HTTP or Thrift service written in either Scala or Java.\r\n\r\n[Top](#Top)\r\n\r\n<a name=\"Transaction Requirements\"></a>\r\n\r\n### Transaction Requirements\r\n\r\nParrot recommends the transactions that represent service requests to meet the following requirements:\r\n\r\n* **Idempotent**, meaning that re-execution of a transaction any number of times yields the same result as the initial execution.\r\n* **Commutative**, meaning that transaction order is not important. Although transactions are initiated in replay order, Parrot's internal behavior may change the actual execution order to guarantee the transaction rate. Also, transactions that implement `Future` responses are executed asynchronously. You can achieve ordering, if required, by using Parrot as a library and initiating new requests in response to previous ones. Examples of this are available.\r\n\r\n[Top](#Top)\r\n\r\n<a name=\"Sources of Transactions\"></a>\r\n\r\n### Sources of Transactions\r\n\r\nTransactions typically come from logs, such as the following:\r\n\r\n* Web server logs capture HTTP transactions.\r\n* Proxy server logs can capture transactions coming through a server. You can place a proxy server in your stack to capture either HTTP or Thrift transactions.\r\n* Network sniffers can capture transactions as they come across a physical wire. You can program the sniffer to create a log of transactions you identify for capture.\r\n\r\nIn some cases, transactions do not exist. For example, transactions for your service may not yet exist because they are part of a new service, or you are obligated not to use transactions that contain sensitive information. In such cases, you can provide _synthetic_ transactions, which are transactions that you create to model the operating environment for your service. When you create synthetic transactions, you must statistically distribute your transactions to match the distribution you expect when your service goes live. \r\n\r\n[Top](#Top)\r\n\r\n<a name=\"Iago Architecture Overview\"></a>\r\n\r\n## Iago Architecture Overview\r\n\r\nIago is hosted by <a href=\"http://confluence.local.twitter.com/display/ENG/Mesos\">Mesos</a>. The following diagram shows the basic components of Parrot:\r\n\r\n![Parrot Architecture Overview](http://confluence.local.twitter.com/download/attachments/8947619/ParrotArchitectureOverview.png)\r\n\r\nParrot consists of a single Parrot _feeder_, which reads your transaction source, and one or more Parrot servers, which format and deliver requests to the service you want to test. The feeder contains a `Poller` object, which is responsible for guaranteeing one minute's worth of transactions in the pipeline to the Parrot servers. Metrics are available in Cuckoo, usually accessed within Viz.\r\n\r\nThe Parrot servers generate requests to your service. Together, all Parrot servers generate the specified number of requests per minute. A Parrot server's `RecordProcessor` object executes your service and maps the transaction to the format required by your service. \r\n\r\n[Top](#Top)\r\n\r\n<a name=\"Implementing Your Test\"></a>\r\n\r\n## Implementing Your Test\r\n\r\nThe following sections show examples of implementing your test in both Scala and Java. See <a href=\"#Code Annotations for the Examples\">Code Annotations for the Examples</a> for information about either example. \r\n\r\n[Top](#Top)\r\n\r\n<a name=\"Scala Example\"></a>\r\n\r\n### Scala Example\r\n\r\nTo implement a load test in Scala, you must extend the Parrot server's `RecordProcessor` class to specify how to map transactions into the requests that the Parrot server delivers to your service. The following example shows a `RecordProcessor` subclass that implements a load test on an `EchoService` Thrift service:\r\n\r\n package com.twitter.example\r\n\r\n import org.apache.thrift.protocol.TBinaryProtocol\r\n\r\n import com.twitter.parrot.processor.RecordProcessor // 1\r\n import com.twitter.parrot.thrift.ParrotJob // 2\r\n import com.twitter.parrot.server.ParrotThriftService // 3\r\n import com.twitter.logging.Logger\r\n\r\n import thrift.EchoService\r\n\r\n class EchoLoadTest(service: ParrotThriftService) extends RecordProcessor {\r\n val client = new EchoService.ServiceToClient(service, new TBinaryProtocol.Factory()) // 4\r\n val log = Logger.get(getClass)\r\n\r\n def processLines(job: ParrotJob, lines: Seq[String]) { // 5\r\n lines map { line =>\r\n client.echo(line) respond { rep =>\r\n if (rep == \"hello\") {\r\n client.echo(\"IT'S TALKING TO US\") // 6\r\n }\r\n log.info(\"response: \" + rep) // 7\r\n }\r\n }\r\n }\r\n }\r\n\t\t\r\n[Top](#Top)\r\n\r\n<a name=\"Java Example\"></a>\r\n\r\n### Java Example\r\n\r\nTo implement a load test in Java, you must extend the Parrot server's `LoadTest` class to specify how to map transactions into the requests that the Parrot server delivers to your service. The `LoadTest` class provides Java-friendly type mappings for the underlying Scala internals. The following example shows a `LoadTest` subclass that implements a load test on an `EchoService` Thrift service:\t\r\n\r\n package com.twitter.jexample;\r\n\r\n import com.twitter.example.thrift.EchoService;\r\n import com.twitter.parrot.processor.LoadTest; // 1\r\n import com.twitter.parrot.thrift.ParrotJob; // 2\r\n import com.twitter.parrot.server.ParrotThriftService; // 3\r\n import com.twitter.util.Future;\r\n import com.twitter.util.FutureEventListener;\r\n import org.apache.thrift.protocol.TBinaryProtocol;\r\n\r\n import java.util.List;\r\n\r\n public class EchoLoadTest extends LoadTest {\r\n EchoService.ServiceToClient client = null;\r\n\r\n public EchoLoadTest(ParrotThriftService service) {\r\n client = new EchoService.ServiceToClient(service, new TBinaryProtocol.Factory()); // 4\r\n }\r\n\r\n public void processLines(ParrotJob job, List<String> lines) { // 5\r\n for(String line: lines) {\r\n Future<String> future = client.echo(line);\r\n future.addEventListener(new FutureEventListener<String>() {\r\n public void onSuccess(String msg) {\r\n System.out.println(\"response: \" + msg);\r\n }\r\n\r\n public void onFailure(Throwable cause) {\r\n System.out.println(\"Error: \" + cause);\r\n }\r\n });\r\n }\r\n }\r\n }\r\n\t\t\r\n[Top](#Top)\r\n\r\n<a name=\"Code Annotations for the Examples\"></a>\r\n\r\n### Code Annotations for the Examples\r\n\r\nYou define your Iago subclass to execute your service and map transactions to requests for your service:\r\n\r\n1. Import `com.twitter.parrot.processor.RecordProcessor` (Scala) or `LoadTest` (Java), whose instance will be executed by a Parrot server.\r\n2. Import `com.twitter.parrot.thrift.ParrotJob`, which contains the Parrot server class.\r\n3. Import `com.twitter.parrot.server.ParrotThriftService` if your service is a Thrift service\r\n4. Create an instance of your service to be placed under test. Your service is a client of the Parrot service.\r\n5. Define a `processLines` method to format the request and and execute your service.\r\n6. Optionally, you can initiate a new request based on the response to a previous one.\r\n7. Optionally, do something with the response. In this example, the response is logged.\r\n\r\n[Top](#Top)\r\n\r\n<a name=\"Configuring Your Test\"></a>\r\n\r\n## Configuring Your Test\r\n\r\nTo configure your test, create a `launcher.scala` file that that creates a `ParrotLauncherConfig` instance with the configuration parameters you want to set. The following example shows parameters for testing a Thrift service:\r\n\r\n import com.twitter.parrot.config.ParrotLauncherConfig\r\n\r\n new ParrotLauncherConfig {\r\n jobname = \"load_echo\"\r\n port = 50017\r\n victims = \"smf1-aev-27-27-sr2\"\r\n log = \"hdfs://hadoop-nn.smf1.twitter.com/mesos/pkg/parrot/logs/reference/oauth/yesterday.log\"\r\n requestRate = 1\r\n duration = 5\r\n timeUnit = \"MINUTES\"\r\n\t\r\n parser = \"thrift\"\r\n imports = \"import com.twitter.example.EchoLoadTest\"\r\n responseType = \"Array[Byte]\"\r\n transport = \"ThriftTransport\"\r\n loadTest = \"EchoLoadTest\"\r\n }\r\n\r\n**Note:** For a sample configuration file, see `config/launcher.scala` within the <a href=\"http://confluence.local.twitter.com/download/attachments/8947619/parrot-0.4.1.zip?version=1&modificationDate=1317267372000\">Parrot distribution</a>.\r\n\r\nYou can specify any of the following parameters:\r\n\r\n<table border=\"1\" cellpadding=\"6\">\r\n<thead>\r\n<tr>\r\n<th>Parameter</th>\r\n<th>Description</th>\r\n<th>Required or<br/>Default Value</th>\r\n</tr>\r\n</thead>\r\n<tr>\r\n\t<td><code>jobName</code></td>\r\n\t<td><p>A string value that specifies the the name of your test.</p>\r\n\t<p><b>Example: </b><code>jobName = \"testing_tasty_new_feature\"</code></p></td>\r\n\t<td><b>Required</b></td>\r\n</tr>\r\n<tr>\r\n\t<td><code>log</code></td>\r\n\t<td><p>A string value that specifies the complete path to the log you want Parrot to replay. The log can be either on HDFS or on your local file system to be uploaded to HDFS.</p>\r\n\t<p><b>Example: </b><code>log = \"hdfs://hadoop-nn.smf1.twitter.com/mesos/pkg/parrot/logs/reference/oauth/yesterday.log\"</code></p></td>\r\n\t<td><b>Required</b></td>\r\n</tr>\r\n<tr>\r\n\t<td><code>victims</code></td>\r\n\t<td><p>A string of comma-separated values that specify the hosts on which to execute the load test. The log can be either on HDFS or on your local file system to be uploaded to HDFS.</p>\r\n\t<p><b>Example: </b><code>victims = \"smf1-abb-23-sr3,smf1-abb-23-sr4\"</code></p></td>\r\n\t<td><b>Required</b></td>\r\n</tr>\r\n<tr>\r\n\t<td><code>port</code></td>\r\n\t<td><p>An integer value that specifies the port on which to deliver requests to the <code>victims</code>.</p>\r\n\t<p><b>Example: </b><code>port = 9000</code></p></td>\r\n\t<td><b>Required</b></td>\r\n</tr>\r\n<tr>\r\n\t<td><code>scheme</code></td>\r\n\t<td><p>A string value that specifies .</p>\r\n\t<p><b>Example: </b><code>scheme = \"http\"</code></p></td>\r\n\t<td><code>http</code></td>\r\n</tr>\r\n<tr>\r\n\t<td><code>header</code></td>\r\n\t<td><p>A string value that specifies .</p>\r\n\t<p><b>Example: </b><code>header = \"api.twitter.com\"</code></p></td>\r\n\t<td><code>api.twitter.com</code></td>\r\n</tr>\r\n<tr>\r\n\t<td><code>duration</code></td>\r\n\t<td><p>An integer value that specifies the time to run the test in <code>timeUnit</code> units.</p>\r\n\t<p><b>Example: </b><code>duration = 5</code></p></td>\r\n\t<td><code>&nbsp;</code></td>\r\n</tr>\r\n<tr>\r\n\t<td><code>timeUnit</code></td>\r\n\t<td><p>A string value that specifies time unit of the <code>duration</code>. It contains one of the following values:\r\n\t\t<ul>\r\n\t\t\t<li> \"MINUTES\"\r\n\t\t\t<li> \"HOURS\"\r\n\t\t\t<li> \"DAYS\"\r\n\t\t</ul></p>\r\n <p><b>Example: </b><code>timeUnit = \"MINUTES\"</code></p></td>\r\n\t<td><code>&nbsp;</code></td>\r\n</tr>\r\n<tr>\r\n\t<td><code>doOAuth</code></td>\r\n\t<td><p>A boolean value that specifies .</p>\r\n\t<p><b>Example: </b><code>doOAuth = false</code></p></td>\r\n\t<td><code>true</code></td>\r\n</tr>\r\n<tr>\r\n\t<td><code>maxRequests</code></td>\r\n\t<td><p>An integer value that specifies the total number of requests to submit to your service.</p>\r\n\t<p><b>Example: </b><code>maxRequests = 10000</code></p></td>\r\n\t<td><code>1000</code></td>\r\n</tr>\r\n<tr>\r\n\t<td><code>suppressUrlMap</code></td>\r\n\t<td><p>A boolean value that specifies .</p>\r\n\t<p><b>Example: </b><code>suppressUrlMap = false</code></p></td>\r\n\t<td><code>true</code></td>\r\n</tr>\r\n<tr>\r\n\t<td><code>reuseFile</code></td>\r\n\t<td><p>A boolean value that specifies whether or not to stop the test when the input log has been read through. Setting this value to true will result in Parrot starting back at the beginning of the log when it exhausts the contents. If this is true, your log file should at least be 1,000 lines or more.</p>\r\n\t<p><b>Example: </b><code>reuseFile = false</code></p></td>\r\n\t<td><code>true</code></td>\r\n</tr>\r\n<tr>\r\n\t<td><code>requestRate</code></td>\r\n\t<td><p>An integer value that specifies the number of requests per second to submit to your service.</p>\r\n\t<p><b>Example: </b><code>requestRate = 10</code></p></td>\r\n\t<td><code>1</code></td>\r\n</tr>\r\n<tr>\r\n\t<td><code>numInstances</code></td>\r\n\t<td><p>An integer value that specifies the number of Parrot servers concurrently making requests to your service.</p>\r\n\t<p><b>Example: </b><code>numInstances = 2</code></p></td>\r\n\t<td><code>1</code></td>\r\n</tr>\r\n<tr>\r\n\t<td><code>numCpus</code></td>\r\n\t<td><p>A decimal value that specifies the number of CPUs to allocate the the test.</p>\r\n\t<p><b>Example: </b><code>numCpus = 2.0</code></p></td>\r\n\t<td><code>2.0</code></td>\r\n</tr>\r\n<tr>\r\n\t<td><code>parser</code></td>\r\n\t<td><p>A string value that specifies how the request is to be interpreted. It is one of the following values:<br/>\r\n\t\t<ul>\r\n\t\t\t<li> \"http\"\r\n\t\t\t<li> \"thrift\"\r\n\t\t\t<li> \"oauth\"\r\n\t\t</ul></p>\r\n <p><b>Example: </b><code>parser = \"thrift\"</code></p></td>\r\n\t<td><code>oauth</code></td>\r\n</tr>\r\n<tr>\r\n\t<td><code>verboseCmd</code></td>\r\n\t<td><p>A boolean value that specifies the level of feedback from Parrot. A value of <code>true</code> specifies maximum feedback.</p>\r\n\t<p><b>Example: </b><code>verboseCmd = true</code></p></td>\r\n\t<td><code>false</code></td>\r\n</tr>\r\n<tr>\r\n\t<td><code>hostConnectionLimit</code></td>\r\n\t<td><p>An integer value that specifies the maximum number of connections to your service's hosts.</p>\r\n\t<p><b>Example: </b><code>hostConnectionLimit = 1</code></p></td>\r\n\t<td><code>Integer.MAX_VALUE</code></td>\r\n</tr>\r\n<tr>\r\n\t<td><code>reuseConnections</code></td>\r\n\t<td><p>A boolean value that specifies whether connections to your service's hosts can be reused. A value of <code>true</code> enables reuse.</p>\r\n\t<p><b>Example: </b><code>reuseConnections = false</code></p></td>\r\n\t<td><code>true</code></td>\r\n</tr>\r\n<tr>\r\n\t<td><code>role</code></td>\r\n\t<td><p>A string value that specifies the role in which the Parrot job shows up on <code>go/smfnonprodcluster</code> and on HDFS.</p>\r\n\t<p><b>Example: </b><code>role = \"preflight\"</code></p></td>\r\n\t<td><i>null</i></td>\r\n</tr>\r\n</tbody>\r\n</table>\r\n\r\n#### Extension Point Parameters\r\n\r\n**Alternative Use:** You can specify the following _extension point_ parameters to configure projects in which Parrot is used as both a feeder and server. The Parrot feeder provides the log lines to your project, which uses these log lines to form requests that the Parrot server then handles:\r\n\r\n<table border=\"1\" cellpadding=\"6\">\r\n<thead>\r\n<tr>\r\n<th>Parameter</th>\r\n<th>Description</th>\r\n<th>Required or<br/>Default Value</th>\r\n</tr>\r\n</thead>\r\n<tr>\r\n\t<td><code>imports</code></td>\r\n\t<td><p>Imports from this project to Parrot</p>\r\n\t<p><b>Example: </b>If <code>ProjectX</code> includes Parrot as a dependency, you would specify: <br/>\r\n\t<code>import org.jboss.netty.handler.codec.http.HttpResponse <br/>\r\n\timport com.twitter.<i>projectX</i>.util.ProcessorClass</code></p></td>\r\n\t<td><code>import org.jboss.netty.handler.codec.http.HttpResponse<br/>\r\n\timport com.twitter.parrot.util.LoadTestStub</code></td>\r\n</tr>\r\n<tr>\r\n\t<td><code>responseType</code></td>\r\n\t<td><p>The response type of responses from Parrot.</p>\r\n\t<p><b>Examples:</b>\r\n\t\t<ul>\r\n\t\t\t<li> <code>HttpResponse</code> for an HTTP service\r\n\t\t\t<li> <code>Array[Byte]</code> for a Thrift service\r\n\t\t</ul> </p>\r\n\t</td>\r\n\t<td><code>HttpResponse</code></td>\r\n</tr>\r\n<tr>\r\n\t<td><code>transport</code></td>\r\n\t<td><p>The kind of transport to the server, which matches the <code>responseType</code> you want. </code></p>\r\n\t<p><b>Example: </b>The Thrift Transport will send your request and give back <code>Future[Array[Byte]]</code>.</p></td>\r\n\t<td><code>FinagleTransport</code></td>\r\n</tr>\r\n<tr>\r\n\t<td><code>loadTest</code></td>\r\n\t<td><p>Your processor for the Parrot feeder's lines, which converts the lines into requests and sends them to the Parrot server.</p>\r\n\t<p><b>Example: </b><code>new LoadTestStub(httpService)</code></p></td>\r\n\t<td><code>new LoadTestStub(httpService)</code></td>\r\n</tr>\r\n</tbody>\r\n</table>\r\n\r\n#### Data Center Parameters\r\n\r\nData center-specific parameters:\r\n\r\n<table border=\"1\" cellpadding=\"6\">\r\n<thead>\r\n<tr>\r\n<th>Parameter</th>\r\n<th>Description</th>\r\n<th>Required or<br/>Default Value</th>\r\n</tr>\r\n</thead>\r\n<tr>\r\n\t<td><code>hadoopNS</code></td>\r\n\t<td><p>File system for the source of your transactions.</p>\r\n\t<p><b>Example: </b><code>hadoopNS = \"hdfs://hadoop-nn.smf1.twitter.com\"</code></p></td>\r\n\t<td><code>hdfs://hadoop-nn.smf1.twitter.com</code>></td>\r\n</tr>\r\n<tr>\r\n\t<td><code>mesosCluster</code></td>\r\n\t<td><p>The Mesos cluster on which Parrot executes.</p>\r\n\t<p><b>Example: </b><code>mesosCluster = \"smf1-nonprod\"</code></p></td>\r\n\t<td><code>smf1-nonprod</code>></td>\r\n</tr>\r\n<tr>\r\n\t<td><code>zkHostName</code></td>\r\n\t<td><p>The host associated with Zookeeper.</p>\r\n\t<p><b>Example: </b><code>zkHostName = Some(\"zookeeper.smf1.twitter.com\")</code></p></td>\r\n\t<td><code>zookeeper.smf1.twitter.com</code></td>\r\n</tr>\r\n<tr>\r\n\t<td><code>zkPort</code></td>\r\n\t<td><p>An integer value that specifies the Zookeeper port on which to deliver requests.</p>\r\n\t<p><b>Example: </b><code>zkPort = 2181</code></p></td>\r\n\t<td><code>2181</code></td>\r\n</tr>\r\n<tr>\r\n\t<td><code>zkNode</code></td>\r\n\t<td><p>The Zookeeper node on which to deliver requests.</p>\r\n\t<p><b>Example: </b><code>zkNode = \"/twitter/service/parrot2/%s\"</code></p></td>\r\n\t<td><code>/twitter/service/parrot2/%s</code></td>\r\n</tr>\r\n</tbody>\r\n</table>\r\n\r\n#### Other Parameters\r\n\r\nYou can change these parameters only *at your own risk*:\r\n\r\n<table border=\"1\" cellpadding=\"6\">\r\n<thead>\r\n<tr>\r\n<th>Parameter</th>\r\n<th>Description</th>\r\n<th>Required or<br/>Default Value</th>\r\n</tr>\r\n</thead>\r\n<tr>\r\n\t<td><code>parrotTasks</code></td>\r\n\t<td><p>The tasks that comprise Parrot; by default, 1 server and 1 feeder.</p>\r\n\t<p><b>Example: </b><code>parrotTasks = List(\"server\", \"feeder\")</code></p></td>\r\n\t<td><code>List(\"server\", \"feeder\")</code></td>\r\n</tr>\r\n<tr>\r\n\t<td><code>parrotLogsDir</code></td>\r\n\t<td><p>A string value that specifies the complete path to the log to the Parrot log directory on Mesos.</p>\r\n\t<p><b>Example: </b><code>parrotLogsDir = \"/mesos/pkg/parrot/logs\"</code></p></td>\r\n\t<td><code>mesos/pkg/parrot/logs</code></td>\r\n</tr>\r\n<tr>\r\n\t<td><code>proxy</code></td>\r\n\t<td><p>Parrot proxy server.</p>\r\n\t<p><b>Example: </b><code>proxy = \"nest2.corp.twitter.com\"</code></p></td>\r\n\t<td><code>nest2.corp.twitter.com</code></td>\r\n</tr>\r\n<tr>\r\n\t<td><code>proxyShell</code></td>\r\n\t<td><p>Parrot proxy shell; by default, no x11 forwarding.</p>\r\n\t<p><b>Example: </b><code>proxyShell = \"ssh -o ForwardX11=no\"</code></p></td>\r\n\t<td><code>ssh -o ForwardX11=no</code></td>\r\n</tr>\r\n<tr>\r\n\t<td><code>proxyCp</code></td>\r\n\t<td><p>Parrot copy proxy; by default, secure copy.</p>\r\n\t<p><b>Example: </b><code>proxyCp = \"scp\"</code></p></td>\r\n\t<td><code>scp</code></td>\r\n</tr>\r\n<tr>\r\n\t<td><code>hadoopFS</code></td>\r\n\t<td><p>A string value that specifies the Hadoop file system.</p>\r\n\t<p><b>Example: </b><code>hadoopFS = \"hadoop fs\"</code></p></td>\r\n\t<td><code>hadoop fs</code></td>\r\n</tr>\r\n</tbody>\r\n</table>\r\n\r\n[Top](#Top)\r\n\r\n\r\n","tagline":"A Load Generation Library","google":"","note":"Don't delete this file! It's used internally to help with page regeneration."}
Jump to Line
Something went wrong with that request. Please try again.