@aws-cdk/aws-glue-alpha 2.176.0-alpha.0 → 2.178.0-alpha.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.jsii +6187 -3907
- package/.jsii.tabl.json.gz +0 -0
- package/.warnings.jsii.js +525 -235
- package/README.md +422 -159
- package/awslint.json +5 -5
- package/lib/code.js +4 -5
- package/lib/connection.js +15 -3
- package/lib/constants.d.ts +261 -0
- package/lib/constants.js +281 -0
- package/lib/data-format.js +5 -5
- package/lib/data-quality-ruleset.js +6 -3
- package/lib/database.js +5 -2
- package/lib/external-table.js +20 -2
- package/lib/index.d.ts +13 -2
- package/lib/index.js +14 -3
- package/lib/jobs/job.d.ts +393 -0
- package/lib/jobs/job.js +298 -0
- package/lib/jobs/pyspark-etl-job.d.ts +81 -0
- package/lib/jobs/pyspark-etl-job.js +130 -0
- package/lib/jobs/pyspark-flex-etl-job.d.ts +83 -0
- package/lib/jobs/pyspark-flex-etl-job.js +137 -0
- package/lib/jobs/pyspark-streaming-job.d.ts +81 -0
- package/lib/jobs/pyspark-streaming-job.js +130 -0
- package/lib/jobs/python-shell-job.d.ts +55 -0
- package/lib/jobs/python-shell-job.js +99 -0
- package/lib/jobs/ray-job.d.ts +44 -0
- package/lib/jobs/ray-job.js +89 -0
- package/lib/jobs/scala-spark-etl-job.d.ts +78 -0
- package/lib/jobs/scala-spark-etl-job.js +134 -0
- package/lib/jobs/scala-spark-flex-etl-job.d.ts +109 -0
- package/lib/jobs/scala-spark-flex-etl-job.js +143 -0
- package/lib/jobs/scala-spark-streaming-job.d.ts +77 -0
- package/lib/jobs/scala-spark-streaming-job.js +131 -0
- package/lib/jobs/spark-ui-utils.d.ts +53 -0
- package/lib/jobs/spark-ui-utils.js +26 -0
- package/lib/s3-table.d.ts +4 -4
- package/lib/s3-table.js +20 -2
- package/lib/schema.d.ts +1 -1
- package/lib/schema.js +2 -2
- package/lib/security-configuration.js +5 -2
- package/lib/storage-parameter.js +1 -1
- package/lib/table-base.d.ts +1 -1
- package/lib/table-base.js +2 -2
- package/lib/table-deprecated.js +1 -1
- package/lib/triggers/trigger-options.d.ts +205 -0
- package/lib/triggers/trigger-options.js +39 -0
- package/lib/triggers/workflow.d.ts +203 -0
- package/lib/triggers/workflow.js +371 -0
- package/package.json +8 -8
- package/rosetta/default.ts-fixture +1 -1
- package/lib/job-executable.d.ts +0 -384
- package/lib/job-executable.js +0 -348
- package/lib/job.d.ts +0 -574
- package/lib/job.js +0 -531
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var _a;
|
|
3
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
4
|
+
exports.PythonShellJob = void 0;
|
|
5
|
+
const jsiiDeprecationWarnings = require("../../.warnings.jsii.js");
|
|
6
|
+
const JSII_RTTI_SYMBOL_1 = Symbol.for("jsii.rtti");
|
|
7
|
+
const aws_glue_1 = require("aws-cdk-lib/aws-glue");
|
|
8
|
+
const iam = require("aws-cdk-lib/aws-iam");
|
|
9
|
+
const job_1 = require("./job");
|
|
10
|
+
const constants_1 = require("../constants");
|
|
11
|
+
const metadata_resource_1 = require("aws-cdk-lib/core/lib/metadata-resource");
|
|
12
|
+
/**
|
|
13
|
+
* Python Shell Jobs class
|
|
14
|
+
*
|
|
15
|
+
* A Python shell job runs Python scripts as a shell and supports a Python version that
|
|
16
|
+
* depends on the AWS Glue version you are using.
|
|
17
|
+
* This can be used to schedule and run tasks that don't require an Apache Spark environment.
|
|
18
|
+
*/
|
|
19
|
+
class PythonShellJob extends job_1.Job {
|
|
20
|
+
/**
|
|
21
|
+
* PythonShellJob constructor
|
|
22
|
+
*/
|
|
23
|
+
constructor(scope, id, props) {
|
|
24
|
+
super(scope, id, { physicalName: props.jobName });
|
|
25
|
+
try {
|
|
26
|
+
jsiiDeprecationWarnings._aws_cdk_aws_glue_alpha_PythonShellJobProps(props);
|
|
27
|
+
}
|
|
28
|
+
catch (error) {
|
|
29
|
+
if (process.env.JSII_DEBUG !== "1" && error.name === "DeprecationError") {
|
|
30
|
+
Error.captureStackTrace(error, PythonShellJob);
|
|
31
|
+
}
|
|
32
|
+
throw error;
|
|
33
|
+
}
|
|
34
|
+
// Enhanced CDK Analytics Telemetry
|
|
35
|
+
(0, metadata_resource_1.addConstructMetadata)(this, props);
|
|
36
|
+
// Set up role and permissions for principal
|
|
37
|
+
this.role = props.role, {
|
|
38
|
+
assumedBy: new iam.ServicePrincipal('glue.amazonaws.com'),
|
|
39
|
+
managedPolicies: [iam.ManagedPolicy.fromAwsManagedPolicyName('service-role/AWSGlueServiceRole')],
|
|
40
|
+
};
|
|
41
|
+
this.grantPrincipal = this.role;
|
|
42
|
+
// Enable CloudWatch metrics and continuous logging by default as a best practice
|
|
43
|
+
const continuousLoggingArgs = this.setupContinuousLogging(this.role, props.continuousLogging);
|
|
44
|
+
const profilingMetricsArgs = { '--enable-metrics': '' };
|
|
45
|
+
const observabilityMetricsArgs = { '--enable-observability-metrics': 'true' };
|
|
46
|
+
// Gather executable arguments
|
|
47
|
+
const executableArgs = this.executableArguments(props);
|
|
48
|
+
// Combine command line arguments into a single line item
|
|
49
|
+
const defaultArguments = {
|
|
50
|
+
...executableArgs,
|
|
51
|
+
...continuousLoggingArgs,
|
|
52
|
+
...profilingMetricsArgs,
|
|
53
|
+
...observabilityMetricsArgs,
|
|
54
|
+
...this.checkNoReservedArgs(props.defaultArguments),
|
|
55
|
+
};
|
|
56
|
+
const jobResource = new aws_glue_1.CfnJob(this, 'Resource', {
|
|
57
|
+
name: props.jobName,
|
|
58
|
+
description: props.description,
|
|
59
|
+
role: this.role.roleArn,
|
|
60
|
+
command: {
|
|
61
|
+
name: constants_1.JobType.PYTHON_SHELL,
|
|
62
|
+
scriptLocation: this.codeS3ObjectUrl(props.script),
|
|
63
|
+
pythonVersion: props.pythonVersion ? props.pythonVersion : constants_1.PythonVersion.THREE_NINE,
|
|
64
|
+
},
|
|
65
|
+
glueVersion: props.glueVersion ? props.glueVersion : constants_1.GlueVersion.V3_0,
|
|
66
|
+
maxCapacity: props.maxCapacity ? props.maxCapacity : constants_1.MaxCapacity.DPU_1_16TH,
|
|
67
|
+
maxRetries: props.jobRunQueuingEnabled ? 0 : props.maxRetries ? props.maxRetries : 0,
|
|
68
|
+
jobRunQueuingEnabled: props.jobRunQueuingEnabled ? props.jobRunQueuingEnabled : false,
|
|
69
|
+
executionProperty: props.maxConcurrentRuns ? { maxConcurrentRuns: props.maxConcurrentRuns } : undefined,
|
|
70
|
+
timeout: props.timeout?.toMinutes(),
|
|
71
|
+
connections: props.connections ? { connections: props.connections.map((connection) => connection.connectionName) } : undefined,
|
|
72
|
+
securityConfiguration: props.securityConfiguration?.securityConfigurationName,
|
|
73
|
+
tags: props.tags,
|
|
74
|
+
defaultArguments,
|
|
75
|
+
});
|
|
76
|
+
const resourceName = this.getResourceNameAttribute(jobResource.ref);
|
|
77
|
+
this.jobArn = this.buildJobArn(this, resourceName);
|
|
78
|
+
this.jobName = resourceName;
|
|
79
|
+
}
|
|
80
|
+
/**
|
|
81
|
+
* Set the executable arguments with best practices enabled by default
|
|
82
|
+
*
|
|
83
|
+
* @returns An array of arguments for Glue to use on execution
|
|
84
|
+
*/
|
|
85
|
+
executableArguments(props) {
|
|
86
|
+
const args = {};
|
|
87
|
+
args['--job-language'] = constants_1.JobLanguage.PYTHON;
|
|
88
|
+
// If no Python version set (default 3.9) or the version is set to 3.9 then set library-set argument
|
|
89
|
+
if (!props.pythonVersion || props.pythonVersion == constants_1.PythonVersion.THREE_NINE) {
|
|
90
|
+
// Selecting this option includes common libraries for Python 3.9
|
|
91
|
+
args['library-set'] = 'analytics';
|
|
92
|
+
}
|
|
93
|
+
return args;
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
exports.PythonShellJob = PythonShellJob;
|
|
97
|
+
_a = JSII_RTTI_SYMBOL_1;
|
|
98
|
+
PythonShellJob[_a] = { fqn: "@aws-cdk/aws-glue-alpha.PythonShellJob", version: "2.178.0-alpha.0" };
|
|
99
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHl0aG9uLXNoZWxsLWpvYi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbInB5dGhvbi1zaGVsbC1qb2IudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBQUEsbURBQThDO0FBQzlDLDJDQUEyQztBQUMzQywrQkFBMkM7QUFFM0MsNENBQTZGO0FBQzdGLDhFQUE4RTtBQWlDOUU7Ozs7OztHQU1HO0FBQ0gsTUFBYSxjQUFlLFNBQVEsU0FBRztJQU1yQzs7T0FFRztJQUNILFlBQVksS0FBZ0IsRUFBRSxFQUFVLEVBQUUsS0FBMEI7UUFDbEUsS0FBSyxDQUFDLEtBQUssRUFBRSxFQUFFLEVBQUUsRUFBRSxZQUFZLEVBQUUsS0FBSyxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUM7Ozs7OzsrQ0FWekMsY0FBYzs7OztRQVd2QixtQ0FBbUM7UUFDbkMsSUFBQSx3Q0FBb0IsRUFBQyxJQUFJLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFFbEMsNENBQTRDO1FBQzVDLElBQUksQ0FBQyxJQUFJLEdBQUcsS0FBSyxDQUFDLElBQUksRUFBRTtZQUN0QixTQUFTLEVBQUUsSUFBSSxHQUFHLENBQUMsZ0JBQWdCLENBQUMsb0JBQW9CLENBQUM7WUFDekQsZUFBZSxFQUFFLENBQUMsR0FBRyxDQUFDLGFBQWEsQ0FBQyx3QkFBd0IsQ0FBQyxpQ0FBaUMsQ0FBQyxDQUFDO1NBQ2pHLENBQUM7UUFDRixJQUFJLENBQUMsY0FBYyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUM7UUFFaEMsaUZBQWlGO1FBQ2pGLE1BQU0scUJBQXFCLEdBQUcsSUFBSSxDQUFDLHNCQUFzQixDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsS0FBSyxDQUFDLGlCQUFpQixDQUFDLENBQUM7UUFDOUYsTUFBTSxvQkFBb0IsR0FBRyxFQUFFLGtCQUFrQixFQUFFLEVBQUUsRUFBRSxDQUFDO1FBQ3hELE1BQU0sd0JBQXdCLEdBQUcsRUFBRSxnQ0FBZ0MsRUFBRSxNQUFNLEVBQUUsQ0FBQztRQUU5RSw4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YSxDQUFDLFVBQVUsRUFBRSxDQUFDO1lBQzVFLGlFQUFpRTtZQUNqRSxJQUFJLENBQUMsYUFBYSxDQUFDLEdBQUcsV0FBVyxDQUFDO1FBQ3BDLENBQUM7UUFFRCxPQUFPLElBQUksQ0FBQztLQUNiOztBQWhGSCx3Q0FpRkMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDZm5Kb2IgfSBmcm9tICdhd3MtY2RrLWxpYi9hd3MtZ2x1ZSc7XG5pbXBvcnQgKiBhcyBpYW0gZnJvbSAnYXdzLWNkay1saWIvYXdzLWlhbSc7XG5pbXBvcnQgeyBKb2IsIEpvYlByb3BlcnRpZXMgfSBmcm9tICcuL2pvYic7XG5pbXBvcnQgeyBDb25zdHJ1Y3QgfSBmcm9tICdjb25zdHJ1Y3RzJztcbmltcG9ydCB7IEpvYlR5cGUsIEdsdWVWZXJzaW9uLCBQeXRob25WZXJzaW9uLCBNYXhDYXBhY2l0eSwgSm9iTGFuZ3VhZ2UgfSBmcm9tICcuLi9jb25zdGFudHMnO1xuaW1wb3J0IHsgYWRkQ29uc3RydWN0TWV0YWRhdGEgfSBmcm9tICdhd3MtY2RrLWxpYi9jb3JlL2xpYi9tZXRhZGF0YS1yZXNvdXJjZSc7XG5cbi8qKlxuICogUHJvcGVydGllcyBmb3IgY3JlYXRpbmcgYSBQeXRob24gU2hlbGwgam9iXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUHl0aG9uU2hlbGxKb2JQcm9wcyBleHRlbmRzIEpvYlByb3BlcnRpZXMge1xuICAvKipcbiAgICogUHl0aG9uIFZlcnNpb25cbiAgICogVGhlIHZlcnNpb24gb2YgUHl0aG9uIHRvIHVzZSB0byBleGVjdXRlIHRoaXMgam9iXG4gICAqIEBkZWZhdWx0IDMuOSBmb3IgU2hlbGwgSm9ic1xuICAgKiovXG4gIHJlYWRvbmx5IHB5dGhvblZlcnNpb24/OiBQeXRob25WZXJzaW9uO1xuXG4gIC8qKlxuICAgKiBUaGUgdG90YWwgbnVtYmVyIG9mIERQVSB0byBhc3NpZ24gdG8gdGhlIFB5dGhvbiBKb2JcbiAgICpcbiAgICogQGRlZmF1bHQgMC4wNjI1XG4gICAqL1xuICByZWFkb25seSBtYXhDYXBhY2l0eT86IE1heENhcGFjaXR5O1xuXG4gIC8qKlxuICAgKiBTcGVjaWZpZXMgd2hldGhlciBqb2IgcnVuIHF1ZXVpbmcgaXMgZW5hYmxlZCBmb3IgdGhlIGpvYiBydW5zIGZvciB0aGlzIGpvYi5cbiAgICogQSB2YWx1ZSBvZiB0cnVlIG1lYW5zIGpvYiBydW4gcXVldWluZyBpcyBlbmFibGVkIGZvciB0aGUgam9iIHJ1bnMuXG4gICAqIElmIGZhbHNlIG9yIG5vdCBwb3B1bGF0ZWQsIHRoZSBqb2IgcnVucyB3aWxsIG5vdCBiZSBjb25zaWRlcmVkIGZvciBxdWV1ZWluZy5cbiAgICogSWYgdGhpcyBmaWVsZCBkb2VzIG5vdCBtYXRjaCB0aGUgdmFsdWUgc2V0IGluIHRoZSBqb2IgcnVuLCB0aGVuIHRoZSB2YWx1ZSBmcm9tXG4gICAqIHRoZSBqb2IgcnVuIGZpZWxkIHdpbGwgYmUgdXNlZC4gVGhpcyBwcm9wZXJ0eSBtdXN0IGJlIHNldCB0byBmYWxzZSBmb3IgZmxleCBqb2JzLlxuICAgKiBJZiB0aGlzIHByb3BlcnR5IGlzIGVuYWJsZWQsIG1heFJldHJpZXMgbXVzdCBiZSBzZXQgdG8gemVyby5cbiAgICpcbiAgICogQGRlZmF1bHQgZmFsc2VcbiAgICovXG4gIHJlYWRvbmx5IGpvYlJ1blF1ZXVpbmdFbmFibGVkPzogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBQeXRob24gU2hlbGwgSm9icyBjbGFzc1xuICpcbiAqIEEgUHl0aG9uIHNoZWxsIGpvYiBydW5zIFB5dGhvbiBzY3JpcHRzIGFzIGEgc2hlbGwgYW5kIHN1cHBvcnRzIGEgUHl0aG9uIHZlcnNpb24gdGhhdFxuICogZGVwZW5kcyBvbiB0aGUgQVdTIEdsdWUgdmVyc2lvbiB5b3UgYXJlIHVzaW5nLlxuICogVGhpcyBjYW4gYmUgdXNlZCB0byBzY2hlZHVsZSBhbmQgcnVuIHRhc2tzIHRoYXQgZG9uJ3QgcmVxdWlyZSBhbiBBcGFjaGUgU3BhcmsgZW52aXJvbm1lbnQuXG4gKi9cbmV4cG9ydCBjbGFzcyBQeXRob25TaGVsbEpvYiBleHRlbmRzIEpvYiB7XG4gIHB1YmxpYyByZWFkb25seSBqb2JBcm46IHN0cmluZztcbiAgcHVibGljIHJlYWRvbmx5IGpvYk5hbWU6IHN0cmluZztcbiAgcHVibGljIHJlYWRvbmx5IHJvbGU6IGlhbS5JUm9sZTtcbiAgcHVibGljIHJlYWRvbmx5IGdyYW50UHJpbmNpcGFsOiBpYW0uSVByaW5jaXBhbDtcblxuICAvKipcbiAgICogUHl0aG9uU2hlbGxKb2IgY29uc3RydWN0b3JcbiAgICovXG4gIGNvbnN0cnVjdG9yKHNjb3BlOiBDb25zdHJ1Y3QsIGlkOiBzdHJpbmcsIHByb3BzOiBQeXRob25TaGVsbEpvYlByb3BzKSB7XG4gICAgc3VwZXIoc2NvcGUsIGlkLCB7IHBoeXNpY2FsTmFtZTogcHJvcHMuam9iTmFtZSB9KTtcbiAgICAvLyBFbmhhbmNlZCBDREsgQW5hbHl0aWNzIFRlbGVtZXRyeVxuICAgIGFkZENvbnN0cnVjdE1ldGFkYXRhKHRoaXMsIHByb3BzKTtcblxuICAgIC8vIFNldCB1cCByb2xlIGFuZCBwZXJtaXNzaW9ucyBmb3IgcHJpbmNpcGFsXG4gICAgdGhpcy5yb2xlID0gcHJvcHMucm9sZSwge1xuICAgICAgYXNzdW1lZEJ5OiBuZXcgaWFtLlNlcnZpY2VQcmluY2lwYWwoJ2dsdWUuYW1hem9uYXdzLmNvbScpLFxuICAgICAgbWFuYWdlZFBvbGljaWVzOiBbaWFtLk1hbmFnZWRQb2xpY3kuZnJvbUF3c01hbmFnZWRQb2xpY3lOYW1lKCdzZXJ2aWNlLXJvbGUvQVdTR2x1ZVNlcnZpY2VSb2xlJyldLFxuICAgIH07XG4gICAgdGhpcy5ncmFudFByaW5jaXBhbCA9IHRoaXMucm9sZTtcblxuICAgIC8vIEVuYWJsZSBDbG91ZFdhdGNoIG1ldHJpY3MgYW5kIGNvbnRpbnVvdXMgbG9nZ2luZyBieSBkZWZhdWx0IGFzIGEgYmVzdCBwcmFjdGljZVxuICAgIGNvbnN0IGNvbnRpbnVvdXNMb2dnaW5nQXJncyA9IHRoaXMuc2V0dXBDb250aW51b3VzTG9nZ2luZyh0aGlzLnJvbGUsIHByb3BzLmNvbnRpbnVvdXNMb2dnaW5nKTtcbiAgICBjb25zdCBwcm9maWxpbmdNZXRyaWNzQXJncyA9IHsgJy0tZW5hYmxlLW1ldHJpY3MnOiAnJyB9O1xuICAgIGNvbnN0IG9ic2VydmFiaWxpdHlNZXRyaWNzQXJncyA9IHsgJy0tZW5hYmxlLW9ic2VydmFiaWxpdHktbWV0cmljcyc6ICd0cnVlJyB9O1xuXG4gICAgLy8gR2F0aGVyIGV4ZWN1dGFibGUgYXJndW1lbnRzXG4gICAgY29uc3QgZXhlY3V0YWJsZUFyZ3MgPSB0aGlzLmV4ZWN1dGFibGVBcmd1bWVudHMocHJvcHMpO1xuXG4gICAgLy8gQ29tYmluZSBjb21tYW5kIGxpbmUgYXJndW1lbnRzIGludG8gYSBzaW5nbGUgbGluZSBpdGVtXG4gICAgY29uc3QgZGVmYXVsdEFyZ3VtZW50cyA9IHtcbiAgICAgIC4uLmV4ZWN1dGFibGVBcmdzLFxuICAgICAgLi4uY29udGludW91c0xvZ2dpbmdBcmdzLFxuICAgICAgLi4ucHJvZmlsaW5nTWV0cmljc0FyZ3MsXG4gICAgICAuLi5vYnNlcnZhYmlsaXR5TWV0cmljc0FyZ3MsXG4gICAgICAuLi50aGlzLmNoZWNrTm9SZXNlcnZlZEFyZ3MocHJvcHMuZGVmYXVsdEFyZ3VtZW50cyksXG4gICAgfTtcblxuICAgIGNvbnN0IGpvYlJlc291cmNlID0gbmV3IENmbkpvYih0aGlzLCAnUmVzb3VyY2UnLCB7XG4gICAgICBuYW1lOiBwcm9wcy5qb2JOYW1lLFxuICAgICAgZGVzY3JpcHRpb246IHByb3BzLmRlc2NyaXB0aW9uLFxuICAgICAgcm9sZTogdGhpcy5yb2xlLnJvbGVBcm4sXG4gICAgICBjb21tYW5kOiB7XG4gICAgICAgIG5hbWU6IEpvYlR5cGUuUFlUSE9OX1NIRUxMLFxuICAgICAgICBzY3JpcHRMb2NhdGlvbjogdGhpcy5jb2RlUzNPYmplY3RVcmwocHJvcHMuc2NyaXB0KSxcbiAgICAgICAgcHl0aG9uVmVyc2lvbjogcHJvcHMucHl0aG9uVmVyc2lvbiA/IHByb3BzLnB5dGhvblZlcnNpb24gOiBQeXRob25WZXJzaW9uLlRIUkVFX05JTkUsXG4gICAgICB9LFxuICAgICAgZ2x1ZVZlcnNpb246IHByb3BzLmdsdWVWZXJzaW9uID8gcHJvcHMuZ2x1ZVZlcnNpb24gOiBHbHVlVmVyc2lvbi5WM18wLFxuICAgICAgbWF4Q2FwYWNpdHk6IHByb3BzLm1heENhcGFjaXR5ID8gcHJvcHMubWF4Q2FwYWNpdHkgOiBNYXhDYXBhY2l0eS5EUFVfMV8xNlRILFxuICAgICAgbWF4UmV0cmllczogcHJvcHMuam9iUnVuUXVldWluZ0VuYWJsZWQgPyAwIDogcHJvcHMubWF4UmV0cmllcyA/IHByb3BzLm1heFJldHJpZXMgOiAwLFxuICAgICAgam9iUnVuUXVldWluZ0VuYWJsZWQ6IHByb3BzLmpvYlJ1blF1ZXVpbmdFbmFibGVkID8gcHJvcHMuam9iUnVuUXVldWluZ0VuYWJsZWQgOiBmYWxzZSxcbiAgICAgIGV4ZWN1dGlvblByb3BlcnR5OiBwcm9wcy5tYXhDb25jdXJyZW50UnVucyA/IHsgbWF4Q29uY3VycmVudFJ1bnM6IHByb3BzLm1heENvbmN1cnJlbnRSdW5zIH0gOiB1bmRlZmluZWQsXG4gICAgICB0aW1lb3V0OiBwcm9wcy50aW1lb3V0Py50b01pbnV0ZXMoKSxcbiAgICAgIGNvbm5lY3Rpb25zOiBwcm9wcy5jb25uZWN0aW9ucyA/IHsgY29ubmVjdGlvbnM6IHByb3BzLmNvbm5lY3Rpb25zLm1hcCgoY29ubmVjdGlvbikgPT4gY29ubmVjdGlvbi5jb25uZWN0aW9uTmFtZSkgfSA6IHVuZGVmaW5lZCxcbiAgICAgIHNlY3VyaXR5Q29uZmlndXJhdGlvbjogcHJvcHMuc2VjdXJpdHlDb25maWd1cmF0aW9uPy5zZWN1cml0eUNvbmZpZ3VyYXRpb25OYW1lLFxuICAgICAgdGFnczogcHJvcHMudGFncyxcbiAgICAgIGRlZmF1bHRBcmd1bWVudHMsXG4gICAgfSk7XG5cbiAgICBjb25zdCByZXNvdXJjZU5hbWUgPSB0aGlzLmdldFJlc291cmNlTmFtZUF0dHJpYnV0ZShqb2JSZXNvdXJjZS5yZWYpO1xuICAgIHRoaXMuam9iQXJuID0gdGhpcy5idWlsZEpvYkFybih0aGlzLCByZXNvdXJjZU5hbWUpO1xuICAgIHRoaXMuam9iTmFtZSA9IHJlc291cmNlTmFtZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXQgdGhlIGV4ZWN1dGFibGUgYXJndW1lbnRzIHdpdGggYmVzdCBwcmFjdGljZXMgZW5hYmxlZCBieSBkZWZhdWx0XG4gICAqXG4gICAqIEByZXR1cm5zIEFuIGFycmF5IG9mIGFyZ3VtZW50cyBmb3IgR2x1ZSB0byB1c2Ugb24gZXhlY3V0aW9uXG4gICAqL1xuICBwcml2YXRlIGV4ZWN1dGFibGVBcmd1bWVudHMocHJvcHM6IFB5dGhvblNoZWxsSm9iUHJvcHMpIHtcbiAgICBjb25zdCBhcmdzOiB7IFtrZXk6IHN0cmluZ106IHN0cmluZyB9ID0ge307XG4gICAgYXJnc1snLS1qb2ItbGFuZ3VhZ2UnXSA9IEpvYkxhbmd1YWdlLlBZVEhPTjtcblxuICAgIC8vIElmIG5vIFB5dGhvbiB2ZXJzaW9uIHNldCAoZGVmYXVsdCAzLjkpIG9yIHRoZSB2ZXJzaW9uIGlzIHNldCB0byAzLjkgdGhlbiBzZXQgbGlicmFyeS1zZXQgYXJndW1lbnRcbiAgICBpZiAoIXByb3BzLnB5dGhvblZlcnNpb24gfHwgcHJvcHMucHl0aG9uVmVyc2lvbiA9PSBQeXRob25WZXJzaW9uLlRIUkVFX05JTkUpIHtcbiAgICAgIC8vIFNlbGVjdGluZyB0aGlzIG9wdGlvbiBpbmNsdWRlcyBjb21tb24gbGlicmFyaWVzIGZvciBQeXRob24gMy45XG4gICAgICBhcmdzWydsaWJyYXJ5LXNldCddID0gJ2FuYWx5dGljcyc7XG4gICAgfVxuXG4gICAgcmV0dXJuIGFyZ3M7XG4gIH1cbn1cbiJdfQ==
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import * as iam from 'aws-cdk-lib/aws-iam';
|
|
2
|
+
import { Job, JobProperties } from './job';
|
|
3
|
+
import { Construct } from 'constructs';
|
|
4
|
+
import { Runtime } from '../constants';
|
|
5
|
+
/**
|
|
6
|
+
* Properties for creating a Ray Glue job
|
|
7
|
+
*/
|
|
8
|
+
export interface RayJobProps extends JobProperties {
|
|
9
|
+
/**
|
|
10
|
+
* Sets the Ray runtime environment version
|
|
11
|
+
*
|
|
12
|
+
* @default - Runtime version will default to Ray2.4
|
|
13
|
+
*/
|
|
14
|
+
readonly runtime?: Runtime;
|
|
15
|
+
/**
|
|
16
|
+
* Specifies whether job run queuing is enabled for the job runs for this job.
|
|
17
|
+
* A value of true means job run queuing is enabled for the job runs.
|
|
18
|
+
* If false or not populated, the job runs will not be considered for queueing.
|
|
19
|
+
* If this field does not match the value set in the job run, then the value from
|
|
20
|
+
* the job run field will be used. This property must be set to false for flex jobs.
|
|
21
|
+
* If this property is enabled, maxRetries must be set to zero.
|
|
22
|
+
*
|
|
23
|
+
* @default - no job run queuing
|
|
24
|
+
*/
|
|
25
|
+
readonly jobRunQueuingEnabled?: boolean;
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Ray Jobs class
|
|
29
|
+
*
|
|
30
|
+
* Glue Ray jobs use worker type Z.2X and Glue version 4.0.
|
|
31
|
+
* These are not overrideable since these are the only configuration that
|
|
32
|
+
* Glue Ray jobs currently support. The runtime defaults to Ray2.4 and min
|
|
33
|
+
* workers defaults to 3.
|
|
34
|
+
*/
|
|
35
|
+
export declare class RayJob extends Job {
|
|
36
|
+
readonly jobArn: string;
|
|
37
|
+
readonly jobName: string;
|
|
38
|
+
readonly role: iam.IRole;
|
|
39
|
+
readonly grantPrincipal: iam.IPrincipal;
|
|
40
|
+
/**
|
|
41
|
+
* RayJob constructor
|
|
42
|
+
*/
|
|
43
|
+
constructor(scope: Construct, id: string, props: RayJobProps);
|
|
44
|
+
}
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var _a;
|
|
3
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
4
|
+
exports.RayJob = void 0;
|
|
5
|
+
const jsiiDeprecationWarnings = require("../../.warnings.jsii.js");
|
|
6
|
+
const JSII_RTTI_SYMBOL_1 = Symbol.for("jsii.rtti");
|
|
7
|
+
const aws_glue_1 = require("aws-cdk-lib/aws-glue");
|
|
8
|
+
const iam = require("aws-cdk-lib/aws-iam");
|
|
9
|
+
const job_1 = require("./job");
|
|
10
|
+
const constants_1 = require("../constants");
|
|
11
|
+
const metadata_resource_1 = require("aws-cdk-lib/core/lib/metadata-resource");
|
|
12
|
+
/**
|
|
13
|
+
* Ray Jobs class
|
|
14
|
+
*
|
|
15
|
+
* Glue Ray jobs use worker type Z.2X and Glue version 4.0.
|
|
16
|
+
* These are not overrideable since these are the only configuration that
|
|
17
|
+
* Glue Ray jobs currently support. The runtime defaults to Ray2.4 and min
|
|
18
|
+
* workers defaults to 3.
|
|
19
|
+
*/
|
|
20
|
+
class RayJob extends job_1.Job {
|
|
21
|
+
/**
|
|
22
|
+
* RayJob constructor
|
|
23
|
+
*/
|
|
24
|
+
constructor(scope, id, props) {
|
|
25
|
+
super(scope, id, {
|
|
26
|
+
physicalName: props.jobName,
|
|
27
|
+
});
|
|
28
|
+
try {
|
|
29
|
+
jsiiDeprecationWarnings._aws_cdk_aws_glue_alpha_RayJobProps(props);
|
|
30
|
+
}
|
|
31
|
+
catch (error) {
|
|
32
|
+
if (process.env.JSII_DEBUG !== "1" && error.name === "DeprecationError") {
|
|
33
|
+
Error.captureStackTrace(error, RayJob);
|
|
34
|
+
}
|
|
35
|
+
throw error;
|
|
36
|
+
}
|
|
37
|
+
// Enhanced CDK Analytics Telemetry
|
|
38
|
+
(0, metadata_resource_1.addConstructMetadata)(this, props);
|
|
39
|
+
this.jobName = props.jobName ?? '';
|
|
40
|
+
// Set up role and permissions for principal
|
|
41
|
+
this.role = props.role, {
|
|
42
|
+
assumedBy: new iam.ServicePrincipal('glue.amazonaws.com'),
|
|
43
|
+
managedPolicies: [iam.ManagedPolicy.fromAwsManagedPolicyName('service-role/AWSGlueServiceRole')],
|
|
44
|
+
};
|
|
45
|
+
this.grantPrincipal = this.role;
|
|
46
|
+
// Enable CloudWatch metrics and continuous logging by default as a best practice
|
|
47
|
+
const continuousLoggingArgs = this.setupContinuousLogging(this.role, props.continuousLogging);
|
|
48
|
+
const profilingMetricsArgs = { '--enable-metrics': '' };
|
|
49
|
+
const observabilityMetricsArgs = { '--enable-observability-metrics': 'true' };
|
|
50
|
+
// Combine command line arguments into a single line item
|
|
51
|
+
const defaultArguments = {
|
|
52
|
+
...this.checkNoReservedArgs(props.defaultArguments),
|
|
53
|
+
...continuousLoggingArgs,
|
|
54
|
+
...profilingMetricsArgs,
|
|
55
|
+
...observabilityMetricsArgs,
|
|
56
|
+
};
|
|
57
|
+
if (props.workerType && props.workerType !== constants_1.WorkerType.Z_2X) {
|
|
58
|
+
throw new Error('Ray jobs only support Z.2X worker type');
|
|
59
|
+
}
|
|
60
|
+
const jobResource = new aws_glue_1.CfnJob(this, 'Resource', {
|
|
61
|
+
name: props.jobName,
|
|
62
|
+
description: props.description,
|
|
63
|
+
role: this.role.roleArn,
|
|
64
|
+
command: {
|
|
65
|
+
name: constants_1.JobType.RAY,
|
|
66
|
+
scriptLocation: this.codeS3ObjectUrl(props.script),
|
|
67
|
+
runtime: props.runtime ? props.runtime : constants_1.Runtime.RAY_TWO_FOUR,
|
|
68
|
+
},
|
|
69
|
+
glueVersion: constants_1.GlueVersion.V4_0,
|
|
70
|
+
workerType: props.workerType ? props.workerType : constants_1.WorkerType.Z_2X,
|
|
71
|
+
numberOfWorkers: props.numberOfWorkers ? props.numberOfWorkers : 3,
|
|
72
|
+
maxRetries: props.jobRunQueuingEnabled ? 0 : props.maxRetries,
|
|
73
|
+
jobRunQueuingEnabled: props.jobRunQueuingEnabled ? props.jobRunQueuingEnabled : false,
|
|
74
|
+
executionProperty: props.maxConcurrentRuns ? { maxConcurrentRuns: props.maxConcurrentRuns } : undefined,
|
|
75
|
+
timeout: props.timeout?.toMinutes(),
|
|
76
|
+
connections: props.connections ? { connections: props.connections.map((connection) => connection.connectionName) } : undefined,
|
|
77
|
+
securityConfiguration: props.securityConfiguration?.securityConfigurationName,
|
|
78
|
+
tags: props.tags,
|
|
79
|
+
defaultArguments,
|
|
80
|
+
});
|
|
81
|
+
const resourceName = this.getResourceNameAttribute(jobResource.ref);
|
|
82
|
+
this.jobArn = this.buildJobArn(this, resourceName);
|
|
83
|
+
this.jobName = resourceName;
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
exports.RayJob = RayJob;
|
|
87
|
+
_a = JSII_RTTI_SYMBOL_1;
|
|
88
|
+
RayJob[_a] = { fqn: "@aws-cdk/aws-glue-alpha.RayJob", version: "2.178.0-alpha.0" };
|
|
89
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmF5LWpvYi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbInJheS1qb2IudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBQUEsbURBQThDO0FBQzlDLDJDQUEyQztBQUMzQywrQkFBMkM7QUFFM0MsNENBQXlFO0FBQ3pFLDhFQUE4RTtBQTBCOUU7Ozs7Ozs7R0FPRztBQUNILE1BQWEsTUFBTyxTQUFRLFNBQUc7SUFNN0I7O09BRUc7SUFDSCxZQUFZLEtBQWdCLEVBQUUsRUFBVSxFQUFFLEtBQWtCO1FBQzFELEtBQUssQ0FBQyxLQUFLLEVBQUUsRUFBRSxFQUFFO1lBQ2YsWUFBWSxFQUFFLEtBQUssQ0FBQyxPQUFPO1NBQzVCLENBQUMsQ0FBQzs7Ozs7OytDQVpNLE1BQU07Ozs7UUFhZixtQ0FBbUM7UUFDbkMsSUFBQSx3Q0FBb0IsRUFBQyxJQUFJLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFFbEMsSUFBSSxDQUFDLE9BQU8sR0FBRyxLQUFLLENBQUMsT0FBTyxJQUFJLEVBQUUsQ0FBQztRQUVuQyw0Q0FBNEM7UUFDNUMsSUFBSSxDQUFDLElBQUksR0FBRyxLQUFLLENBQUMsSUFBSSxFQUFFO1lBQ3RCLFNBQVMsRUFBRSxJQUFJLEdBQUcsQ0FBQyxnQkFBZ0IsQ0FBQyxvQkFBb0IsQ0FBQztZQUN6RCxlQUFlLEVBQUUsQ0FBQyxHQUFHLENBQUMsYUFBYSxDQUFDLHdCQUF3QixDQUFDLGlDQUFpQyxDQUFDLENBQUM7U0FDakcsQ0FBQztRQUNGLElBQUksQ0FBQyxjQUFjLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQztRQUVoQyxpRkFBaUY7UUFDakYsTUFBTSxxQkFBcUIsR0FBRyxJQUFJLENBQUMsc0JBQXNCLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxLQUFLLENBQUMsaUJBQWlCLENBQUMsQ0FBQztRQUM5RixNQUFNLG9CQUFvQixHQUFHLEVBQUUsa0JBQWtCLEVBQUUsRUFBRSxFQUFFLENBQUM7UUFDeEQsTUFBTSx3QkFBd0IsR0FBRyxFQUFFLGdDQUFnQyxFQUFFLE1BQU0sRUFBRSxDQUFDO1FBRTlFLHlEQUF5RDtRQUN6RCxNQUFNLGdCQUFnQixHQUFHO1lBQ3ZCLEdBQUcsSUFBSSxDQUFDLG1CQUFtQixDQUFDLEtBQUssQ0FBQyxnQkFBZ0IsQ0FBQztZQUNuRCxHQUFHLHFCQUFxQjtZQUN4QixHQUFHLG9CQUFvQjtZQUN2QixHQUFHLHdCQUF3QjtTQUM1QixDQUFDO1FBRUYsSUFBSSxLQUFLLENBQUMsVUFBVSxJQUFJLEtBQUssQ0FBQyxVQUFVLEtBQUssc0JBQVUsQ0FBQyxJQUFJLEVBQUUsQ0FBQztZQUM3RCxNQUFNLElBQUksS0FBSyxDQUFDLHdDQUF3QyxDQUFDLENBQUM7UUFDNUQsQ0FBQztRQUVELE1BQU0sV0FBVyxHQUFHLElBQUksaUJBQU0sQ0FBQyxJQUFJLEVBQUUsVUFBVSxFQUFFO1lBQy9DLElBQUksRUFBRSxLQUFLLENBQUMsT0FBTztZQUNuQixXQUFXLEVBQUUsS0FBSyxDQUFDLFdBQVc7WUFDOUIsSUFBSSxFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTztZQUN2QixPQUFPLEVBQUU7Z0JBQ1AsSUFBSSxFQUFFLG1CQUFPLENBQUMsR0FBRztnQkFDakIsY0FBYyxFQUFFLElBQUksQ0FBQyxlQUFlLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQztnQkFDbEQsT0FBTyxFQUFFLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLG1CQUFPLENBQUMsWUFBWTthQUM5RDtZQUNELFdBQVcsRUFBRSx1QkFBVyxDQUFDLElBQUk7WUFDN0IsVUFBVSxFQUFFLEtBQUssQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLHNCQUFVLENBQUMsSUFBSTtZQUNqRSxlQUFlLEVBQUUsS0FBSyxDQUFDLGVBQWUsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLGVBQWUsQ0FBQSxDQUFDLENBQUMsQ0FBQztZQUNqRSxVQUFVLEVBQUUsS0FBSyxDQUFDLG9CQUFvQixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxVQUFVO1lBQzdELG9CQUFvQixFQUFFLEtBQUssQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLG9CQUFvQixDQUFDLENBQUMsQ0FBQyxLQUFLO1lBQ3JGLGlCQUFpQixFQUFFLEtBQUssQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDLENBQUMsRUFBRSxpQkFBaUIsRUFBRSxLQUFLLENBQUMsaUJBQWlCLEVBQUUsQ0FBQyxDQUFDLENBQUMsU0FBUztZQUN2RyxPQUFPLEVBQUUsS0FBSyxDQUFDLE9BQU8sRUFBRSxTQUFTLEVBQUU7WUFDbkMsV0FBVyxFQUFFLEtBQUssQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLEVBQUUsV0FBVyxFQUFFLEtBQUssQ0FBQyxXQUFXLENBQUMsR0FBRyxDQUFDLENBQUMsVUFBVSxFQUFFLEVBQUUsQ0FBQyxVQUFVLENBQUMsY0FBYyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsU0FBUztZQUM5SCxxQkFBcUIsRUFBRSxLQUFLLENBQUMscUJBQXFCLEVBQUUseUJBQXlCO1lBQzdFLElBQUksRUFBRSxLQUFLLENBQUMsSUFBSTtZQUNoQixnQkFBZ0I7U0FDakIsQ0FBQyxDQUFDO1FBRUgsTUFBTSxZQUFZLEdBQUcsSUFBSSxDQUFDLHdCQUF3QixDQUFDLFdBQVcsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUNwRSxJQUFJLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxFQUFFLFlBQVksQ0FBQyxDQUFDO1FBQ25ELElBQUksQ0FBQyxPQUFPLEdBQUcsWUFBWSxDQUFDO0tBQzdCOztBQW5FSCx3QkFvRUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDZm5Kb2IgfSBmcm9tICdhd3MtY2RrLWxpYi9hd3MtZ2x1ZSc7XG5pbXBvcnQgKiBhcyBpYW0gZnJvbSAnYXdzLWNkay1saWIvYXdzLWlhbSc7XG5pbXBvcnQgeyBKb2IsIEpvYlByb3BlcnRpZXMgfSBmcm9tICcuL2pvYic7XG5pbXBvcnQgeyBDb25zdHJ1Y3QgfSBmcm9tICdjb25zdHJ1Y3RzJztcbmltcG9ydCB7IEpvYlR5cGUsIEdsdWVWZXJzaW9uLCBXb3JrZXJUeXBlLCBSdW50aW1lIH0gZnJvbSAnLi4vY29uc3RhbnRzJztcbmltcG9ydCB7IGFkZENvbnN0cnVjdE1ldGFkYXRhIH0gZnJvbSAnYXdzLWNkay1saWIvY29yZS9saWIvbWV0YWRhdGEtcmVzb3VyY2UnO1xuXG4vKipcbiAqIFByb3BlcnRpZXMgZm9yIGNyZWF0aW5nIGEgUmF5IEdsdWUgam9iXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUmF5Sm9iUHJvcHMgZXh0ZW5kcyBKb2JQcm9wZXJ0aWVzIHtcbiAgLyoqXG4gICAqIFNldHMgdGhlIFJheSBydW50aW1lIGVudmlyb25tZW50IHZlcnNpb25cbiAgICpcbiAgICogQGRlZmF1bHQgLSBSdW50aW1lIHZlcnNpb24gd2lsbCBkZWZhdWx0IHRvIFJheTIuNFxuICAgKi9cbiAgcmVhZG9ubHkgcnVudGltZT86IFJ1bnRpbWU7XG5cbiAgLyoqXG4gICAqIFNwZWNpZmllcyB3aGV0aGVyIGpvYiBydW4gcXVldWluZyBpcyBlbmFibGVkIGZvciB0aGUgam9iIHJ1bnMgZm9yIHRoaXMgam9iLlxuICAgKiBBIHZhbHVlIG9mIHRydWUgbWVhbnMgam9iIHJ1biBxdWV1aW5nIGlzIGVuYWJsZWQgZm9yIHRoZSBqb2IgcnVucy5cbiAgICogSWYgZmFsc2Ugb3Igbm90IHBvcHVsYXRlZCwgdGhlIGpvYiBydW5zIHdpbGwgbm90IGJlIGNvbnNpZGVyZWQgZm9yIHF1ZXVlaW5nLlxuICAgKiBJZiB0aGlzIGZpZWxkIGRvZXMgbm90IG1hdGNoIHRoZSB2YWx1ZSBzZXQgaW4gdGhlIGpvYiBydW4sIHRoZW4gdGhlIHZhbHVlIGZyb21cbiAgICogdGhlIGpvYiBydW4gZmllbGQgd2lsbCBiZSB1c2VkLiBUaGlzIHByb3BlcnR5IG11c3QgYmUgc2V0IHRvIGZhbHNlIGZvciBmbGV4IGpvYnMuXG4gICAqIElmIHRoaXMgcHJvcGVydHkgaXMgZW5hYmxlZCwgbWF4UmV0cmllcyBtdXN0IGJlIHNldCB0byB6ZXJvLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIG5vIGpvYiBydW4gcXVldWluZ1xuICAgKi9cbiAgcmVhZG9ubHkgam9iUnVuUXVldWluZ0VuYWJsZWQ/OiBib29sZWFuO1xufVxuXG4vKipcbiAqIFJheSBKb2JzIGNsYXNzXG4gKlxuICogR2x1ZSBSYXkgam9icyB1c2Ugd29ya2VyIHR5cGUgWi4yWCBhbmQgR2x1ZSB2ZXJzaW9uIDQuMC5cbiAqIFRoZXNlIGFyZSBub3Qgb3ZlcnJpZGVhYmxlIHNpbmNlIHRoZXNlIGFyZSB0aGUgb25seSBjb25maWd1cmF0aW9uIHRoYXRcbiAqIEdsdWUgUmF5IGpvYnMgY3VycmVudGx5IHN1cHBvcnQuIFRoZSBydW50aW1lIGRlZmF1bHRzIHRvIFJheTIuNCBhbmQgbWluXG4gKiB3b3JrZXJzIGRlZmF1bHRzIHRvIDMuXG4gKi9cbmV4cG9ydCBjbGFzcyBSYXlKb2IgZXh0ZW5kcyBKb2Ige1xuICBwdWJsaWMgcmVhZG9ubHkgam9iQXJuOiBzdHJpbmc7XG4gIHB1YmxpYyByZWFkb25seSBqb2JOYW1lOiBzdHJpbmc7XG4gIHB1YmxpYyByZWFkb25seSByb2xlOiBpYW0uSVJvbGU7XG4gIHB1YmxpYyByZWFkb25seSBncmFudFByaW5jaXBhbDogaWFtLklQcmluY2lwYWw7XG5cbiAgLyoqXG4gICAqIFJheUpvYiBjb25zdHJ1Y3RvclxuICAgKi9cbiAgY29uc3RydWN0b3Ioc2NvcGU6IENvbnN0cnVjdCwgaWQ6IHN0cmluZywgcHJvcHM6IFJheUpvYlByb3BzKSB7XG4gICAgc3VwZXIoc2NvcGUsIGlkLCB7XG4gICAgICBwaHlzaWNhbE5hbWU6IHByb3BzLmpvYk5hbWUsXG4gICAgfSk7XG4gICAgLy8gRW5oYW5jZWQgQ0RLIEFuYWx5dGljcyBUZWxlbWV0cnlcbiAgICBhZGRDb25zdHJ1Y3RNZXRhZGF0YSh0aGlzLCBwcm9wcyk7XG5cbiAgICB0aGlzLmpvYk5hbWUgPSBwcm9wcy5qb2JOYW1lID8/ICcnO1xuXG4gICAgLy8gU2V0IHVwIHJvbGUgYW5kIHBlcm1pc3Npb25zIGZvciBwcmluY2lwYWxcbiAgICB0aGlzLnJvbGUgPSBwcm9wcy5yb2xlLCB7XG4gICAgICBhc3N1bWVkQnk6IG5ldyBpYW0uU2VydmljZVByaW5jaXBhbCgnZ2x1ZS5hbWF6b25hd3MuY29tJyksXG4gICAgICBtYW5hZ2VkUG9saWNpZXM6IFtpYW0uTWFuYWdlZFBvbGljeS5mcm9tQXdzTWFuYWdlZFBvbGljeU5hbWUoJ3NlcnZpY2Utcm9sZS9BV1NHbHVlU2VydmljZVJvbGUnKV0sXG4gICAgfTtcbiAgICB0aGlzLmdyYW50UHJpbmNpcGFsID0gdGhpcy5yb2xlO1xuXG4gICAgLy8gRW5hYmxlIENsb3VkV2F0Y2ggbWV0cmljcyBhbmQgY29udGludW91cyBsb2dnaW5nIGJ5IGRlZmF1bHQgYXMgYSBiZXN0IHByYWN0aWNlXG4gICAgY29uc3QgY29udGludW91c0xvZ2dpbmdBcmdzID0gdGhpcy5zZXR1cENvbnRpbnVvdXNMb2dnaW5nKHRoaXMucm9sZSwgcHJvcHMuY29udGludW91c0xvZ2dpbmcpO1xuICAgIGNvbnN0IHByb2ZpbGluZ01ldHJpY3NBcmdzID0geyAnLS1lbmFibGUtbWV0cmljcyc6ICcnIH07XG4gICAgY29uc3Qgb2JzZXJ2YWJpbGl0eU1ldHJpY3NBcmdzID0geyAnLS1lbmFibGUtb2JzZXJ2YWJpbGl0eS1tZXRyaWNzJzogJ3RydWUnIH07XG5cbiAgICAvLyBDb21iaW5lIGNvbW1hbmQgbGluZSBhcmd1bWVudHMgaW50byBhIHNpbmdsZSBsaW5lIGl0ZW1cbiAgICBjb25zdCBkZWZhdWx0QXJndW1lbnRzID0ge1xuICAgICAgLi4udGhpcy5jaGVja05vUmVzZXJ2ZWRBcmdzKHByb3BzLmRlZmF1bHRBcmd1bWVudHMpLFxuICAgICAgLi4uY29udGludW91c0xvZ2dpbmdBcmdzLFxuICAgICAgLi4ucHJvZmlsaW5nTWV0cmljc0FyZ3MsXG4gICAgICAuLi5vYnNlcnZhYmlsaXR5TWV0cmljc0FyZ3MsXG4gICAgfTtcblxuICAgIGlmIChwcm9wcy53b3JrZXJUeXBlICYmIHByb3BzLndvcmtlclR5cGUgIT09IFdvcmtlclR5cGUuWl8yWCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdSYXkgam9icyBvbmx5IHN1cHBvcnQgWi4yWCB3b3JrZXIgdHlwZScpO1xuICAgIH1cblxuICAgIGNvbnN0IGpvYlJlc291cmNlID0gbmV3IENmbkpvYih0aGlzLCAnUmVzb3VyY2UnLCB7XG4gICAgICBuYW1lOiBwcm9wcy5qb2JOYW1lLFxuICAgICAgZGVzY3JpcHRpb246IHByb3BzLmRlc2NyaXB0aW9uLFxuICAgICAgcm9sZTogdGhpcy5yb2xlLnJvbGVBcm4sXG4gICAgICBjb21tYW5kOiB7XG4gICAgICAgIG5hbWU6IEpvYlR5cGUuUkFZLFxuICAgICAgICBzY3JpcHRMb2NhdGlvbjogdGhpcy5jb2RlUzNPYmplY3RVcmwocHJvcHMuc2NyaXB0KSxcbiAgICAgICAgcnVudGltZTogcHJvcHMucnVudGltZSA/IHByb3BzLnJ1bnRpbWUgOiBSdW50aW1lLlJBWV9UV09fRk9VUixcbiAgICAgIH0sXG4gICAgICBnbHVlVmVyc2lvbjogR2x1ZVZlcnNpb24uVjRfMCxcbiAgICAgIHdvcmtlclR5cGU6IHByb3BzLndvcmtlclR5cGUgPyBwcm9wcy53b3JrZXJUeXBlIDogV29ya2VyVHlwZS5aXzJYLFxuICAgICAgbnVtYmVyT2ZXb3JrZXJzOiBwcm9wcy5udW1iZXJPZldvcmtlcnMgPyBwcm9wcy5udW1iZXJPZldvcmtlcnM6IDMsXG4gICAgICBtYXhSZXRyaWVzOiBwcm9wcy5qb2JSdW5RdWV1aW5nRW5hYmxlZCA/IDAgOiBwcm9wcy5tYXhSZXRyaWVzLFxuICAgICAgam9iUnVuUXVldWluZ0VuYWJsZWQ6IHByb3BzLmpvYlJ1blF1ZXVpbmdFbmFibGVkID8gcHJvcHMuam9iUnVuUXVldWluZ0VuYWJsZWQgOiBmYWxzZSxcbiAgICAgIGV4ZWN1dGlvblByb3BlcnR5OiBwcm9wcy5tYXhDb25jdXJyZW50UnVucyA/IHsgbWF4Q29uY3VycmVudFJ1bnM6IHByb3BzLm1heENvbmN1cnJlbnRSdW5zIH0gOiB1bmRlZmluZWQsXG4gICAgICB0aW1lb3V0OiBwcm9wcy50aW1lb3V0Py50b01pbnV0ZXMoKSxcbiAgICAgIGNvbm5lY3Rpb25zOiBwcm9wcy5jb25uZWN0aW9ucyA/IHsgY29ubmVjdGlvbnM6IHByb3BzLmNvbm5lY3Rpb25zLm1hcCgoY29ubmVjdGlvbikgPT4gY29ubmVjdGlvbi5jb25uZWN0aW9uTmFtZSkgfSA6IHVuZGVmaW5lZCxcbiAgICAgIHNlY3VyaXR5Q29uZmlndXJhdGlvbjogcHJvcHMuc2VjdXJpdHlDb25maWd1cmF0aW9uPy5zZWN1cml0eUNvbmZpZ3VyYXRpb25OYW1lLFxuICAgICAgdGFnczogcHJvcHMudGFncyxcbiAgICAgIGRlZmF1bHRBcmd1bWVudHMsXG4gICAgfSk7XG5cbiAgICBjb25zdCByZXNvdXJjZU5hbWUgPSB0aGlzLmdldFJlc291cmNlTmFtZUF0dHJpYnV0ZShqb2JSZXNvdXJjZS5yZWYpO1xuICAgIHRoaXMuam9iQXJuID0gdGhpcy5idWlsZEpvYkFybih0aGlzLCByZXNvdXJjZU5hbWUpO1xuICAgIHRoaXMuam9iTmFtZSA9IHJlc291cmNlTmFtZTtcbiAgfVxufVxuIl19
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
import * as iam from 'aws-cdk-lib/aws-iam';
|
|
2
|
+
import { Job, JobProperties } from './job';
|
|
3
|
+
import { Construct } from 'constructs';
|
|
4
|
+
import { SparkUIProps, SparkUILoggingLocation } from './spark-ui-utils';
|
|
5
|
+
import { Code } from '../code';
|
|
6
|
+
/**
|
|
7
|
+
* Properties for creating a Scala Spark ETL job
|
|
8
|
+
*/
|
|
9
|
+
export interface ScalaSparkEtlJobProps extends JobProperties {
|
|
10
|
+
/**
|
|
11
|
+
* Enables the Spark UI debugging and monitoring with the specified props.
|
|
12
|
+
*
|
|
13
|
+
* @default - Spark UI debugging and monitoring is disabled.
|
|
14
|
+
*
|
|
15
|
+
* @see https://docs.aws.amazon.com/glue/latest/dg/monitor-spark-ui-jobs.html
|
|
16
|
+
* @see https://docs.aws.amazon.com/glue/latest/dg/aws-glue-programming-etl-glue-arguments.html
|
|
17
|
+
*/
|
|
18
|
+
readonly sparkUI?: SparkUIProps;
|
|
19
|
+
/**
|
|
20
|
+
* Class name (required for Scala scripts)
|
|
21
|
+
* Package and class name for the entry point of Glue job execution for
|
|
22
|
+
* Java scripts
|
|
23
|
+
**/
|
|
24
|
+
readonly className: string;
|
|
25
|
+
/**
|
|
26
|
+
* Extra Jars S3 URL (optional)
|
|
27
|
+
* S3 URL where additional jar dependencies are located
|
|
28
|
+
* @default - no extra jar files
|
|
29
|
+
*/
|
|
30
|
+
readonly extraJars?: Code[];
|
|
31
|
+
/**
|
|
32
|
+
* Specifies whether job run queuing is enabled for the job runs for this job.
|
|
33
|
+
* A value of true means job run queuing is enabled for the job runs.
|
|
34
|
+
* If false or not populated, the job runs will not be considered for queueing.
|
|
35
|
+
* If this field does not match the value set in the job run, then the value from
|
|
36
|
+
* the job run field will be used. This property must be set to false for flex jobs.
|
|
37
|
+
* If this property is enabled, maxRetries must be set to zero.
|
|
38
|
+
*
|
|
39
|
+
* @default - no job run queuing
|
|
40
|
+
*/
|
|
41
|
+
readonly jobRunQueuingEnabled?: boolean;
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* Spark ETL Jobs class
|
|
45
|
+
*
|
|
46
|
+
* ETL jobs support pySpark and Scala languages, for which there are separate
|
|
47
|
+
* but similar constructors. ETL jobs default to the G2 worker type, but you
|
|
48
|
+
* can override this default with other supported worker type values
|
|
49
|
+
* (G1, G2, G4 and G8). ETL jobs defaults to Glue version 4.0, which you can
|
|
50
|
+
* override to 3.0. The following ETL features are enabled by default:
|
|
51
|
+
* —enable-metrics, —enable-spark-ui, —enable-continuous-cloudwatch-log.
|
|
52
|
+
* You can find more details about version, worker type and other features
|
|
53
|
+
* in Glue's public documentation.
|
|
54
|
+
*/
|
|
55
|
+
export declare class ScalaSparkEtlJob extends Job {
|
|
56
|
+
readonly jobArn: string;
|
|
57
|
+
readonly jobName: string;
|
|
58
|
+
readonly role: iam.IRole;
|
|
59
|
+
readonly grantPrincipal: iam.IPrincipal;
|
|
60
|
+
/**
|
|
61
|
+
* The Spark UI logs location if Spark UI monitoring and debugging is enabled.
|
|
62
|
+
*
|
|
63
|
+
* @see https://docs.aws.amazon.com/glue/latest/dg/monitor-spark-ui-jobs.html
|
|
64
|
+
* @see https://docs.aws.amazon.com/glue/latest/dg/aws-glue-programming-etl-glue-arguments.html
|
|
65
|
+
*/
|
|
66
|
+
readonly sparkUILoggingLocation?: SparkUILoggingLocation;
|
|
67
|
+
/**
|
|
68
|
+
* ScalaSparkEtlJob constructor
|
|
69
|
+
*/
|
|
70
|
+
constructor(scope: Construct, id: string, props: ScalaSparkEtlJobProps);
|
|
71
|
+
/**
|
|
72
|
+
* Set the executable arguments with best practices enabled by default
|
|
73
|
+
*
|
|
74
|
+
* @returns An array of arguments for Glue to use on execution
|
|
75
|
+
*/
|
|
76
|
+
private executableArguments;
|
|
77
|
+
private setupSparkUI;
|
|
78
|
+
}
|
|
@@ -0,0 +1,134 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var _a;
|
|
3
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
4
|
+
exports.ScalaSparkEtlJob = void 0;
|
|
5
|
+
const jsiiDeprecationWarnings = require("../../.warnings.jsii.js");
|
|
6
|
+
const JSII_RTTI_SYMBOL_1 = Symbol.for("jsii.rtti");
|
|
7
|
+
const iam = require("aws-cdk-lib/aws-iam");
|
|
8
|
+
const aws_s3_1 = require("aws-cdk-lib/aws-s3");
|
|
9
|
+
const aws_glue_1 = require("aws-cdk-lib/aws-glue");
|
|
10
|
+
const job_1 = require("./job");
|
|
11
|
+
const constants_1 = require("../constants");
|
|
12
|
+
const spark_ui_utils_1 = require("./spark-ui-utils");
|
|
13
|
+
const metadata_resource_1 = require("aws-cdk-lib/core/lib/metadata-resource");
|
|
14
|
+
/**
|
|
15
|
+
* Spark ETL Jobs class
|
|
16
|
+
*
|
|
17
|
+
* ETL jobs support pySpark and Scala languages, for which there are separate
|
|
18
|
+
* but similar constructors. ETL jobs default to the G2 worker type, but you
|
|
19
|
+
* can override this default with other supported worker type values
|
|
20
|
+
* (G1, G2, G4 and G8). ETL jobs defaults to Glue version 4.0, which you can
|
|
21
|
+
* override to 3.0. The following ETL features are enabled by default:
|
|
22
|
+
* —enable-metrics, —enable-spark-ui, —enable-continuous-cloudwatch-log.
|
|
23
|
+
* You can find more details about version, worker type and other features
|
|
24
|
+
* in Glue's public documentation.
|
|
25
|
+
*/
|
|
26
|
+
class ScalaSparkEtlJob extends job_1.Job {
|
|
27
|
+
/**
|
|
28
|
+
* ScalaSparkEtlJob constructor
|
|
29
|
+
*/
|
|
30
|
+
constructor(scope, id, props) {
|
|
31
|
+
super(scope, id, {
|
|
32
|
+
physicalName: props.jobName,
|
|
33
|
+
});
|
|
34
|
+
try {
|
|
35
|
+
jsiiDeprecationWarnings._aws_cdk_aws_glue_alpha_ScalaSparkEtlJobProps(props);
|
|
36
|
+
}
|
|
37
|
+
catch (error) {
|
|
38
|
+
if (process.env.JSII_DEBUG !== "1" && error.name === "DeprecationError") {
|
|
39
|
+
Error.captureStackTrace(error, ScalaSparkEtlJob);
|
|
40
|
+
}
|
|
41
|
+
throw error;
|
|
42
|
+
}
|
|
43
|
+
// Enhanced CDK Analytics Telemetry
|
|
44
|
+
(0, metadata_resource_1.addConstructMetadata)(this, props);
|
|
45
|
+
// Set up role and permissions for principal
|
|
46
|
+
this.role = props.role, {
|
|
47
|
+
assumedBy: new iam.ServicePrincipal('glue.amazonaws.com'),
|
|
48
|
+
managedPolicies: [iam.ManagedPolicy.fromAwsManagedPolicyName('service-role/AWSGlueServiceRole')],
|
|
49
|
+
};
|
|
50
|
+
this.grantPrincipal = this.role;
|
|
51
|
+
// Enable SparkUI by default as a best practice
|
|
52
|
+
const sparkUIArgs = props.sparkUI?.bucket ? this.setupSparkUI(this.role, props.sparkUI) : undefined;
|
|
53
|
+
this.sparkUILoggingLocation = sparkUIArgs?.location;
|
|
54
|
+
// Enable CloudWatch metrics and continuous logging by default as a best practice
|
|
55
|
+
const continuousLoggingArgs = this.setupContinuousLogging(this.role, props.continuousLogging);
|
|
56
|
+
const profilingMetricsArgs = { '--enable-metrics': '' };
|
|
57
|
+
const observabilityMetricsArgs = { '--enable-observability-metrics': 'true' };
|
|
58
|
+
// Gather executable arguments
|
|
59
|
+
const execuatbleArgs = this.executableArguments(props);
|
|
60
|
+
// Mandatory className argument
|
|
61
|
+
if (props.className === undefined) {
|
|
62
|
+
throw new Error('className must be set for Scala ETL Jobs');
|
|
63
|
+
}
|
|
64
|
+
// Conbine command line arguments into a single line item
|
|
65
|
+
const defaultArguments = {
|
|
66
|
+
...execuatbleArgs,
|
|
67
|
+
...continuousLoggingArgs,
|
|
68
|
+
...profilingMetricsArgs,
|
|
69
|
+
...observabilityMetricsArgs,
|
|
70
|
+
...sparkUIArgs?.args,
|
|
71
|
+
...this.checkNoReservedArgs(props.defaultArguments),
|
|
72
|
+
};
|
|
73
|
+
if ((!props.workerType && props.numberOfWorkers !== undefined) || (props.workerType && props.numberOfWorkers === undefined)) {
|
|
74
|
+
throw new Error('Both workerType and numberOfWorkers must be set');
|
|
75
|
+
}
|
|
76
|
+
const jobResource = new aws_glue_1.CfnJob(this, 'Resource', {
|
|
77
|
+
name: props.jobName,
|
|
78
|
+
description: props.description,
|
|
79
|
+
role: this.role.roleArn,
|
|
80
|
+
command: {
|
|
81
|
+
name: constants_1.JobType.ETL,
|
|
82
|
+
scriptLocation: this.codeS3ObjectUrl(props.script),
|
|
83
|
+
},
|
|
84
|
+
glueVersion: props.glueVersion ? props.glueVersion : constants_1.GlueVersion.V4_0,
|
|
85
|
+
workerType: props.workerType ? props.workerType : constants_1.WorkerType.G_1X,
|
|
86
|
+
numberOfWorkers: props.numberOfWorkers ? props.numberOfWorkers : 10,
|
|
87
|
+
maxRetries: props.jobRunQueuingEnabled ? 0 : props.maxRetries,
|
|
88
|
+
jobRunQueuingEnabled: props.jobRunQueuingEnabled ? props.jobRunQueuingEnabled : false,
|
|
89
|
+
executionProperty: props.maxConcurrentRuns ? { maxConcurrentRuns: props.maxConcurrentRuns } : undefined,
|
|
90
|
+
timeout: props.timeout?.toMinutes(),
|
|
91
|
+
connections: props.connections ? { connections: props.connections.map((connection) => connection.connectionName) } : undefined,
|
|
92
|
+
securityConfiguration: props.securityConfiguration?.securityConfigurationName,
|
|
93
|
+
tags: props.tags,
|
|
94
|
+
defaultArguments,
|
|
95
|
+
});
|
|
96
|
+
const resourceName = this.getResourceNameAttribute(jobResource.ref);
|
|
97
|
+
this.jobArn = this.buildJobArn(this, resourceName);
|
|
98
|
+
this.jobName = resourceName;
|
|
99
|
+
}
|
|
100
|
+
/**
|
|
101
|
+
* Set the executable arguments with best practices enabled by default
|
|
102
|
+
*
|
|
103
|
+
* @returns An array of arguments for Glue to use on execution
|
|
104
|
+
*/
|
|
105
|
+
executableArguments(props) {
|
|
106
|
+
const args = {};
|
|
107
|
+
args['--job-language'] = constants_1.JobLanguage.SCALA;
|
|
108
|
+
args['--class'] = props.className;
|
|
109
|
+
if (props.extraJars && props.extraJars?.length > 0) {
|
|
110
|
+
args['--extra-jars'] = props.extraJars.map(code => this.codeS3ObjectUrl(code)).join(',');
|
|
111
|
+
}
|
|
112
|
+
return args;
|
|
113
|
+
}
|
|
114
|
+
setupSparkUI(role, sparkUiProps) {
|
|
115
|
+
(0, spark_ui_utils_1.validateSparkUiPrefix)(sparkUiProps.prefix);
|
|
116
|
+
const bucket = sparkUiProps.bucket ?? new aws_s3_1.Bucket(this, 'SparkUIBucket', { enforceSSL: true, encryption: aws_s3_1.BucketEncryption.S3_MANAGED });
|
|
117
|
+
bucket.grantReadWrite(role, (0, spark_ui_utils_1.cleanSparkUiPrefixForGrant)(sparkUiProps.prefix));
|
|
118
|
+
const args = {
|
|
119
|
+
'--enable-spark-ui': 'true',
|
|
120
|
+
'--spark-event-logs-path': bucket.s3UrlForObject(sparkUiProps.prefix).replace(/\/?$/, '/'), // path will always end with a slash
|
|
121
|
+
};
|
|
122
|
+
return {
|
|
123
|
+
location: {
|
|
124
|
+
prefix: sparkUiProps.prefix,
|
|
125
|
+
bucket,
|
|
126
|
+
},
|
|
127
|
+
args,
|
|
128
|
+
};
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
exports.ScalaSparkEtlJob = ScalaSparkEtlJob;
|
|
132
|
+
_a = JSII_RTTI_SYMBOL_1;
|
|
133
|
+
ScalaSparkEtlJob[_a] = { fqn: "@aws-cdk/aws-glue-alpha.ScalaSparkEtlJob", version: "2.178.0-alpha.0" };
|
|
134
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2NhbGEtc3BhcmstZXRsLWpvYi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbInNjYWxhLXNwYXJrLWV0bC1qb2IudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBQUEsMkNBQTJDO0FBQzNDLCtDQUE4RDtBQUM5RCxtREFBOEM7QUFDOUMsK0JBQTJDO0FBRTNDLDRDQUE2RTtBQUM3RSxxREFBMkg7QUFFM0gsOEVBQThFO0FBMkM5RTs7Ozs7Ozs7Ozs7R0FXRztBQUNILE1BQWEsZ0JBQWlCLFNBQVEsU0FBRztJQWN2Qzs7T0FFRztJQUNILFlBQVksS0FBZ0IsRUFBRSxFQUFVLEVBQUUsS0FBNEI7UUFDcEUsS0FBSyxDQUFDLEtBQUssRUFBRSxFQUFFLEVBQUU7WUFDZixZQUFZLEVBQUUsS0FBSyxDQUFDLE9BQU87U0FDNUIsQ0FBQyxDQUFDOzs7Ozs7K0NBcEJNLGdCQUFnQjs7OztRQXFCekIsbUNBQW1DO1FBQ25DLElBQUEsd0NBQW9CLEVBQUMsSUFBSSxFQUFFLEtBQUssQ0FBQyxDQUFDO1FBRWxDLDRDQUE0QztRQUM1QyxJQUFJLENBQUMsSUFBSSxHQUFHLEtBQUssQ0FBQyxJQUFJLEVBQUU7WUFDdEIsU0FBUyxFQUFFLElBQUksR0FBRyxDQUFDLGdCQUFnQixDQUFDLG9CQUFvQixDQUFDO1lBQ3pELGVBQWUsRUFBRSxDQUFDLEdBQUcsQ0FBQyxhQUFhLENBQUMsd0JBQXdCLENBQUMsaUNBQWlDLENBQUMsQ0FBQztTQUNqRyxDQUFDO1FBQ0YsSUFBSSxDQUFDLGNBQWMsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDO1FBRWhDLCtDQUErQztRQUMvQyxNQUFNLFdBQVcsR0FBRyxLQUFLLENBQUMsT0FBTyxFQUFFLE1BQU0sQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDO1FBQ3BHLElBQUksQ0FBQyxzQkFBc0IsR0FBRyxXQUFXLEVBQUUsUUFBUSxDQUFDO1FBRXBELGlGQUFpRjtRQUNqRixNQUFNLHFCQUFxQixHQUFHLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLEtBQUssQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO1FBQzlGLE1BQU0sb0JBQW9CLEdBQUcsRUFBRSxrQkFBa0IsRUFBRSxFQUFFLEVBQUUsQ0FBQztRQUN4RCxNQUFNLHdCQUF3QixHQUFHLEVBQUUsZ0NBQWdDLEVBQUUsTUFBTSxFQUFFLENBQUM7UUFFOUUsOEJBQThCO1FBQzlCLE1BQU0sY0FBYyxHQUFHLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUV2RCwrQkFBK0I7UUFDL0IsSUFBSSxLQUFLLENBQUMsU0FBUyxLQUFLLFNBQVMsRUFBRSxDQUFDO1lBQ2xDLE1BQU0sSUFBSSxLQUFLLENBQUMsMENBQTBDLENBQUMsQ0FBQztRQUM5RCxDQUFDO1FBRUQseURBQXlEO1FBQ3pELE1BQU0sZ0JBQWdCLEdBQUc7WUFDdkIsR0FBRyxjQUFjO1lBQ2pCLEdBQUcscUJBQXFCO1lBQ3hCLEdBQUcsb0JBQW9CO1lBQ3ZCLEdBQUcsd0JBQXdCO1lBQzNCLEdBQUcsV0FBVyxFQUFFLElBQUk7WUFDcEIsR0FBRyxJQUFJLENBQUMsbUJBQW1CLENBQUMsS0FBSyxDQUFDLGdCQUFnQixDQUFDO1NBQ3BELENBQUM7UUFFRixJQUFJLENBQUMsQ0FBQyxLQUFLLENBQUMsVUFBVSxJQUFJLEtBQUssQ0FBQyxlQUFlLEtBQUssU0FBUyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsVUFBVSxJQUFJLEtBQUssQ0FBQyxlQUFlLEtBQUssU0FBUyxDQUFDLEVBQUUsQ0FBQztZQUM1SCxNQUFNLElBQUksS0FBSyxDQUFDLGlEQUFpRCxDQUFDLENBQUM7UUFDckUsQ0FBQztRQUVELE1BQU0sV0FBVyxHQUFHLElBQUksaUJBQU0sQ0FBQyxJQUFJLEVBQUUsVUFBVSxFQUFFO1lBQy9DLElBQUksRUFBRSxLQUFLLENBQUMsT0FBTztZQUNuQixXQUFXLEVBQUUsS0FBSyxDQUFDLFdBQVc7WUFDOUIsSUFBSSxFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTztZQUN2QixPQUFPLEVBQUU7Z0JBQ1AsSUFBSSxFQUFFLG1CQUFPLENBQUMsR0FBRztnQkFDakIsY0FBYyxFQUFFLElBQUksQ0FBQyxlQUFlLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQzthQUNuRDtZQUNELFdBQVcsRUFBRSxLQUFLLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyx1QkFBVyxDQUFDLElBQUk7WUFDckUsVUFBVSxFQUFFLEtBQUssQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLHNCQUFVLENBQUMsSUFBSTtZQUNqRSxlQUFlLEVBQUUsS0FBSyxDQUFDLGVBQWUsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLGVBQWUsQ0FBQyxDQUFDLENBQUMsRUFBRTtZQUNuRSxVQUFVLEVBQUUsS0FBSyxDQUFDLG9CQUFvQixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxVQUFVO1lBQzdELG9CQUFvQixFQUFFLEtBQUssQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLG9CQUFvQixDQUFDLENBQUMsQ0FBQyxLQUFLO1lBQ3JGLGlCQUFpQixFQUFFLEtBQUssQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDLENBQUMsRUFBRSxpQkFBaUIsRUFBRSxLQUFLLENBQUMsaUJBQWlCLEVBQUUsQ0FBQyxDQUFDLENBQUMsU0FBUztZQUN2RyxPQUFPLEVBQUUsS0FBSyxDQUFDLE9BQU8sRUFBRSxTQUFTLEVBQUU7WUFDbkMsV0FBVyxFQUFFLEtBQUssQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLEVBQUUsV0FBVyxFQUFFLEtBQUssQ0FBQyxXQUFXLENBQUMsR0FBRyxDQUFDLENBQUMsVUFBVSxFQUFFLEVBQUUsQ0FBQyxVQUFVLENBQUMsY0FBYyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsU0FBUztZQUM5SCxxQkFBcUIsRUFBRSxLQUFLLENBQUMscUJBQXFCLEVBQUUseUJBQXlCO1lBQzdFLElBQUksRUFBRSxLQUFLLENBQUMsSUFBSTtZQUNoQixnQkFBZ0I7U0FDakIsQ0FBQyxDQUFDO1FBRUgsTUFBTSxZQUFZLEdBQUcsSUFBSSxDQUFDLHdCQUF3QixDQUFDLFdBQVcsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUNwRSxJQUFJLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxFQUFFLFlBQVksQ0FBQyxDQUFDO1FBQ25ELElBQUksQ0FBQyxPQUFPLEdBQUcsWUFBWSxDQUFDO0tBQzdCO0lBRUQ7Ozs7T0FJRztJQUNLLG1CQUFtQixDQUFDLEtBQTRCO1FBQ3RELE1BQU0sSUFBSSxHQUE4QixFQUFFLENBQUM7UUFDM0MsSUFBSSxDQUFDLGdCQUFnQixDQUFDLEdBQUcsdUJBQVcsQ0FBQyxLQUFLLENBQUM7UUFDM0MsSUFBSSxDQUFDLFNBQVMsQ0FBQyxHQUFHLEtBQUssQ0FBQyxTQUFVLENBQUM7UUFFbkMsSUFBSSxLQUFLLENBQUMsU0FBUyxJQUFJLEtBQUssQ0FBQyxTQUFTLEVBQUUsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDO1lBQ25ELElBQUksQ0FBQyxjQUFjLENBQUMsR0FBRyxLQUFLLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDM0YsQ0FBQztRQUVELE9BQU8sSUFBSSxDQUFDO0tBQ2I7SUFFTyxZQUFZLENBQUMsSUFBZSxFQUFFLFlBQTBCO1FBQzlELElBQUEsc0NBQXFCLEVBQUMsWUFBWSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQzNDLE1BQU0sTUFBTSxHQUFHLFlBQVksQ0FBQyxNQUFNLElBQUksSUFBSSxlQUFNLENBQUMsSUFBSSxFQUFFLGVBQWUsRUFBRSxFQUFFLFVBQVUsRUFBRSxJQUFJLEVBQUUsVUFBVSxFQUFFLHlCQUFnQixDQUFDLFVBQVUsRUFBRSxDQUFDLENBQUM7UUFDdkksTUFBTSxDQUFDLGNBQWMsQ0FBQyxJQUFJLEVBQUUsSUFBQSwyQ0FBMEIsRUFBQyxZQUFZLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQztRQUM3RSxNQUFNLElBQUksR0FBRztZQUNYLG1CQUFtQixFQUFFLE1BQU07WUFDM0IseUJBQXlCLEVBQUUsTUFBTSxDQUFDLGNBQWMsQ0FBQyxZQUFZLENBQUMsTUFBTSxDQUFDLENBQUMsT0FBTyxDQUFDLE1BQU0sRUFBRSxHQUFHLENBQUMsRUFBRSxvQ0FBb0M7U0FDakksQ0FBQztRQUVGLE9BQU87WUFDTCxRQUFRLEVBQUU7Z0JBQ1IsTUFBTSxFQUFFLFlBQVksQ0FBQyxNQUFNO2dCQUMzQixNQUFNO2FBQ1A7WUFDRCxJQUFJO1NBQ0wsQ0FBQztLQUNIOztBQXpISCw0Q0EwSEMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgKiBhcyBpYW0gZnJvbSAnYXdzLWNkay1saWIvYXdzLWlhbSc7XG5pbXBvcnQgeyBCdWNrZXQsIEJ1Y2tldEVuY3J5cHRpb24gfSBmcm9tICdhd3MtY2RrLWxpYi9hd3MtczMnO1xuaW1wb3J0IHsgQ2ZuSm9iIH0gZnJvbSAnYXdzLWNkay1saWIvYXdzLWdsdWUnO1xuaW1wb3J0IHsgSm9iLCBKb2JQcm9wZXJ0aWVzIH0gZnJvbSAnLi9qb2InO1xuaW1wb3J0IHsgQ29uc3RydWN0IH0gZnJvbSAnY29uc3RydWN0cyc7XG5pbXBvcnQgeyBKb2JUeXBlLCBHbHVlVmVyc2lvbiwgSm9iTGFuZ3VhZ2UsIFdvcmtlclR5cGUgfSBmcm9tICcuLi9jb25zdGFudHMnO1xuaW1wb3J0IHsgU3BhcmtVSVByb3BzLCBTcGFya1VJTG9nZ2luZ0xvY2F0aW9uLCB2YWxpZGF0ZVNwYXJrVWlQcmVmaXgsIGNsZWFuU3BhcmtVaVByZWZpeEZvckdyYW50IH0gZnJvbSAnLi9zcGFyay11aS11dGlscyc7XG5pbXBvcnQgeyBDb2RlIH0gZnJvbSAnLi4vY29kZSc7XG5pbXBvcnQgeyBhZGRDb25zdHJ1Y3RNZXRhZGF0YSB9IGZyb20gJ2F3cy1jZGstbGliL2NvcmUvbGliL21ldGFkYXRhLXJlc291cmNlJztcblxuLyoqXG4gKiBQcm9wZXJ0aWVzIGZvciBjcmVhdGluZyBhIFNjYWxhIFNwYXJrIEVUTCBqb2JcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTY2FsYVNwYXJrRXRsSm9iUHJvcHMgZXh0ZW5kcyBKb2JQcm9wZXJ0aWVzIHtcbiAgLyoqXG4gICAqIEVuYWJsZXMgdGhlIFNwYXJrIFVJIGRlYnVnZ2luZyBhbmQgbW9uaXRvcmluZyB3aXRoIHRoZSBzcGVjaWZpZWQgcHJvcHMuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gU3BhcmsgVUkgZGVidWdnaW5nIGFuZCBtb25pdG9yaW5nIGlzIGRpc2FibGVkLlxuICAgKlxuICAgKiBAc2VlIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9nbHVlL2xhdGVzdC9kZy9tb25pdG9yLXNwYXJrLXVpLWpvYnMuaHRtbFxuICAgKiBAc2VlIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9nbHVlL2xhdGVzdC9kZy9hd3MtZ2x1ZS1wcm9ncmFtbWluZy1ldGwtZ2x1ZS1hcmd1bWVudHMuaHRtbFxuICAgKi9cbiAgcmVhZG9ubHkgc3BhcmtVST86IFNwYXJrVUlQcm9wcztcblxuICAvKipcbiAgICogQ2xhc3MgbmFtZSAocmVxdWlyZWQgZm9yIFNjYWxhIHNjcmlwdHMpXG4gICAqIFBhY2thZ2UgYW5kIGNsYXNzIG5hbWUgZm9yIHRoZSBlbnRyeSBwb2ludCBvZiBHbHVlIGpvYiBleGVjdXRpb24gZm9yXG4gICAqIEphdmEgc2NyaXB0c1xuICAgKiovXG4gIHJlYWRvbmx5IGNsYXNzTmFtZTogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBFeHRyYSBKYXJzIFMzIFVSTCAob3B0aW9uYWwpXG4gICAqIFMzIFVSTCB3aGVyZSBhZGRpdGlvbmFsIGphciBkZXBlbmRlbmNpZXMgYXJlIGxvY2F0ZWRcbiAgICogQGRlZmF1bHQgLSBubyBleHRyYSBqYXIgZmlsZXNcbiAgICovXG4gIHJlYWRvbmx5IGV4dHJhSmFycz86IENvZGVbXTtcblxuICAvKipcbiAgICogU3BlY2lmaWVzIHdoZXRoZXIgam9iIHJ1biBxdWV1aW5nIGlzIGVuYWJsZWQgZm9yIHRoZSBqb2IgcnVucyBmb3IgdGhpcyBqb2IuXG4gICAqIEEgdmFsdWUgb2YgdHJ1ZSBtZWFucyBqb2IgcnVuIHF1ZXVpbmcgaXMgZW5hYmxlZCBmb3IgdGhlIGpvYiBydW5zLlxuICAgKiBJZiBmYWxzZSBvciBub3QgcG9wdWxhdGVkLCB0aGUgam9iIHJ1bnMgd2lsbCBub3QgYmUgY29uc2lkZXJlZCBmb3IgcXVldWVpbmcuXG4gICAqIElmIHRoaXMgZmllbGQgZG9lcyBub3QgbWF0Y2ggdGhlIHZhbHVlIHNldCBpbiB0aGUgam9iIHJ1biwgdGhlbiB0aGUgdmFsdWUgZnJvbVxuICAgKiB0aGUgam9iIHJ1biBmaWVsZCB3aWxsIGJlIHVzZWQuIFRoaXMgcHJvcGVydHkgbXVzdCBiZSBzZXQgdG8gZmFsc2UgZm9yIGZsZXggam9icy5cbiAgICogSWYgdGhpcyBwcm9wZXJ0eSBpcyBlbmFibGVkLCBtYXhSZXRyaWVzIG11c3QgYmUgc2V0IHRvIHplcm8uXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gbm8gam9iIHJ1biBxdWV1aW5nXG4gICAqL1xuICByZWFkb25seSBqb2JSdW5RdWV1aW5nRW5hYmxlZD86IGJvb2xlYW47XG59XG5cbi8qKlxuICogU3BhcmsgRVRMIEpvYnMgY2xhc3NcbiAqXG4gKiBFVEwgam9icyBzdXBwb3J0IHB5U3BhcmsgYW5kIFNjYWxhIGxhbmd1YWdlcywgZm9yIHdoaWNoIHRoZXJlIGFyZSBzZXBhcmF0ZVxuICogYnV0IHNpbWlsYXIgY29uc3RydWN0b3JzLiBFVEwgam9icyBkZWZhdWx0IHRvIHRoZSBHMiB3b3JrZXIgdHlwZSwgYnV0IHlvdVxuICogY2FuIG92ZXJyaWRlIHRoaXMgZGVmYXVsdCB3aXRoIG90aGVyIHN1cHBvcnRlZCB3b3JrZXIgdHlwZSB2YWx1ZXNcbiAqIChHMSwgRzIsIEc0IGFuZCBHOCkuIEVUTCBqb2JzIGRlZmF1bHRzIHRvIEdsdWUgdmVyc2lvbiA0LjAsIHdoaWNoIHlvdSBjYW5cbiAqIG92ZXJyaWRlIHRvIDMuMC4gVGhlIGZvbGxvd2luZyBFVEwgZmVhdHVyZXMgYXJlIGVuYWJsZWQgYnkgZGVmYXVsdDpcbiAqIOKAlGVuYWJsZS1tZXRyaWNzLCDigJRlbmFibGUtc3BhcmstdWksIOKAlGVuYWJsZS1jb250aW51b3VzLWNsb3Vkd2F0Y2gtbG9nLlxuICogWW91IGNhbiBmaW5kIG1vcmUgZGV0YWlscyBhYm91dCB2ZXJzaW9uLCB3b3JrZXIgdHlwZSBhbmQgb3RoZXIgZmVhdHVyZXNcbiAqIGluIEdsdWUncyBwdWJsaWMgZG9jdW1lbnRhdGlvbi5cbiAqL1xuZXhwb3J0IGNsYXNzIFNjYWxhU3BhcmtFdGxKb2IgZXh0ZW5kcyBKb2Ige1xuICBwdWJsaWMgcmVhZG9ubHkgam9iQXJuOiBzdHJpbmc7XG4gIHB1YmxpYyByZWFkb25seSBqb2JOYW1lOiBzdHJpbmc7XG4gIHB1YmxpYyByZWFkb25seSByb2xlOiBpYW0uSVJvbGU7XG4gIHB1YmxpYyByZWFkb25seSBncmFudFByaW5jaXBhbDogaWFtLklQcmluY2lwYWw7XG5cbiAgLyoqXG4gICAqIFRoZSBTcGFyayBVSSBsb2dzIGxvY2F0aW9uIGlmIFNwYXJrIFVJIG1vbml0b3JpbmcgYW5kIGRlYnVnZ2luZyBpcyBlbmFibGVkLlxuICAgKlxuICAgKiBAc2VlIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9nbHVlL2xhdGVzdC9kZy9tb25pdG9yLXNwYXJrLXVpLWpvYnMuaHRtbFxuICAgKiBAc2VlIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9nbHVlL2xhdGVzdC9kZy9hd3MtZ2x1ZS1wcm9ncmFtbWluZy1ldGwtZ2x1ZS1hcmd1bWVudHMuaHRtbFxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IHNwYXJrVUlMb2dnaW5nTG9jYXRpb24/OiBTcGFya1VJTG9nZ2luZ0xvY2F0aW9uO1xuXG4gIC8qKlxuICAgKiBTY2FsYVNwYXJrRXRsSm9iIGNvbnN0cnVjdG9yXG4gICAqL1xuICBjb25zdHJ1Y3RvcihzY29wZTogQ29uc3RydWN0LCBpZDogc3RyaW5nLCBwcm9wczogU2NhbGFTcGFya0V0bEpvYlByb3BzKSB7XG4gICAgc3VwZXIoc2NvcGUsIGlkLCB7XG4gICAgICBwaHlzaWNhbE5hbWU6IHByb3BzLmpvYk5hbWUsXG4gICAgfSk7XG4gICAgLy8gRW5oYW5jZWQgQ0RLIEFuYWx5dGljcyBUZWxlbWV0cnlcbiAgICBhZGRDb25zdHJ1Y3RNZXRhZGF0YSh0aGlzLCBwcm9wcyk7XG5cbiAgICAvLyBTZXQgdXAgcm9sZSBhbmQgcGVybWlzc2lvbnMgZm9yIHByaW5jaXBhbFxuICAgIHRoaXMucm9sZSA9IHByb3BzLnJvbGUsIHtcbiAgICAgIGFzc3VtZWRCeTogbmV3IGlhbS5TZXJ2aWNlUHJpbmNpcGFsKCdnbHVlLmFtYXpvbmF3cy5jb20nKSxcbiAgICAgIG1hbmFnZWRQb2xpY2llczogW2lhbS5NYW5hZ2VkUG9saWN5LmZyb21Bd3NNYW5hZ2VkUG9saWN5TmFtZSgnc2VydmljZS1yb2xlL0FXU0dsdWVTZXJ2aWNlUm9sZScpXSxcbiAgICB9O1xuICAgIHRoaXMuZ3JhbnRQcmluY2lwYWwgPSB0aGlzLnJvbGU7XG5cbiAgICAvLyBFbmFibGUgU3BhcmtVSSBieSBkZWZhdWx0IGFzIGEgYmVzdCBwcmFjdGljZVxuICAgIGNvbnN0IHNwYXJrVUlBcmdzID0gcHJvcHMuc3BhcmtVST8uYnVja2V0ID8gdGhpcy5zZXR1cFNwYXJrVUkodGhpcy5yb2xlLCBwcm9wcy5zcGFya1VJKSA6IHVuZGVmaW5lZDtcbiAgICB0aGlzLnNwYXJrVUlMb2dnaW5nTG9jYXRpb24gPSBzcGFya1VJQXJncz8ubG9jYXRpb247XG5cbiAgICAvLyBFbmFibGUgQ2xvdWRXYXRjaCBtZXRyaWNzIGFuZCBjb250aW51b3VzIGxvZ2dpbmcgYnkgZGVmYXVsdCBhcyBhIGJlc3QgcHJhY3RpY2VcbiAgICBjb25zdCBjb250aW51b3VzTG9nZ2luZ0FyZ3MgPSB0aGlzLnNldHVwQ29udGludW91c0xvZ2dpbmcodGhpcy5yb2xlLCBwcm9wcy5jb250aW51b3VzTG9nZ2luZyk7XG4gICAgY29uc3QgcHJvZmlsaW5nTWV0cmljc0FyZ3MgPSB7ICctLWVuYWJsZS1tZXRyaWNzJzogJycgfTtcbiAgICBjb25zdCBvYnNlcnZhYmlsaXR5TWV0cmljc0FyZ3MgPSB7ICctLWVuYWJsZS1vYnNlcnZhYmlsaXR5LW1ldHJpY3MnOiAndHJ1ZScgfTtcblxuICAgIC8vIEdhdGhlciBleGVjdXRhYmxlIGFyZ3VtZW50c1xuICAgIGNvbnN0IGV4ZWN1YXRibGVBcmdzID0gdGhpcy5leGVjdXRhYmxlQXJndW1lbnRzKHByb3BzKTtcblxuICAgIC8vIE1hbmRhdG9yeSBjbGFzc05hbWUgYXJndW1lbnRcbiAgICBpZiAocHJvcHMuY2xhc3NOYW1lID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignY2xhc3NOYW1lIG11c3QgYmUgc2V0IGZvciBTY2FsYSBFVEwgSm9icycpO1xuICAgIH1cblxuICAgIC8vIENvbmJpbmUgY29tbWFuZCBsaW5lIGFyZ3VtZW50cyBpbnRvIGEgc2luZ2xlIGxpbmUgaXRlbVxuICAgIGNvbnN0IGRlZmF1bHRBcmd1bWVudHMgPSB7XG4gICAgICAuLi5leGVjdWF0YmxlQXJncyxcbiAgICAgIC4uLmNvbnRpbnVvdXNMb2dnaW5nQXJncyxcbiAgICAgIC4uLnByb2ZpbGluZ01ldHJpY3NBcmdzLFxuICAgICAgLi4ub2JzZXJ2YWJpbGl0eU1ldHJpY3NBcmdzLFxuICAgICAgLi4uc3BhcmtVSUFyZ3M/LmFyZ3MsXG4gICAgICAuLi50aGlzLmNoZWNrTm9SZXNlcnZlZEFyZ3MocHJvcHMuZGVmYXVsdEFyZ3VtZW50cyksXG4gICAgfTtcblxuICAgIGlmICgoIXByb3BzLndvcmtlclR5cGUgJiYgcHJvcHMubnVtYmVyT2ZXb3JrZXJzICE9PSB1bmRlZmluZWQpIHx8IChwcm9wcy53b3JrZXJUeXBlICYmIHByb3BzLm51bWJlck9mV29ya2VycyA9PT0gdW5kZWZpbmVkKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdCb3RoIHdvcmtlclR5cGUgYW5kIG51bWJlck9mV29ya2VycyBtdXN0IGJlIHNldCcpO1xuICAgIH1cblxuICAgIGNvbnN0IGpvYlJlc291cmNlID0gbmV3IENmbkpvYih0aGlzLCAnUmVzb3VyY2UnLCB7XG4gICAgICBuYW1lOiBwcm9wcy5qb2JOYW1lLFxuICAgICAgZGVzY3JpcHRpb246IHByb3BzLmRlc2NyaXB0aW9uLFxuICAgICAgcm9sZTogdGhpcy5yb2xlLnJvbGVBcm4sXG4gICAgICBjb21tYW5kOiB7XG4gICAgICAgIG5hbWU6IEpvYlR5cGUuRVRMLFxuICAgICAgICBzY3JpcHRMb2NhdGlvbjogdGhpcy5jb2RlUzNPYmplY3RVcmwocHJvcHMuc2NyaXB0KSxcbiAgICAgIH0sXG4gICAgICBnbHVlVmVyc2lvbjogcHJvcHMuZ2x1ZVZlcnNpb24gPyBwcm9wcy5nbHVlVmVyc2lvbiA6IEdsdWVWZXJzaW9uLlY0XzAsXG4gICAgICB3b3JrZXJUeXBlOiBwcm9wcy53b3JrZXJUeXBlID8gcHJvcHMud29ya2VyVHlwZSA6IFdvcmtlclR5cGUuR18xWCxcbiAgICAgIG51bWJlck9mV29ya2VyczogcHJvcHMubnVtYmVyT2ZXb3JrZXJzID8gcHJvcHMubnVtYmVyT2ZXb3JrZXJzIDogMTAsXG4gICAgICBtYXhSZXRyaWVzOiBwcm9wcy5qb2JSdW5RdWV1aW5nRW5hYmxlZCA/IDAgOiBwcm9wcy5tYXhSZXRyaWVzLFxuICAgICAgam9iUnVuUXVldWluZ0VuYWJsZWQ6IHByb3BzLmpvYlJ1blF1ZXVpbmdFbmFibGVkID8gcHJvcHMuam9iUnVuUXVldWluZ0VuYWJsZWQgOiBmYWxzZSxcbiAgICAgIGV4ZWN1dGlvblByb3BlcnR5OiBwcm9wcy5tYXhDb25jdXJyZW50UnVucyA/IHsgbWF4Q29uY3VycmVudFJ1bnM6IHByb3BzLm1heENvbmN1cnJlbnRSdW5zIH0gOiB1bmRlZmluZWQsXG4gICAgICB0aW1lb3V0OiBwcm9wcy50aW1lb3V0Py50b01pbnV0ZXMoKSxcbiAgICAgIGNvbm5lY3Rpb25zOiBwcm9wcy5jb25uZWN0aW9ucyA/IHsgY29ubmVjdGlvbnM6IHByb3BzLmNvbm5lY3Rpb25zLm1hcCgoY29ubmVjdGlvbikgPT4gY29ubmVjdGlvbi5jb25uZWN0aW9uTmFtZSkgfSA6IHVuZGVmaW5lZCxcbiAgICAgIHNlY3VyaXR5Q29uZmlndXJhdGlvbjogcHJvcHMuc2VjdXJpdHlDb25maWd1cmF0aW9uPy5zZWN1cml0eUNvbmZpZ3VyYXRpb25OYW1lLFxuICAgICAgdGFnczogcHJvcHMudGFncyxcbiAgICAgIGRlZmF1bHRBcmd1bWVudHMsXG4gICAgfSk7XG5cbiAgICBjb25zdCByZXNvdXJjZU5hbWUgPSB0aGlzLmdldFJlc291cmNlTmFtZUF0dHJpYnV0ZShqb2JSZXNvdXJjZS5yZWYpO1xuICAgIHRoaXMuam9iQXJuID0gdGhpcy5idWlsZEpvYkFybih0aGlzLCByZXNvdXJjZU5hbWUpO1xuICAgIHRoaXMuam9iTmFtZSA9IHJlc291cmNlTmFtZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXQgdGhlIGV4ZWN1dGFibGUgYXJndW1lbnRzIHdpdGggYmVzdCBwcmFjdGljZXMgZW5hYmxlZCBieSBkZWZhdWx0XG4gICAqXG4gICAqIEByZXR1cm5zIEFuIGFycmF5IG9mIGFyZ3VtZW50cyBmb3IgR2x1ZSB0byB1c2Ugb24gZXhlY3V0aW9uXG4gICAqL1xuICBwcml2YXRlIGV4ZWN1dGFibGVBcmd1bWVudHMocHJvcHM6IFNjYWxhU3BhcmtFdGxKb2JQcm9wcykge1xuICAgIGNvbnN0IGFyZ3M6IHsgW2tleTogc3RyaW5nXTogc3RyaW5nIH0gPSB7fTtcbiAgICBhcmdzWyctLWpvYi1sYW5ndWFnZSddID0gSm9iTGFuZ3VhZ2UuU0NBTEE7XG4gICAgYXJnc1snLS1jbGFzcyddID0gcHJvcHMuY2xhc3NOYW1lITtcblxuICAgIGlmIChwcm9wcy5leHRyYUphcnMgJiYgcHJvcHMuZXh0cmFKYXJzPy5sZW5ndGggPiAwKSB7XG4gICAgICBhcmdzWyctLWV4dHJhLWphcnMnXSA9IHByb3BzLmV4dHJhSmFycy5tYXAoY29kZSA9PiB0aGlzLmNvZGVTM09iamVjdFVybChjb2RlKSkuam9pbignLCcpO1xuICAgIH1cblxuICAgIHJldHVybiBhcmdzO1xuICB9XG5cbiAgcHJpdmF0ZSBzZXR1cFNwYXJrVUkocm9sZTogaWFtLklSb2xlLCBzcGFya1VpUHJvcHM6IFNwYXJrVUlQcm9wcykge1xuICAgIHZhbGlkYXRlU3BhcmtVaVByZWZpeChzcGFya1VpUHJvcHMucHJlZml4KTtcbiAgICBjb25zdCBidWNrZXQgPSBzcGFya1VpUHJvcHMuYnVja2V0ID8/IG5ldyBCdWNrZXQodGhpcywgJ1NwYXJrVUlCdWNrZXQnLCB7IGVuZm9yY2VTU0w6IHRydWUsIGVuY3J5cHRpb246IEJ1Y2tldEVuY3J5cHRpb24uUzNfTUFOQUdFRCB9KTtcbiAgICBidWNrZXQuZ3JhbnRSZWFkV3JpdGUocm9sZSwgY2xlYW5TcGFya1VpUHJlZml4Rm9yR3JhbnQoc3BhcmtVaVByb3BzLnByZWZpeCkpO1xuICAgIGNvbnN0IGFyZ3MgPSB7XG4gICAgICAnLS1lbmFibGUtc3BhcmstdWknOiAndHJ1ZScsXG4gICAgICAnLS1zcGFyay1ldmVudC1sb2dzLXBhdGgnOiBidWNrZXQuczNVcmxGb3JPYmplY3Qoc3BhcmtVaVByb3BzLnByZWZpeCkucmVwbGFjZSgvXFwvPyQvLCAnLycpLCAvLyBwYXRoIHdpbGwgYWx3YXlzIGVuZCB3aXRoIGEgc2xhc2hcbiAgICB9O1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIGxvY2F0aW9uOiB7XG4gICAgICAgIHByZWZpeDogc3BhcmtVaVByb3BzLnByZWZpeCxcbiAgICAgICAgYnVja2V0LFxuICAgICAgfSxcbiAgICAgIGFyZ3MsXG4gICAgfTtcbiAgfVxufVxuIl19
|
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
import * as iam from 'aws-cdk-lib/aws-iam';
|
|
2
|
+
import { Job, JobProperties } from './job';
|
|
3
|
+
import { Construct } from 'constructs';
|
|
4
|
+
import { SparkUIProps, SparkUILoggingLocation } from './spark-ui-utils';
|
|
5
|
+
import * as cdk from 'aws-cdk-lib/core';
|
|
6
|
+
import { Code } from '../code';
|
|
7
|
+
/**
|
|
8
|
+
* Flex Jobs class
|
|
9
|
+
*
|
|
10
|
+
* Flex jobs supports Python and Scala language.
|
|
11
|
+
* The flexible execution class is appropriate for non-urgent jobs such as
|
|
12
|
+
* pre-production jobs, testing, and one-time data loads.
|
|
13
|
+
* Flexible job runs are supported for jobs using AWS Glue version 3.0 or later and G.1X or
|
|
14
|
+
* G.2X worker types but will default to the latest version of Glue (currently Glue 3.0.)
|
|
15
|
+
*
|
|
16
|
+
* Similar to ETL, we’ll enable these features: —enable-metrics, —enable-spark-ui,
|
|
17
|
+
* —enable-continuous-cloudwatch-log
|
|
18
|
+
*
|
|
19
|
+
*/
|
|
20
|
+
export interface ScalaSparkFlexEtlJobProps extends JobProperties {
|
|
21
|
+
/**
|
|
22
|
+
* Enables the Spark UI debugging and monitoring with the specified props.
|
|
23
|
+
*
|
|
24
|
+
* @default - Spark UI debugging and monitoring is disabled.
|
|
25
|
+
*
|
|
26
|
+
* @see https://docs.aws.amazon.com/glue/latest/dg/monitor-spark-ui-jobs.html
|
|
27
|
+
* @see https://docs.aws.amazon.com/glue/latest/dg/aws-glue-programming-etl-glue-arguments.html
|
|
28
|
+
*/
|
|
29
|
+
readonly sparkUI?: SparkUIProps;
|
|
30
|
+
/**
|
|
31
|
+
* Specifies configuration properties of a notification (optional).
|
|
32
|
+
* After a job run starts, the number of minutes to wait before sending a job run delay notification.
|
|
33
|
+
* @default - undefined
|
|
34
|
+
*/
|
|
35
|
+
readonly notifyDelayAfter?: cdk.Duration;
|
|
36
|
+
/**
|
|
37
|
+
* The fully qualified Scala class name that serves as the entry point for the job.
|
|
38
|
+
*
|
|
39
|
+
* @see `--class` in https://docs.aws.amazon.com/glue/latest/dg/aws-glue-programming-etl-glue-arguments.html
|
|
40
|
+
*/
|
|
41
|
+
readonly className: string;
|
|
42
|
+
/**
|
|
43
|
+
* Additional Java .jar files that AWS Glue adds to the Java classpath before executing your script.
|
|
44
|
+
* Only individual files are supported, directories are not supported.
|
|
45
|
+
*
|
|
46
|
+
* @default [] - no extra jars are added to the classpath
|
|
47
|
+
*
|
|
48
|
+
* @see `--extra-jars` in https://docs.aws.amazon.com/glue/latest/dg/aws-glue-programming-etl-glue-arguments.html
|
|
49
|
+
*/
|
|
50
|
+
readonly extraJars?: Code[];
|
|
51
|
+
/**
|
|
52
|
+
* Setting this value to true prioritizes the customer's extra JAR files in the classpath.
|
|
53
|
+
*
|
|
54
|
+
* @default false - priority is not given to user-provided jars
|
|
55
|
+
*
|
|
56
|
+
* @see `--user-jars-first` in https://docs.aws.amazon.com/glue/latest/dg/aws-glue-programming-etl-glue-arguments.html
|
|
57
|
+
*/
|
|
58
|
+
readonly extraJarsFirst?: boolean;
|
|
59
|
+
/**
|
|
60
|
+
* Additional files, such as configuration files that AWS Glue copies to the working directory of your script before executing it.
|
|
61
|
+
* Only individual files are supported, directories are not supported.
|
|
62
|
+
*
|
|
63
|
+
* @default [] - no extra files are copied to the working directory
|
|
64
|
+
*
|
|
65
|
+
* @see `--extra-files` in https://docs.aws.amazon.com/glue/latest/dg/aws-glue-programming-etl-glue-arguments.html
|
|
66
|
+
*/
|
|
67
|
+
readonly extraFiles?: Code[];
|
|
68
|
+
}
|
|
69
|
+
/**
|
|
70
|
+
* Spark ETL Jobs class
|
|
71
|
+
*
|
|
72
|
+
* ETL jobs support pySpark and Scala languages, for which there are separate
|
|
73
|
+
* but similar constructors. ETL jobs default to the G2 worker type, but you
|
|
74
|
+
* can override this default with other supported worker type values
|
|
75
|
+
* (G1, G2, G4 and G8). ETL jobs defaults to Glue version 4.0, which you can
|
|
76
|
+
* override to 3.0. The following ETL features are enabled by default:
|
|
77
|
+
* —enable-metrics, —enable-spark-ui, —enable-continuous-cloudwatch-log.
|
|
78
|
+
* You can find more details about version, worker type and other features
|
|
79
|
+
* in Glue's public documentation.
|
|
80
|
+
*/
|
|
81
|
+
export declare class ScalaSparkFlexEtlJob extends Job {
|
|
82
|
+
readonly jobArn: string;
|
|
83
|
+
readonly jobName: string;
|
|
84
|
+
readonly role: iam.IRole;
|
|
85
|
+
readonly grantPrincipal: iam.IPrincipal;
|
|
86
|
+
/**
|
|
87
|
+
* The Spark UI logs location if Spark UI monitoring and debugging is enabled.
|
|
88
|
+
*
|
|
89
|
+
* @see https://docs.aws.amazon.com/glue/latest/dg/monitor-spark-ui-jobs.html
|
|
90
|
+
* @see https://docs.aws.amazon.com/glue/latest/dg/aws-glue-programming-etl-glue-arguments.html
|
|
91
|
+
*/
|
|
92
|
+
readonly sparkUILoggingLocation?: SparkUILoggingLocation;
|
|
93
|
+
/**
|
|
94
|
+
* ScalaSparkFlexEtlJob constructor
|
|
95
|
+
*/
|
|
96
|
+
constructor(scope: Construct, id: string, props: ScalaSparkFlexEtlJobProps);
|
|
97
|
+
/**
|
|
98
|
+
* Set the executable arguments with best practices enabled by default
|
|
99
|
+
*
|
|
100
|
+
* @returns An array of arguments for Glue to use on execution
|
|
101
|
+
*/
|
|
102
|
+
private executableArguments;
|
|
103
|
+
/**
|
|
104
|
+
* Set the arguments for sparkUI with best practices enabled by default
|
|
105
|
+
*
|
|
106
|
+
* @returns An array of arguments for enabling sparkUI
|
|
107
|
+
*/
|
|
108
|
+
private setupSparkUI;
|
|
109
|
+
}
|