|
@@ -2,7 +2,7 @@ from asyncio import current_task
|
|
import json
|
|
import json
|
|
import time
|
|
import time
|
|
from turtle import update
|
|
from turtle import update
|
|
-from app import crud, models
|
|
|
|
|
|
+from app import crud, models, schemas
|
|
from app.common import minio
|
|
from app.common import minio
|
|
from app.core.datasource.datasource import DataSourceBase
|
|
from app.core.datasource.datasource import DataSourceBase
|
|
from app.crud.jm_homework_datasource_relation import get_jm_relations
|
|
from app.crud.jm_homework_datasource_relation import get_jm_relations
|
|
@@ -18,10 +18,10 @@ type_dict = {
|
|
"Dag": "sparks"
|
|
"Dag": "sparks"
|
|
}
|
|
}
|
|
|
|
|
|
-def jm_job_create_task(jm_homework: models.JmHomework, db: Session):
|
|
|
|
|
|
+def jm_job_create_task(jm_homework: models.JmHomework, relation_list, db: Session):
|
|
content = ''
|
|
content = ''
|
|
if jm_homework.type == "Dag":
|
|
if jm_homework.type == "Dag":
|
|
- content = red_dag_and_format(jm_homework, db)
|
|
|
|
|
|
+ content = red_dag_and_format(jm_homework, relation_list, db)
|
|
elif jm_homework.type == "Python":
|
|
elif jm_homework.type == "Python":
|
|
content = red_python_and_format(jm_homework)
|
|
content = red_python_and_format(jm_homework)
|
|
af_task = {
|
|
af_task = {
|
|
@@ -37,14 +37,13 @@ def jm_job_create_task(jm_homework: models.JmHomework, db: Session):
|
|
}
|
|
}
|
|
res = send_post('/af/af_task', af_task)
|
|
res = send_post('/af/af_task', af_task)
|
|
af_task = res['data']
|
|
af_task = res['data']
|
|
- crud.create_relation(db ,jm_homework.id, 'task', af_task['id'])
|
|
|
|
return af_task
|
|
return af_task
|
|
|
|
|
|
-def jm_job_update_task(jm_homework: models.JmHomework, db: Session):
|
|
|
|
|
|
+def jm_job_update_task(jm_homework: models.JmHomework, relation_list, db: Session):
|
|
relation = crud.get_af_id(db, jm_homework.id, 'task')
|
|
relation = crud.get_af_id(db, jm_homework.id, 'task')
|
|
content = ''
|
|
content = ''
|
|
if jm_homework.type == "Dag":
|
|
if jm_homework.type == "Dag":
|
|
- content = content = red_dag_and_format(jm_homework, db)
|
|
|
|
|
|
+ content = content = red_dag_and_format(jm_homework, relation_list, db)
|
|
elif jm_homework.type == "Python":
|
|
elif jm_homework.type == "Python":
|
|
content = red_python_and_format(jm_homework)
|
|
content = red_python_and_format(jm_homework)
|
|
af_task = {
|
|
af_task = {
|
|
@@ -62,21 +61,12 @@ def jm_job_update_task(jm_homework: models.JmHomework, db: Session):
|
|
af_task = res['data']
|
|
af_task = res['data']
|
|
return af_task
|
|
return af_task
|
|
|
|
|
|
-def jm_homework_submit(jm_homework: models.JmHomework, db: Session):
|
|
|
|
- task_relation = crud.get_af_id(db,jm_homework.id,'task')
|
|
|
|
- if task_relation is None:
|
|
|
|
- jm_job_create_task(jm_homework, db)
|
|
|
|
- else:
|
|
|
|
- jm_job_update_task(jm_homework, db)
|
|
|
|
-
|
|
|
|
-def jm_job_create_job(jm_job_info: models.JmJobInfo, db: Session):
|
|
|
|
- nodes = crud.get_one_job_nodes(db, jm_job_info.id)
|
|
|
|
- homework_ids = [node.homework_id for node in nodes]
|
|
|
|
|
|
+def jm_job_create_job(jm_job_info: models.JmJobInfo, nodes, edges, db: Session):
|
|
|
|
+ homework_ids = [node['homework_id'] for node in nodes]
|
|
relations = crud.get_af_ids(db,homework_ids, 'task')
|
|
relations = crud.get_af_ids(db,homework_ids, 'task')
|
|
se_id_to_af_id_dict = { relation.se_id:relation.af_id for relation in relations}
|
|
se_id_to_af_id_dict = { relation.se_id:relation.af_id for relation in relations}
|
|
tasks = [ send_get("/af/af_task/getOnce",id)['data'] for id in se_id_to_af_id_dict.values()]
|
|
tasks = [ send_get("/af/af_task/getOnce",id)['data'] for id in se_id_to_af_id_dict.values()]
|
|
- edges = crud.get_one_job_edges(db, jm_job_info.id)
|
|
|
|
- dependence = [[se_id_to_af_id_dict[edge['in_node_id']],se_id_to_af_id_dict[str(edge['out_node_id'])]] for edge in edges]
|
|
|
|
|
|
+ dependence = [[se_id_to_af_id_dict[edge['source']],se_id_to_af_id_dict[str(edge['target'])]] for edge in edges]
|
|
cron = jm_job_info.cron_expression if jm_job_info.cron_type == 2 else '@once'
|
|
cron = jm_job_info.cron_expression if jm_job_info.cron_type == 2 else '@once'
|
|
cron.replace('?','*')
|
|
cron.replace('?','*')
|
|
af_job = {
|
|
af_job = {
|
|
@@ -96,20 +86,16 @@ def jm_job_create_job(jm_job_info: models.JmJobInfo, db: Session):
|
|
}
|
|
}
|
|
res = send_post('/af/af_job', af_job)
|
|
res = send_post('/af/af_job', af_job)
|
|
af_job = res['data']
|
|
af_job = res['data']
|
|
- crud.create_relation(db, jm_job_info.id,'job', af_job['id'])
|
|
|
|
send_submit(af_job['id'])
|
|
send_submit(af_job['id'])
|
|
- # on_off_control(af_job['id'],jm_job_info.status)
|
|
|
|
|
|
+ return af_job
|
|
|
|
|
|
|
|
|
|
-def jm_job_update_job(jm_job_info: models.JmJobInfo, db: Session):
|
|
|
|
- nodes = crud.get_one_job_nodes(db, jm_job_info.id)
|
|
|
|
- homework_ids = [node.homework_id for node in nodes]
|
|
|
|
- node_id_to_h_id = {node.id:node.homework_id for node in nodes}
|
|
|
|
|
|
+def jm_job_update_job(jm_job_info: models.JmJobInfo, nodes, edges, db: Session):
|
|
|
|
+ homework_ids = [node['homework_id'] for node in nodes]
|
|
relations = crud.get_af_ids(db,homework_ids, 'task')
|
|
relations = crud.get_af_ids(db,homework_ids, 'task')
|
|
se_id_to_af_id_dict = { relation.se_id:relation.af_id for relation in relations}
|
|
se_id_to_af_id_dict = { relation.se_id:relation.af_id for relation in relations}
|
|
tasks = [ send_get("/af/af_task/getOnce",id)['data'] for id in se_id_to_af_id_dict.values()]
|
|
tasks = [ send_get("/af/af_task/getOnce",id)['data'] for id in se_id_to_af_id_dict.values()]
|
|
- edges = crud.get_one_job_edges(db, jm_job_info.id)
|
|
|
|
- dependence = [[se_id_to_af_id_dict[node_id_to_h_id[edge.in_node_id]],se_id_to_af_id_dict[node_id_to_h_id[edge.out_node_id]]] for edge in edges]
|
|
|
|
|
|
+ dependence = [[se_id_to_af_id_dict[edge['source']],se_id_to_af_id_dict[str(edge['target'])]] for edge in edges]
|
|
cron = jm_job_info.cron_expression if jm_job_info.cron_type == 2 else '@once'
|
|
cron = jm_job_info.cron_expression if jm_job_info.cron_type == 2 else '@once'
|
|
cron.replace('?','*')
|
|
cron.replace('?','*')
|
|
af_job = {
|
|
af_job = {
|
|
@@ -128,20 +114,9 @@ def jm_job_update_job(jm_job_info: models.JmJobInfo, db: Session):
|
|
res = send_put('/af/af_job', job_relation.af_id, af_job)
|
|
res = send_put('/af/af_job', job_relation.af_id, af_job)
|
|
af_job = res['data']
|
|
af_job = res['data']
|
|
send_submit(af_job['id'])
|
|
send_submit(af_job['id'])
|
|
- on_off_control(af_job['id'],jm_job_info.status)
|
|
|
|
-
|
|
|
|
-
|
|
|
|
-def jm_job_submit(jm_job_info: models.JmJobInfo, db: Session):
|
|
|
|
- job_relation = crud.get_af_id(db,jm_job_info.id,'job')
|
|
|
|
- if job_relation is None:
|
|
|
|
- jm_job_create_job(jm_job_info, db)
|
|
|
|
- else:
|
|
|
|
- jm_job_update_job(jm_job_info, db)
|
|
|
|
-
|
|
|
|
|
|
|
|
-def red_dag_and_format(jm_homework: models.JmHomework, db: Session):
|
|
|
|
- relations = get_jm_relations(db,jm_homework.id)
|
|
|
|
- node_relation_dict = { relation.node_uuid:relation for relation in relations}
|
|
|
|
|
|
+def red_dag_and_format(jm_homework: models.JmHomework, relation_list, db: Session):
|
|
|
|
+ node_relation_dict = { relation['node_uuid']:relation for relation in relation_list}
|
|
file = minio_client.get_file(jm_homework.dag_url)
|
|
file = minio_client.get_file(jm_homework.dag_url)
|
|
result = json.loads(file)
|
|
result = json.loads(file)
|
|
edges = result['edges']
|
|
edges = result['edges']
|
|
@@ -161,14 +136,14 @@ def red_dag_and_format(jm_homework: models.JmHomework, db: Session):
|
|
for filed in fileds:
|
|
for filed in fileds:
|
|
script += filed['dataField'] + ','
|
|
script += filed['dataField'] + ','
|
|
script = script.strip(',')
|
|
script = script.strip(',')
|
|
- ds_id = node_relation_dict[node['id']].datasource_id
|
|
|
|
|
|
+ ds_id = node_relation_dict[node['id']]['datasource_id']
|
|
database_name = ""
|
|
database_name = ""
|
|
if ds_id == -1:
|
|
if ds_id == -1:
|
|
database_name = DATABASE_NAME
|
|
database_name = DATABASE_NAME
|
|
else:
|
|
else:
|
|
data_source = crud.get_job_jdbc_datasource(db,ds_id)
|
|
data_source = crud.get_job_jdbc_datasource(db,ds_id)
|
|
database_name = data_source.database_name
|
|
database_name = data_source.database_name
|
|
- script += ' from ' + database_name + '.'+node_relation_dict[node['id']].table
|
|
|
|
|
|
+ script += ' from ' + database_name + '.'+node_relation_dict[node['id']]['table']
|
|
sub_node = {
|
|
sub_node = {
|
|
"id": node['id'],
|
|
"id": node['id'],
|
|
"name": node['name'],
|
|
"name": node['name'],
|
|
@@ -178,7 +153,7 @@ def red_dag_and_format(jm_homework: models.JmHomework, db: Session):
|
|
sub_nodes.append(sub_node)
|
|
sub_nodes.append(sub_node)
|
|
elif node['op'] == 'outputsource':
|
|
elif node['op'] == 'outputsource':
|
|
fileds = node['data']['output_source']
|
|
fileds = node['data']['output_source']
|
|
- ds_id = node_relation_dict[node['id']].datasource_id
|
|
|
|
|
|
+ ds_id = node_relation_dict[node['id']]['datasource_id']
|
|
database_name = ""
|
|
database_name = ""
|
|
if ds_id == -1:
|
|
if ds_id == -1:
|
|
database_name = DATABASE_NAME
|
|
database_name = DATABASE_NAME
|
|
@@ -186,7 +161,7 @@ def red_dag_and_format(jm_homework: models.JmHomework, db: Session):
|
|
data_source = crud.get_job_jdbc_datasource(db,ds_id)
|
|
data_source = crud.get_job_jdbc_datasource(db,ds_id)
|
|
database_name = data_source.database_name
|
|
database_name = data_source.database_name
|
|
script = '''def main_func (input0, spark,sc):
|
|
script = '''def main_func (input0, spark,sc):
|
|
- input0.write.mode("overwrite").saveAsTable("''' + database_name + '.'+node_relation_dict[node['id']].table+'''")'''
|
|
|
|
|
|
+ input0.write.mode("overwrite").saveAsTable("''' + database_name + '.'+node_relation_dict[node['id']]['table']+'''")'''
|
|
inputs = {}
|
|
inputs = {}
|
|
index = 0
|
|
index = 0
|
|
input_list = t_s[node['id']] if node['id'] in t_s.keys() else []
|
|
input_list = t_s[node['id']] if node['id'] in t_s.keys() else []
|
|
@@ -234,7 +209,6 @@ def red_python_and_format(jm_homework):
|
|
file = minio_client.get_file(jm_homework.script_file if jm_homework.script_file else "/python/test.py")
|
|
file = minio_client.get_file(jm_homework.script_file if jm_homework.script_file else "/python/test.py")
|
|
return file.decode("utf-8")
|
|
return file.decode("utf-8")
|
|
|
|
|
|
-
|
|
|
|
def on_off_control(af_job_id: int,status: int):
|
|
def on_off_control(af_job_id: int,status: int):
|
|
for i in range(0,11):
|
|
for i in range(0,11):
|
|
parsed_res = get_job_last_parsed_time(af_job_id)
|
|
parsed_res = get_job_last_parsed_time(af_job_id)
|
|
@@ -245,4 +219,18 @@ def on_off_control(af_job_id: int,status: int):
|
|
break
|
|
break
|
|
if i >= 10:
|
|
if i >= 10:
|
|
raise Exception(f"{af_job_id}==>执行失败")
|
|
raise Exception(f"{af_job_id}==>执行失败")
|
|
|
|
+ time.sleep(2)
|
|
|
|
+
|
|
|
|
+def execute_job(af_job_id: int):
|
|
|
|
+ current_time = int(time.time())
|
|
|
|
+ send_submit(af_job_id)
|
|
|
|
+ for i in range(0,21):
|
|
|
|
+ parsed_res = get_job_last_parsed_time(af_job_id)
|
|
|
|
+ last_parsed_time = parsed_res['data']['last_parsed_time']
|
|
|
|
+ if last_parsed_time and int(last_parsed_time) > current_time:
|
|
|
|
+ res = send_execute(af_job_id)
|
|
|
|
+ print(f"{af_job_id}<==任务执行成功==>{last_parsed_time}")
|
|
|
|
+ return res
|
|
|
|
+ if i >= 20:
|
|
|
|
+ raise Exception(f"{af_job_id}==>文件正在转化中")
|
|
time.sleep(2)
|
|
time.sleep(2)
|