From b313ce06b285d15705f9184ac5a31a7151d5f6bb Mon Sep 17 00:00:00 2001 From: Sangjin Lee Date: Fri, 1 Jul 2016 16:23:00 -0700 Subject: [PATCH] YARN-5174. [documentation] several updates/corrections to timeline service documentation (Sangjin Lee, Varun Saxena, Naganarasimha G R, and Li Lu via sjlee) --- .../src/site/markdown/TimelineServiceV2.md | 378 ++++++++++-------- .../site/resources/images/flow_hierarchy.png | Bin 0 -> 42345 bytes 2 files changed, 219 insertions(+), 159 deletions(-) create mode 100644 hadoop-yarn-project/hadoop-yarn/hadoop-yarn-site/src/site/resources/images/flow_hierarchy.png diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-site/src/site/markdown/TimelineServiceV2.md b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-site/src/site/markdown/TimelineServiceV2.md index 6e151c95cf1..d1ef46be602 100644 --- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-site/src/site/markdown/TimelineServiceV2.md +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-site/src/site/markdown/TimelineServiceV2.md @@ -21,7 +21,7 @@ The YARN Timeline Service v.2 * [Current Status](#Current_Status) * [Deployment](#Deployment) * [Configurations](#Configurations) - * [Enabling the Timeline Service v.2](#Enabling_Timeline_Service_v2) + * [Enabling Timeline Service v.2](#Enabling_Timeline_Service_v2) * [Publishing of application specific data](#Publishing_of_application_specific_data) * [Timeline Service v.2 REST API](#Timeline_Service_REST_API_v2) * [Query Flows](#REST_API_LIST_FLOWS) @@ -55,11 +55,15 @@ scales well to a large size while maintaining good response times for reads and #### Usability improvements In many cases, users are interested in information at the level of "flows" or logical groups of YARN applications. It is much more common to launch a set or series of YARN applications to -complete a logic application. Timeline Service v.2 supports the notion of flows explicitly. In +complete a logical application. Timeline Service v.2 supports the notion of flows explicitly. In addition, it supports aggregating metrics at the flow level. -Also, information such as configuration and metrics is treated and supported as a first-class -citizen. +Also, information such as configuration and metrics is treated and supported as first-class +citizens. + +The following diagrams illustrates the relationship between different YARN entities modelling flows. + +![Flow Hierarchy](./images/flow_hierarchy.png) ###Architecture @@ -85,30 +89,32 @@ The following diagram illustrates the design at a high level. ### Current Status and Future Plans -YARN Timeline Service v.2 is currently in alpha. It is very much work in progress, and many things -can and will change rapidly. Users must enable Timeline Service v.2 only on a test or +YARN Timeline Service v.2 is currently in alpha ("alpha 1"). It is very much work in progress, and +many things can and will change rapidly. Users must enable Timeline Service v.2 only on a test or experimental cluster to test the feature. -A complete end-to-end flow of writes and reads must be functional, with Apache HBase as the -backend. You must be able to start generating data. When enabled, all YARN-generic events are +Most importantly, **security is not enabled**. Do not set up or use Timeline Service v.2 until +security is implemented if security is a requirement. + +A complete end-to-end flow of writes and reads is functional, with Apache HBase as the backend. +You should be able to start generating data. When enabled, all YARN-generic events are published as well as YARN system metrics such as CPU and memory. Furthermore, some applications -including Distributed Shell and MapReduce write per-framework data to YARN Timeline Service v.2. +including Distributed Shell and MapReduce can write per-framework data to YARN Timeline Service +v.2. -The REST API comes with a good number of useful and flexible query patterns (see below for more -information). - -Although the basic mode of accessing data is via REST, it also comes with a basic web UI based on -the proposed new YARN UI framework. Currently there is no support for command line access, however. +The basic mode of accessing data is via REST. Currently there is no support for command line +access. The REST API comes with a good number of useful and flexible query patterns (see below for +more information). The collectors (writers) are currently embedded in the node managers as auxiliary services. The resource manager also has its dedicated in-process collector. The reader is currently a single instance. Currently, it is not possible to write to Timeline Service outside the context of a YARN application (i.e. no off-cluster client). -When YARN Timeline Service v.2 is disabled, one must expect no functional or performance impact +When YARN Timeline Service v.2 is disabled, one can expect no functional or performance impact on any other existing functionality. -The work to make it production-ready continues. Some key items include +The work to make it truly production-ready continues. Some key items include * More robust storage fault tolerance * Security @@ -134,10 +140,9 @@ New configuration parameters that are introduced with v.2 are marked bold. |:---- |:---- | | `yarn.timeline-service.enabled` | Indicate to clients whether Timeline service is enabled or not. If enabled, the `TimelineClient` library used by applications will post entities and events to the Timeline server. Defaults to `false`. | | `yarn.timeline-service.version` | Indicate what is the current version of the running timeline service. For example, if "yarn.timeline-service.version" is 1.5, and "yarn.timeline-service.enabled" is true, it means the cluster will and must bring up the timeline service v.1.5 (and nothing else). On the client side, if the client uses the same version of timeline service, it must succeed. If the client chooses to use a smaller version in spite of this, then depending on how robust the compatibility story is between versions, the results may vary. Defaults to `1.0f`. | -| **`yarn.timeline-service.writer.class`** | The class for the backend storage writer. Defaults to a filesystem storage writer, therefore it must be overridden. | -| **`yarn.timeline-service.reader.class`** | The class for the backend storage reader. Defaults to a filesystem storage reader, therefore it must be overridden. | +| **`yarn.timeline-service.writer.class`** | The class for the backend storage writer. Defaults to HBase storage writer. | +| **`yarn.timeline-service.reader.class`** | The class for the backend storage reader. Defaults to HBase storage reader. | | **`yarn.system-metrics-publisher.enabled`** | The setting that controls whether yarn system metrics is published on the Timeline service or not by RM And NM. Defaults to `false`. | -| **`yarn.rm.system-metrics-publisher.emit-container-events`** | The setting that controls whether yarn container metrics is published to the timeline server or not by RM. This configuration setting is for ATS V2. Defaults to `false`. | #### Advanced configuration @@ -150,20 +155,24 @@ New configuration parameters that are introduced with v.2 are marked bold. | **`yarn.timeline-service.writer.flush-interval-seconds`** | The setting that controls how often the timeline collector flushes the timeline writer. Defaults to `60`. | | **`yarn.timeline-service.app-collector.linger-period.ms`** | Time period till which the application collector will be alive in NM, after the application master container finishes. Defaults to `1000` (1 second). | | **`yarn.timeline-service.timeline-client.number-of-async-entities-to-merge`** | Time line V2 client tries to merge these many number of async entities (if available) and then call the REST ATS V2 API to submit. Defaults to `10`. | -| **`yarn.timeline-service.coprocessor.app-final-value-retention-milliseconds`** | The setting that controls how long the final value of a metric of a completed app is retained before merging into the flow sum. Defaults to `259200000` (3 days). | +| **`yarn.timeline-service.hbase.coprocessor.app-final-value-retention-milliseconds`** | The setting that controls how long the final value of a metric of a completed app is retained before merging into the flow sum. Defaults to `259200000` (3 days). This should be set in the HBase cluster. | +| **`yarn.rm.system-metrics-publisher.emit-container-events`** | The setting that controls whether yarn container metrics is published to the timeline server or not by RM. This configuration setting is for ATS V2. Defaults to `false`. | -### Enabling the Timeline Service v.2 +### Enabling Timeline Service v.2 #### Preparing Apache HBase cluster for storage -The first part is to set up or pick an Apache HBase cluster to use as the storage cluster. Once -you have an HBase cluster ready to use for this purpose, perform the following steps. +The first part is to set up or pick an Apache HBase cluster to use as the storage cluster. The +version of Apache HBase that is supported with Timeline Service v.2 is 1.1.x. The 1.0.x versions +do not work with Timeline Service v.2. The 1.2.x versions have not been tested. + +Once you have an Apache HBase cluster ready to use for this purpose, perform the following steps. First, add the timeline service jar to the HBase classpath in all HBase machines in the cluster. It is needed for the coprocessor as well as the schema creator. For example, - cp hadoop-yarn-server-timelineservice-3.0.0-SNAPSHOT.jar /usr/hbase/lib/ + cp hadoop-yarn-server-timelineservice-3.0.0-alpha1-SNAPSHOT.jar /usr/hbase/lib/ Then, enable the coprocessor that handles the aggregation. To enable it, add the following entry in region servers' `hbase-site.xml` file (generally located in the `conf` directory) as follows: @@ -201,16 +210,6 @@ Following are the basic configurations to start Timeline service v.2: true - - yarn.timeline-service.writer.class - org.apache.hadoop.yarn.server.timelineservice.storage.HBaseTimelineWriterImpl - - - - yarn.timeline-service.reader.class - org.apache.hadoop.yarn.server.timelineservice.storage.HBaseTimelineReaderImpl - - yarn.nodemanager.aux-services mapreduce_shuffle,timeline_collector @@ -237,7 +236,7 @@ Following are the basic configurations to start Timeline service v.2: ``` -In addition, you may want to set the YARN cluster name to a reasonably unique name in case you +In addition, you may want to set the YARN cluster name to a reasonably unique value in case you are using multiple clusters to store data in the same Apache HBase storage: ``` @@ -277,10 +276,11 @@ This section is for YARN application developers that want to integrate with Time Developers can continue to use the `TimelineClient` API to publish per-framework data to the Timeline Service v.2. You only need to instantiate the right type of the client to write to v.2. On the other hand, the entity/object API for v.2 is different than v.1 as the object model is -significantly changed. The v.2 timeline entity class is `org.apache.hadoop.yarn.api.records.timelineservice.TimelineEntity` -whereas the v.1 class is `org.apache.hadoop.yarn.api.records.timeline.TimelineEntity`. The methods -on `TimelineClient` suitable for writing to the Timeline Service v.2 are clearly delineated, and -they use the v.2 types as arguments. +significantly changed. The v.2 timeline entity class is +`org.apache.hadoop.yarn.api.records.timelineservice.TimelineEntity` whereas the v.1 class is +`org.apache.hadoop.yarn.api.records.timeline.TimelineEntity`. The methods on `TimelineClient` +suitable for writing to Timeline Service v.2 are clearly delineated, and they use the v.2 +types as arguments. Timeline Service v.2 `putEntities` methods come in 2 varieties: `putEntities` and `putEntitiesAsync`. The former is a blocking operation which must be used for writing more @@ -330,16 +330,58 @@ Service v.2. Note that currently you need to be on the cluster to be able to wri Service. For example, an application master or code in the container can write to the Timeline Service, while an off-cluster MapReduce job submitter cannot. +After creating the timeline client, user also needs to set the timeline collector address for the application. If `AMRMClient` is used then by registering the timeline client by calling `AMRMClient#registerTimelineClient` is sufficient. + + amRMClient.registerTimelineClient(timelineClient); + +Else address needs to be retreived from the AM allocate response and need to be set in timeline client explicitly. + + timelineClient.setTimelineServiceAddress(response.getCollectorAddr()); + You can create and publish your own entities, events, and metrics as with previous versions. +TimelineEntity objects have the following fields to hold timeline data: + +* events: A set of TimelineEvents, ordered by the timestamp of the events in descending +order. Each event contains one id and a map to store related information and is +associated with one timestamp. +* configs: A map from a string (config name) to a string (config value) representing all +configs associated with the entity. Users can post the whole config or a part of it in the +configs field. Supported for application and generic entities. Supported for application and +generic entities. +* metrics: A set of metrics related to this entity. There are two types of metrics: single +value metric and time series metric. Each metric item contains metric name (id), value, and what +kind of aggregation operation should be performed in this metric (no­op by default). Supported for +flow run, application and generic entities. +* info: A map from a string (info key name) to an object (info value) to hold up related +information for this entity. Supported for application and generic entities. +* isrelatedtoEntities and relatestoEntities: It is also possible to represent relationships between +entities. Each entity contains a relatestoEntities and isrelatedtoEntities fields to represent +relationships to other entities. Both fields are represented by a map from a string (the name of +the relationship) to a timeline entity. In this way relationships among entities can be +represented as a DAG. + +Note that when posting timeline metrics, one may choose how each metric should be aggregated +through the `TimelineMetric#setRealtimeAggregationOp()` method. The word "aggregate" here means +applying one of the `TimelineMetricOperation` for a set of entities. Timeline service v2 provides +built-in application level aggregation, which means aggregating metrics from different timeline +entities within one YARN application. Right now, there are two kinds of operations supported in +`TimelineMetricOperation`: + +* `MAX`: Getting the maximum value among all `TimelineMetric` objects. +* `SUM`: Getting the sum of all `TimelineMetric` objects. + +By default, the `NOP` operation means not performing any real-time aggregation operation. + Application frameworks must set the "flow context" whenever possible in order to take advantage of the flow support Timeline Service v.2 provides. The flow context consists of the following: * Flow name: a string that identifies the high-level flow (e.g. "distributed grep" or any identifiable name that can uniquely represent the app) * Flow run id: a monotonically-increasing sequence of numbers that distinguish different runs of -the same flow -* (optional) Flow version: a string identifier that denotes a version of the flow +the same flow. +* (optional) Flow version: a string identifier that denotes a version of the flow. Flow version can +be used to identify changes in the flows, such as code changes or script changes. If the flow context is not specified, defaults are supplied for these attributes: @@ -359,10 +401,11 @@ You can provide the flow context via YARN application tags: appContext.setApplicationTags(tags); + # Timeline Service v.2 REST API -Querying the Timeline Service v.2 is currently only supported via REST API; there is no API -client implemented in the YARN libraries. +Querying Timeline Service v.2 is currently only supported via REST API; there is no API client +implemented in the YARN libraries. The v.2 REST API is implemented at under the path, `/ws/v2/timeline/` on the Timeline Service web service. @@ -377,11 +420,11 @@ Returns a JSON object describing the service instance and version information. { "About":"Timeline Reader API", - "timeline-service-version":"3.0.0-SNAPSHOT", - "timeline-service-build-version":"3.0.0-SNAPSHOT from fb0acd08e6f0b030d82eeb7cbfa5404376313e60 by sjlee source checksum be6cba0e42417d53be16459e1685e7", + "timeline-service-version":"3.0.0-alpha1-SNAPSHOT", + "timeline-service-build-version":"3.0.0-alpha1-SNAPSHOT from fb0acd08e6f0b030d82eeb7cbfa5404376313e60 by sjlee source checksum be6cba0e42417d53be16459e1685e7", "timeline-service-version-built-on":"2016-04-11T23:15Z", - "hadoop-version":"3.0.0-SNAPSHOT", - "hadoop-build-version":"3.0.0-SNAPSHOT from fb0acd08e6f0b030d82eeb7cbfa5404376313e60 by sjlee source checksum ee968fd0aedcc7384230ee3ca216e790", + "hadoop-version":"3.0.0-alpha1-SNAPSHOT", + "hadoop-build-version":"3.0.0-alpha1-SNAPSHOT from fb0acd08e6f0b030d82eeb7cbfa5404376313e60 by sjlee source checksum ee968fd0aedcc7384230ee3ca216e790", "hadoop-version-built-on":"2016-04-11T23:14Z" } @@ -390,8 +433,9 @@ The following shows the supported queries on the REST API. ## Query Flows With Query Flows API, you can retrieve a list of active flows that had runs most recently. -If REST endpoint without cluster name is used, cluster specified by the configuration yarn.resourcemanager.cluster-id in yarn-site.xml is taken. -If none of the flows match the predicates, an empty list will be returned. +If the REST endpoint without the cluster name is used, the cluster specified by the configuration +`yarn.resourcemanager.cluster-id` in `yarn-site.xml` is taken. If none of the flows match the +predicates, an empty list will be returned. ### HTTP request: @@ -406,8 +450,8 @@ If none of the flows match the predicates, an empty list will be returned. 1. `limit` - If specified, defines the number of flows to return. The maximum possible value for limit is maximum value of Long. If it is not specified or has a value less than 0, then limit will be considered as 100. -1. `dateRange` - If specified is given as "[startdate]-[enddate]"(i.e. start and end date separated by - "-") or single date. Dates are interpreted in yyyyMMdd format and are assumed to be in GMT. +1. `daterange` - If specified is given as "[startdate]-[enddate]"(i.e. start and end date separated by + "-") or single date. Dates are interpreted in the yyyyMMdd format and are assumed to be in UTC. If a single date is specified, all flows active on that date are returned. If both startdate and enddate is given, all flows active between start and end date will be returned. If only startdate is given, flows active on and after startdate are returned. If only enddate is given, flows active on and before enddate @@ -480,10 +524,11 @@ If none of the flows match the predicates, an empty list will be returned. ## Query Flow Runs -With Query Flow Runs API, you can drill further down to get the runs (specific instances) of a given flow. -This returns the most recent runs that belong to the given flow. If REST endpoint without cluster name is used, -cluster specified by the configuration yarn.resourcemanager.cluster-id in yarn-site.xml is taken. -If none of the flow runs match the predicates, an empty list will be returned. +With Query Flow Runs API, you can drill further down to get the runs (specific instances) of a +given flow. This returns the most recent runs that belong to the given flow. If the REST +endpoint without the cluster name is used, the cluster specified by the configuration +`yarn.resourcemanager.cluster-id` in `yarn-site.xml` is taken. If none of the flow runs match the +predicates, an empty list will be returned. ### HTTP request: @@ -498,16 +543,16 @@ If none of the flow runs match the predicates, an empty list will be returned. 1. `limit` - If specified, defines the number of flows to return. The maximum possible value for limit is maximum value of Long. If it is not specified or has a value less than 0, then limit will be considered as 100. -1. `createdTimeStart` - If specified, then only flow runs started after this timestamp are returned. -1. `createdTimeEnd` - If specified, then only flow runs started before this timestamp are returned. -1. `metricsToRetrieve` - If specified, defines which metrics to retrieve or which ones not to retrieve and send back in response. - metricsToRetrieve can be an expression of the form :
+1. `createdtimestart` - If specified, then only flow runs started after this timestamp are returned. +1. `createdtimeend` - If specified, then only flow runs started before this timestamp are returned. +1. `metricstoretrieve` - If specified, defines which metrics to retrieve or which ones not to retrieve and send back in response. + metricstoretrieve can be an expression of the form :
(<metricprefix>,<metricprefix>,<metricprefix>,<metricprefix>...)
This specifies a comma separated list of metric id prefixes. Only metrics matching any of the prefixes will be retrieved. Brackets are optional for the simple expression. Alternatively, expressions can be of the form :
!(<metricprefix>,<metricprefix>,<metricprefix>,<metricprefix>...)
This specifies a comma separated list of metric id prefixes. Only metrics not matching any of the prefixes will be retrieved.
- If metricsToRetrieve is specified, metrics will be retrieved irrespective of whether `METRICS` is specified in fields query param + If metricstoretrieve is specified, metrics will be retrieved irrespective of whether `METRICS` is specified in fields query param or not. Please note that URL unsafe characters such as spaces will have to be suitably encoded. 1. `fields` - Specifies which fields to retrieve. For querying flow runs, only `ALL` or `METRICS` are valid fields. Other fields will lead to HTTP 400 (Bad Request) response. If not specified, in response, id, type, createdtime and info fields @@ -559,9 +604,10 @@ If none of the flow runs match the predicates, an empty list will be returned. ## Query Flow Run -With this API, you can query a specific flow run identified by cluster, user, flow name and run id.If REST endpoint without cluster name is -used, cluster specified by the configuration yarn.resourcemanager.cluster-id in yarn-site.xml is taken. Metrics are returned by default while -querying individual flow run. +With this API, you can query a specific flow run identified by cluster, user, flow name and run id. +If the REST endpoint without the cluster name is used, the cluster specified by the configuration +`yarn.resourcemanager.cluster-id` in `yarn-site.xml` is taken. Metrics are returned by default +while querying individual flow runs. ### HTTP request: @@ -573,8 +619,8 @@ querying individual flow run. ### Query Parameters Supported: -1. `metricsToRetrieve` - If specified, defines which metrics to retrieve or which ones not to retrieve and send back in response. - metricsToRetrieve can be an expression of the form :
+1. `metricstoretrieve` - If specified, defines which metrics to retrieve or which ones not to retrieve and send back in response. + metricstoretrieve can be an expression of the form :
(<metricprefix>,<metricprefix>,<metricprefix>,<metricprefix>...)
This specifies a comma separated list of metric id prefixes. Only metrics matching any of the prefixes will be retrieved. Brackets are optional for the simple expression. Alternatively, expressions can be of the form :
@@ -627,9 +673,11 @@ querying individual flow run. ## Query Apps for a flow -With this API, you can query all the YARN applications that are part of a specific flow.If REST endpoint without cluster name -is used, cluster specified by the configuration yarn.resourcemanager.cluster-id in yarn-site.xml is taken. If number of matching applications are -more than the limit, the most recent apps up to the limit will be returned. If none of the apps match the predicates, an empty list will be returned. +With this API, you can query all the YARN applications that are part of a specific flow. If the +REST endpoint without the cluster name is used, the cluster specified by the configuration +`yarn.resourcemanager.cluster-id` in `yarn-site.xml` is taken. If the number of matching +applications are more than the limit, the most recent apps up to the limit will be returned. If +none of the apps match the predicates, an empty list will be returned. ### HTTP request: @@ -644,19 +692,19 @@ more than the limit, the most recent apps up to the limit will be returned. If n 1. `limit` - If specified, defines the number of applications to return. The maximum possible value for limit is maximum value of Long. If it is not specified or has a value less than 0, then limit will be considered as 100. -1. `createdTimeStart` - If specified, then only applications created after this timestamp are returned. -1. `createdTimeEnd` - If specified, then only applications created before this timestamp are returned. -1. `relatesTo` - If specified, matched applications must relate to or not relate to given entities associated with a entity type. +1. `createdtimestart` - If specified, then only applications created after this timestamp are returned. +1. `createdtimeend` - If specified, then only applications created before this timestamp are returned. +1. `relatesto` - If specified, matched applications must relate to or not relate to given entities associated with a entity type. relatesto is represented as an expression of the form :
"(<entitytype>:<entityid>:<entityid>...,<entitytype>:<entityid>:<entityid>...) <op> !(<entitytype>:<entityid>:<entityid>...,<entitytype>:<entityid>:<entityid>...)".
- If relatesTo expression has entity type - entity id(s) relations specified within enclosing brackets proceeding "!", this means apps with - these relations in its relatesTo field, will not be returned. For expressions or subexpressions without "!", all apps which have the specified - relations in its relatesTo field, will be returned. "op" is a logical operator and can be either AND or OR. entity type can be followed by any number + If relatesto expression has entity type - entity id(s) relations specified within enclosing brackets proceeding "!", this means apps with + these relations in its relatesto field, will not be returned. For expressions or subexpressions without "!", all apps which have the specified + relations in its relatesto field, will be returned. "op" is a logical operator and can be either AND or OR. entity type can be followed by any number of entity id(s). And we can combine any number of ANDs' and ORs' to create complex expressions. Brackets can be used to club expressions together.
- _For example_ : relatesTo can be "(((type1:id1:id2:id3,type3:id9) AND !(type2:id7:id8)) OR (type1:id4))".
+ _For example_ : relatesto can be "(((type1:id1:id2:id3,type3:id9) AND !(type2:id7:id8)) OR (type1:id4))".
Please note that URL unsafe characters such as spaces will have to be suitably encoded. -1. `isRelatedTo` - If specified, matched applications must be related to or not related to given entities associated with a entity type. isRelatedTo is - represented in the same form as relatesTo. +1. `isrelatedto` - If specified, matched applications must be related to or not related to given entities associated with a entity type. isrelatedto is + represented in the same form as relatesto. 1. `infofilters` - If specified, matched applications must have exact matches to the given info key and must be either equal or not equal to given value. The info key is a string but value can be any object. infofilters are represented as an expression of the form :
"(<key> <compareop> <value>) <op> (<key> <compareop> <value>)".
@@ -685,30 +733,30 @@ more than the limit, the most recent apps up to the limit will be returned. If n We can combine any number of ANDs' and ORs' to create complex expressions. Brackets can be used to club expressions together.
_For example_ : eventfilters can be "(((event1,event2) AND !(event4)) OR (event3,event7,event5))".
Please note that URL unsafe characters such as spaces will have to be suitably encoded. -1. `metricsToRetrieve` - If specified, defines which metrics to retrieve or which ones not to retrieve and send back in response. - metricsToRetrieve can be an expression of the form :
+1. `metricstoretrieve` - If specified, defines which metrics to retrieve or which ones not to retrieve and send back in response. + metricstoretrieve can be an expression of the form :
(<metricprefix>,<metricprefix>,<metricprefix>,<metricprefix>...)
This specifies a comma separated list of metric id prefixes. Only metrics matching any of the prefixes will be retrieved. Brackets are optional for the simple expression. Alternatively, expressions can be of the form:
!(<metricprefix>,<metricprefix>,<metricprefix>,<metricprefix>...)
This specifies a comma separated list of metric id prefixes. Only metrics not matching any of the prefixes will be retrieved.
- If metricsToRetrieve is specified, metrics will be retrieved irrespective of whether `METRICS` is specified in fields query param + If metricstoretrieve is specified, metrics will be retrieved irrespective of whether `METRICS` is specified in fields query param or not. Please note that URL unsafe characters such as spaces will have to be suitably encoded. -1. `confsToRetrieve` - If specified, defines which configs to retrieve or which ones not to retrieve and send back in response. - confsToRetrieve can be an expression of the form :
+1. `confstoretrieve` - If specified, defines which configs to retrieve or which ones not to retrieve and send back in response. + confstoretrieve can be an expression of the form :
(<config\_name\_prefix>,<config\_name\_prefix>,<config\_name\_prefix>,<config\_name\_prefix>...)
This specifies a comma separated list of config name prefixes. Only configs matching any of the prefixes will be retrieved. Brackets are optional for the simple expression. Alternatively, expressions can be of the form:
!(<config\_name\_prefix>,<config\_name\_prefix>,<config\_name\_prefix>,<config\_name\_prefix>...)
This specifies a comma separated list of config name prefixes. Only configs not matching any of the prefixes will be retrieved.
- If confsToRetrieve is specified, configs will be retrieved irrespective of whether `CONFIGS` is specified in fields query param + If confstoretrieve is specified, configs will be retrieved irrespective of whether `CONFIGS` is specified in fields query param or not. Please note that URL unsafe characters such as spaces will have to be suitably encoded. 1. `fields` - Specifies which fields to retrieve. Possible values for fields can be `EVENTS`, `INFO`, `CONFIGS`, `METRICS`, `RELATES_TO`, `IS_RELATED_TO` and `ALL`. All fields will be retrieved if `ALL` is specified. Multiple fields can be specified as a comma-separated list. If fields is not specified, in response, app id, type (equivalent to YARN_APPLICATION), app createdtime and UID in info field will be returned. -1. `metricsLimit` - If specified, defines the number of metrics to return. Considered only if fields contains METRICS/ALL - or metricsToRetrieve is specified. Ignored otherwise. The maximum possible value for metricsLimit can be maximum value of - Integer. If it is not specified or has a value less than 1, and metrics have to be retrieved, then metricsLimit will be +1. `metricslimit` - If specified, defines the number of metrics to return. Considered only if fields contains METRICS/ALL + or metricstoretrieve is specified. Ignored otherwise. The maximum possible value for metricslimit can be maximum value of + Integer. If it is not specified or has a value less than 1, and metrics have to be retrieved, then metricslimit will be considered as 1 i.e. latest single value of metric(s) will be returned. ### Example JSON Response: @@ -750,9 +798,11 @@ more than the limit, the most recent apps up to the limit will be returned. If n ## Query Apps for a flow run -With this API, you can query all the YARN applications that are part of a specific flow run.If REST endpoint without cluster name -is used, cluster specified by the configuration yarn.resourcemanager.cluster-id in yarn-site.xml is taken. If number of matching applications are -more than the limit, the most recent apps up to the limit will be returned. If none of the apps match the predicates, an empty list will be returned. +With this API, you can query all the YARN applications that are part of a specific flow run. If the +REST endpoint without the cluster name is used, the cluster specified by the configuration +`yarn.resourcemanager.cluster-id` in `yarn-site.xml` is taken. If number of matching applications +are more than the limit, the most recent apps up to the limit will be returned. If none of the apps +match the predicates, an empty list will be returned. ### HTTP request: @@ -767,19 +817,19 @@ more than the limit, the most recent apps up to the limit will be returned. If n 1. `limit` - If specified, defines the number of applications to return. The maximum possible value for limit is maximum value of Long. If it is not specified or has a value less than 0, then limit will be considered as 100. -1. `createdTimeStart` - If specified, then only applications created after this timestamp are returned. -1. `createdTimeEnd` - If specified, then only applications created before this timestamp are returned. -1. `relatesTo` - If specified, matched applications must relate to or not relate to given entities associated with a entity type. +1. `createdtimestart` - If specified, then only applications created after this timestamp are returned. +1. `createdtimeend` - If specified, then only applications created before this timestamp are returned. +1. `relatesto` - If specified, matched applications must relate to or not relate to given entities associated with a entity type. relatesto is represented as an expression of the form :
"(<entitytype>:<entityid>:<entityid>...,<entitytype>:<entityid>:<entityid>...) <op> !(<entitytype>:<entityid>:<entityid>...,<entitytype>:<entityid>:<entityid>...)".
- If relatesTo expression has entity type - entity id(s) relations specified within enclosing brackets proceeding "!", this means apps with - these relations in its relatesTo field, will not be returned. For expressions or subexpressions without "!", all apps which have the specified - relations in its relatesTo field, will be returned. "op" is a logical operator and can be either AND or OR. entity type can be followed by any number + If relatesto expression has entity type - entity id(s) relations specified within enclosing brackets proceeding "!", this means apps with + these relations in its relatesto field, will not be returned. For expressions or subexpressions without "!", all apps which have the specified + relations in its relatesto field, will be returned. "op" is a logical operator and can be either AND or OR. entity type can be followed by any number of entity id(s). And we can combine any number of ANDs' and ORs' to create complex expressions. Brackets can be used to club expressions together.
- _For example_ : relatesTo can be "(((type1:id1:id2:id3,type3:id9) AND !(type2:id7:id8)) OR (type1:id4))".
+ _For example_ : relatesto can be "(((type1:id1:id2:id3,type3:id9) AND !(type2:id7:id8)) OR (type1:id4))".
Please note that URL unsafe characters such as spaces will have to be suitably encoded. -1. `isRelatedTo` - If specified, matched applications must be related to or not related to given entities associated with a entity type. isRelatedTo is - represented in the same form as relatesTo. +1. `isrelatedto` - If specified, matched applications must be related to or not related to given entities associated with a entity type. isrelatedto is + represented in the same form as relatesto. 1. `infofilters` - If specified, matched applications must have exact matches to the given info key and must be either equal or not equal to given value. The info key is a string but value can be any object. infofilters are represented as an expression of the form :
"(<key> <compareop> <value>) <op> (<key> <compareop> <value>)".
@@ -808,30 +858,30 @@ more than the limit, the most recent apps up to the limit will be returned. If n We can combine any number of ANDs' and ORs' to create complex expressions. Brackets can be used to club expressions together.
_For example_ : eventfilters can be "(((event1,event2) AND !(event4)) OR (event3,event7,event5))".
Please note that URL unsafe characters such as spaces will have to be suitably encoded. -1. `metricsToRetrieve` - If specified, defines which metrics to retrieve or which ones not to retrieve and send back in response. - metricsToRetrieve can be an expression of the form :
+1. `metricstoretrieve` - If specified, defines which metrics to retrieve or which ones not to retrieve and send back in response. + metricstoretrieve can be an expression of the form :
(<metricprefix>,<metricprefix>,<metricprefix>,<metricprefix>...)
This specifies a comma separated list of metric id prefixes. Only metrics matching any of the prefixes will be retrieved. Brackets are optional for the simple expression. Alternatively, expressions can be of the form :
!(<metricprefix>,<metricprefix>,<metricprefix>,<metricprefix>...)
This specifies a comma separated list of metric id prefixes. Only metrics not matching any of the prefixes will be retrieved.
- If metricsToRetrieve is specified, metrics will be retrieved irrespective of whether `METRICS` is specified in fields query param + If metricstoretrieve is specified, metrics will be retrieved irrespective of whether `METRICS` is specified in fields query param or not. Please note that URL unsafe characters such as spaces will have to be suitably encoded. -1. `confsToRetrieve` - If specified, defines which configs to retrieve or which ones not to retrieve and send back in response. - confsToRetrieve can be an expression of the form :
+1. `confstoretrieve` - If specified, defines which configs to retrieve or which ones not to retrieve and send back in response. + confstoretrieve can be an expression of the form :
(<config\_name\_prefix>,<config\_name\_prefix>,<config\_name\_prefix>,<config\_name\_prefix>...)
This specifies a comma separated list of config name prefixes. Only configs matching any of the prefixes will be retrieved. Brackets are optional for the simple expression. Alternatively, expressions can be of the form :
!(<config\_name\_prefix>,<config\_name\_prefix>,<config\_name\_prefix>,<config\_name\_prefix>...)
This specifies a comma separated list of config name prefixes. Only configs not matching any of the prefixes will be retrieved.
- If confsToRetrieve is specified, configs will be retrieved irrespective of whether `CONFIGS` is specified in fields query param + If confstoretrieve is specified, configs will be retrieved irrespective of whether `CONFIGS` is specified in fields query param or not. Please note that URL unsafe characters such as spaces will have to be suitably encoded. 1. `fields` - Specifies which fields to retrieve. Possible values for fields can be `EVENTS`, `INFO`, `CONFIGS`, `METRICS`, `RELATES_TO`, `IS_RELATED_TO` and `ALL`. All fields will be retrieved if `ALL` is specified. Multiple fields can be specified as a comma-separated list. If fields is not specified, in response, app id, type (equivalent to YARN_APPLICATION), app createdtime and UID in info field will be returned. -1. `metricsLimit` - If specified, defines the number of metrics to return. Considered only if fields contains METRICS/ALL - or metricsToRetrieve is specified. Ignored otherwise. The maximum possible value for metricsLimit can be maximum value of - Integer. If it is not specified or has a value less than 1, and metrics have to be retrieved, then metricsLimit will be +1. `metricslimit` - If specified, defines the number of metrics to return. Considered only if fields contains METRICS/ALL + or metricstoretrieve is specified. Ignored otherwise. The maximum possible value for metricslimit can be maximum value of + Integer. If it is not specified or has a value less than 1, and metrics have to be retrieved, then metricslimit will be considered as 1 i.e. latest single value of metric(s) will be returned. ### Example JSON Response: @@ -861,10 +911,12 @@ more than the limit, the most recent apps up to the limit will be returned. If n ## Query app -With this API, you can query a single YARN application identified by cluster and application ID. If REST endpoint without cluster name -is used, cluster specified by the configuration yarn.resourcemanager.cluster-id in yarn-site.xml is taken. Flow context information i.e. -user, flow name and run id are not mandatory but if specified in query param can preclude the need for an additional operation to fetch -flow context information based on cluster and app id. +With this API, you can query a single YARN application identified by the cluster and the +application ID. If the REST endpoint without the cluster name is used, the cluster specified by the +configuration `yarn.resourcemanager.cluster-id` in `yarn-site.xml` is taken. Flow context +information i.e. user, flow name and run id are not mandatory but if specified in query param can +preclude the need for an additional operation to fetch flow context information based on cluster +and app id. ### HTTP request: @@ -882,30 +934,30 @@ flow context information based on cluster and app id. If userid, flowname and flowrunid are not specified, we would have to fetch flow context information based on cluster and appid while executing the query. 1. `flowrunid` - Only applications belonging to this flow run id will be returned. This query param must be specified along with userid and flowname query params, otherwise it will be ignored. If userid, flowname and flowrunid are not specified, we would have to fetch flow context information based on cluster and appid while executing the query. -1. `metricsToRetrieve` - If specified, defines which metrics to retrieve or which ones not to retrieve and send back in response. - metricsToRetrieve can be an expression of the form :
+1. `metricstoretrieve` - If specified, defines which metrics to retrieve or which ones not to retrieve and send back in response. + metricstoretrieve can be an expression of the form :
(<metricprefix>,<metricprefix>,<metricprefix>,<metricprefix>...)
This specifies a comma separated list of metric id prefixes. Only metrics matching any of the prefixes will be retrieved. Brackets are optional for the simple expression. Alternatively, expressions can be of the form :
!(<metricprefix>,<metricprefix>,<metricprefix>,<metricprefix>...)
This specifies a comma separated list of metric id prefixes. Only metrics not matching any of the prefixes will be retrieved.
- If metricsToRetrieve is specified, metrics will be retrieved irrespective of whether `METRICS` is specified in fields query param + If metricstoretrieve is specified, metrics will be retrieved irrespective of whether `METRICS` is specified in fields query param or not. Please note that URL unsafe characters such as spaces will have to be suitably encoded. -1. `confsToRetrieve` - If specified, defines which configs to retrieve or which ones not to retrieve and send back in response. - confsToRetrieve can be an expression of the form :
+1. `confstoretrieve` - If specified, defines which configs to retrieve or which ones not to retrieve and send back in response. + confstoretrieve can be an expression of the form :
(<config\_name\_prefix>,<config\_name\_prefix>,<config\_name\_prefix>,<config\_name\_prefix>...)
This specifies a comma separated list of config name prefixes. Only configs matching any of the prefixes will be retrieved. Brackets are optional for the simple expression. Alternatively, expressions can be of the form :
!(<config\_name\_prefix>,<config\_name\_prefix>,<config\_name\_prefix>,<config\_name\_prefix>...)
This specifies a comma separated list of config name prefixes. Only configs not matching any of the prefixes will be retrieved.
- If confsToRetrieve is specified, configs will be retrieved irrespective of whether `CONFIGS` is specified in fields query param + If confstoretrieve is specified, configs will be retrieved irrespective of whether `CONFIGS` is specified in fields query param or not. Please note that URL unsafe characters such as spaces will have to be suitably encoded. 1. `fields` - Specifies which fields to retrieve. Possible values for fields can be `EVENTS`, `INFO`, `CONFIGS`, `METRICS`, `RELATES_TO`, `IS_RELATED_TO` and `ALL`. All fields will be retrieved if `ALL` is specified. Multiple fields can be specified as a comma-separated list. If fields is not specified, in response, app id, type (equivalent to YARN_APPLICATION), app createdtime and UID in info field will be returned. -1. `metricsLimit` - If specified, defines the number of metrics to return. Considered only if fields contains METRICS/ALL - or metricsToRetrieve is specified. Ignored otherwise. The maximum possible value for metricsLimit can be maximum value of - Integer. If it is not specified or has a value less than 1, and metrics have to be retrieved, then metricsLimit will be +1. `metricslimit` - If specified, defines the number of metrics to return. Considered only if fields contains METRICS/ALL + or metricstoretrieve is specified. Ignored otherwise. The maximum possible value for metricslimit can be maximum value of + Integer. If it is not specified or has a value less than 1, and metrics have to be retrieved, then metricslimit will be considered as 1 i.e. latest single value of metric(s) will be returned. ### Example JSON Response: @@ -933,12 +985,16 @@ flow context information based on cluster and app id. ## Query generic entities -With this API, you can query generic entities identified by cluster ID, application ID and per-framework entity type. If REST endpoint without cluster name -is used, cluster specified by the configuration yarn.resourcemanager.cluster-id in yarn-site.xml is taken. Flow context information i.e. -user, flow name and run id are not mandatory but if specified in query param can preclude the need for an additional operation to fetch -flow context information based on cluster and app id. If number of matching entities are more than the limit, the most recent entities up to the limit -will be returned. This endpoint can be used to query containers, application attempts or any other generic entity which clients put into the backend. -For instance, we can query containers by specifying entity type as `YARN_CONTAINER` and application attempts by specifying entity type as `YARN_APPLICATION_ATTEMPT`. +With this API, you can query generic entities identified by cluster ID, application ID and +per-framework entity type. If the REST endpoint without the cluster name is used, the cluster +specified by the configuration `yarn.resourcemanager.cluster-id` in `yarn-site.xml` is taken. Flow +context information i.e. user, flow name and run id are not mandatory but if specified in query +param can preclude the need for an additional operation to fetch flow context information based on +cluster and app id. If number of matching entities are more than the limit, the most recent +entities up to the limit will be returned. This endpoint can be used to query containers, +application attempts or any other generic entity which clients put into the backend. +For instance, we can query containers by specifying entity type as `YARN_CONTAINER` and application +attempts by specifying entity type as `YARN_APPLICATION_ATTEMPT`. If none of the entities match the predicates, an empty list will be returned. ### HTTP request: @@ -959,19 +1015,19 @@ If none of the entities match the predicates, an empty list will be returned. If userid, flowname and flowrunid are not specified, we would have to fetch flow context information based on cluster and appid while executing the query. 1. `limit` - If specified, defines the number of entities to return. The maximum possible value for limit is maximum value of Long. If it is not specified or has a value less than 0, then limit will be considered as 100. -1. `createdTimeStart` - If specified, then only entities created after this timestamp are returned. -1. `createdTimeEnd` - If specified, then only entities created before this timestamp are returned. -1. `relatesTo` - If specified, matched entities must relate to or not relate to given entities associated with a entity type. +1. `createdtimestart` - If specified, then only entities created after this timestamp are returned. +1. `createdtimeend` - If specified, then only entities created before this timestamp are returned. +1. `relatesto` - If specified, matched entities must relate to or not relate to given entities associated with a entity type. relatesto is represented as an expression of the form :
"(<entitytype>:<entityid>:<entityid>...,<entitytype>:<entityid>:<entityid>...) <op> !(<entitytype>:<entityid>:<entityid>...,<entitytype>:<entityid>:<entityid>...)".
- If relatesTo expression has entity type - entity id(s) relations specified within enclosing brackets proceeding "!", this means entities with - these relations in its relatesTo field, will not be returned. For expressions or subexpressions without "!", all entities which have the specified - relations in its relatesTo field, will be returned. "op" is a logical operator and can be either AND or OR. entity type can be followed by any number + If relatesto expression has entity type - entity id(s) relations specified within enclosing brackets proceeding "!", this means entities with + these relations in its relatesto field, will not be returned. For expressions or subexpressions without "!", all entities which have the specified + relations in its relatesto field, will be returned. "op" is a logical operator and can be either AND or OR. entity type can be followed by any number of entity id(s). And we can combine any number of ANDs' and ORs' to create complex expressions. Brackets can be used to club expressions together.
- _For example_ : relatesTo can be "(((type1:id1:id2:id3,type3:id9) AND !(type2:id7:id8)) OR (type1:id4))".
+ _For example_ : relatesto can be "(((type1:id1:id2:id3,type3:id9) AND !(type2:id7:id8)) OR (type1:id4))".
Please note that URL unsafe characters such as spaces will have to be suitably encoded. -1. `isRelatedTo` - If specified, matched entities must be related to or not related to given entities associated with a entity type. isRelatedTo is - represented in the same form as relatesTo. +1. `isrelatedto` - If specified, matched entities must be related to or not related to given entities associated with a entity type. isrelatedto is + represented in the same form as relatesto. 1. `infofilters` - If specified, matched entities must have exact matches to the given info key and must be either equal or not equal to given value. The info key is a string but value can be any object. infofilters are represented as an expression of the form :
"(<key> <compareop> <value>) <op> (<key> <compareop> <value>)".
@@ -1000,30 +1056,30 @@ If none of the entities match the predicates, an empty list will be returned. We can combine any number of ANDs' and ORs' to create complex expressions. Brackets can be used to club expressions together.
_For example_ : eventfilters can be "(((event1,event2) AND !(event4)) OR (event3,event7,event5))".
Please note that URL unsafe characters such as spaces will have to be suitably encoded. -1. `metricsToRetrieve` - If specified, defines which metrics to retrieve or which ones not to retrieve and send back in response. - metricsToRetrieve can be an expression of the form :
+1. `metricstoretrieve` - If specified, defines which metrics to retrieve or which ones not to retrieve and send back in response. + metricstoretrieve can be an expression of the form :
(<metricprefix>,<metricprefix>,<metricprefix>,<metricprefix>...)
This specifies a comma separated list of metric id prefixes. Only metrics matching any of the prefixes will be retrieved. Brackets are optional for the simple expression. Alternatively, expressions can be of the form:
!(<metricprefix>,<metricprefix>,<metricprefix>,<metricprefix>...)
This specifies a comma separated list of metric id prefixes. Only metrics not matching any of the prefixes will be retrieved.
- If metricsToRetrieve is specified, metrics will be retrieved irrespective of whether `METRICS` is specified in fields query param + If metricstoretrieve is specified, metrics will be retrieved irrespective of whether `METRICS` is specified in fields query param or not. Please note that URL unsafe characters such as spaces will have to be suitably encoded. -1. `confsToRetrieve` - If specified, defines which configs to retrieve or which ones not to retrieve and send back in response. - confsToRetrieve can be an expression of the form :
+1. `confstoretrieve` - If specified, defines which configs to retrieve or which ones not to retrieve and send back in response. + confstoretrieve can be an expression of the form :
(<config\_name\_prefix>,<config\_name\_prefix>,<config\_name\_prefix>,<config\_name\_prefix>...)
This specifies a comma separated list of config name prefixes. Only configs matching any of the prefixes will be retrieved. Brackets are optional for the simple expression. Alternatively, expressions can be of the form:
!(<config\_name\_prefix>,<config\_name\_prefix>,<config\_name\_prefix>,<config\_name\_prefix>...)
This specifies a comma separated list of config name prefixes. Only configs not matching any of the prefixes will be retrieved.
- If confsToRetrieve is specified, configs will be retrieved irrespective of whether `CONFIGS` is specified in fields query param + If confstoretrieve is specified, configs will be retrieved irrespective of whether `CONFIGS` is specified in fields query param or not. Please note that URL unsafe characters such as spaces will have to be suitably encoded. 1. `fields` - Specifies which fields to retrieve. Possible values for fields can be `EVENTS`, `INFO`, `CONFIGS`, `METRICS`, `RELATES_TO`, `IS_RELATED_TO` and `ALL`. All fields will be retrieved if `ALL` is specified. Multiple fields can be specified as a comma-separated list. If fields is not specified, in response, entity id, entity type, createdtime and UID in info field will be returned. -1. `metricsLimit` - If specified, defines the number of metrics to return. Considered only if fields contains METRICS/ALL - or metricsToRetrieve is specified. Ignored otherwise. The maximum possible value for metricsLimit can be maximum value of - Integer. If it is not specified or has a value less than 1, and metrics have to be retrieved, then metricsLimit will be +1. `metricslimit` - If specified, defines the number of metrics to return. Considered only if fields contains METRICS/ALL + or metricstoretrieve is specified. Ignored otherwise. The maximum possible value for metricslimit can be maximum value of + Integer. If it is not specified or has a value less than 1, and metrics have to be retrieved, then metricslimit will be considered as 1 i.e. latest single value of metric(s) will be returned. ### Example JSON Response: @@ -1066,12 +1122,16 @@ If none of the entities match the predicates, an empty list will be returned. ## Query generic entity -With this API, you can query a specific generic entity identified by cluster ID, application ID, per-framework entity type and entity ID. If REST endpoint without -cluster name is used, cluster specified by the configuration yarn.resourcemanager.cluster-id in yarn-site.xml is taken. Flow context information i.e. -user, flow name and run id are not mandatory but if specified in query param can preclude the need for an additional operation to fetch -flow context information based on cluster and app id. This endpoint can be used to query a single container, application attempt or any other generic entity which -clients put into the backend. For instance, we can query a specific YARN container by specifying entity type as `YARN_CONTAINER` and giving entity ID as container ID. -Similarly, application attempt can be queried by specifying entity type as `YARN_APPLICATION_ATTEMPT` and entity ID being the application attempt ID. +With this API, you can query a specific generic entity identified by cluster ID, application ID, +per-framework entity type and entity ID. If the REST endpoint without the cluster name is used, the +cluster specified by the configuration `yarn.resourcemanager.cluster-id` in `yarn-site.xml` is +taken. Flow context information i.e. user, flow name and run id are not mandatory but if specified +in query param can preclude the need for an additional operation to fetch flow context information +based on cluster and app id. This endpoint can be used to query a single container, application +attempt or any other generic entity which clients put into the backend. For instance, we can query +a specific YARN container by specifying entity type as `YARN_CONTAINER` and giving entity ID as +container ID. Similarly, application attempt can be queried by specifying entity type as +`YARN_APPLICATION_ATTEMPT` and entity ID being the application attempt ID. ### HTTP request: @@ -1089,30 +1149,30 @@ Similarly, application attempt can be queried by specifying entity type as `YARN If userid, flowname and flowrunid are not specified, we would have to fetch flow context information based on cluster and appid while executing the query. 1. `flowrunid` - If specified, entity must belong to this flow run id. This query param must be specified along with userid and flowname query params, otherwise it will be ignored. If userid, flowname and flowrunid are not specified, we would have to fetch flow context information based on cluster and appid while executing the query. -1. `metricsToRetrieve` - If specified, defines which metrics to retrieve or which ones not to retrieve and send back in response. - metricsToRetrieve can be an expression of the form :
+1. `metricstoretrieve` - If specified, defines which metrics to retrieve or which ones not to retrieve and send back in response. + metricstoretrieve can be an expression of the form :
(<metricprefix>,<metricprefix>,<metricprefix>,<metricprefix>...)
This specifies a comma separated list of metric id prefixes. Only metrics matching any of the prefixes will be retrieved. Brackets are optional for the simple expression. Alternatively, expressions can be of the form:
!(<metricprefix>,<metricprefix>,<metricprefix>,<metricprefix>...)
This specifies a comma separated list of metric id prefixes. Only metrics not matching any of the prefixes will be retrieved.
- If metricsToRetrieve is specified, metrics will be retrieved irrespective of whether `METRICS` is specified in fields query param + If metricstoretrieve is specified, metrics will be retrieved irrespective of whether `METRICS` is specified in fields query param or not. Please note that URL unsafe characters such as spaces will have to be suitably encoded. -1. `confsToRetrieve` - If specified, defines which configs to retrieve or which ones not to retrieve and send back in response. - confsToRetrieve can be an expression of the form :
+1. `confstoretrieve` - If specified, defines which configs to retrieve or which ones not to retrieve and send back in response. + confstoretrieve can be an expression of the form :
(<config\_name\_prefix>,<config\_name\_prefix>,<config\_name\_prefix>,<config\_name\_prefix>...)
This specifies a comma separated list of config name prefixes. Only configs matching any of the prefixes will be retrieved. Brackets are optional for the simple expression. Alternatively, expressions can be of the form :
!(<config\_name\_prefix>,<config\_name\_prefix>,<config\_name\_prefix>,<config\_name\_prefix>...)
This specifies a comma separated list of config name prefixes. Only configs not matching any of the prefixes will be retrieved.
- If confsToRetrieve is specified, configs will be retrieved irrespective of whether `CONFIGS` is specified in fields query param + If confstoretrieve is specified, configs will be retrieved irrespective of whether `CONFIGS` is specified in fields query param or not. Please note that URL unsafe characters such as spaces will have to be suitably encoded. 1. `fields` - Specifies which fields to retrieve. Possible values for fields can be `EVENTS`, `INFO`, `CONFIGS`, `METRICS`, `RELATES_TO`, `IS_RELATED_TO` and `ALL`. All fields will be retrieved if `ALL` is specified. Multiple fields can be specified as a comma-separated list. If fields is not specified, in response, entity id, entity type, createdtime and UID in info field will be returned. -1. `metricsLimit` - If specified, defines the number of metrics to return. Considered only if fields contains METRICS/ALL - or metricsToRetrieve is specified. Ignored otherwise. The maximum possible value for metricsLimit can be maximum value of - Integer. If it is not specified or has a value less than 1, and metrics have to be retrieved, then metricsLimit will be +1. `metricslimit` - If specified, defines the number of metrics to return. Considered only if fields contains METRICS/ALL + or metricstoretrieve is specified. Ignored otherwise. The maximum possible value for metricslimit can be maximum value of + Integer. If it is not specified or has a value less than 1, and metrics have to be retrieved, then metricslimit will be considered as 1 i.e. latest single value of metric(s) will be returned. ### Example JSON Response: diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-site/src/site/resources/images/flow_hierarchy.png b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-site/src/site/resources/images/flow_hierarchy.png new file mode 100644 index 0000000000000000000000000000000000000000..fc4b06b9831e7337cd93abaae5ddc6a6668762aa GIT binary patch literal 42345 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 literal 0 HcmV?d00001