背景
在大数据,尤其是数据仓库领域有许多配置文件,例如ETL作业的配置。大多数的平台都可以通过Web页面或者Restful 接口的方式进行ETL作业的配置。
痛点:当需要配置大量的ETL作业时,通过Web页面配置效率低,且容易出错
虽然ETL作业的参数很多,但是需要关心往往只有几个,其它使用默认即可。因此可以使用模板,只需要修改模板中我们关心的参数即可。
实现方式
- 制作模板文件:准备一个ETL作业的配置文件,把需要修改的参数改为
$变量名
, 如,$name
- 通过string.Template() 读取模板文件的内容
- 通过safe_substitute() 给模板文件中的变量赋值
- 调用Restful 接口创建ETL作业(不同平台的接口不一样,本文不做演示)
详细案例
1. 制作模板文件
template.json
变量为:$dir
$name
$table
{
"autoAcquireLock":true,
"basicConfig":{
"agency":"dgc_agency",
"customFields":{},
"executeUser":"",
"instanceTimeout":0,
"owner":"",
"priority":0
},
"directory":"$dir",
"location":{
"x":"807",
"y":"325"
},
"maskedParams":[],
"name":"$name",
"nodes":[
{
"failPolicy":"FAIL_CHILD",
"location":{
"x":"-160.0",
"y":"56.0"
},
"maxExecutionTime":30,
"name":"ods_merge_data",
"pollingInterval":20,
"preNodeName":[],
"properties":[
{
"name":"scriptName",
"value":"ods_merge_data.py"
},
{
"name":"connectionName",
"value":"bigdata_host"
},
{
"name":"arguments",
"value":"-n $table -d ${cyctime}"
},
{
"name":"statementOrScript",
"value":"SCRIPT"
}
],
"resouces":[],
"retryInterval":120,
"retryTimes":0,
"type":"Python"
}
],
"processType":"BATCH",
"resouces":[],
"schedule":{
"cron":{
"concurrent":80,
"dependJobs":{
"dependFailPolicy":"FAIL",
"dependPeriod":"SAME_PERIOD",
"jobs":[],
"sameWorkSpaceJobs":[]
},
"dependPrePeriod":false,
"expression":"0 1 7-7/2 * * ?",
"expressionTimeZone":"GMT+08:00",
"startTime":"2022-02-19T17:25:54+08"
},
"type":"CRON"
},
"singleNodeJobFlag":false,
"updateLineageInfo":false,
"useCdmCache":false,
"version":"1.0"
}
2. 通过string.Template() 读取模板文件的内容
file = open('template.json', encoding='utf-8')
content = file.read()
template_setting = string.Template(content)
3. 通过safe_substitute() 给模板文件中的变量赋值
name = 'example'
dir = '/opt/datawarehouse/ods'
table = 'ods_goods'
setting = template_setting.safe_substitute(name = name, dir = dir, table = table)
print(setting)
完整代码
# coding=utf-8
import string
if __name__ == '__main__':
file = open('template.json', encoding='utf-8')
content = file.read()
template_setting = string.Template(content)
name = 'example'
dir = '/opt/datawarehouse/ods'
table = 'ods_goods'
setting = template_setting.safe_substitute(name = name, dir = dir, table = table)
print(setting)
"""
调用Restful 接口创建ETL作业
不同平台的接口不一样,本文不做演示
"""