Commit e8148e7f authored by zhu-mingye's avatar zhu-mingye

[feature] add clusterConfig ,taskmanagerConfig && update configInfo of DevOps

parent 5e71add4
......@@ -14,6 +14,7 @@ public class JobInfoDetail {
private ClusterConfiguration clusterConfiguration;
private History history;
private JobHistory jobHistory;
private JobManagerConfiguration jobManagerConfiguration;
private Integer refreshCount;
public JobInfoDetail(Integer id) {
......@@ -53,6 +54,13 @@ public class JobInfoDetail {
this.clusterConfiguration = clusterConfiguration;
}
public void setJobManagerConfiguration(JobManagerConfiguration jobMangerConfiguration) {
this.jobManagerConfiguration = jobMangerConfiguration;
}
public JobManagerConfiguration getJobManagerConfiguration() {
return jobManagerConfiguration;
}
public History getHistory() {
return history;
}
......
package com.dlink.model;
import lombok.Data;
import java.util.Map;
/**
* @program: dlink
* @description: JobManager 配置信息
* @author: zhumingye
* @create: 2022-06-26 10:53
*/
@Data
public class JobManagerConfiguration {
private Map<String, String> metrics ;
private Map<String, String> jobManagerConfig;
private String jobManagerLog;
private String jobManagerStdout;
}
......@@ -2,6 +2,7 @@ package com.dlink.service.impl;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.dlink.alert.*;
import com.dlink.api.FlinkAPI;
import com.dlink.assertion.Assert;
import com.dlink.assertion.Asserts;
import com.dlink.assertion.Tips;
......@@ -40,10 +41,7 @@ import java.time.Duration;
import java.time.Instant;
import java.time.LocalDateTime;
import java.time.temporal.ChronoUnit;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Map;
import java.util.*;
/**
* 任务 服务实现类
......@@ -572,6 +570,40 @@ public class TaskServiceImpl extends SuperServiceImpl<TaskMapper, Task> implemen
jobInfoDetail.setCluster(cluster);
History history = historyService.getById(jobInstance.getHistoryId());
history.setConfig(JSONUtil.parseObject(history.getConfigJson()));
JobManagerConfiguration jobManagerConfiguration = new JobManagerConfiguration();
if(Asserts.isNotNullString(history.getJobManagerAddress())) {
FlinkAPI flinkAPI = FlinkAPI.build(history.getJobManagerAddress());
Map<String, String> jobManagerMetricsMap = new HashMap<String, String>(); //获取jobManager metrics
List<LinkedHashMap> jobManagerMetricsItemsList = JSONUtil.toList(JSONUtil.toJsonString(flinkAPI.getJobManagerMetrics()), LinkedHashMap.class);
jobManagerMetricsItemsList.forEach(mapItems -> {
String configKey = (String) mapItems.get("id");
String configValue = (String) mapItems.get("value");
if (Asserts.isNotNullString( configKey) && Asserts.isNotNullString(configValue)) {
jobManagerMetricsMap.put(configKey, configValue);
}
});
Map<String, String> jobManagerConfigMap = new HashMap<String, String>();//获取jobManager配置信息
List<LinkedHashMap> jobManagerConfigMapItemsList = JSONUtil.toList(JSONUtil.toJsonString(flinkAPI.getJobManagerConfig()), LinkedHashMap.class);
jobManagerConfigMapItemsList.forEach(mapItems -> {
String configKey = (String) mapItems.get("key");
String configValue = (String) mapItems.get("value");
if (Asserts.isNotNullString( configKey) && Asserts.isNotNullString(configValue)) {
jobManagerConfigMap.put(configKey, configValue);
}
});
String jobMangerLog = flinkAPI.getJobManagerLog(); //获取jobManager日志
String jobManagerStdOut = flinkAPI.getJobManagerStdOut(); //获取jobManager标准输出日志
jobManagerConfiguration.setMetrics(jobManagerMetricsMap);
jobManagerConfiguration.setJobManagerConfig(jobManagerConfigMap);
jobManagerConfiguration.setJobManagerLog(jobMangerLog);
jobManagerConfiguration.setJobManagerStdout(jobManagerStdOut);
jobInfoDetail.setJobManagerConfiguration(jobManagerConfiguration);
}
if (Asserts.isNotNull(history) && Asserts.isNotNull(history.getClusterConfigurationId())) {
jobInfoDetail.setClusterConfiguration(clusterConfigurationService.getClusterConfigById(history.getClusterConfigurationId()));
}
......
import {Descriptions, Empty, Tabs, Tag} from 'antd';
import {
CheckCircleOutlined,
CloseCircleOutlined,
ExclamationCircleOutlined,
RocketOutlined,
SyncOutlined
} from "@ant-design/icons";
import {parseByteStr, parseMilliSecondStr, parseSecondStr} from "@/components/Common/function";
const {TabPane} = Tabs;
const CheckPoints = (props: any) => {
const {job} = props;
const getOverview = () => {
return (
<>
{(job?.jobHistory?.checkpoints) ?
<Descriptions bordered size="small" column={1} >
<Descriptions.Item label="CheckPoint Counts">
<Tag color="blue" title={"Total"}>
<RocketOutlined/> Total: {job?.jobHistory?.checkpoints['counts']['total']}
</Tag>
<Tag color="red" title={"Failed"}>
<CloseCircleOutlined /> Failed: {job?.jobHistory?.checkpoints['counts']['failed']}
</Tag>
<Tag color="cyan" title={"Restored"}>
<ExclamationCircleOutlined /> Restored: {job?.jobHistory?.checkpoints['counts']['restored']}
</Tag>
<Tag color="green" title={"Completed"}>
<CheckCircleOutlined /> Completed: {job?.jobHistory?.checkpoints['counts']['completed']}
</Tag>
<Tag color="orange" title={"In Progress"}>
<SyncOutlined /> In Progress: {job?.jobHistory?.checkpoints['counts']['in_progress']}
</Tag>
</Descriptions.Item>
<Descriptions.Item label="Latest Completed CheckPoint">
<Tag color="green" title={"Latest Completed CheckPoint"}>
{job?.jobHistory?.checkpoints['latest']['completed'] === null ? 'None' :
job?.jobHistory?.checkpoints['latest']['completed']['external_path']
}
</Tag>
</Descriptions.Item>
<Descriptions.Item label="Latest Failed CheckPoint">
<Tag color="red" title={"Latest Failed CheckPoint"}>
{job?.jobHistory?.checkpoints['latest']['failed']=== null ? 'None' :
job?.jobHistory?.checkpoints['latest']['failed']['external_path']
}
</Tag>
</Descriptions.Item>
<Descriptions.Item label="Latest Restored">
<Tag color="cyan" title={"Latest Restored"}>
{job?.jobHistory?.checkpoints['latest']['restored'] === null ? 'None' :
job?.jobHistory?.checkpoints['latest']['restored']['external_path'] }
</Tag>
</Descriptions.Item>
<Descriptions.Item label="Latest Savepoint">
<Tag color="purple" title={"Latest Savepoint"}>
{job?.jobHistory?.checkpoints['latest']['savepoint'] === null ? 'None' :
job?.jobHistory?.checkpoints['latest']['savepoint']['external_path']
}
</Tag>
</Descriptions.Item>
</Descriptions>
: <Empty image={Empty.PRESENTED_IMAGE_SIMPLE}/>
}
</>
)
}
const getSummary = () => {
return (
<>
{(job?.jobHistory?.checkpoints) ?
<Descriptions bordered size="small" column={1} >
<Descriptions.Item label="End to End Duration">
<Tag color="blue" title={"Max"}>
<RocketOutlined/> Max: {parseSecondStr(job?.jobHistory?.checkpoints['summary']['end_to_end_duration']['max']) }
</Tag>
<Tag color="green" title={"Min"}>
<RocketOutlined/> Min: {parseSecondStr(job?.jobHistory?.checkpoints['summary']['end_to_end_duration']['min']) }
</Tag>
<Tag color="orange" title={"Avg"}>
<RocketOutlined/> Avg: {parseSecondStr(job?.jobHistory?.checkpoints['summary']['end_to_end_duration']['avg']) }
</Tag>
</Descriptions.Item>
<Descriptions.Item label="Checkpointed Data Size">
<Tag color="blue" title={"Max"}>
<RocketOutlined/> Max: {parseByteStr(job?.jobHistory?.checkpoints['summary']['state_size']['max']) }
</Tag>
<Tag color="green" title={"Min"}>
<RocketOutlined/> Min: {parseByteStr(job?.jobHistory?.checkpoints['summary']['state_size']['min']) }
</Tag>
<Tag color="orange" title={"Avg"}>
<RocketOutlined/> Avg: {parseByteStr(job?.jobHistory?.checkpoints['summary']['state_size']['avg']) }
</Tag>
</Descriptions.Item>
<Descriptions.Item label="Processed (persisted) in-flight data">
<Tag color="blue" title={"Max"}>
<RocketOutlined/> Max: {job?.jobHistory?.checkpoints['summary']['processed_data']['max']}
</Tag>
<Tag color="green" title={"Min"}>
<RocketOutlined/> Min: {job?.jobHistory?.checkpoints['summary']['processed_data']['min']}
</Tag>
<Tag color="orange" title={"Avg"}>
<RocketOutlined/> Avg: {job?.jobHistory?.checkpoints['summary']['processed_data']['avg']}
</Tag>
</Descriptions.Item>
<Descriptions.Item label="Persisted data">
<Tag color="blue" title={"Max"}>
<RocketOutlined/> Max: {job?.jobHistory?.checkpoints['summary']['persisted_data']['max']}
</Tag>
<Tag color="green" title={"Min"}>
<RocketOutlined/> Min: {job?.jobHistory?.checkpoints['summary']['persisted_data']['min']}
</Tag>
<Tag color="orange" title={"Avg"}>
<RocketOutlined/> Avg: {job?.jobHistory?.checkpoints['summary']['persisted_data']['avg']}
</Tag>
</Descriptions.Item>
<Descriptions.Item label="Alignment Buffered">
<Tag color="blue" title={"Max"}>
<RocketOutlined/> Max: {job?.jobHistory?.checkpoints['summary']['alignment_buffered']['max']}
</Tag>
<Tag color="green" title={"Min"}>
<RocketOutlined/> Min: {job?.jobHistory?.checkpoints['summary']['alignment_buffered']['min']}
</Tag>
<Tag color="orange" title={"Avg"}>
<RocketOutlined/> Avg: {job?.jobHistory?.checkpoints['summary']['alignment_buffered']['avg']}
</Tag>
</Descriptions.Item>
</Descriptions>
: <Empty image={Empty.PRESENTED_IMAGE_SIMPLE}/>
}
</>
)
}
const getHistory = () => {
return (
<>
<Empty image={Empty.PRESENTED_IMAGE_SIMPLE}/>
</>
)
}
const getConfigraution = () => {
return (
<>
{(job?.jobHistory?.checkpointsConfig) ?
<Descriptions bordered size="small" column={1} >
<Descriptions.Item label="Checkpointing Mode">
<Tag color="blue" title={"Checkpointing Mode"}>
{job?.jobHistory?.checkpointsConfig['mode'].toUpperCase() }
</Tag>
</Descriptions.Item>
<Descriptions.Item label="Checkpoint Storage">
<Tag color="blue" title={"Checkpoint Storage"}>
{job?.jobHistory?.checkpointsConfig['checkpoint_storage']? job?.jobHistory?.checkpointsConfig['checkpoint_storage'] : 'Disabled'}
</Tag>
</Descriptions.Item>
<Descriptions.Item label="State Backend">
<Tag color="blue" title={"State Backend"}>
{job?.jobHistory?.checkpointsConfig['state_backend'] ? job?.jobHistory?.checkpointsConfig['state_backend'] : 'Disabled' }
</Tag>
</Descriptions.Item>
<Descriptions.Item label="Interval">
<Tag color="blue" title={"Interval"}>
{job?.jobHistory?.checkpointsConfig['interval'] }
</Tag>
</Descriptions.Item>
<Descriptions.Item label="Timeout">
<Tag color="blue" title={"Timeout"}>
{parseMilliSecondStr(job?.jobHistory?.checkpointsConfig['timeout'])}
</Tag>
</Descriptions.Item>
<Descriptions.Item label="Minimum Pause Between Checkpoints">
<Tag color="blue" title={"Minimum Pause Between Checkpoints"}>
{parseSecondStr(job?.jobHistory?.checkpointsConfig['min_pause']) }
</Tag>
</Descriptions.Item>
<Descriptions.Item label="Maximum Concurrent Checkpoints">
<Tag color="blue" title={"Maximum Concurrent Checkpoints"}>
{job?.jobHistory?.checkpointsConfig['max_concurrent'] }
</Tag>
</Descriptions.Item>
<Descriptions.Item label="Unaligned Checkpoints ">
<Tag color="blue" title={"Unaligned Checkpoints"}>
{job?.jobHistory?.checkpointsConfig['unaligned_checkpoints'] ? 'Enabled' : 'Disabled'}
</Tag>
</Descriptions.Item>
<Descriptions.Item label="Persist Checkpoints Externally Enabled">
<Tag color="blue" title={"Persist Checkpoints Externally Enabled"}>
{job?.jobHistory?.checkpointsConfig['externalization']['enabled'] ? 'Enabled' : 'Disabled'}
</Tag>
</Descriptions.Item>
{job?.jobHistory?.checkpointsConfig['externalization']['enabled'] && (
<Descriptions.Item label="Delete On Cancellation">
<Tag color="blue" title={"Delete On Cancellation"}>
{job?.jobHistory?.checkpointsConfig['externalization']['delete_on_cancellation'] ? 'Enabled' : 'Disabled'}
</Tag>
</Descriptions.Item>
)}
<Descriptions.Item label="Tolerable Failed Checkpoints">
<Tag color="blue" title={"Tolerable Failed Checkpoints"}>
{job?.jobHistory?.checkpointsConfig['tolerable_failed_checkpoints'] }
</Tag>
</Descriptions.Item>
</Descriptions>
: <Empty image={Empty.PRESENTED_IMAGE_SIMPLE}/>
}
</>
)
}
return (<>
<Tabs defaultActiveKey="overview" size="small" tabPosition="top" style={{
border: "1px solid #f0f0f0",
}}>
<TabPane tab={<span>&nbsp; Overview &nbsp;</span>} key="overview">
{getOverview()}
</TabPane>
<TabPane tab={<span>&nbsp; History &nbsp;</span>} key="history">
{getHistory()}
</TabPane>
<TabPane tab={<span>&nbsp; Summary &nbsp;</span>} key="summary">
{getSummary()}
</TabPane>
<TabPane tab={<span>&nbsp; Configraution &nbsp;</span>} key="configraution">
{getConfigraution()}
</TabPane>
</Tabs>
</>)
};
export default CheckPoints;
import {Descriptions, Empty, Tabs} from 'antd';
import CodeShow from "@/components/Common/CodeShow";
const {TabPane} = Tabs;
const ClusterConfiguration = (props: any) => {
const {} = props;
const {job} = props;
const getMetricsConfigForm =() => {
let formList = [];
let tempData = job?.jobManagerConfiguration?.metrics;
for (let key in tempData) {
formList.push(
<Descriptions.Item label={key}>
{tempData[key]}
</Descriptions.Item>
)
}
return formList
}
const getJobManagerConfigForm = () => {
let formList = [];
let tempData = job?.jobManagerConfiguration?.jobManagerConfig;
for (let key in tempData) {
formList.push(
<Descriptions.Item label={key}>
{tempData[key]}
</Descriptions.Item>
)
}
return formList
}
return (<>
<Tabs defaultActiveKey="metrics" size="small" tabPosition="top" style={{
border: "1px solid #f0f0f0",
}}>
<TabPane tab={<span>&nbsp; Metrics &nbsp;</span>} key="metrics">
<Descriptions bordered size="small" column={1}>
{getMetricsConfigForm()}
</Descriptions>
</TabPane>
<TabPane tab={<span>&nbsp; Configuration &nbsp;</span>} key="configuration">
<Descriptions bordered size="small" column={1}>
{getJobManagerConfigForm()}
</Descriptions>
</TabPane>
<TabPane tab={<span>&nbsp; Logs &nbsp;</span>} key="logs">
{(job?.jobManagerConfiguration?.jobManagerLog === ""|| job?.jobManagerConfig?.jobManagerLog === null) ?
<Empty image={Empty.PRESENTED_IMAGE_SIMPLE}/>
: <CodeShow code={job?.jobManagerConfiguration?.jobManagerLog} language='java' height='500px'/>
}
</TabPane>
<TabPane tab={<span>&nbsp; Stdout &nbsp;</span>} key="stdout">
{(job?.jobManagerConfiguration?.jobManagerStdout === ""|| job?.jobManagerConfig?.jobManagerStdout === null) ?
<Empty image={Empty.PRESENTED_IMAGE_SIMPLE}/>
: <CodeShow code={job?.jobManagerConfiguration?.jobManagerStdout} language='java' height='500px'/>
}
</TabPane>
</Tabs>
</>)
};
export default ClusterConfiguration;
import {Descriptions, Typography, Tag} from 'antd';
import {
RocketOutlined
} from '@ant-design/icons';
import {Descriptions, Tag, Typography} from 'antd';
import {RocketOutlined} from '@ant-design/icons';
const {Text, Link} = Typography;
......@@ -10,7 +8,8 @@ const Config = (props: any) => {
const {job} = props;
return (<>
<Descriptions bordered size="small">
<>
<Descriptions bordered size="small" title={"Dinky Job Configuration"}>
<Descriptions.Item label="执行模式">{job?.history?.type ? (
<Tag color="blue" key={job?.history?.type}>
<RocketOutlined/> {job?.history?.type}
......@@ -18,33 +17,66 @@ const Config = (props: any) => {
) : undefined}
</Descriptions.Item>
<Descriptions.Item label="集群实例">
{job?.cluster?.alias?<Link>{job?.cluster?.alias}</Link>:'-'}
{job?.cluster?.alias ? <Link>{job?.cluster?.alias}</Link> : '-'}
</Descriptions.Item>
<Descriptions.Item label="集群配置">
{job?.clusterConfiguration?.alias?<Link>{job?.clusterConfiguration?.alias}</Link>:'-'}
{job?.clusterConfiguration?.alias ? <Link>{job?.clusterConfiguration?.alias}</Link> : '-'}
</Descriptions.Item>
<Descriptions.Item label="共享会话">
{job?.history?.session?<Link>{job?.history?.session}</Link>:'禁用'}
{job?.history?.session ? <Link>{job?.history?.session}</Link> : '禁用'}
</Descriptions.Item>
<Descriptions.Item label="片段机制">{job?.history?.config.useSqlFragment?'启用':'禁用'}</Descriptions.Item>
<Descriptions.Item label="语句集">{job?.history?.config.useStatementSet?'启用':'禁用'}</Descriptions.Item>
<Descriptions.Item label="任务类型">{job?.history?.config.isJarTask?'Jar':'FlinkSQL'}</Descriptions.Item>
<Descriptions.Item label="批模式">{job?.history?.config.useBatchModel?'启用':'禁用'}</Descriptions.Item>
<Descriptions.Item label="片段机制">{job?.history?.config.useSqlFragment ? '启用' : '禁用'}</Descriptions.Item>
<Descriptions.Item label="语句集">{job?.history?.config.useStatementSet ? '启用' : '禁用'}</Descriptions.Item>
<Descriptions.Item label="任务类型">{job?.history?.config.isJarTask ? 'Jar' : 'FlinkSQL'}</Descriptions.Item>
<Descriptions.Item label="批模式">{job?.history?.config.useBatchModel ? '启用' : '禁用'}</Descriptions.Item>
<Descriptions.Item label="CheckPoint">{job?.history?.config.checkpoint}</Descriptions.Item>
<Descriptions.Item label="SavePoint机制">
{job?.history?.config.savePointStrategy=='NONE'?'禁用':
job?.history?.config.savePointStrategy=='LATEST'?'最近一次':
job?.history?.config.savePointStrategy=='EARLIEST'?'最早一次':
job?.history?.config.savePointStrategy=='CUSTOM'?'指定一次':'禁用'}
{job?.history?.config.savePointStrategy == 'NONE' ? '禁用' :
job?.history?.config.savePointStrategy == 'LATEST' ? '最近一次' :
job?.history?.config.savePointStrategy == 'EARLIEST' ? '最早一次' :
job?.history?.config.savePointStrategy == 'CUSTOM' ? '指定一次' : '禁用'}
</Descriptions.Item>
<Descriptions.Item label="SavePoint" span={2}>{job?.history?.config.savePointPath}</Descriptions.Item>
<Descriptions.Item label="Flink Configuration" span={3}><Text code>{JSON.stringify(job?.history?.config.config)}</Text></Descriptions.Item>
{job?.jar?<>
{job?.jar ? <>
<Descriptions.Item label="Jar 路径">{job?.jar?.path}</Descriptions.Item>
<Descriptions.Item label="Jar 主类">{job?.jar?.mainClass}</Descriptions.Item>
<Descriptions.Item label="Jar 入参">{job?.jar?.paras}</Descriptions.Item>
</>:undefined}
</> : undefined}
</Descriptions>
</>
<br/><br/>
<>
<Descriptions bordered size="small" title={"Flink Job Configuration"}>
<Descriptions.Item label="Execution Mode">
<Tag color="blue" title={"Execution Mode"}>
{job?.jobHistory?.config['execution-config']['execution-mode']}
</Tag>
</Descriptions.Item>
<Descriptions.Item label="Restart Strategy">
<Tag color="blue" title={"Restart Strategy"}>
{job?.jobHistory?.config['execution-config']['restart-strategy']}
</Tag>
</Descriptions.Item>
<Descriptions.Item label="Job Parallelism">
<Tag color="blue" title={"Job Parallelism"}>
{job?.jobHistory?.config['execution-config']['job-parallelism']}
</Tag>
</Descriptions.Item>
<Descriptions.Item label="Object Reuse Mode">
<Tag color="blue" title={"Object Reuse Mode"}>
{job?.jobHistory?.config['execution-config']['object-reuse-mode'].toString()}
</Tag>
</Descriptions.Item>
<Descriptions.Item label="Flink User Configuration" span={3}>
<Text
code>{JSON.stringify(job?.jobHistory?.config['execution-config']['user-config'])}</Text>
</Descriptions.Item>
</Descriptions>
</>
</>)
};
......
import React, {useEffect, useState} from 'react';
import {useEffect, useState} from 'react';
import {history, useLocation} from 'umi';
import {ClusterOutlined, EllipsisOutlined, FireOutlined, RedoOutlined, RocketOutlined} from '@ant-design/icons';
import {Button, Dropdown, Empty, Menu, message, Modal, Space, Tag, Typography} from 'antd';
......@@ -17,6 +17,8 @@ import Exception from "@/pages/DevOps/JobInfo/Exception";
import FlinkSQL from "@/pages/DevOps/JobInfo/FlinkSQL";
import Alert from "@/pages/DevOps/JobInfo/Alert";
import DataMap from "@/pages/DevOps/JobInfo/DataMap";
import CheckPoints from "@/pages/DevOps/JobInfo/CheckPoints";
import ClusterConfiguration from "@/pages/DevOps/JobInfo/ClusterConfiguration";
const {Link} = Typography;
......@@ -257,8 +259,8 @@ const JobInfo = (props: any) => {
<ProCard>
{tabKey === 'base' ? <BaseInfo job={job}/> : undefined}
{tabKey === 'config' ? <Config job={job}/> : undefined}
{tabKey === 'cluster' ? <Empty image={Empty.PRESENTED_IMAGE_SIMPLE}/> : undefined}
{tabKey === 'snapshot' ? <Empty image={Empty.PRESENTED_IMAGE_SIMPLE}/> : undefined}
{tabKey === 'cluster' ? <ClusterConfiguration job={job}/> : undefined}
{tabKey === 'snapshot' ? <CheckPoints job={job}/> : undefined}
{tabKey === 'exception' ? <Exception job={job}/> : undefined}
{tabKey === 'log' ? <Empty image={Empty.PRESENTED_IMAGE_SIMPLE}/> : undefined}
{tabKey === 'optimize' ? <Empty image={Empty.PRESENTED_IMAGE_SIMPLE}/> : undefined}
......
......@@ -45,6 +45,8 @@ export type JobInfoDetail = {
cluster: ClusterTableListItem,
clusterConfiguration: ClusterConfigurationTableListItem,
history: HistoryItem,
jobHistory: JobHistoryItem,
jobManagerConfiguration : JobManagerConfiguration
jar: JarTableListItem
}
......@@ -58,3 +60,28 @@ export type VerticesTableListItem = {
endTime: string,
tasks: any,
}
export type JobHistoryItem = {
id: number,
job: string,
exceptions: string,
checkpoints: string,
checkpointsConfig: string,
config: string,
jar: string,
cluster: string,
clusterConfiguration: string,
updateTime: string,
}
export type JobManagerConfiguration = {
metrics: string ,
jobManagerConfig: string,
jobManagerLog : string,
jobManagerStdout: string,
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment