This page lists the major RESTful APIs provided by Apache Griffin.
Apache Griffin default BASE_PATH
is http://<your ip>:8080
.
We follow general rules to design Apache Griffin's REST APIs. In the HTTP response that is sent to a client, the status code, which is a three-digit number, is accompanied by a reason phrase (also known as status text) that simply describes the meaning of the code. The status codes are classified by number range, with each class of codes having the same basic meaning.
- The range 100-199 is classed as Informational.
- 200-299 is Successful.
- 300-399 is Redirection.
- 400-499 is Client error.
- 500-599 is Server error.
The valid HTTP response is designed as follows:
Action | HTTP Status | Response Body |
---|---|---|
POST | 201, "Created" | created item |
GET | 200, "OK" | requested items |
PUT | 204, "No Content" | no content |
DELETE | 204, "No Content" | no content |
Note that: The metric module is implemented with elasticsearch bulk api, so the responses do not follow rules above.
The response for exception is designed as follows:
Action | HTTP Status | Response Body |
---|---|---|
ANY | 400, "Bad Request" | error detail |
ANY | 500, "Internal Server Error" | error detail |
{
"timestamp": 1517208444322,
"status": 400,
"error": "Bad Request",
"code": 40009,
"message": "Property 'measure.id' is invalid",
"path": "/api/v1/jobs"
}
{
"timestamp": 1517209428969,
"status": 500,
"error": "Internal Server Error",
"message": "Failed to add metric values",
"exception": "java.net.ConnectException",
"path": "/api/v1/metrics/values"
}
Description:
- timestamp: the timestamp of response created
- status : the HTTP status code
- error : reason phrase of the HTTP status
- code: customized error code
- message : customized error message
- exception: fully qualified name of cause exception
- path: the requested api
Note that: 'exception' field may not exist if it is caused by client error, and 'code' field may not exist for server error.
GET /api/v1/version
curl -k -H "Accept: application/json" -X GET http://127.0.0.1:8080/api/v1/version
0.3.0
POST /api/v1/measures
key | value |
---|---|
Content-Type | application/json |
There are two kinds of measures, Apache Griffin measure and external measure.
The measure's 'dq.type' can either be 'ACCURACY' or 'PROFILING'.
Here is an example to define measure of profiling:
curl -k -H "Content-Type: application/json" -H "Accept: application/json" \
-X POST http://127.0.0.1:8080/api/v1/measures \
-d '{
"name": "profiling_measure",
"measure.type": "griffin",
"dq.type": "PROFILING",
"rule.description": {
"details": [
{
"name": "age",
"infos": "Total Count,Average"
}
]
},
"process.type": "BATCH",
"owner": "test",
"description": "measure description",
"data.sources": [
{
"name": "source",
"connector": {
"name": "connector_name",
"type": "HIVE",
"version": "1.2",
"data.unit": "1hour",
"data.time.zone": "UTC(WET,GMT)",
"config": {
"database": "default",
"table.name": "demo_src",
"where": "dt=#YYYYMMdd# AND hour=#HH#"
},
"predicates": [
{
"type": "file.exist",
"config": {
"root.path": "hdfs:///griffin/demo_src",
"path": "/dt=#YYYYMMdd#/hour=#HH#/_DONE"
}
}
]
}
}
],
"evaluate.rule": {
"rules": [
{
"dsl.type": "griffin-dsl",
"dq.type": "PROFILING",
"rule": "count(source.`age`) AS `age-count`,avg(source.`age`) AS `age-average`",
"name": "profiling",
"details": {}
}
]
}
}'
Here is an example to define measure of accuracy:
curl -k -H "Content-Type: application/json" -H "Accept: application/json" \
-X POST http://127.0.0.1:8080/api/v1/measures \
-d '{
"name": "accuracy_measure",
"measure.type": "griffin",
"dq.type": "ACCURACY",
"process.type": "BATCH",
"owner": "test",
"description": "measure description",
"data.sources": [
{
"name": "source",
"connector": {
"name": "connector_name_source",
"type": "HIVE",
"version": "1.2",
"data.unit": "1hour",
"data.time.zone": "UTC(WET,GMT)",
"config": {
"database": "default",
"table.name": "demo_src",
"where": "dt=#YYYYMMdd# AND hour=#HH#"
},
"predicates": [
{
"type": "file.exist",
"config": {
"root.path": "hdfs:///griffin/demo_src",
"path": "/dt=#YYYYMMdd#/hour=#HH#/_DONE"
}
}
]
}
},
{
"name": "target",
"connector": {
"name": "connector_name_target",
"type": "HIVE",
"version": "1.2",
"data.unit": "1hour",
"data.time.zone": "UTC(WET,GMT)",
"config": {
"database": "default",
"table.name": "demo_tgt",
"where": "dt=#YYYYMMdd# AND hour=#HH#"
},
"predicates": [
{
"type": "file.exist",
"config": {
"root.path": "hdfs:///griffin/demo_src",
"path": "/dt=#YYYYMMdd#/hour=#HH#/_DONE"
}
}
]
}
}
],
"evaluate.rule": {
"rules": [
{
"dsl.type": "griffin-dsl",
"dq.type": "ACCURACY",
"name": "accuracy",
"rule": "source.desc=target.desc"
}
]
}
}'
Here is an example to define external measure:
curl -k -H "Content-Type: application/json" -H "Accept: application/json" \
-X POST http://127.0.0.1:8080/api/v1/measures \
-d '{
"name": "external_name",
"measure.type": "external",
"dq.type": "ACCURACY",
"description": "measure description",
"organization": "orgName",
"owner": "test",
"metric.name": "metricName"
}'
GET /api/v1/measures
GET /api/v1/measures/{measure_id}
curl -k -H "Accept: application/json" -X GET http://127.0.0.1:8080/api/v1/measures
[
{
"measure.type": "griffin",
"id": 1,
"name": "accuracy_measure",
"owner": "test",
"description": "measure description",
"deleted": false,
"dq.type": "ACCURACY",
"sinks": [
"ELASTICSEARCH",
"HDFS"
],
"process.type": "BATCH",
"data.sources": [
{
"id": 4,
"name": "source",
"connector": {
"id": 5,
"name": "connector_name_source",
"type": "HIVE",
"version": "1.2",
"predicates": [
{
"id": 6,
"type": "file.exist",
"config": {
"root.path": "hdfs:///127.0.0.1/demo_src",
"path": "/dt=#YYYYMMdd#/hour=#HH#/_DONE"
}
}
],
"data.unit": "1hour",
"data.time.zone": "UTC(WET,GMT)",
"config": {
"database": "default",
"table.name": "demo_src",
"where": "dt=#YYYYMMdd# AND hour=#HH#"
}
},
"baseline": false
},
{
"id": 7,
"name": "target",
"connector": {
"id": 8,
"name": "connector_name_target",
"type": "HIVE",
"version": "1.2",
"predicates": [
{
"id": 9,
"type": "file.exist",
"config": {
"root.path": "hdfs:///127.0.0.1/demo_src",
"path": "/dt=#YYYYMMdd#/hour=#HH#/_DONE"
}
}
],
"data.unit": "1hour",
"data.time.zone": "UTC(WET,GMT)",
"config": {
"database": "default",
"table.name": "demo_tgt",
"where": "dt=#YYYYMMdd# AND hour=#HH#"
}
},
"baseline": false
}
],
"evaluate.rule": {
"id": 2,
"rules": [
{
"id": 3,
"rule": "source.desc=target.desc",
"dsl.type": "griffin-dsl",
"dq.type": "ACCURACY"
}
]
}
}
]
DELETE /api/v1/measures/{measure_id}
When deleting a measure,api will also delete related jobs.
curl -k -H "Accept: application/json" -X DELETE http://127.0.0.1:8080/api/v1/measures/1
The response body should be empty if no error happens, and the HTTP status is (204, "No Content").
PUT /api/v1/measures
Here is an example to update measure:
curl -k -H "Content-Type: application/json" -H "Accept: application/json" \
-X PUT http://127.0.0.1:8080/api/v1/measures \
-d '{
"measure.type": "griffin",
"id": 19,
"name": "profiling_measure_edited",
"owner": "test",
"description": "measure description",
"deleted": false,
"dq.type": "PROFILING",
"sinks": [
"ELASTICSEARCH",
"HDFS"
],
"process.type": "BATCH",
"rule.description": {
"details": [
{
"name": "age",
"infos": "Total Count,Average"
}
]
},
"data.sources": [
{
"id": 22,
"name": "source",
"connector": {
"id": 23,
"name": "connector_name",
"type": "HIVE",
"version": "1.2",
"predicates": [
{
"id": 24,
"type": "file.exist",
"config": {
"root.path": "hdfs:///griffin/demo_src",
"path": "/dt=#YYYYMMdd#/hour=#HH#/_DONE"
}
}
],
"data.unit": "1hour",
"data.time.zone": "UTC(WET,GMT)",
"config": {
"database": "default",
"table.name": "demo_src",
"where": "dt=#YYYYMMdd# AND hour=#HH#"
}
},
"baseline": false
}
],
"evaluate.rule": {
"id": 20,
"rules": [
{
"id": 21,
"rule": "count(source.`age`) AS `age-count`,avg(source.`age`) AS `age-average`",
"dsl.type": "griffin-dsl",
"dq.type": "PROFILING",
"details": {}
}
]
}
}'
Here is an example to update external measure:
curl -k -H "Content-Type: application/json" -H "Accept: application/json" \
-X PUT http://127.0.0.1:8080/api/v1/measures \
-d '{
"measure.type": "external",
"id": 25,
"name": "external_name",
"owner": "test",
"description": "measure description edited",
"organization": "orgName",
"deleted": false,
"dq.type": "ACCURACY",
"sinks": ["ELASTICSEARCH", "HDFS"],
"metric.name": "metricName",
"measure.type": "external"
}'
POST /api/v1/jobs
curl -k -H "Content-Type: application/json" -H "Accept: application/json" \
-X POST http://127.0.0.1:8080/api/v1/jobs \
-d '{
"measure.id": 10,
"job.name":"job_name_10",
"job.type":"batch",
"cron.expression": "0 0/4 * * * ?",
"cron.time.zone": "GMT+8:00",
"predicate.config": {
"checkdonefile.schedule":{
"interval": "1m",
"repeat": 2
}
},
"data.segments": [
{
"data.connector.name": "connector_name_source",
"as.baseline":true,
"segment.range": {
"begin": "-1h",
"length": "1h"
}
},
{
"data.connector.name": "connector_name_target",
"segment.range": {
"begin": "-1h",
"length": "1h"
}
}
]
}'
POST /api/v1/jobs/trigger/{job_id}
In the current version triggering the job in this way leads to scheduling of a single job instance. The method returns
immediately even if starting it may take time. The response contains triggerKey
by which the instance could be found
when it is started (see find instance by trigger key).
curl -k -X POST http://127.0.0.1:8080/api/v1/jobs/trigger/101
{
"triggerKey": "DEFAULT.6da64b5bd2ee-34e2cb23-11a2-4f92-9cbd-6cb3402cdb48",
}
GET /api/v1/jobs
curl -k -H "Content-Type: application/json" -H "Accept: application/json" \
-X GET http://127.0.0.1:8080/api/v1/jobs
[{
"job.type": "batch",
"id": 51,
"measure.id": 10,
"job.name": "job_name_10",
"metric.name": "job_name_10",
"quartz.name": "job_name_10_1547192473206",
"quartz.group": "BA",
"cron.expression": "0 0/4 * * * ?",
"job.state": {
"state": "NORMAL",
"toStart": false,
"toStop": true,
"nextFireTime": 1547693040000,
"previousFireTime": 1547692800000
},
"cron.time.zone": "GMT+8:00",
"predicate.config": {
"checkdonefile.schedule": {
"interval": "1m",
"repeat": 2
}
},
"data.segments": [{
"id": 52,
"data.connector.name": "connector_name_source",
"as.baseline": true,
"segment.range": {
"id": 53,
"begin": "-1h",
"length": "1h"
}
}, {
"id": 54,
"data.connector.name": "connector_name_target",
"as.baseline": false,
"segment.range": {
"id": 55,
"begin": "-1h",
"length": "1h"
}
}
],
"job.type": "batch"
}
]
GET /api/v1/jobs/config?jobId={job_id}
curl -k -H "Content-Type: application/json" -H "Accept: application/json" \
-X GET http://127.0.0.1:8080/api/v1/jobs/config?jobId=827
{
"job.type": "batch",
"id": 827,
"measure.id": 10,
"job.name": "job_name_10",
"metric.name": "job_name_10",
"quartz.name": "job_name_10_1547694147531",
"quartz.group": "BA",
"cron.expression": "0 0/4 * * * ?",
"cron.time.zone": "GMT+8:00",
"predicate.config": {
"checkdonefile.schedule": {
"interval": "1m",
"repeat": 2
}
},
"data.segments": [{
"id": 828,
"data.connector.name": "connector_name_source",
"as.baseline": true,
"segment.range": {
"id": 829,
"begin": "-1h",
"length": "1h"
}
}, {
"id": 830,
"data.connector.name": "connector_name_target",
"as.baseline": false,
"segment.range": {
"id": 831,
"begin": "-1h",
"length": "1h"
}
}
],
"job.type": "batch"
}
DELETE /api/v1/jobs/{job_id}
curl -k -H "Content-Type: application/json" -H "Accept: application/json" \
-X DELETE http://127.0.0.1:8080/api/v1/jobs/51
DELETE /api/v1/jobs?jobName={name}
curl -k -H "Content-Type: application/json" -H "Accept: application/json" \
-X DELETE http://127.0.0.1:8080/api/v1/jobs?jobName=job_name_10
The response body should be empty if no error happens, and the HTTP status is (204, "No Content").
GET /api/v1/jobs/instances?jobId={id}&page={pageNum}&size={pageSize}
name | description | type | example value |
---|---|---|---|
jobId | job id | Long | 1 |
page | page you want starting from index 0 | int | 0 |
size | instance number per page | int | 10 |
curl -k -G -X GET http://127.0.0.1:8080/api/v1/jobs/instances -d jobId=827 -d page=1 -d size=5
[{
"id": 1176,
"sessionId": null,
"state": "NOT_FOUND",
"type": "BATCH",
"predicateGroup": "PG",
"predicateName": "job_name_10_predicate_1547776800012",
"timestamp": 1547776800012,
"expireTimestamp": 1548381600012
}, {
"id": 1175,
"sessionId": null,
"state": "NOT_FOUND",
"type": "BATCH",
"predicateGroup": "PG",
"predicateName": "job_name_10_predicate_1547776560018",
"timestamp": 1547776560019,
"expireTimestamp": 1548381360019
}
]
GET /api/v1/jobs/triggerKeys/{triggerKey}
This could be used after triggering the job by job id to find the job instance when it is scheduled. In the current version no more than one instance is triggered and thus the response is a list with single element (or empty list if not found).
curl http://127.0.0.1:8080/api/v1/jobs/triggerKeys/DEFAULT.6da64b5bd2ee-34e2cb23-11a2-4f92-9cbd-6cb3402cdb48
[
{
"id":201,
"sessionId":1,
"state":"SUCCESS",
"type":"BATCH",
"appId":"application_1554199833471_0002",
"appUri":"http://localhost:38088/cluster/app/application_1554199833471_0002",
"predicateGroup":"PG",
"predicateName":"acc1a_name_predicate_1554202748883",
"triggerKey":"DEFAULT.6da64b5bd2ee-34e2cb23-11a2-4f92-9cbd-6cb3402cdb49",
"timestamp":1554202748884,
"expireTimestamp":1554807548884
}
]
GET /api/v1/jobs/health
curl -k -X GET http://127.0.0.1:8080/api/v1/jobs/health
{
"healthyJobCount": 0,
"jobCount": 1
}
GET /api/v1/jobs/download?jobName={name}&ts={timestamp}
name | description | type | example value |
---|---|---|---|
jobName | job name | String | 1 |
timestamp | timestamp | Long | 0 |
curl -k -G -X GET http://127.0.0.1:8080/api/v1/jobs/download \
-d jobName=job_name_10 -d timestamp=1547778857807
If successful, this method returns missing records in the response body, maximum record count is 100.
GET /api/v1/jobs/instances/{jobInstanceId}
curl -k -G -X GET http://127.0.0.1:8080/api/v1/jobs/instances/1
If successful, this method returns job instance description for the given job instance id. If there is no instance with given id found, returns Griffin Exception.
GET /api/v1/metrics
The response is a map of metrics group by measure name. For example:
curl -k -X GET http://127.0.0.1:8080/api/v1/metrics
{
"measure_no_predicate_day": [
{
"name": "job_no_predicate_day",
"type": "accuracy",
"owner": "test",
"metricValues": [
{
"name": "job_no_predicate_day",
"tmst": 1517994480000,
"value": {
"total": 125000,
"miss": 0,
"matched": 125000
}
},
{
"name": "job_no_predicate_day",
"tmst": 1517994240000,
"value": {
"total": 125000,
"miss": 0,
"matched": 125000
}
}
]
}
],
"measure_predicate_hour": [
{
"name": "job_predicate_hour",
"type": "accuracy",
"owner": "test",
"metricValues": []
}
]
}
POST /api/v1/metrics/values
name | description | type |
---|---|---|
Metric Values | A list of metric values | MetricValue |
curl -k -H "Content-Type: application/json" -H "Accept: application/json" \
-X POST http://127.0.0.1:8080/api/v1/metrics/values \
-d '[
{
"name" : "metricName",
"tmst" : 1509599811123,
"value" : {
"__tmst" : 1509599811123,
"miss" : 11,
"total" : 125000,
"matched" : 124989
}
}
]'
The response body should have 'errors' field as 'false' if success, for example
{
"took": 32,
"errors": false,
"items": [
{
"index": {
"_index": "griffin",
"_type": "accuracy",
"_id": "AWFAs5pOJwYEbKWP7mhq",
"_version": 1,
"result": "created",
"_shards": {
"total": 2,
"successful": 1,
"failed": 0
},
"created": true,
"status": 201
}
}
]
}
GET /api/v1/metrics/values?metricName={name}&size={size}&offset={offset}&tmst={timestamp}
name | description | type | example value |
---|---|---|---|
metricName | name of the metric values | String | job_no_predicate_day |
size | max amount of return records | int | 5 |
offset | the amount of records to skip by timestamp in descending order | int | 0 |
tmst | the start timestamp of records you want to get | long | 0 |
Parameter offset and tmst are optional.
curl -k -G -X GET http://127.0.0.1:8080/api/v1/metrics/values -d metricName=job_no_predicate_day -d size=10
[
{
"name": "job_no_predicate_day",
"tmst": 1517994720000,
"value": {
"total": 125000,
"miss": 0,
"matched": 125000
}
},
{
"name": "job_no_predicate_day",
"tmst": 1517994480000,
"value": {
"total": 125000,
"miss": 0,
"matched": 125000
}
},
{
"name": "job_no_predicate_day",
"tmst": 1517994240000,
"value": {
"total": 125000,
"miss": 0,
"matched": 125000
}
}
]
DELETE /api/v1/metrics/values?metricName={name}
The response body should have 'failures' field as empty if success, for example
curl -k -H "Accept: application/json" \
-X DELETE http://127.0.0.1:8080/api/v1/metrics/values?metricName=job_no_predicate_day
{
"took": 363,
"timed_out": false,
"total": 5,
"deleted": 5,
"batches": 1,
"version_conflicts": 0,
"noops": 0,
"retries": {
"bulk": 0,
"search": 0
},
"throttled_millis": 0,
"requests_per_second": -1,
"throttled_until_millis": 0,
"failures": []
}
GET http://127.0.0.1:8080/api/v1/metrics/values/:jobInstanceId
curl -k -G -X GET http://127.0.0.1:8080/api/v1/metrics/values/{304}
{
"name": "some_job",
"tmst": 1553526960000,
"value": {
"total": 74,
"miss": 31,
"matched": 43,
"matchedFraction": 0.581081081081081
},
"metadata": {
"applicationId": "\"application_1549876136110_0237\"",
}
}
GET /api/v1/metadata/hive/table?db={}&table={}
name | description | type | example value |
---|---|---|---|
db | hive database name | String | default |
table | hive table name | String | demo_src |
curl -k -H "Accept: application/json" \
-G -X GET http://127.0.0.1:8080/api/v1/metadata/hive/table \
-d db=default \
-d table=demo_src
{
"tableName": "demo_src",
"dbName": "default",
"owner": "root",
"createTime": 1505986176,
"lastAccessTime": 0,
"retention": 0,
"sd": {
"cols": [
{
"name": "id",
"type": "bigint",
"comment": null,
"setName": true,
"setType": true,
"setComment": false
},
{
"name": "age",
"type": "int",
"comment": null,
"setName": true,
"setType": true,
"setComment": false
},
{
"name": "desc",
"type": "string",
"comment": null,
"setName": true,
"setType": true,
"setComment": false
}
],
"location": "hdfs://sandbox:9000/griffin/data/batch/demo_src"
},
"partitionKeys": [
{
"name": "dt",
"type": "string",
"comment": null,
"setName": true,
"setType": true,
"setComment": false
},
{
"name": "hour",
"type": "string",
"comment": null,
"setName": true,
"setType": true,
"setComment": false
}
]
}
GET /api/v1/metadata/hive/tables/names?db={}
name | description | typ | example value |
---|---|---|---|
db | hive database name | String | default |
curl -k -H "Accept: application/json" \
-X GET http://127.0.0.1:8080/api/v1/metadata/hive/table?db=default
[
"demo_src",
"demo_tgt"
]
GET /api/v1/metadata/hive/dbs/tables
curl -k -H "Accept: application/json" \
-X GET http://127.0.0.1:8080/api/v1/metadata/hive/dbs/tables
{
"default": [
{
"tableName": "demo_src",
"dbName": "default",
"owner": "root",
"createTime": 1505986176,
"lastAccessTime": 0,
"sd": {
"cols": [
{
"name": "id",
"type": "bigint",
"comment": null,
"setComment": false,
"setType": true,
"setName": true
},
{
"name": "age",
"type": "int",
"comment": null,
"setComment": false,
"setType": true,
"setName": true
},
{
"name": "desc",
"type": "string",
"comment": null,
"setComment": false,
"setType": true,
"setName": true
}
],
"location": "hdfs://sandbox:9000/griffin/data/batch/demo_src"
},
"partitionKeys": [
{
"name": "dt",
"type": "string",
"comment": null,
"setComment": false,
"setType": true,
"setName": true
},
{
"name": "hour",
"type": "string",
"comment": null,
"setComment": false,
"setType": true,
"setName": true
}
]
},
{
"tableName": "demo_tgt",
"dbName": "default",
"owner": "root",
"createTime": 1505986176,
"lastAccessTime": 0,
"sd": {
"cols": [
{
"name": "id",
"type": "bigint",
"comment": null,
"setComment": false,
"setType": true,
"setName": true
},
{
"name": "age",
"type": "int",
"comment": null,
"setComment": false,
"setType": true,
"setName": true
},
{
"name": "desc",
"type": "string",
"comment": null,
"setComment": false,
"setType": true,
"setName": true
}
],
"location": "hdfs://sandbox:9000/griffin/data/batch/demo_tgt"
},
"partitionKeys": [
{
"name": "dt",
"type": "string",
"comment": null,
"setComment": false,
"setType": true,
"setName": true
},
{
"name": "hour",
"type": "string",
"comment": null,
"setComment": false,
"setType": true,
"setName": true
}
]
}
]
}
GET /api/v1/metadata/hive/dbs
curl -k -H "Accept: application/json" \
-X GET http://127.0.0.1:8080/api/v1/metadata/hive/dbs
[
"default"
]
GET /api/v1/metadata/hive/tables?db={name}
name | description | typ | example value |
---|---|---|---|
db | hive database name | String | default |
curl -k -H "Accept: application/json" \
-X GET http://127.0.0.1:8080/api/v1/metadata/hive/tables?db=default
[
{
"tableName": "demo_src",
"dbName": "default",
"owner": "root",
"createTime": 1508216660,
"lastAccessTime": 0,
"retention": 0,
"sd": {
"cols": [
{
"name": "id",
"type": "bigint",
"comment": null,
"setName": true,
"setType": true,
"setComment": false
},
{
"name": "age",
"type": "int",
"comment": null,
"setName": true,
"setType": true,
"setComment": false
},
{
"name": "desc",
"type": "string",
"comment": null,
"setName": true,
"setType": true,
"setComment": false
}
],
"location": "hdfs://sandbox:9000/griffin/data/batch/demo_src"
},
"partitionKeys": [
{
"name": "dt",
"type": "string",
"comment": null,
"setName": true,
"setType": true,
"setComment": false
},
{
"name": "hour",
"type": "string",
"comment": null,
"setName": true,
"setType": true,
"setComment": false
}
]
},
{
"tableName": "demo_tgt",
"dbName": "default",
"owner": "root",
"createTime": 1508216660,
"lastAccessTime": 0,
"retention": 0,
"sd": {
"cols": [
{
"name": "id",
"type": "bigint",
"comment": null,
"setName": true,
"setType": true,
"setComment": false
},
{
"name": "age",
"type": "int",
"comment": null,
"setName": true,
"setType": true,
"setComment": false
},
{
"name": "desc",
"type": "string",
"comment": null,
"setName": true,
"setType": true,
"setComment": false
}
],
"location": "hdfs://sandbox:9000/griffin/data/batch/demo_tgt"
},
"partitionKeys": [
{
"name": "dt",
"type": "string",
"comment": null,
"setName": true,
"setType": true,
"setComment": false
},
{
"name": "hour",
"type": "string",
"comment": null,
"setName": true,
"setType": true,
"setComment": false
}
]
}
]
POST /api/v1/login/authenticate
name | description | type | example value |
---|---|---|---|
map | a map contains user name and password | Map | {"username":"user","password":"test"} |
curl -k -H "Content-Type: application/json" -H "Accept: application/json" \
-X POST http://127.0.0.1:8080/api/v1/login/authenticate \
-d '{"username":"user","password":"test"}'
if authentication passes, response below will be returned.
{
"fullName": "Default",
"ntAccount": "user",
"status": 0
}