From d702816e7db06f0c7143b18d4557b92307c4796b Mon Sep 17 00:00:00 2001 From: Zhijie Shen Date: Mon, 16 Mar 2015 10:52:32 -0700 Subject: [PATCH] YARN-2854. Updated the documentation of the timeline service and the generic history service. Contributed by Naganarasimha G R. (cherry picked from commit fbe811d904d4325ae17a83071c841755461f52b7) --- hadoop-yarn-project/CHANGES.txt | 3 + .../src/site/markdown/TimelineServer.md | 360 +++++++++--------- .../resources/images/timeline_structure.jpg | Bin 0 -> 23070 bytes 3 files changed, 186 insertions(+), 177 deletions(-) create mode 100644 hadoop-yarn-project/hadoop-yarn/hadoop-yarn-site/src/site/resources/images/timeline_structure.jpg diff --git a/hadoop-yarn-project/CHANGES.txt b/hadoop-yarn-project/CHANGES.txt index 0d08ec67ec0..66f36e3dfa6 100644 --- a/hadoop-yarn-project/CHANGES.txt +++ b/hadoop-yarn-project/CHANGES.txt @@ -330,6 +330,9 @@ Release 2.7.0 - UNRELEASED YARN-3187. Documentation of Capacity Scheduler Queue mapping based on user or group. (Gururaj Shetty via jianhe) + YARN-2854. Updated the documentation of the timeline service and the generic + history service. (Naganarasimha G R via zjshen) + OPTIMIZATIONS YARN-2990. FairScheduler's delay-scheduling always waits for node-local and diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-site/src/site/markdown/TimelineServer.md b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-site/src/site/markdown/TimelineServer.md index 8ac1e3bc887..cb8a5d33c16 100644 --- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-site/src/site/markdown/TimelineServer.md +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-site/src/site/markdown/TimelineServer.md @@ -16,144 +16,122 @@ YARN Timeline Server ==================== * [Overview](#Overview) -* [Current Status](#Current_Status) -* [Basic Configuration](#Basic_Configuration) -* [Advanced Configuration](#Advanced_Configuration) -* [Generic-data related Configuration](#Generic-data_related_Configuration) -* [Per-framework-date related Configuration](#Per-framework-date_related_Configuration) -* [Running Timeline server](#Running_Timeline_server) -* [Accessing generic-data via command-line](#Accessing_generic-data_via_command-line) -* [Publishing of per-framework data by applications](#Publishing_of_per-framework_data_by_applications) + * [Introduction](#Introduction) + * [Current Status](#Current_Status) + * [Timeline Structure](#Timeline_Structure) +* [Deployment](#Deployment) + * [Configurations](#Configurations) + * [Running Timeline server](#Running_Timeline_server) + * [Accessing generic-data via command-line](#Accessing_generic-data_via_command-line) +* [Publishing of application specific data](#Publishing_of_application_specific_data) Overview --------- +--------- -Storage and retrieval of applications' current as well as historic information in a generic fashion is solved in YARN through the Timeline Server (previously also called Generic Application History Server). This serves two responsibilities: +### Introduction -* Generic information about completed applications - - Generic information includes application level data like queue-name, user information etc in the ApplicationSubmissionContext, list of application-attempts that ran for an application, information about each application-attempt, list of containers run under each application-attempt, and information about each container. Generic data is stored by ResourceManager to a history-store (default implementation on a file-system) and used by the web-UI to display information about completed applications. + Storage and retrieval of application's current as well as historic information in a generic fashion is solved in YARN through the Timeline Server. This serves two responsibilities: -* Per-framework information of running and completed applications - - Per-framework information is completely specific to an application or framework. For example, Hadoop MapReduce framework can include pieces of information like number of map tasks, reduce tasks, counters etc. Application developers can publish the specific information to the Timeline server via TimelineClient from within a client, the ApplicationMaster and/or the application's containers. This information is then queryable via REST APIs for rendering by application/framework specific UIs. +#### Application specific information -Current Status --------------- + Supports collection of information completely specific to an application or framework. For example, Hadoop MapReduce framework can include pieces of information like number of map tasks, reduce tasks, counters etc. Application developers can publish the specific information to the Timeline server via TimelineClient, the ApplicationMaster and/or the application's containers. This information is then queryable via REST APIs for rendering by application/framework specific UIs. -Timeline sever is a work in progress. The basic storage and retrieval of information, both generic and framework specific, are in place. Timeline server doesn't work in secure mode yet. The generic information and the per-framework information are today collected and presented separately and thus are not integrated well together. Finally, the per-framework information is only available via RESTful APIs, using JSON type content - ability to install framework specific UIs in YARN isn't supported yet. +#### Generic information about completed applications + + Previously this was done by Application History Server but with timeline server its just one use case of Timeline server functionality. Generic information includes application level data like queue-name, user information etc in the ApplicationSubmissionContext, list of application-attempts that ran for an application, information about each application-attempt, list of containers run under each application-attempt, and information about each container. Generic data is published by ResourceManager to the timeline store and used by the web-UI to display information about completed applications. + -Basic Configuration -------------------- +### Current Status -Users need to configure the Timeline server before starting it. The simplest configuration you should add in `yarn-site.xml` is to set the hostname of the Timeline server. + The essential functionality of the timeline server have been completed and it can work in both secure and non secure modes. The generic history service is also built on timeline store. In subsequent releases we will be rolling out next generation timeline service which is scalable and reliable. Currently, Application specific information is only available via RESTful APIs using JSON type content. The ability to install framework specific UIs in YARN is not supported yet. + +### Timeline Structure + +![Timeline Structure] (./images/timeline_structure.jpg) + +#### TimelineDomain + + Domain is like namespace for Timeline server and users can host multiple entities, isolating them from others. Timeline server Security is defined at this level. Domain majorly stores owner info, read & write ACL information, created and modified time stamp information. Domain is uniquely identified by ID. + +#### TimelineEntity + + Entity contains the the meta information of some conceptual entity and its related events. The entity can be an application, an application attempt, a container or whatever the user-defined object. It contains Primary filters which will be used to index the entities in TimelineStore, such that users should carefully choose the information they want to store as the primary filters. The remaining data can be stored as other information. Entity is uniquely identified by EntityId and EntityType. + +#### TimelineEvent + + TimelineEvent contains the information of an event that is related to some conceptual entity of an application. Users are free to define what the event means, such as starting an application, getting allocated a container and etc. + +Deployment +---------- + +###Configurations + +#### Basic Configuration + +| Configuration Property | Description | +|:---- |:---- | +| `yarn.timeline-service.enabled` | Indicate to clients whether Timeline service is enabled or not. If enabled, the TimelineClient library used by end-users will post entities and events to the Timeline server. Defaults to false. | +| `yarn.resourcemanager.system-metrics-publisher.enabled` | The setting that controls whether yarn system metrics is published on the timeline server or not by RM. Defaults to false. | +| `yarn.timeline-service.generic-application-history.enabled` | Indicate to clients whether to query generic application data from timeline history-service or not. If not enabled then application data is queried only from Resource Manager. Defaults to false. | + +#### Advanced configuration + +| Configuration Property | Description | +|:---- |:---- | +| `yarn.timeline-service.ttl-enable` | Enable age off of timeline store data. Defaults to true. | +| `yarn.timeline-service.ttl-ms` | Time to live for timeline store data in milliseconds. Defaults to 604800000 (7 days). | +| `yarn.timeline-service.handler-thread-count` | Handler thread count to serve the client RPC requests. Defaults to 10. | +| `yarn.timeline-service.client.max-retries` | Default maximum number of retires for timeline servive client. Defaults to 30. | +| `yarn.timeline-service.client.retry-interval-ms` | Default retry time interval for timeline servive client. Defaults to 1000. | + +#### Timeline store and state store configuration + +| Configuration Property | Description | +|:---- |:---- | +| `yarn.timeline-service.store-class` | Store class name for timeline store. Defaults to org.apache.hadoop.yarn.server.timeline.LeveldbTimelineStore. | +| `yarn.timeline-service.leveldb-timeline-store.path` | Store file name for leveldb timeline store. Defaults to ${hadoop.tmp.dir}/yarn/timeline. | +| `yarn.timeline-service.leveldb-timeline-store.ttl-interval-ms` | Length of time to wait between deletion cycles of leveldb timeline store in milliseconds. Defaults to 300000. | +| `yarn.timeline-service.leveldb-timeline-store.read-cache-size` | Size of read cache for uncompressed blocks for leveldb timeline store in bytes. Defaults to 104857600. | +| `yarn.timeline-service.leveldb-timeline-store.start-time-read-cache-size` | Size of cache for recently read entity start times for leveldb timeline store in number of entities. Defaults to 10000. | +| `yarn.timeline-service.leveldb-timeline-store.start-time-write-cache-size` | Size of cache for recently written entity start times for leveldb timeline store in number of entities. Defaults to 10000. | +| `yarn.timeline-service.recovery.enabled` | Defaults to false. | +| `yarn.timeline-service.state-store-class` | Store class name for timeline state store. Defaults to org.apache.hadoop.yarn.server.timeline.recovery.LeveldbTimelineStateStore. | +| `yarn.timeline-service.leveldb-state-store.path` | Store file name for leveldb timeline state store. | + +#### Web and RPC Configuration + +| Configuration Property | Description | +|:---- |:---- | +| `yarn.timeline-service.hostname` | The hostname of the Timeline service web application. Defaults to 0.0.0.0. | +| `yarn.timeline-service.address` | Address for the Timeline server to start the RPC server. Defaults to ${yarn.timeline-service.hostname}:10200. | +| `yarn.timeline-service.webapp.address` | The http address of the Timeline service web application. Defaults to ${yarn.timeline-service.hostname}:8188. | +| `yarn.timeline-service.webapp.https.address` | The https address of the Timeline service web application. Defaults to ${yarn.timeline-service.hostname}:8190. | +| `yarn.timeline-service.bind-host` | The actual address the server will bind to. If this optional address is set, the RPC and webapp servers will bind to this address and the port specified in yarn.timeline-service.address and yarn.timeline-service.webapp.address, respectively. This is most useful for making the service listen to all interfaces by setting to 0.0.0.0. | +| `yarn.timeline-service.http-cross-origin.enabled` | Enables cross-origin support (CORS) for web services where cross-origin web response headers are needed. For example, javascript making a web services request to the timeline server. Defaults to false. | +| `yarn.timeline-service.http-cross-origin.allowed-origins` | Comma separated list of origins that are allowed for web services needing cross-origin (CORS) support. Wildcards `(*)` and patterns allowed. Defaults to `*`. | +| yarn.timeline-service.http-cross-origin.allowed-methods | Comma separated list of methods that are allowed for web services needing cross-origin (CORS) support. Defaults to GET,POST,HEAD. | +| `yarn.timeline-service.http-cross-origin.allowed-headers` | Comma separated list of headers that are allowed for web services needing cross-origin (CORS) support. Defaults to X-Requested-With,Content-Type,Accept,Origin. | +| `yarn.timeline-service.http-cross-origin.max-age` | The number of seconds a pre-flighted request can be cached for web services needing cross-origin (CORS) support. Defaults to 1800. | + +#### Security Configuration + + Security can be enabled by setting yarn.timeline-service.http-authentication.type to kerberos and further following configurations can be done. + +| Configuration Property | Description | +|:---- |:---- | +| `yarn.timeline-service.http-authentication.type` | Defines authentication used for the timeline server HTTP endpoint. Supported values are: simple / kerberos / #AUTHENTICATION_HANDLER_CLASSNAME#. Defaults to simple. | +| `yarn.timeline-service.http-authentication.simple.anonymous.allowed` | Indicates if anonymous requests are allowed by the timeline server when using 'simple' authentication. Defaults to true. | +| `yarn.timeline-service.principal` | The Kerberos principal for the timeline server. | +| yarn.timeline-service.keytab | The Kerberos keytab for the timeline server. Defaults to /etc/krb5.keytab. | +| `yarn.timeline-service.delegation.key.update-interval` | Defaults to 86400000 (1 day). | +| `yarn.timeline-service.delegation.token.renew-interval` | Defaults to 86400000 (1 day). | +| `yarn.timeline-service.delegation.token.max-lifetime` | Defaults to 604800000 (7 day). | + +#### Enabling the timeline service and the generic history service + + Following are the basic configuration to start Timeline server. -```xml - - The hostname of the Timeline service web application. - yarn.timeline-service.hostname - 0.0.0.0 - ``` - -Advanced Configuration ----------------------- - -In addition to the hostname, admins can also configure whether the service is enabled or not, the ports of the RPC and the web interfaces, and the number of RPC handler threads. - -```xml - - Address for the Timeline server to start the RPC server. - yarn.timeline-service.address - ${yarn.timeline-service.hostname}:10200 - - - - The http address of the Timeline service web application. - yarn.timeline-service.webapp.address - ${yarn.timeline-service.hostname}:8188 - - - - The https address of the Timeline service web application. - yarn.timeline-service.webapp.https.address - ${yarn.timeline-service.hostname}:8190 - - - - Handler thread count to serve the client RPC requests. - yarn.timeline-service.handler-thread-count - 10 - - - - Enables cross-origin support (CORS) for web services where - cross-origin web response headers are needed. For example, javascript making - a web services request to the timeline server. - yarn.timeline-service.http-cross-origin.enabled - false - - - - Comma separated list of origins that are allowed for web - services needing cross-origin (CORS) support. Wildcards (*) and patterns - allowed - yarn.timeline-service.http-cross-origin.allowed-origins - * - - - - Comma separated list of methods that are allowed for web - services needing cross-origin (CORS) support. - yarn.timeline-service.http-cross-origin.allowed-methods - GET,POST,HEAD - - - - Comma separated list of headers that are allowed for web - services needing cross-origin (CORS) support. - yarn.timeline-service.http-cross-origin.allowed-headers - X-Requested-With,Content-Type,Accept,Origin - - - - The number of seconds a pre-flighted request can be cached - for web services needing cross-origin (CORS) support. - yarn.timeline-service.http-cross-origin.max-age - 1800 - -``` - -Generic-data related Configuration ----------------------------------- - -Users can specify whether the generic data collection is enabled or not, and also choose the storage-implementation class for the generic data. There are more configurations related to generic data collection, and users can refer to `yarn-default.xml` for all of them. - -```xml - - Indicate to ResourceManager as well as clients whether - history-service is enabled or not. If enabled, ResourceManager starts - recording historical data that Timelien service can consume. Similarly, - clients can redirect to the history service when applications - finish if this is enabled. - yarn.timeline-service.generic-application-history.enabled - false - - - - Store class name for history store, defaulting to file system - store - yarn.timeline-service.generic-application-history.store-class - org.apache.hadoop.yarn.server.applicationhistoryservice.FileSystemApplicationHistoryStore - -``` - -Per-framework-date related Configuration ----------------------------------------- - -Users can specify whether per-framework data service is enabled or not, choose the store implementation for the per-framework data, and tune the retention of the per-framework data. There are more configurations related to per-framework data service, and users can refer to `yarn-default.xml` for all of them. - -```xml Indicate to clients whether Timeline service is enabled or not. If enabled, the TimelineClient library used by end-users will post entities @@ -163,69 +141,97 @@ Users can specify whether per-framework data service is enabled or not, choose t - Store class name for timeline store. - yarn.timeline-service.store-class - org.apache.hadoop.yarn.server.timeline.LeveldbTimelineStore - - - - Enable age off of timeline store data. - yarn.timeline-service.ttl-enable + The setting that controls whether yarn system metrics is + published on the timeline server or not by RM. + yarn.resourcemanager.system-metrics-publisher.enabled true - Time to live for timeline store data in milliseconds. - yarn.timeline-service.ttl-ms - 604800000 + Indicate to clients whether to query generic application + data from timeline history-service or not. If not enabled then application + data is queried only from Resource Manager. + yarn.timeline-service.generic-application-history.enabled + true ``` -Running Timeline server ------------------------ +### Running Timeline server -Assuming all the aforementioned configurations are set properly, admins can start the Timeline server/history service with the following command: - - $ yarn timelineserver - -Or users can start the Timeline server / history service as a daemon: - - $ $HADOOP_YARN_HOME/sbin/yarn-daemon.sh start timelineserver - -Accessing generic-data via command-line ---------------------------------------- - -Users can access applications' generic historic data via the command line as below. Note that the same commands are usable to obtain the corresponding information about running applications. + Assuming all the aforementioned configurations are set properly, admins can start the Timeline server/history service with the following command: ``` - $ yarn application -status - $ yarn applicationattempt -list - $ yarn applicationattempt -status - $ yarn container -list - $ yarn container -status + $ yarn timelineserver ``` -Publishing of per-framework data by applications + Or users can start the Timeline server / history service as a daemon: + +``` + $ $HADOOP_YARN_HOME/sbin/yarn-daemon.sh start timelineserver +``` + +### Accessing generic-data via command-line + + Users can access applications' generic historic data via the command line as below. Note that the same commands are usable to obtain the corresponding information about running applications. + +``` + $ yarn application -status + $ yarn applicationattempt -list + $ yarn applicationattempt -status + $ yarn container -list + $ yarn container -status +``` + +Publishing of application specific data ------------------------------------------------ -Developers can define what information they want to record for their applications by composing `TimelineEntity` and `TimelineEvent` objects, and put the entities and events to the Timeline server via `TimelineClient`. Following is an example: + Developers can define what information they want to record for their applications by composing `TimelineEntity` and `TimelineEvent` objects, and put the entities and events to the Timeline server via `TimelineClient`. Below is an example: -```java -// Create and start the Timeline client -TimelineClient client = TimelineClient.createTimelineClient(); -client.init(conf); -client.start(); - -TimelineEntity entity = null; -// Compose the entity -try { - TimelinePutResponse response = client.putEntities(entity); -} catch (IOException e) { - // Handle the exception -} catch (YarnException e) { - // Handle the exception -} - -// Stop the Timeline client -client.stop(); ``` + // Create and start the Timeline client + TimelineClient client = TimelineClient.createTimelineClient(); + client.init(conf); + client.start(); + + try { + TimelineDomain myDomain = new TimelineDomain(); + myDomain.setID("MyDomain"); + // Compose other Domain info .... + + client.putDomain(myDomain); + + TimelineEntity myEntity = new TimelineEntity(); + myEntity.setDomainId(myDomain.getId()); + myEntity.setEntityType("APPLICATION"); + myEntity.setEntityID("MyApp1") + // Compose other entity info + + TimelinePutResponse response = client.putEntities(entity); + + + TimelineEvent event = new TimelineEvent(); + event.setEventType("APP_FINISHED"); + event.setTimestamp(System.currentTimeMillis()); + event.addEventInfo("Exit Status", "SUCCESS"); + // Compose other Event info .... + + myEntity.addEvent(event); + timelineClient.putEntities(entity); + + } catch (IOException e) { + // Handle the exception + } catch (YarnException e) { + // Handle the exception + } + + // Stop the Timeline client + client.stop(); +``` + + **Note** : Following are the points which needs to be observed during updating a entity. + + * Domain ID should not be modified for already existing entity. + + * Its advisable to have same primary filters for all updates on entity. As on modification of primary filter by subsequent updates will result in not fetching the information before the update when queried with updated primary filter. + + * On modification of Primary filter value, new value will be appended with the old value. diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-site/src/site/resources/images/timeline_structure.jpg b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-site/src/site/resources/images/timeline_structure.jpg new file mode 100644 index 0000000000000000000000000000000000000000..dbfce25d7055e113b673fc950bb4a101f3b582c4 GIT binary patch literal 23070 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 literal 0 HcmV?d00001