- Motivation:
- current way of managing job config via files makes it hard to manage job configurations, persisting it in MySQL would make it easier to manage and also provide various CRUD API interfaces to mange the job configuration.
- Proposed Change:
- create MySQL table `gobblin_job_config`
- create REST endpoints for CRUD operations
- add functionality to detect change in any job config and schedule or trigger job accordingly ( similar to current mechanism based on file change )
- In future, Gobblin should use JDBI (v3) as ORM instead of plan JDBC based persistence which will become cumbersome as it uses DB heavily for all kinds of metadata storage.
- New or Changed Public Interfaces:
- POST /job/{jobName}
- PUT /job//{jobName}
- GET /job/{jobName}
- DELETE /job/{jobName}
- Migration Plan and Compatibility:
- since this is new functionality, in addition to the current file based job config, user can select either one to manage the job.
- Rejected Alternatives:
- use of other REST framework ( preferring to use REST.li instead of dropwizard or any other as its built in framework for other APIs
Design:
MySQL
...
DDL: ( V1_0_4__job_store.sql )
Code Block | ||||||
---|---|---|---|---|---|---|
| ||||||
CREATE TABLE gobblin_job_owners ( name varchar(255) NOT NULL, email varchar(255) NOT NULL, team_name int(11) DEFAULT NULL, team_email int(11) DEFAULT NULL, org_name int(11) DEFAULT NULL, created_date timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, updated_date timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, PRIMARY KEY (email) ) ENGINE = InnoDB DEFAULT CHARSET = utf8; CREATE TABLE gobblin_sync_systems ( name varchar(255) NOT NULL, db_type varchar(255) NOT NULL, users varchar(255) NOT NULL, on_hold tinyint(1) NOT NULL DEFAULT '0', deprecated tinyint(1) NOT NULL DEFAULT '0', config text, created_date timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, updated_date timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, PRIMARY KEY (name) ) ENGINE = InnoDB DEFAULT CHARSET = utf8; CREATE TABLE gobblin_jobs ( id int(11) NOT NULL AUTO_INCREMENT, name varchar(255) NOT NULL, description varchar(255) DEFAULT NULL, schedule varchar(64) DEFAULT NULL, is_disabled tinyint(1) DEFAULT '0', priority smallint DEFAULT 100, configs text, owner_email varchar(255) NOT NULL, source_system varchar(255) NOT NULL, #source_dataset varchar(255) DEFAULT NULL, #target_dataset varchar(255) DEFAULT NULL, target_system varchar(255) NOT NULL, created_date timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, updated_date timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, PRIMARY KEY (name), # FOREIGN KEY (owner_email) REFERENCES gobblin_job_owners (email), # FOREIGN KEY (source_system) REFERENCES gobblin_sync_systems (name), # FOREIGN KEY (target_system) REFERENCES gobblin_sync_systems (name), INDEX (name), INDEX (id) ) AUTO_INCREMENT = 1 ENGINE = InnoDB DEFAULT CHARSET = utf8; CREATE TABLE gobblin_sync_systems_maintenance ( id int(11) NOT NULL AUTO_INCREMENT, sync_system_name varchar(255) NOT NULL, type varchar(255) NOT NULL, start_time datetime NOT NULL, end_time datetime NOT NULL, PRIMARY KEY (id), FOREIGN KEY (sync_system_name) REFERENCES gobblin_sync_systems (name) ) ENGINE = InnoDB DEFAULT CHARSET = utf8; |
JOB MGMT. CRUD REST API
Create New job example
Code Block | ||
---|---|---|
| ||
METHOD: POST URL: http://localhost:9090/job/PullFromWikipedia BODY: { "jobName": "PullFromWikipedia", "jobDescription": "A getting started example for Gobblin", "jobDisabled": false, "jobProperties": { "job.group": "Wikipedia", "source.class": "org.apache.gobblin.example.wikipedia.WikipediaSource", "test_remove": "test_remove_value", "something": "asdsad" } } RESPONSE: 201 - created |
2. update existing job
Code Block | ||
---|---|---|
| ||
POSTMETHOD: PUT URL: http://localhost:9090/job/PullFromWikipedia BODY: { "jobName "name": "PullFromWikipedia", "jobDescription "description": "A getting started example for Gobblin - pull some pages from wikipedia", "disabled": true, "schedule": "", "jobDisabled "priority": false98, "jobProperties "configs": { "job.group": "Wikipedia", "source.class": "org.apache.gobblin.example.wikipedia.WikipediaSource", "test_removeadd": "test_remove_value", "something": "asdsad" }, "_jobPropertiesToRemove": [ "key" ] } }, "ownerEmail": "jsenjaliya@paypal.com", "sourceSystem": "simba", "targetSystem": "RADD-LVS", "configsToRemove": [ "test_remove" ] } RESPONSE: 200 - OK |
3. GET existing job
Code Block | ||
---|---|---|
| ||
GET httpMETHOD: GET URL: http://localhost:9090/job/PullFromWikipedia BODY: None RESPONSE: { "jobNameschedule": "PullFromWikipediarun_once", "jobIdconfigs": 14, { "jobPropertiesjob.group": {"Wikipedia", "source.class": "org.apache.gobblin.example.wikipedia.WikipediaSource", "test_removesomething": "test_remove_valueasdsad", "job.grouptest_add": "Wikipediatest_remove_value", }, "somethingcreatedDate": "asdsad"1587770060000, }"sourceSystem": "simba", "jobDisabledname": false"PullFromWikipedia", "jobDescriptiondescription": "A getting started example for Gobblin - pull some pages from wikipedia", "disabled": true, "id": 1, "updatedDate": 1587774853000, "priority": 98, "created_datetargetSystem": 1575937161000"RADD-LVS", "updated_dateownerEmail": 1575937161000"jsenjaliya@paypal.com" } |