From cdec3e0780d085a858b5338a3934754fafe3b5c8 Mon Sep 17 00:00:00 2001 From: Zzm0809 <934230207@qq.com> Date: Wed, 27 Dec 2023 22:07:33 +0800 Subject: [PATCH] Refactor doc and Fix some devops bug (#2826) * Optimization The data source directory tree has two scroll bars * [Improvement-2809] Improvement result not scroll (#2819) * improve-result-scroll * Spotless Apply --------- Co-authored-by: Zzm0809 * refactor docs and fix some bug * Spotless Apply * added devops docs * modify alert_strategy.md * fix render bug * fix NPE * fix debug bug --------- Co-authored-by: Zzm0809 --- README.md | 5 + README_zh_CN.md | 8 +- .../dinky/service/impl/TaskServiceImpl.java | 13 +- .../LeftContainer/Project/function.tsx | 9 +- .../JobOverview/components/FlinkTable.tsx | 24 +- .../JobOverview/components/JobDesc.tsx | 12 +- .../src/pages/DevOps/JobDetail/index.tsx | 2 +- dinky-web/src/types/DevOps/data.d.ts | 71 +- dinky-web/src/utils/function.tsx | 8 +- .../dinky_k8s_quick_start.mdx | 100 +-- docs/docs/developer_guide/local_debug.md | 2 +- docs/docs/extend/function_expansion/alert.md | 169 ----- .../extend/function_expansion/completion.md | 44 -- .../extend/function_expansion/connector.md | 38 -- .../extend/function_expansion/datasource.md | 623 ------------------ .../function_expansion/flinktaskmonitor.md | 61 -- .../extend/function_expansion/flinkversion.md | 21 - docs/docs/extend/integrate.md | 68 -- .../extend/practice_guide/_category_.json | 4 - docs/docs/extend/practice_guide/aggtable.md | 373 ----------- .../cdc_kafka_multi_source_merge.md | 351 ---------- docs/docs/extend/practice_guide/clickhouse.md | 10 - docs/docs/extend/practice_guide/cross_join.md | 116 ---- .../extend/practice_guide/dataspherestudio.md | 10 - .../extend/practice_guide/dolphinscheduler.md | 10 - docs/docs/extend/practice_guide/doris.md | 208 ------ docs/docs/extend/practice_guide/flinkcdc.md | 12 - docs/docs/extend/practice_guide/hive.md | 98 --- docs/docs/extend/practice_guide/hudi.md | 298 --------- docs/docs/extend/practice_guide/iceberg.md | 9 - .../extend/practice_guide/kafka_to_hive.md | 208 ------ docs/docs/extend/practice_guide/kudu.md | 118 ---- .../docs/extend/practice_guide/lookup_join.md | 128 ---- docs/docs/extend/practice_guide/principle.md | 178 ----- .../extend/practice_guide/temporal_join.md | 165 ----- docs/docs/extend/practice_guide/udf.md | 11 - docs/docs/extend/practice_guide/yarnsubmit.md | 206 ------ docs/docs/faq.md | 2 +- docs/docs/thanks.md | 38 +- docs/docs/upgrade.md | 2 +- .../devops_center/deveops_center_intro.md | 36 - .../devops_center/indicators_list.md | 62 -- .../user_guide/devops_center/job_details.md | 109 ++- .../devops_center/job_instance_status.md | 150 ----- .../user_guide/devops_center/job_overview.md | 26 + docs/docs/user_guide/metrics_overview.md | 2 +- .../system_setting/alert_strategy.md | 21 +- 47 files changed, 346 insertions(+), 3893 deletions(-) delete mode 100644 docs/docs/extend/function_expansion/alert.md delete mode 100644 docs/docs/extend/function_expansion/completion.md delete mode 100644 docs/docs/extend/function_expansion/connector.md delete mode 100644 docs/docs/extend/function_expansion/datasource.md delete mode 100644 docs/docs/extend/function_expansion/flinktaskmonitor.md delete mode 100644 docs/docs/extend/function_expansion/flinkversion.md delete mode 100644 docs/docs/extend/integrate.md delete mode 100644 docs/docs/extend/practice_guide/_category_.json delete mode 100644 docs/docs/extend/practice_guide/aggtable.md delete mode 100644 docs/docs/extend/practice_guide/cdc_kafka_multi_source_merge.md delete mode 100644 docs/docs/extend/practice_guide/clickhouse.md delete mode 100644 docs/docs/extend/practice_guide/cross_join.md delete mode 100644 docs/docs/extend/practice_guide/dataspherestudio.md delete mode 100644 docs/docs/extend/practice_guide/dolphinscheduler.md delete mode 100644 docs/docs/extend/practice_guide/doris.md delete mode 100644 docs/docs/extend/practice_guide/flinkcdc.md delete mode 100644 docs/docs/extend/practice_guide/hive.md delete mode 100644 docs/docs/extend/practice_guide/hudi.md delete mode 100644 docs/docs/extend/practice_guide/iceberg.md delete mode 100644 docs/docs/extend/practice_guide/kafka_to_hive.md delete mode 100644 docs/docs/extend/practice_guide/kudu.md delete mode 100644 docs/docs/extend/practice_guide/lookup_join.md delete mode 100644 docs/docs/extend/practice_guide/principle.md delete mode 100644 docs/docs/extend/practice_guide/temporal_join.md delete mode 100644 docs/docs/extend/practice_guide/udf.md delete mode 100644 docs/docs/extend/practice_guide/yarnsubmit.md delete mode 100644 docs/docs/user_guide/devops_center/deveops_center_intro.md delete mode 100644 docs/docs/user_guide/devops_center/indicators_list.md delete mode 100644 docs/docs/user_guide/devops_center/job_instance_status.md create mode 100644 docs/docs/user_guide/devops_center/job_overview.md diff --git a/README.md b/README.md index 3f8b67a436..5b21de3d3b 100644 --- a/README.md +++ b/README.md @@ -148,3 +148,8 @@ Thanks to [JetBrains](https://www.jetbrains.com/?from=dlink) for providing a fre Please refer to the [LICENSE](https://github.com/DataLinkDC/dinky/blob/dev/LICENSE) document. +# Contributors + + + + diff --git a/README_zh_CN.md b/README_zh_CN.md index 2ec688593c..a497d493d3 100644 --- a/README_zh_CN.md +++ b/README_zh_CN.md @@ -148,4 +148,10 @@ Dinky 是一个 `开箱即用` 、`易扩展` ,以 `Apache Flink` 为基础, ## 版权 -请参考 [LICENSE](https://github.com/DataLinkDC/dinky/blob/dev/LICENSE) 文件。 \ No newline at end of file +请参考 [LICENSE](https://github.com/DataLinkDC/dinky/blob/dev/LICENSE) 文件。 + +# 贡献者 + + + + diff --git a/dinky-admin/src/main/java/org/dinky/service/impl/TaskServiceImpl.java b/dinky-admin/src/main/java/org/dinky/service/impl/TaskServiceImpl.java index 43d4d5d36a..550be8e02b 100644 --- a/dinky-admin/src/main/java/org/dinky/service/impl/TaskServiceImpl.java +++ b/dinky-admin/src/main/java/org/dinky/service/impl/TaskServiceImpl.java @@ -511,14 +511,21 @@ public boolean changeTaskLifeRecyle(Integer taskId, JobLifeCycle lifeCycle) thro boolean saved = saveOrUpdate(task.buildTask()); if (saved && Asserts.isNotNull(task.getJobInstanceId())) { JobInstance jobInstance = jobInstanceService.getById(task.getJobInstanceId()); - jobInstance.setStep(lifeCycle.getValue()); - jobInstanceService.updateById(jobInstance); - log.info("jobInstance [{}] step change to {}", jobInstance.getJid(), lifeCycle.getValue()); + if (Asserts.isNotNull(jobInstance)) { + jobInstance.setStep(lifeCycle.getValue()); + boolean updatedJobInstance = jobInstanceService.updateById(jobInstance); + if (updatedJobInstance) jobInstanceService.refreshJobInfoDetail(jobInstance.getId(), true); + log.warn( + "JobInstance [{}] step change to [{}] ,Trigger Force Refresh", + jobInstance.getName(), + lifeCycle.getValue()); + } } return saved; } @Override + @Transactional(rollbackFor = Exception.class) public boolean saveOrUpdateTask(Task task) { Task byId = getById(task.getId()); if (byId != null && JobLifeCycle.PUBLISH.equalsValue(byId.getStep())) { diff --git a/dinky-web/src/pages/DataStudio/LeftContainer/Project/function.tsx b/dinky-web/src/pages/DataStudio/LeftContainer/Project/function.tsx index e3d76a29a8..36b02ad10f 100644 --- a/dinky-web/src/pages/DataStudio/LeftContainer/Project/function.tsx +++ b/dinky-web/src/pages/DataStudio/LeftContainer/Project/function.tsx @@ -80,19 +80,19 @@ export const buildStepValue = (step: number) => { return { title: l('global.table.lifecycle.dev'), status: 'processing', - color: '#1890ff' + color: 'cyan' }; case 2: return { title: l('global.table.lifecycle.online'), status: 'success', - color: '#52c41a' + color: 'purple' }; default: return { title: l('global.table.lifecycle.dev'), status: 'default', - color: '#1890ff' + color: 'cyan' }; } }; @@ -144,7 +144,8 @@ export const buildProjectTree = ( <> ); diff --git a/dinky-web/src/pages/DevOps/JobDetail/JobOverview/components/FlinkTable.tsx b/dinky-web/src/pages/DevOps/JobDetail/JobOverview/components/FlinkTable.tsx index dd539aaa97..bc2a4595fa 100644 --- a/dinky-web/src/pages/DevOps/JobDetail/JobOverview/components/FlinkTable.tsx +++ b/dinky-web/src/pages/DevOps/JobDetail/JobOverview/components/FlinkTable.tsx @@ -19,7 +19,12 @@ import StatusTag from '@/components/JobTags/StatusTag'; import { JobProps } from '@/pages/DevOps/JobDetail/data'; -import { parseByteStr, parseMilliSecondStr, parseNumStr } from '@/utils/function'; +import { + formatTimestampToYYYYMMDDHHMMSS, + parseByteStr, + parseMilliSecondStr, + parseNumStr +} from '@/utils/function'; import { l } from '@/utils/intl'; import { ProCard, ProColumns, ProTable } from '@ant-design/pro-components'; import { Typography } from 'antd'; @@ -32,8 +37,10 @@ export type VerticesTableListItem = { metrics: any; parallelism: number; startTime?: number; + 'start-time'?: number; duration?: number; endTime?: number; + 'end-time'?: number; tasks: any; }; @@ -101,15 +108,20 @@ const FlinkTable = (props: JobProps): JSX.Element => { }, { title: l('global.table.startTime'), - dataIndex: 'startTime', - valueType: 'dateTime' + render: (dom, entity) => { + return entity.startTime === -1 || entity['start-time'] === -1 + ? '-' + : formatTimestampToYYYYMMDDHHMMSS(entity['start-time'] as number) || + formatTimestampToYYYYMMDDHHMMSS(entity.startTime as number); + } }, { title: l('global.table.endTime'), - dataIndex: 'endTime', - valueType: 'dateTime', render: (dom, entity) => { - return entity.endTime === -1 ? '-' : entity.endTime; + return entity.endTime === -1 || entity['end-time'] === -1 + ? '-' + : formatTimestampToYYYYMMDDHHMMSS(entity['end-time'] as number) || + formatTimestampToYYYYMMDDHHMMSS(entity.endTime as number); } }, { diff --git a/dinky-web/src/pages/DevOps/JobDetail/JobOverview/components/JobDesc.tsx b/dinky-web/src/pages/DevOps/JobDetail/JobOverview/components/JobDesc.tsx index bb645801e7..99e50d90f6 100644 --- a/dinky-web/src/pages/DevOps/JobDetail/JobOverview/components/JobDesc.tsx +++ b/dinky-web/src/pages/DevOps/JobDetail/JobOverview/components/JobDesc.tsx @@ -88,7 +88,7 @@ const JobDesc = (props: JobProps) => { - {jobDetail?.jobDataDto?.config?.executionConfig?.restartStrategy} + {jobDetail?.jobDataDto?.config['execution-config']['restart-strategy']} @@ -109,13 +109,11 @@ const JobDesc = (props: JobProps) => { - {jobDetail?.history?.configJson?.useSqlFragment - ? l('button.enable') - : l('button.disable')} + {jobDetail?.history?.configJson?.fragment ? l('button.enable') : l('button.disable')} - {jobDetail?.history?.configJson?.useBatchModel + {jobDetail?.history?.configJson?.batchModel ? l('global.table.execmode.batch') : l('global.table.execmode.streaming')} @@ -125,7 +123,7 @@ const JobDesc = (props: JobProps) => { - {jobDetail?.jobDataDto?.config?.executionConfig?.jobParallelism} + {jobDetail?.jobDataDto?.config['execution-config']['job-parallelism']} @@ -137,7 +135,7 @@ const JobDesc = (props: JobProps) => { - {jobDetail?.history?.configJson.savePointPath} + {jobDetail?.history?.configJson?.configJson['state.savepoints.dir'] ?? '-'} diff --git a/dinky-web/src/pages/DevOps/JobDetail/index.tsx b/dinky-web/src/pages/DevOps/JobDetail/index.tsx index 337d7ab1b4..e80134a2af 100644 --- a/dinky-web/src/pages/DevOps/JobDetail/index.tsx +++ b/dinky-web/src/pages/DevOps/JobDetail/index.tsx @@ -65,7 +65,7 @@ const JobDetail = (props: any) => { pollingInterval: 3000 }); - const jobInfoDetail: Jobs.JobInfoDetail = data; + const jobInfoDetail = data as Jobs.JobInfoDetail; const [tabKey, setTabKey] = useState(OperatorEnum.JOB_BASE_INFO); diff --git a/dinky-web/src/types/DevOps/data.d.ts b/dinky-web/src/types/DevOps/data.d.ts index 13d615472b..f25fff4868 100644 --- a/dinky-web/src/types/DevOps/data.d.ts +++ b/dinky-web/src/types/DevOps/data.d.ts @@ -18,7 +18,7 @@ */ import { BaseBeanColumns } from '@/types/Public/data'; -import { Alert } from '@/types/RegCenter/data.d'; +import { Alert, Cluster } from '@/types/RegCenter/data.d'; /** * about flink job @@ -48,6 +48,62 @@ declare namespace Jobs { useBatchModel: string; }; + export type ExecutorSetting = { + type: string; + host: string; + port: number; + useBatchModel: boolean; + checkpoint: string; + parallelism: number; + useSqlFragment: boolean; + useStatementSet: boolean; + savePointPath: string; + jobName: string; + config: Map; + variables: Map; + jarFiles: []; + jobManagerAddress: string; + plan: boolean; + remote: boolean; + validParallelism: boolean; + validJobName: boolean; + validHost: boolean; + validPort: boolean; + validConfig: boolean; + validVariables: boolean; + validJarFiles: boolean; + }; + + export type JobConfigJsonInfo = { + type: string; + checkpoint: string; + savePointStrategy: string; + savePointPath: string; + parallelism: number; + clusterId: number; + clusterConfigurationId: number; + step: number; + configJson: { + 'state.savepoints.dir': string; + }; + useResult: boolean; + useChangeLog: boolean; + useAutoCancel: boolean; + useRemote: boolean; + address: string; + taskId: number; + jarFiles: []; + pyFiles: []; + jobName: string; + fragment: boolean; + statementSet: boolean; + batchModel: boolean; + maxRowNum: number; + gatewayConfig: any; + variables: Map; + executorSetting: ExecutorSetting; + }; + export type History = { id: number; tenantId: number; @@ -61,7 +117,7 @@ declare namespace Jobs { type: string; error: string; result: string; - configJson: JobConfig; + configJson: JobConfigJsonInfo; startTime: string; endTime: string; taskId: number; @@ -166,13 +222,18 @@ declare namespace Jobs { jid: string; name: string; executionConfig: ExecutionConfig; + 'execution-config': ExecutionConfig; }; export type ExecutionConfig = { executionMode: string; + 'execution-mode': string; restartStrategy: string; + 'restart-strategy': string; jobParallelism: number; - objectReuse: boolean; + 'job-parallelism': number; + 'object-reuse': boolean; userConfig: any; + 'user-config': any; }; export type JobDataDtoItem = { @@ -191,8 +252,8 @@ declare namespace Jobs { export type JobInfoDetail = { id: number; instance: JobInstance; - clusterInstance: any; - clusterConfiguration: any; + clusterInstance: Cluster.Instance; + clusterConfiguration: Cluster.Config; history: History; jobDataDto: JobDataDtoItem; jobManagerConfiguration: any; diff --git a/dinky-web/src/utils/function.tsx b/dinky-web/src/utils/function.tsx index 755deca87d..e00484b843 100644 --- a/dinky-web/src/utils/function.tsx +++ b/dinky-web/src/utils/function.tsx @@ -45,7 +45,6 @@ import { l } from '@/utils/intl'; import { Monaco } from '@monaco-editor/react'; import dayjs from 'dayjs'; import cookies from 'js-cookie'; -import { trim } from 'lodash'; import { editor, KeyCode, KeyMod } from 'monaco-editor'; import path from 'path'; import { format } from 'sql-formatter'; @@ -619,6 +618,13 @@ export const formatDateToYYYYMMDDHHMMSS = (date: Date) => { return dayjs(date).format(DATETIME_FORMAT); }; +export const formatTimestampToYYYYMMDDHHMMSS = (timestamp: number) => { + if (timestamp == null) { + return '-'; + } + return dayjs(timestamp).format(DATETIME_FORMAT); +}; + export const parseDateStringToDate = (dateString: Date) => { return dayjs(dateString).toDate(); }; diff --git a/docs/docs/data_integration_guide/dinky_k8s_quick_start.mdx b/docs/docs/data_integration_guide/dinky_k8s_quick_start.mdx index 74518fffce..f4e08b931f 100644 --- a/docs/docs/data_integration_guide/dinky_k8s_quick_start.mdx +++ b/docs/docs/data_integration_guide/dinky_k8s_quick_start.mdx @@ -3,6 +3,7 @@ sidebar_position: 1 id: dinky_k8s_quick_start title: K8s集成 --- + import Tabs from '@theme/Tabs'; import TabItem from '@theme/TabItem'; @@ -20,27 +21,21 @@ Dinky支持以下几种 Flink on k8s 运行模式: **部分内容可参考 Flink 对应集成 k8s 文档链接** - - - -[https://nightlies.apache.org/flink/flink-docs-release-1.13/zh/docs/deployment/resource-providers/native_kubernetes/](https://nightlies.apache.org/flink/flink-docs-release-1.16/zh/docs/deployment/resource-providers/native_kubernetes/) - - - - -[https://nightlies.apache.org/flink/flink-docs-release-1.14/zh/docs/deployment/resource-providers/native_kubernetes/](https://nightlies.apache.org/flink/flink-docs-release-1.16/zh/docs/deployment/resource-providers/native_kubernetes/) - - - - -[https://nightlies.apache.org/flink/flink-docs-release-1.15/zh/docs/deployment/resource-providers/native_kubernetes/](https://nightlies.apache.org/flink/flink-docs-release-1.16/zh/docs/deployment/resource-providers/native_kubernetes/) - - - - -[https://nightlies.apache.org/flink/flink-docs-release-1.16/zh/docs/deployment/resource-providers/native_kubernetes/](https://nightlies.apache.org/flink/flink-docs-release-1.16/zh/docs/deployment/resource-providers/native_kubernetes/) - - + + [https://nightlies.apache.org/flink/flink-docs-release-1.14/zh/docs/deployment/resource-providers/native_kubernetes/](https://nightlies.apache.org/flink/flink-docs-release-1.16/zh/docs/deployment/resource-providers/native_kubernetes/) + + + [https://nightlies.apache.org/flink/flink-docs-release-1.15/zh/docs/deployment/resource-providers/native_kubernetes/](https://nightlies.apache.org/flink/flink-docs-release-1.16/zh/docs/deployment/resource-providers/native_kubernetes/) + + + [https://nightlies.apache.org/flink/flink-docs-release-1.16/zh/docs/deployment/resource-providers/native_kubernetes/](https://nightlies.apache.org/flink/flink-docs-release-1.16/zh/docs/deployment/resource-providers/native_kubernetes/) + + + [https://nightlies.apache.org/flink/flink-docs-release-1.17/zh/docs/deployment/resource-providers/native_kubernetes/](https://nightlies.apache.org/flink/flink-docs-release-1.16/zh/docs/deployment/resource-providers/native_kubernetes/) + + + [https://nightlies.apache.org/flink/flink-docs-release-1.18/zh/docs/deployment/resource-providers/native_kubernetes/](https://nightlies.apache.org/flink/flink-docs-release-1.16/zh/docs/deployment/resource-providers/native_kubernetes/) + @@ -144,52 +139,61 @@ ADD extends /opt/flink/lib # 把当前extends目录下的jar添加进依赖目 ##### Kubernetes 配置 -| 参数 | 说明 | 是否必填 | 默认值 | 示例值 | -|--------|--------------------------------------------------------|:----:|:---:|:----------:| -| 暴露端口类型 | 支持NodePort与ClusterIP | 是 | 无 | NodePort | -| Kubernetes 命名空间 | 集群所在的 Kubernetes 命名空间 | 是 | 无 | dinky | -| K8s 提交账号 | 集群提交任务的账号 | 是 | 无 | default | -| Flink 镜像地址 | 上一步打包的镜像地址 | 是 | 无 | dinky-flink-1.0.0-1.15.4 | -| JobManager CPU 配置 | JobManager 资源配置 | 否 | 无 | 1 | -| TaskManager CPU 配置 | TaskManager 资源配置 | 否 | 无 | 1 | -| Flink 配置文件路径 | 仅指定到文件夹,dinky会自行读取文件夹下的配置文件并作为flink的默认配置 | 否 | 无 | /opt/flink/conf | +| 参数 | 说明 | 是否必填 | 默认值 | 示例值 | +|--------------------|------------------------------------------|:----:|:---:|:------------------------:| +| 暴露端口类型 | 支持NodePort与ClusterIP | 是 | 无 | NodePort | +| Kubernetes 命名空间 | 集群所在的 Kubernetes 命名空间 | 是 | 无 | dinky | +| K8s 提交账号 | 集群提交任务的账号 | 是 | 无 | default | +| Flink 镜像地址 | 上一步打包的镜像地址 | 是 | 无 | dinky-flink-1.0.0-1.15.4 | +| JobManager CPU 配置 | JobManager 资源配置 | 否 | 无 | 1 | +| TaskManager CPU 配置 | TaskManager 资源配置 | 否 | 无 | 1 | +| Flink 配置文件路径 | 仅指定到文件夹,dinky会自行读取文件夹下的配置文件并作为flink的默认配置 | 否 | 无 | /opt/flink/conf | > 如果您有其他的配置项需要添加,请点击添加配置项按钮,添加完毕后,点击保存即可 ##### Kubernetes 连接与pod配置 -| 参数 | 说明 | 是否必填 | 默认值 | 示例值 | -|--------|--------------------------------------------------------|:----:|:---:|:----------:| -|K8s KubeConfig |集群的KubeConfig内容,如果不填写,则默认使用`~/.kube/config`文件 | 否 | 无 | 无 | -|Default Pod Template |默认的Pod模板 | 否 | 无 | 无 | -|JM Pod Template |JobManager的Pod模板 | 否 | 无 | 无 | -|TM Pod Template |TaskManager的Pod模板 | 否 | 无 | 无 | +| 参数 | 说明 | 是否必填 | 默认值 | 示例值 | +|----------------------|-----------------------------------------------|:----:|:---:|:---:| +| K8s KubeConfig | 集群的KubeConfig内容,如果不填写,则默认使用`~/.kube/config`文件 | 否 | 无 | 无 | +| Default Pod Template | 默认的Pod模板 | 否 | 无 | 无 | +| JM Pod Template | JobManager的Pod模板 | 否 | 无 | 无 | +| TM Pod Template | TaskManager的Pod模板 | 否 | 无 | 无 | ##### 提交 FlinkSQL 配置项 (Application 模式必填)-公共配置 -| 参数 | 说明 | 是否必填 | 默认值 | 示例值 | -|--------|----------------------------------------------------------------------------------------------------------|:----:|:---:|:--------------:| -| Jar 文件路径 | 指定镜像内dinky-app的 Jar 文件路径,如果该集群配置用于提交 Application 模式任务时 则必填| 否 | 无 | local:///opt/flink/dinky-app-1.16-1.0.0-jar-with-dependencies.jar | +| 参数 | 说明 | 是否必填 | 默认值 | 示例值 | +|----------|------------------------------------------------------------|:----:|:---:|:-----------------------------------------------------------------:| +| Jar 文件路径 | 指定镜像内dinky-app的 Jar 文件路径,如果该集群配置用于提交 Application 模式任务时 则必填 | 否 | 无 | local:///opt/flink/dinky-app-1.16-1.0.0-jar-with-dependencies.jar | > 由于flink限制,k8s模式只能加载镜像内的jar包,也就是地址必须为local://开头,如果想要自定义jar提交,请查阅jar提交部分 #### Flink 预设配置(高优先级)-公共配置 -| 参数 | 说明 | 是否必填 | 默认值 | 示例值 | -|-----------------|----|:----:|:---:|:--:| -| JobManager 内存 | JobManager 内存大小! | 否 | 无 | 1g | -| TaskManager 内存 | TaskManager 内存大小! | 否 | 无 | 1g | -| TaskManager 堆内存 | TaskManager 堆内存大小! | 否 | 无 | 1g | -| 插槽数 | 插槽数量 | 否 | 无 | 2 | -| 保存点路径 | 对应SavePoint目录 | 否 | 无 | hdfs:///flink/savepoint | -| 检查点路径 | 对应CheckPoint目录 | 否 | 无 | hdfs:///flink/checkpoint | +| 参数 | 说明 | 是否必填 | 默认值 | 示例值 | +|-----------------|--------------------|:----:|:---:|:------------------------:| +| JobManager 内存 | JobManager 内存大小! | 否 | 无 | 1g | +| TaskManager 内存 | TaskManager 内存大小! | 否 | 无 | 1g | +| TaskManager 堆内存 | TaskManager 堆内存大小! | 否 | 无 | 1g | +| 插槽数 | 插槽数量 | 否 | 无 | 2 | +| 保存点路径 | 对应SavePoint目录 | 否 | 无 | hdfs:///flink/savepoint | +| 检查点路径 | 对应CheckPoint目录 | 否 | 无 | hdfs:///flink/checkpoint | ## 启动session集群(可选) + 除了您自己手动部署session集群外,dinky还提供了快捷方式部署Kubernetes session集群,在上面Kubernetes集群配置完成后,点击启动按钮即可向指定Kubernetes集群提交session集群 + ![IMG](http://pic.dinky.org.cn/dinky/docs/test/k8s-config-list.png) + 至此,所有准备工作均已完成完成,接下来就可以通过` kubernetes session`模式或`kubernetes application`模式进行任务提交啦。 + ## 提交 kubernetes application 任务 + 进入数据开发页面,新建一个flink sql任务,选择集群类型为`kubernetes application`,集群选择为我们刚刚配置的集群,点击提交即可 -![IMG](http://pic.dinky.org.cn/dinky/docs/test/k8s-task-demo.png)## 提交 kubernetes session 任务 + +![IMG](http://pic.dinky.org.cn/dinky/docs/test/k8s-task-demo.png) + +## 提交 kubernetes session 任务 + 进入数据开发页面,新建一个flink sql任务,选择集群类型为`kubernetes session`,集群选择为我们刚刚配置的集群,点击提交即可 图片同上 \ No newline at end of file diff --git a/docs/docs/developer_guide/local_debug.md b/docs/docs/developer_guide/local_debug.md index 8d1bbd6a94..69d99a8ecb 100644 --- a/docs/docs/developer_guide/local_debug.md +++ b/docs/docs/developer_guide/local_debug.md @@ -90,7 +90,7 @@ npm run dev 由于目前 Dinky 各个模块未发布到 Maven 中央仓库,所以需要先进行 Install 编译。从而在本地仓库中生成相应的依赖。 -如果你是第一次编译 Dinky,那么请勾选以下 Maven Profile,然后下图中的`生命周期 -> Install`进行编译。 +如果你是第一次编译 Dinky,那么请勾选以下 Maven Profile,然后双击下图中的`生命周期 -> Install`进行编译。 ::: ![localdebug_profile](http://pic.dinky.org.cn/dinky/docs/zh-CN/developer_guide/local_debug/localdebug_profile.png) diff --git a/docs/docs/extend/function_expansion/alert.md b/docs/docs/extend/function_expansion/alert.md deleted file mode 100644 index abd034f218..0000000000 --- a/docs/docs/extend/function_expansion/alert.md +++ /dev/null @@ -1,169 +0,0 @@ ---- -sidebar_position: 4 -id: alert -title: 扩展报警插件 ---- - - - - -Dinky 告警机制遵循 SPI,可随意扩展所需要的告警机制。如需扩展可在 dinky-alert 模块中进行可插拔式扩展。现已经支持的告警机制包括如下: - -- DingDingTalk -- 企业微信: 同时支持**APP** 和 **WeChat 群聊** 方式 -- Email -- 飞书 - -Dinky 学习了 ``Apache Dolphinscheduler`` 的插件扩展机制,可以在 Dinky 中添加自定义的告警机制。 - -## 准备工作 -- 本地开发环境搭建 - - 详见 [开发者本地调试手册](../../developer_guide/local_debug) - -## 后端开发 -- 在 **dinky-alert** 新建子模块 , 命名规则为 `dinky-alert-{报警类型}` 在子模块中实现相关告警机制 -- **代码层面** 根据告警场景自行实现报警逻辑 - - 注意事项: - - 不可在父类的基础上修改代码,可以在子类中进行扩展 ,或者重写父类方法 - - 注意告警所使用到的常量需要继承**AlertBaseConstant** 其他差异的特殊常量在新建的模块中定义,参考其他告警类型代码 - - 扩展告警类型需要同时提交**测试用例** -- 需要在新建的此模块的 **resource** 下 新建包 ``META-INF.services`` , 在此包中新建文件 ``org.dinky.alert.Alert`` 内容如下: - - ``org.dinky.alert.{报警类型}.{报警类型Alert}`` 参考其他告警类型的此文件 -- 打包相关配置 修改如下: - - 在 **dinky-core** 模块的 **pom.xml** 下 , 找到扩展告警相关的依赖 `放在一起方便管理` 并且新增如下内容: - ```xml - - org.dinky - 模块名称 - ${scope.runtime} - - ``` - - - 在 **dinky-admin** 模块的 **pom.xml** 下 , 找到扩展告警相关的依赖 `放在一起方便管理` 并且新增如下内容: - ```xml - - org.dinky - 模块名称 - ${expand.scope} - - ``` - -- 在 **dinky** 根下 **pom.xml** 中 ,新增如下内容: - ```xml - - org.dinky - 模块名称 - ${project.version} - - ``` - -- 在 **dinky-assembly** 模块中 , 找到 ``package.xml`` 路径: **/dinky-assembly/src/main/assembly/package.xml** , 新增如下内容: -```xml - - ${project.parent.basedir}/dinky-alert/模块名称/target - - lib - - 模块名称-${project.version}.jar - - - ``` - - ----- - -## 前端开发 -- **dinky-web** 为 Dinky 的前端模块 -- 扩展告警插件相关表单所在路径: `dinky-web/src/pages/RegistrationCenter/AlertManage/AlertInstance` - - 修改 `dinky-web/src/pages/RegistrationCenter/AlertManage/AlertInstance/conf.ts` - - **ALERT_TYPE** 添加如下 eg: - ``` typescript - EMAIL:'Email', - ``` - **ALERT_CONFIG_LIST** 添加如下 eg: - ```typescript - { - type: ALERT_TYPE.EMAIL, - } - ``` - **注意:** 此处属性值需要与后端 `AlertTypeEnum` 声明的值保持一致 - -如下图: -![extend_alert_conf](http://pic.dinky.org.cn/dinky/docs/zh-CN/extend/function_expansion/alert/extend_alert_conf.png) - - - 修改 `dinky-web/src/pages/RegistrationCenter/AlertManage/AlertInstance/icon.tsx` 的 **getAlertIcon** 中 - - 添加如下 eg: -```typescript - case ALERT_TYPE.EMAIL: - return (); -``` -同时在下方定义 SVG : `如不定义将使用默认 SVG` - -svg 获取: [https://www.iconfont.cn](https://www.iconfont.cn) -``` typescript -export const EmailSvg = () => ( - {svg 相关代码} -); -``` -**注意:** svg 相关代码中需要将 **width** **height** 统一更换为 **width={svgSize} height={svgSize}** - -如下图: -![extened_alert_icon](http://pic.dinky.org.cn/dinky/docs/zh-CN/extend/function_expansion/alert/extened_alert_icon.png) - - - - - 修改 `dinky-web/src/pages/RegistrationCenter/AlertManage/AlertInstance/components/AlertInstanceChooseForm.tsx` - - 追加如下 eg: -```typescript - {(values?.type == ALERT_TYPE.EMAIL || alertType == ALERT_TYPE.EMAIL)? - { - setAlertType(undefined); - handleChooseModalVisible(); - }} - modalVisible={values?.type == ALERT_TYPE.EMAIL || alertType == ALERT_TYPE.EMAIL} - values={values} - onSubmit={(value) => { - onSubmit(value); - }} - onTest={(value) => { - onTest(value); - }} - />:undefined - } -``` -其中需要修改的地方为 -- `EMAIL` 替换为上述 **dinky-web/src/pages/RegistrationCenter/AlertManage/AlertInstance/conf.ts** 中 **ALERT_TYPE** 的新增类型 -- `EmailForm` 为新建告警表单文件 **dinky-web/src/pages/RegistrationCenter/AlertManage/AlertInstance/components/EmailForm.tsx** 中的 **EmailForm** . - -如下图: -![extened_alert_choose_form](http://pic.dinky.org.cn/dinky/docs/zh-CN/extend/function_expansion/alert/extened_alert_choose_form.png) - - - 需要新建表单文件 , 命名规则: ``{告警类型}Form`` - - 该文件中除 **表单属性** 外 , 其余可参照其他类型告警 , 建议复制其他类型告警的表单 , 修改其中的表单属性即可 - - 注意: - - 部分表单属性保存为 Json 格式 - - 需要修改 如下的表单配置 - - - ```typescript - // 找到如下相关代码: - const [formVals, setFormVals] = useState>({ - id: props.values?.id, - name: props.values?.name, - type: ALERT_TYPE.EMAIL, // 此处需要修改为新增的告警类型 - params: props.values?.params, - enabled: props.values?.enabled, - }); - -``` - - ----- -:::tip 说明 -至此 , 基于 Dinky 扩展告警完成 , 如您也有扩展需求 ,请参照如何 [[Issuse]](../../developer_guide/contribution/issue) 和如何[[提交 PR]](../../developer_guide/contribution/pull_request) -::: \ No newline at end of file diff --git a/docs/docs/extend/function_expansion/completion.md b/docs/docs/extend/function_expansion/completion.md deleted file mode 100644 index 652aab6d32..0000000000 --- a/docs/docs/extend/function_expansion/completion.md +++ /dev/null @@ -1,44 +0,0 @@ ---- -sidebar_position: 5 -id: completion -title: FlinkSQL 编辑器自动补全函数 ---- - - - - -## FlinkSQL 编辑器自动补全函数 - -Dlink-0.3.2 版本上线了一个非常实用的功能——自动补全。 - -我们在使用 IDEA 等工具时,提示方法并补全、生成的功能大大提升了开发效率。而 Dlink 的目标便是让 FlinkSQL 更加丝滑,所以其提供了自定义的自动补全功能。对比传统的使用 `Java` 字符串来编写 FlinkSQL 的方式,Dlink 的优势是巨大。 - -在文档中心,我们可以根据自己的需要扩展相应的自动补全规则,如 `UDF`、`Connector With` 等 FlinkSQL 片段,甚至可以扩展任意可以想象到内容,如注释、模板、配置、算法等。 - -具体新增规则的示例请看下文描述。 - -## set 语法来设置执行环境参数 - -对于一个 FlinkSQL 的任务来说,除了 sql 口径,其任务配置也十分重要。所以 Dlink-0.3.2 版本中提供了 `sql-client` 的 `set` 语法,可以通过 `set` 关键字来指定任务的执行配置(如 “ `set table.exec.resource.default-parallelism=2;` ” ),其优先级要高于 Dlink 自身的任务配置(面板右侧)。 - -那么长的参数一般人谁记得住?等等,别忘了 Dlink 的新功能自动补全~ - -配置实现输入 `parallelism` 子字符串来自动补全 `table.exec.resource.default-parallelism=` 。 - -在文档中心中添加一个规则,名称为 `parallelism`,填充值为 `table.exec.resource.default-parallelism=`,其他内容随意。 - -保存之后,来到编辑器输入 `par` . - -选中要补全的规则后,编辑器中自动补全了 `table.exec.resource.default-parallelism=` 。 - -至此,有些小伙伴发现,是不是可以直接定义 `pl2` 来自动生成 `set table.exec.resource.default-parallelism=2;` ? - -当然可以的。 - -还有小伙伴问,可不可以定义 `pl` 生成 `set table.exec.resource.default-parallelism=;` 后,光标自动定位到 `=` 于 `;` 之间? - -这个也可以的,只需要定义 `pl` 填充值为 `set table.exec.resource.default-parallelism=${1:};` ,即可实现。 - -所以说,只要能想象到的都可以定义,这样的 Dlink 你爱了吗? - -嘘,还有点小 bug 后续修复呢。如果有什么建议及问题请及时指出哦。 \ No newline at end of file diff --git a/docs/docs/extend/function_expansion/connector.md b/docs/docs/extend/function_expansion/connector.md deleted file mode 100644 index ab25f82d72..0000000000 --- a/docs/docs/extend/function_expansion/connector.md +++ /dev/null @@ -1,38 +0,0 @@ ---- -sidebar_position: 2 -id: connector -title: 扩展连接器 ---- - - - - -## Flink Connector 介绍 - -Flink做为实时计算引擎,支持非常丰富的上下游存储系统的 Connectors。并从这些上下系统读写数据并进行计算。对于这些 Connectors 在 Flink 中统一称之为数据源(Source) 端和 目标(Sink) 端。 - -- 数据源(Source)指的是输入流计算系统的上游存储系统来源。在当前的 FlinkSQL 模式的作业中,数据源可以是消息队列 Kafka、数据库 MySQL 等。 -- 目标(Sink)指的是流计算系统输出处理结果的目的地。在当前的流计算 FlinkSQL 模式的作业中,目标端可以是消息队列 Kafka、数据库 MySQL、OLAP引擎 Doris、ClickHouse 等。 - -Dinky 实时计算平台支持支持 Flink 1.13、Flink 1.14、Flink 1.15、Flink 1.16 五个版本,对应的版本支持所有开源的上下游存储系统具体Connector信息详见Flink开源社区: - -- [Flink1.13](https://nightlies.apache.org/flink/flink-docs-release-1.13/docs/connectors/table/overview/) -- [Flink1.14](https://nightlies.apache.org/flink/flink-docs-release-1.14/docs/connectors/table/overview/) -- [Flink1.15](https://nightlies.apache.org/flink/flink-docs-release-1.15/docs/connectors/table/overview/) -- [Flink1.16](https://nightlies.apache.org/flink/flink-docs-release-1.16/docs/connectors/table/overview/) - - -另外非 Flink 官网支持的 Connector 详见 github: - -- [Flink-CDC](https://github.com/ververica/flink-cdc-connectors/releases/) -- [Hudi](https://github.com/apache/hudi/releases) -- [Iceberg](https://github.com/apache/iceberg/releases) -- [Doris](https://github.com/apache/incubator-doris-flink-connector/tags) -- [Starrocks](https://github.com/StarRocks/flink-connector-starrocks/releases) -- [ClickHouse](https://github.com/itinycheng/flink-connector-clickhouse) -- [Pulsar](https://github.com/streamnative/pulsar-flink/releases) - - -## 扩展 Connector - -将 Flink 集群上已扩展好的 Connector 直接放入 Dlink 的 lib 或者 plugins 下,然后重启即可。定制 Connector 过程同 Flink 官方一样。 diff --git a/docs/docs/extend/function_expansion/datasource.md b/docs/docs/extend/function_expansion/datasource.md deleted file mode 100644 index 3e909022f6..0000000000 --- a/docs/docs/extend/function_expansion/datasource.md +++ /dev/null @@ -1,623 +0,0 @@ ---- -sidebar_position: 3 -id: datasource -title: 扩展数据源 ---- - - - - - Dinky 数据源遵循 SPI,可随意扩展所需要的数据源。数据源扩展可在 dlink-metadata 模块中进行可插拔式扩展。现已经支持的数据源包括如下: - - - MySQL - - Oracle - - SQLServer - - PostGreSQL - - Phoenix - - Doris(Starrocks) - - ClickHouse - - Hive ``需要的jar包: hive-jdbc-2.1.1.jar && hive-service-2.1.1.jar`` - -使用以上数据源,详见注册中心[数据源管理](../../user_guide/register_center/datasource_manage),配置数据源连接 -:::tip 注意事项 - Dinky 不在对 Starorcks 进行额外扩展,Doris 和 Starorcks 底层并无差别,原则上只是功能区分。经社区测试验证,可采用 Doris 扩展连接 Starrocks。 -::: ----- - -## 准备工作 -- 本地开发环境搭建 - - 详见 [开发者本地调试手册](../../developer_guide/local_debug) - -## 后端开发 -- 本文以 Hive 数据源扩展为例 -- 在 **dlink-metadata** 模块中, 右键**新建子模块**, 命名规则: **dlink-metadata-{数据源名称}** -- **代码层面** - - 注意事项: - - 不可在父类的基础上修改代码,可以在子类中进行扩展 ,或者重写父类方法 - - 扩展数据源需要同时提交**测试用例** - - 在此模块的 **pom.xml** 中,添加所需依赖, 需要注意的是 : 数据源本身的 ``JDBC``的 jar 不要包含在打包中 , 而是后续部署时,添加在 ``plugins`` 下 - - 需要在此模块的 **resource** 下 新建包 ``META-INF.services`` , 在此包中新建文件 ``com.dlink.metadata.driver.Driver`` 内容如下: - - ``com.dlink.metadata.driver.数据源类型Driver`` - 基础包: -```bash -顶层包名定义: com.dlink.metadata - 子包含义: - - constant: 常量定义 目前此模块中主要定义各种动态构建的执行 SQL - - convert: 存放数据源的数据类型<->Java 类型的转换类 ps: 可以不定义 不定义使用 dlink-metadata-base 的默认转换 即调用父类的方法 - - driver: 存放数据源驱动类,获取元数据的主要类,类 extends AbstractJdbcDriver implements Driver - - query : 存放解析获取元数据的主要类,类 extends AbstractDBQuery 方法不重写 默认使用父类 -``` -代码如下: - -HiveConstant -```java -public interface HiveConstant { - - /** - * 查询所有database - */ - String QUERY_ALL_DATABASE = " show databases"; - /** - * 查询所有schema下的所有表 - */ - String QUERY_ALL_TABLES_BY_SCHEMA = "show tables"; - /** - * 扩展信息Key - */ - String DETAILED_TABLE_INFO = "Detailed Table Information"; - /** - * 查询指定schema.table的扩展信息 - */ - String QUERY_TABLE_SCHEMA_EXTENED_INFOS = " describe extended `%s`.`%s`"; - /** - * 查询指定schema.table的信息 列 列类型 列注释 - */ - String QUERY_TABLE_SCHEMA = " describe `%s`.`%s`"; - /** - * 使用 DB - */ - String USE_DB = "use `%s`"; - /** - * 只查询指定schema.table的列名 - */ - String QUERY_TABLE_COLUMNS_ONLY = "show columns in `%s`.`%s`"; -} - -``` - -HiveTypeConvert -```java - -public class HiveTypeConvert implements ITypeConvert { - // 主要是将获取到的数据类型转换为 Java 数据类型的映射 存储在 Column 中 , 此处根据扩展的数据源特性进行修改 - @Override - public ColumnType convert(Column column) { - if (Asserts.isNull(column)) { - return ColumnType.STRING; - } - String t = column.getType().toLowerCase().trim(); - if (t.contains("char")) { - return ColumnType.STRING; - } else if (t.contains("boolean")) { - if (column.isNullable()) { - return ColumnType.JAVA_LANG_BOOLEAN; - } - return ColumnType.BOOLEAN; - } else if (t.contains("tinyint")) { - if (column.isNullable()) { - return ColumnType.JAVA_LANG_BYTE; - } - return ColumnType.BYTE; - } else if (t.contains("smallint")) { - if (column.isNullable()) { - return ColumnType.JAVA_LANG_SHORT; - } - return ColumnType.SHORT; - } else if (t.contains("bigint")) { - if (column.isNullable()) { - return ColumnType.JAVA_LANG_LONG; - } - return ColumnType.LONG; - } else if (t.contains("largeint")) { - return ColumnType.STRING; - } else if (t.contains("int")) { - if (column.isNullable()) { - return ColumnType.INTEGER; - } - return ColumnType.INT; - } else if (t.contains("float")) { - if (column.isNullable()) { - return ColumnType.JAVA_LANG_FLOAT; - } - return ColumnType.FLOAT; - } else if (t.contains("double")) { - if (column.isNullable()) { - return ColumnType.JAVA_LANG_DOUBLE; - } - return ColumnType.DOUBLE; - } else if (t.contains("timestamp")) { - return ColumnType.TIMESTAMP; - } else if (t.contains("date")) { - return ColumnType.STRING; - } else if (t.contains("datetime")) { - return ColumnType.STRING; - } else if (t.contains("decimal")) { - return ColumnType.DECIMAL; - } else if (t.contains("time")) { - return ColumnType.DOUBLE; - } - return ColumnType.STRING; - } - - // 转换为 DB 的数据类型 - @Override - public String convertToDB(ColumnType columnType) { - switch (columnType) { - case STRING: - return "varchar"; - case BOOLEAN: - case JAVA_LANG_BOOLEAN: - return "boolean"; - case BYTE: - case JAVA_LANG_BYTE: - return "tinyint"; - case SHORT: - case JAVA_LANG_SHORT: - return "smallint"; - case LONG: - case JAVA_LANG_LONG: - return "bigint"; - case FLOAT: - case JAVA_LANG_FLOAT: - return "float"; - case DOUBLE: - case JAVA_LANG_DOUBLE: - return "double"; - case DECIMAL: - return "decimal"; - case INT: - case INTEGER: - return "int"; - case TIMESTAMP: - return "timestamp"; - default: - return "varchar"; - } - } -} - - -``` - - -HiveDriver -```java - -public class HiveDriver extends AbstractJdbcDriver implements Driver { - // 获取表的信息 - @Override - public Table getTable(String schemaName, String tableName) { - List tables = listTables(schemaName); - Table table = null; - for (Table item : tables) { - if (Asserts.isEquals(item.getName(), tableName)) { - table = item; - break; - } - } - if (Asserts.isNotNull(table)) { - table.setColumns(listColumns(schemaName, table.getName())); - } - return table; - } - - -// 根据库名称获取表的信息 - @Override - public List
listTables(String schemaName) { - List
tableList = new ArrayList<>(); - PreparedStatement preparedStatement = null; - ResultSet results = null; - IDBQuery dbQuery = getDBQuery(); - String sql = dbQuery.tablesSql(schemaName); - try { - //此步骤是为了切换数据库 与其他数据源有所区别 - execute(String.format(HiveConstant.USE_DB, schemaName)); - preparedStatement = conn.prepareStatement(sql); - results = preparedStatement.executeQuery(); - ResultSetMetaData metaData = results.getMetaData(); - List columnList = new ArrayList<>(); - for (int i = 1; i <= metaData.getColumnCount(); i++) { - columnList.add(metaData.getColumnLabel(i)); - } - while (results.next()) { - String tableName = results.getString(dbQuery.tableName()); - if (Asserts.isNotNullString(tableName)) { - Table tableInfo = new Table(); - tableInfo.setName(tableName); - if (columnList.contains(dbQuery.tableComment())) { - tableInfo.setComment(results.getString(dbQuery.tableComment())); - } - tableInfo.setSchema(schemaName); - if (columnList.contains(dbQuery.tableType())) { - tableInfo.setType(results.getString(dbQuery.tableType())); - } - if (columnList.contains(dbQuery.catalogName())) { - tableInfo.setCatalog(results.getString(dbQuery.catalogName())); - } - if (columnList.contains(dbQuery.engine())) { - tableInfo.setEngine(results.getString(dbQuery.engine())); - } - tableList.add(tableInfo); - } - } - } catch (Exception e) { - e.printStackTrace(); - } finally { - close(preparedStatement, results); - } - return tableList; - } - - //获取所有数据库 和 库下所有表 - @Override - public List getSchemasAndTables() { - return listSchemas(); - } - - //获取所有数据库 - @Override - public List listSchemas() { - - List schemas = new ArrayList<>(); - PreparedStatement preparedStatement = null; - ResultSet results = null; - String schemasSql = getDBQuery().schemaAllSql(); - try { - preparedStatement = conn.prepareStatement(schemasSql); - results = preparedStatement.executeQuery(); - while (results.next()) { - String schemaName = results.getString(getDBQuery().schemaName()); - if (Asserts.isNotNullString(schemaName)) { - Schema schema = new Schema(schemaName); - if (execute(String.format(HiveConstant.USE_DB, schemaName))) { - // 获取库下的所有表 存储到schema中 - schema.setTables(listTables(schema.getName())); - } - schemas.add(schema); - } - } - } catch (Exception e) { - e.printStackTrace(); - } finally { - close(preparedStatement, results); - } - return schemas; - } - - // 根据库名表名获取表的列信息 - @Override - public List listColumns(String schemaName, String tableName) { - List columns = new ArrayList<>(); - PreparedStatement preparedStatement = null; - ResultSet results = null; - IDBQuery dbQuery = getDBQuery(); - String tableFieldsSql = dbQuery.columnsSql(schemaName, tableName); - try { - preparedStatement = conn.prepareStatement(tableFieldsSql); - results = preparedStatement.executeQuery(); - ResultSetMetaData metaData = results.getMetaData(); - List columnList = new ArrayList<>(); - for (int i = 1; i <= metaData.getColumnCount(); i++) { - columnList.add(metaData.getColumnLabel(i)); - } - Integer positionId = 1; - while (results.next()) { - Column field = new Column(); - if (StringUtils.isEmpty(results.getString(dbQuery.columnName()))) { - break; - } else { - if (columnList.contains(dbQuery.columnName())) { - String columnName = results.getString(dbQuery.columnName()); - field.setName(columnName); - } - if (columnList.contains(dbQuery.columnType())) { - field.setType(results.getString(dbQuery.columnType())); - } - if (columnList.contains(dbQuery.columnComment()) && Asserts.isNotNull(results.getString(dbQuery.columnComment()))) { - String columnComment = results.getString(dbQuery.columnComment()).replaceAll("\"|'", ""); - field.setComment(columnComment); - } - field.setPosition(positionId++); - field.setJavaType(getTypeConvert().convert(field)); - } - columns.add(field); - } - } catch (SQLException e) { - e.printStackTrace(); - } finally { - close(preparedStatement, results); - } - return columns; - } - - //获取建表的SQL - @Override - public String getCreateTableSql(Table table) { - StringBuilder createTable = new StringBuilder(); - PreparedStatement preparedStatement = null; - ResultSet results = null; - String createTableSql = getDBQuery().createTableSql(table.getSchema(), table.getName()); - try { - preparedStatement = conn.prepareStatement(createTableSql); - results = preparedStatement.executeQuery(); - while (results.next()) { - createTable.append(results.getString(getDBQuery().createTableName())).append("\n"); - } - } catch (Exception e) { - e.printStackTrace(); - } finally { - close(preparedStatement, results); - } - return createTable.toString(); - } - - @Override - public int executeUpdate(String sql) throws Exception { - Asserts.checkNullString(sql, "Sql 语句为空"); - String querySQL = sql.trim().replaceAll(";$", ""); - int res = 0; - try (Statement statement = conn.createStatement()) { - res = statement.executeUpdate(querySQL); - } - return res; - } - - @Override - public JdbcSelectResult query(String sql, Integer limit) { - if (Asserts.isNull(limit)) { - limit = 100; - } - JdbcSelectResult result = new JdbcSelectResult(); - List> datas = new ArrayList<>(); - List columns = new ArrayList<>(); - List columnNameList = new ArrayList<>(); - PreparedStatement preparedStatement = null; - ResultSet results = null; - int count = 0; - try { - String querySQL = sql.trim().replaceAll(";$", ""); - preparedStatement = conn.prepareStatement(querySQL); - results = preparedStatement.executeQuery(); - if (Asserts.isNull(results)) { - result.setSuccess(true); - close(preparedStatement, results); - return result; - } - ResultSetMetaData metaData = results.getMetaData(); - for (int i = 1; i <= metaData.getColumnCount(); i++) { - columnNameList.add(metaData.getColumnLabel(i)); - Column column = new Column(); - column.setName(metaData.getColumnLabel(i)); - column.setType(metaData.getColumnTypeName(i)); - column.setAutoIncrement(metaData.isAutoIncrement(i)); - column.setNullable(metaData.isNullable(i) == 0 ? false : true); - column.setJavaType(getTypeConvert().convert(column)); - columns.add(column); - } - result.setColumns(columnNameList); - while (results.next()) { - LinkedHashMap data = new LinkedHashMap<>(); - for (int i = 0; i < columns.size(); i++) { - data.put(columns.get(i).getName(), getTypeConvert().convertValue(results, columns.get(i).getName(), columns.get(i).getType())); - } - datas.add(data); - count++; - if (count >= limit) { - break; - } - } - result.setSuccess(true); - } catch (Exception e) { - result.setError(LogUtil.getError(e)); - result.setSuccess(false); - } finally { - close(preparedStatement, results); - result.setRowData(datas); - return result; - } } - - @Override - public IDBQuery getDBQuery() { - return new HiveQuery(); - } - - @Override - public ITypeConvert getTypeConvert() { - return new HiveTypeConvert(); - } - - // 获取驱动类 - @Override - String getDriverClass() { - return "org.apache.hive.jdbc.HiveDriver"; - } - - // 改数据源表的类型 此处必须 - @Override - public String getType() { - return "Hive"; - } - // 改数据源表的名称 此处必须 - @Override - public String getName() { - return "Hive"; - } - - // 映射 Flink 的数据类型 - @Override - public Map getFlinkColumnTypeConversion() { - HashMap map = new HashMap<>(); - map.put("BOOLEAN", "BOOLEAN"); - map.put("TINYINT", "TINYINT"); - map.put("SMALLINT", "SMALLINT"); - map.put("INT", "INT"); - map.put("VARCHAR", "STRING"); - map.put("TEXY", "STRING"); - map.put("INT", "INT"); - map.put("DATETIME", "TIMESTAMP"); - return map; - } -} - - - -``` - - -HiveQuery -```java - - -public class HiveQuery extends AbstractDBQuery { - // 获取所有数据库的查询SQL 需要与 常量类(HiveConstant) 联合使用 - @Override - public String schemaAllSql() { - return HiveConstant.QUERY_ALL_DATABASE; - } - - // 获取库下的所有表的SQL 需要与 常量类(HiveConstant) 联合使用 - @Override - public String tablesSql(String schemaName) { - return HiveConstant.QUERY_ALL_TABLES_BY_SCHEMA; - } - - // 动态构建获取表的所有列的SQL 需要与 常量类(HiveConstant) 联合使用 - @Override - public String columnsSql(String schemaName, String tableName) { - return String.format(HiveConstant.QUERY_TABLE_SCHEMA, schemaName, tableName); - } - - // 获取所有数据库的 result title - @Override - public String schemaName() { - return "database_name"; - } - - // 获取建表语句的 result title - @Override - public String createTableName() { - return "createtab_stmt"; - } - - // 获取所有表的 result title - @Override - public String tableName() { - return "tab_name"; - } - - // 获取表注释的 result title - @Override - public String tableComment() { - return "comment"; - } - - // 获取列名的 result title - @Override - public String columnName() { - return "col_name"; - } - - // 获取列的数据类型的 result title - @Override - public String columnType() { - return "data_type"; - } - - // 获取列注释的 result title - @Override - public String columnComment() { - return "comment"; - } - -} - -``` - -- 以上代码开发完成 在此模块下进行测试 建议使用单元测试进行测试 , 如您 PR , 则测试用例必须提交,同时需要注意敏感信息的处理 - -- 通过仅仅上述的代码可知 Dinky 的代码扩展性极强 , 可根据数据源的特性随时重写父类的方法 , 进而轻松实现扩展 - - - - -- 如果上述过程 测试没有问题 需要整合进入项目中 , 请看以下步骤: -- 打包相关配置 修改如下: - - 在 **dlink-core** 模块的 **pom.xml** 下 , 找到扩展数据源相关的依赖 `放在一起方便管理` 并且新增如下内容: -```xml - - com.dlink - 模块名称 - ${scope.runtime} - -``` - - 在 **dlink** 根下 **pom.xml** 中 ,新增如下内容: -```xml - - com.dlink - 模块名称 - ${project.version} - -``` - - - 在 **dlink-assembly** 模块中 , 找到 ``package.xml`` 路径: **/dlink-assembly/src/main/assembly/package.xml** , 新增如下内容: -```xml - - ${project.parent.basedir}/dlink-metadata/模块名称/target - - lib - - 模块名称-${project.version}.jar - - - ``` - -至此 如您的代码没有问题的话 后端代码扩展就已经完成了 ! - ----- - -## 前端开发 -- **dinky-web** 为 Dinky 的前端模块 -- 扩展数据源相关表单所在路径: `dinky-web/src/pages/DataBase/` - - 修改 `dinky-web/src/pages/DataBase/components/DBForm.tsx` 的 **const data** 中 添加如下: -eg: -```shell - { - type: 'Hive', - }, -``` -如下图: -![extened_datasource_dbform](http://pic.dinky.org.cn/dinky/docs/zh-CN/extend/function_expansion/datasource/extened_datasource_dbform.jpg) - -注意: ``此处数据源类型遵照大驼峰命名规则`` - - - 添加数据源logo图片 - - 路径: `dinky-web/public/database/` - - logo 图下载参考: [https://www.iconfont.cn](https://www.iconfont.cn) - - logo 图片存放位置: `dinky-web/public/database` - - 修改 `dinky-web/src/pages/DataBase/DB.ts` , 添加如下: -eg: -```shell - case 'hive': - imageUrl += 'hive.png'; # 需要和添加的图片名称保持一致 - break; -``` -如下图: -![extened_datasource_datasourceform](http://pic.dinky.org.cn/dinky/docs/zh-CN/extend/function_expansion/datasource/extened_datasource_datasourceform.jpg) - - 创建数据源相关表单属性在: `dinky-web/src/pages/DataBase/components/DataBaseForm.tsx` 此处无需修改 - ----- - -:::info 说明 -至此 , 基于 Dinky 扩展数据源完成 , 如您也有扩展需求 ,请参照如何 [[Issuse]](../../developer_guide/contribution/issue) 和如何 [[提交 PR]](../../developer_guide/contribution/pull_request) -::: diff --git a/docs/docs/extend/function_expansion/flinktaskmonitor.md b/docs/docs/extend/function_expansion/flinktaskmonitor.md deleted file mode 100644 index 000b5e5abf..0000000000 --- a/docs/docs/extend/function_expansion/flinktaskmonitor.md +++ /dev/null @@ -1,61 +0,0 @@ ---- -sidebar_position: 6 -id: flinktaskmonitor -title: flink 任务运行监控 ---- - - - - -## 说明 - -本文章主要说明对运行过程中的 flink 任务的监控,采用 **prometheus+pushgateway+grafana** 方式,为非平台内部监控方案。 - -## 前提 - -公司的服务器已经安装了 prometheus 和 pushgateway 网关服务,如果为安装,需要运维人员进行安装,或是自行安装。 - -## 介绍 - -Flink 提供的 Metrics 可以在 Flink 内部收集一些指标,通过这些指标让开发人员更好地理解作业或集群的状态。 -由于集群运行后很难发现内部的实际状况,跑得慢或快,是否异常等,开发人员无法实时查看所有的 Task 日志。 Metrics 可以很好的帮助开发人员了解作业的当前状况。 - -Flink 官方支持 Prometheus,并且提供了对接 Prometheus 的 jar 包,很方便就可以集成。 -在 FLINK_HEME/plugins/metrics-prometheus 目录下可以找到 **flink-metrics-prometheus** 包。 - -flink 的 plugin 目录下的 jar 包无需拷贝到 lib 目录下,可在运行时被 flink 加载。 - -## 配置步骤 - -### 修改Flink配置 - -修改 **flink-conf.yaml** 文件,该文件和集群配置有关,如果是 Standalone,Yarn Session 和 Kubernetes Session 模式,则需要修改启动本地集群或 session 集群时的 flink 目录下的 flink-conf.yaml 文件。 -如果是 Yarn Per-job、Yarn Application 和 Kubernetes Application 模式,则需要修改创建集群时指定的 flink 配置目录下的 flink-conf.yaml 文件, -同时需要将上面提到的 **flink-metrics-prometheus** 上传到平台的 **plugins** 目录和 **hdfs** 上的 **flink lib** 目录下。 - -```shell -vim flink-conf.yaml -``` - -添加如下配置: - -```yaml -##### 与 Prometheus 集成配置 ##### -metrics.reporter.promgateway.class: org.apache.flink.metrics.prometheus.PrometheusPushGatewayReporter -# PushGateway 的主机名与端口号 -metrics.reporter.promgateway.host: node01 -metrics.reporter.promgateway.port: 9091 -# Flink metric 在前端展示的标签(前缀)与随机后缀 -metrics.reporter.promgateway.jobName: flink-application -metrics.reporter.promgateway.randomJobNameSuffix: true -metrics.reporter.promgateway.deleteOnShutdown: false -metrics.reporter.promgateway.interval: 30 SECONDS -``` - -之后启动 flink 任务,然后就可以通过 grafana 来查询 prometheus 中网关的数据了。 - -### grafana 监控方案 - -https://grafana.com/search/?term=flink&type=dashboard - -通过上面网站搜索 flink ,我们就可以找到其他用户共享的他们使用的 flink 任务监控方案,从结果中找到自己喜欢的监控方案,下载对应的 json 文件后,上传到 grafana 即可实现对任务的监控。 \ No newline at end of file diff --git a/docs/docs/extend/function_expansion/flinkversion.md b/docs/docs/extend/function_expansion/flinkversion.md deleted file mode 100644 index 1b30ced135..0000000000 --- a/docs/docs/extend/function_expansion/flinkversion.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -sidebar_position: 1 -id: flinkversion -title: 扩展 Flink 版本 ---- - - - - -## 扩展其他版本的 Flink - -**dlink-catalog-mysql**、**dlink-client**、**dlink-app**。 - -**lib** 目录下默认的上面三个依赖对应的 flink 版本可能和你想要使用的 flink 版本不一致,需要进入到平台的 **lib** 目录下查看具体的上面三个依赖对应的 flink 版本, -如果不一致,则需要删除 **lib** 目录下的对应的上面三个依赖包,然后从 **extends** 和 **jar** 目录下找到合适的包,拷贝到 **lib** 目录下。 - -比如 **lib** 目录下的 **dlink-client-1.14-0.6.7.jar** ,表示使用的 flink 版本为 1.14.x , -如果你在 **plugins** 目录下上传的 flink 用到的 jar 包的版本不是 1.14.x ,就需要更换 **dlink-client** 包。 - - -切换版本时需要同时更新 plugins 下的 Flink 依赖。 \ No newline at end of file diff --git a/docs/docs/extend/integrate.md b/docs/docs/extend/integrate.md deleted file mode 100644 index f60208f3e8..0000000000 --- a/docs/docs/extend/integrate.md +++ /dev/null @@ -1,68 +0,0 @@ ---- -sidebar_position: 1 -id: integrate -title: 集成 ---- - - - -**声明:** Dinky并没有维护下面列出的库,其中有一部分是生产实践,一部分还未做过相关生产实践。欢迎使用Dinky已经集成的第三方库。 - -## 关系型数据库 - - MySQL - - PostGreSQL - - Oracle - - SQLServer - -## OLAP引擎 - - Doris - - ClickHouse - - Phoenix - - Hive - - - -## 消息队列 - - - Kafka - - Pulsar - - -以上均采用FlinkSQL Connector与Dinky集成使用,下面链接提供了FlinkSQL相关Connector包,请在[maven仓库](https://repo.maven.apache.org/maven2/org/apache/flink/)自行下载。 - - -## CDC工具 - - - [Flink CDC](https://github.com/ververica/flink-cdc-connectors/releases/) - - -## 调度平台 - - - **Oozie** - - **dolphinscheduler:** [Apache dolphinscheduler](https://dolphinscheduler.apache.org/zh-cn/)大数据调度平台 - - -对于调度平台,需支持HTTP服务即可 - -## 数据湖 - - - Hudi - - Iceberg - - -[Hudi](https://github.com/apache/hudi) 及 [Iceberg](https://github.com/apache/iceberg) 请移步到github自行编译或者下载 - -## HADOOP - - [flink-shaded-hadoop-3-uber](https://repository.cloudera.com/artifactory/cloudera-repos/org/apache/flink/flink-shaded-hadoop-3-uber) - -## 其他 - - - **dataspherestudio:** 微众银行开源[数据中台](https://github.com/WeBankFinTech/DataSphereStudio) - - -与Dinky的集成实践请移步最佳实践中的集成指南 - - - - - \ No newline at end of file diff --git a/docs/docs/extend/practice_guide/_category_.json b/docs/docs/extend/practice_guide/_category_.json deleted file mode 100644 index 1f9f8d8546..0000000000 --- a/docs/docs/extend/practice_guide/_category_.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "label": "实践指南", - "position": 3 -} diff --git a/docs/docs/extend/practice_guide/aggtable.md b/docs/docs/extend/practice_guide/aggtable.md deleted file mode 100644 index 3923ce0c83..0000000000 --- a/docs/docs/extend/practice_guide/aggtable.md +++ /dev/null @@ -1,373 +0,0 @@ ---- -sidebar_position: 3 -id: aggtable -title: AGGTABLE 表值聚合的实践 ---- - - - -## 摘要 - -本文讲述了 Dlink 对 Flink 的表值聚合功能的应用与增强。增强主要在于定义了 AGGTABLE 来通过 FlinkSql 进行表值聚合的实现,以下将通过两个示例 top2 与 to_map 进行讲解。 - -## 准备工作 - -### 准备测试表 - -#### 学生表(student) - -```sql -DROP TABLE IF EXISTS `student`; -CREATE TABLE `student` ( - `sid` int(11) NOT NULL, - `name` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, - PRIMARY KEY (`sid`) USING BTREE -) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic; - -INSERT INTO `student` VALUES (1, '小明'); -INSERT INTO `student` VALUES (2, '小红'); -INSERT INTO `student` VALUES (3, '小黑'); -INSERT INTO `student` VALUES (4, '小白'); -``` - -#### 一维成绩表(score) - -```sql -DROP TABLE IF EXISTS `score`; -CREATE TABLE `score` ( - `cid` int(11) NOT NULL, - `sid` int(11) NULL DEFAULT NULL, - `cls` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, - `score` int(11) NULL DEFAULT NULL, - PRIMARY KEY (`cid`) USING BTREE -) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic; - -INSERT INTO `score` VALUES (1, 1, 'chinese', 90); -INSERT INTO `score` VALUES (2, 1, 'math', 100); -INSERT INTO `score` VALUES (3, 1, 'english', 95); -INSERT INTO `score` VALUES (4, 2, 'chinese', 98); -INSERT INTO `score` VALUES (5, 2, 'english', 99); -INSERT INTO `score` VALUES (6, 3, 'chinese', 99); -INSERT INTO `score` VALUES (7, 3, 'english', 100); -``` - -#### 前二排名表(scoretop2) - -```sql -DROP TABLE IF EXISTS `scoretop2`; -CREATE TABLE `scoretop2` ( - `cls` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL, - `score` int(11) NULL DEFAULT NULL, - `rank` int(11) NOT NULL, - PRIMARY KEY (`cls`, `rank`) USING BTREE -) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic; -``` - -#### 二维成绩单表(studentscore) - -```sql -DROP TABLE IF EXISTS `studentscore`; -CREATE TABLE `studentscore` ( - `sid` int(11) NOT NULL, - `name` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, - `chinese` int(11) NULL DEFAULT NULL, - `math` int(11) NULL DEFAULT NULL, - `english` int(11) NULL DEFAULT NULL, - PRIMARY KEY (`sid`) USING BTREE -) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic; -``` - -### 问题提出 - -#### 输出各科成绩前二的分数 - -要求输出已有学科排名前二的分数到scoretop2表中。 - -#### 输出二维成绩单 - -要求将一维成绩表转化为二维成绩单,其中不存在的成绩得分为0,并输出至studentscore表中。 - -## Dlink 的 AGGTABLE - -​ 本文以 Flink 官方的 Table Aggregate Functions 示例 Top2 为例进行比较说明,传送门 https://ci.apache.org/projects/flink/flink-docs-release-1.13/docs/dev/table/functions/udfs/#table-aggregate-functions - -### 官方 Table API 实现 - -```java -import org.apache.flink.api.java.tuple.Tuple2; -import org.apache.flink.table.api.*; -import org.apache.flink.table.functions.TableAggregateFunction; -import org.apache.flink.util.Collector; -import static org.apache.flink.table.api.Expressions.*; - -// mutable accumulator of structured type for the aggregate function -public static class Top2Accumulator { - public Integer first; - public Integer second; -} - -// function that takes (value INT), stores intermediate results in a structured -// type of Top2Accumulator, and returns the result as a structured type of Tuple2 -// for value and rank -public static class Top2 extends TableAggregateFunction, Top2Accumulator> { - - @Override - public Top2Accumulator createAccumulator() { - Top2Accumulator acc = new Top2Accumulator(); - acc.first = Integer.MIN_VALUE; - acc.second = Integer.MIN_VALUE; - return acc; - } - - public void accumulate(Top2Accumulator acc, Integer value) { - if (value > acc.first) { - acc.second = acc.first; - acc.first = value; - } else if (value > acc.second) { - acc.second = value; - } - } - - public void merge(Top2Accumulator acc, Iterable it) { - for (Top2Accumulator otherAcc : it) { - accumulate(acc, otherAcc.first); - accumulate(acc, otherAcc.second); - } - } - - public void emitValue(Top2Accumulator acc, Collector> out) { - // emit the value and rank - if (acc.first != Integer.MIN_VALUE) { - out.collect(Tuple2.of(acc.first, 1)); - } - if (acc.second != Integer.MIN_VALUE) { - out.collect(Tuple2.of(acc.second, 2)); - } - } -} - -TableEnvironment env = TableEnvironment.create(...); - -// call function "inline" without registration in Table API -env - .from("MyTable") - .groupBy($("myField")) - .flatAggregate(call(Top2.class, $("value"))) - .select($("myField"), $("f0"), $("f1")); - -// call function "inline" without registration in Table API -// but use an alias for a better naming of Tuple2's fields -env - .from("MyTable") - .groupBy($("myField")) - .flatAggregate(call(Top2.class, $("value")).as("value", "rank")) - .select($("myField"), $("value"), $("rank")); - -// register function -env.createTemporarySystemFunction("Top2", Top2.class); - -// call registered function in Table API -env - .from("MyTable") - .groupBy($("myField")) - .flatAggregate(call("Top2", $("value")).as("value", "rank")) - .select($("myField"), $("value"), $("rank")); -``` - -### Dlink FlinkSql 实现 - -#### 示例 - -```sql -CREATE AGGTABLE aggdemo AS -SELECT myField,value,rank -FROM MyTable -GROUP BY myField -AGG BY TOP2(value) as (value,rank); -``` - -#### 优势 - -​ 可以通过 FlinkSql 来实现表值聚合的需求,降低了开发与维护成本。 - -#### 缺点 - -​ 语法固定,示例关键字必须存在并进行描述,where 可以加在 FROM 和 GROUP BY 之间。 - -## Dlink 本地实现各科成绩前二 - -​ 本示例通过 Dlink 的本地环境进行演示实现。 - -### 进入Dlink - -![login_dinky](http://pic.dinky.org.cn/dinky/docs/zh-CN/extend/practice_guide/aggtable/login_dinky.png) - -​ 只有版本号大于等于 0.2.2-rc1 的 Dlink 才支持本文 AGGTABLE 的使用。 - -### 编写 FlinkSQL - -```sql -jdbcconfig:='connector' = 'jdbc', - 'url' = 'jdbc:mysql://127.0.0.1:3306/data?useUnicode=true&characterEncoding=UTF-8&autoReconnect=true&useSSL=false&zeroDateTimeBehavior=convertToNull&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true', - 'username'='dlink', - 'password'='dlink',; -CREATE TABLE student ( - sid INT, - name STRING, - PRIMARY KEY (sid) NOT ENFORCED -) WITH ( - ${jdbcconfig} - 'table-name' = 'student' -); -CREATE TABLE score ( - cid INT, - sid INT, - cls STRING, - score INT, - PRIMARY KEY (cid) NOT ENFORCED -) WITH ( - ${jdbcconfig} - 'table-name' = 'score' -); -CREATE TABLE scoretop2 ( - cls STRING, - score INT, - `rank` INT, - PRIMARY KEY (cls,`rank`) NOT ENFORCED -) WITH ( - ${jdbcconfig} - 'table-name' = 'scoretop2' -); -CREATE AGGTABLE aggscore AS -SELECT cls,score,rank -FROM score -GROUP BY cls -AGG BY TOP2(score) as (score,rank); - -insert into scoretop2 -select -b.cls,b.score,b.`rank` -from aggscore b -``` - -​ 本 Sql 使用了 Dinky 的增强特性 Fragment 机制,对 jdbc 的配置进行了定义。 - -### 维护 FlinkSQL 及配置 - -![maintain_flinksql_config](http://pic.dinky.org.cn/dinky/docs/zh-CN/extend/practice_guide/aggtable/maintain_flinksql_config.png) - -​ 编写 FlinkSQL ,配置开启 Fragment 机制,设置 Flink 集群为本地执行。点击保存。 - -### 同步执行INSERT - -![sync_run_insert](http://pic.dinky.org.cn/dinky/docs/zh-CN/extend/practice_guide/aggtable/sync_run_insert.png) - -​ 点击同步执行按钮运行当前编辑器中的 FlinkSQL 语句集。弹出提示信息,等待执行完成后自动关闭并刷新信息和结果。 - -​ 当前版本使用异步提交功能将直接提交任务到集群,Studio 不负责执行结果的记录。提交任务前请保存 FlinkSQL 和配置,否则将提交旧的语句和配置。 - -### 执行反馈 - -![run_feedback](http://pic.dinky.org.cn/dinky/docs/zh-CN/extend/practice_guide/aggtable/run_feedback.png) - -​ 本地执行成功,“0_admin” 为本地会话,里面存储了 Catalog。 - -### 同步执行SELECT查看中间过程 - -![sync_select_show_middle](http://pic.dinky.org.cn/dinky/docs/zh-CN/extend/practice_guide/aggtable/sync_select_show_middle.png) - -​ 由于当前会话中已经存储了表的定义,此时直接选中 select 语句点击同步执行可以重新计算并展示其计算过程中产生的结果,由于 Flink 表值聚合操作机制,该结果非最终结果。 - -### 同步执行SELECT查看最终结果 - -![sync_select_show_final](http://pic.dinky.org.cn/dinky/docs/zh-CN/extend/practice_guide/aggtable/sync_select_show_final.png) - - -​ 在草稿的页面使用相同的会话可以共享 Catalog,此时只需要执行 select 查询 sink 表就可以预览最终的统计结果。 - -### 查看Mysql表的数据 - -![show_mysql_data](http://pic.dinky.org.cn/dinky/docs/zh-CN/extend/practice_guide/aggtable/show_mysql_data.png) - - - -​ sink 表中只有五条数据,结果是正确的。 - -## Dlink 远程实现二维成绩单 - -​ 本示例通过 Dlink 控制远程集群来实现。 - -​ 远程集群的 lib 中需要上传 dlink-function.jar 。 - -### 编写FlinkSQL - -```sql -jdbcconfig:='connector' = 'jdbc', - 'url' = 'jdbc:mysql://127.0.0.1:3306/data?useUnicode=true&characterEncoding=UTF-8&autoReconnect=true&useSSL=false&zeroDateTimeBehavior=convertToNull&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true', - 'username'='dlink', - 'password'='dlink',; -CREATE TABLE student ( - sid INT, - name STRING, - PRIMARY KEY (sid) NOT ENFORCED -) WITH ( - ${jdbcconfig} - 'table-name' = 'student' -); -CREATE TABLE score ( - cid INT, - sid INT, - cls STRING, - score INT, - PRIMARY KEY (cid) NOT ENFORCED -) WITH ( - ${jdbcconfig} - 'table-name' = 'score' -); -CREATE TABLE studentscore ( - sid INT, - name STRING, - chinese INT, - math INT, - english INT, - PRIMARY KEY (sid) NOT ENFORCED -) WITH ( - ${jdbcconfig} - 'table-name' = 'studentscore' -); -CREATE AGGTABLE aggscore2 AS -SELECT sid,data -FROM score -GROUP BY sid -AGG BY TO_MAP(cls,score) as (data); - -insert into studentscore -select -a.sid,a.name, -cast(GET_KEY(b.data,'chinese','0') as int), -cast(GET_KEY(b.data,'math','0') as int), -cast(GET_KEY(b.data,'english','0') as int) -from student a -left join aggscore2 b on a.sid=b.sid -``` - -​ 本实例通过表值聚合将分组后的多行转单列然后通过 GET_KEY 取值的思路来实现。同时,也使用了 Fragment 机制。 - -### 同步执行 - -![sync_run](http://pic.dinky.org.cn/dinky/docs/zh-CN/extend/practice_guide/aggtable/sync_run.png) - -​ 与示例一相似,不同点在于需要更改集群配置为 远程集群。远程集群的注册在集群中心注册,Hosts 需要填写 JobManager 的地址,HA模式则使用英文逗号分割可能出现的地址,如“127.0.0.1:8081,127.0.0.2:8081,127.0.0.3:8081”。心跳监测正常的集群实例即可用于任务执行或提交。 - -### Flink UI - -![flink_webui](http://pic.dinky.org.cn/dinky/docs/zh-CN/extend/practice_guide/aggtable/flink_webui.png) - -​ 打开集群的 Flink UI 可以发现刚刚提交的批任务,此时可以发现集群版本号为 1.14.0 ,而 Dlink 默认版本为 1.14.0 ,所以一般大版本内可以互相兼容。 - -### 查看Mysql表的数据 - -![show_mysql_data_again](http://pic.dinky.org.cn/dinky/docs/zh-CN/extend/practice_guide/aggtable/show_mysql_data_again.png) - -​ 查看 Mysql 表的最终数据,发现存在四条结果,且也符合问题的要求。 - diff --git a/docs/docs/extend/practice_guide/cdc_kafka_multi_source_merge.md b/docs/docs/extend/practice_guide/cdc_kafka_multi_source_merge.md deleted file mode 100644 index 9bdef8b133..0000000000 --- a/docs/docs/extend/practice_guide/cdc_kafka_multi_source_merge.md +++ /dev/null @@ -1,351 +0,0 @@ ---- -sidebar_position: 5 -id: cdc_kafka_multi_source_merge -title: Flink CDC 和 Kafka 多源合并 ---- - - - - -# Flink CDC 和 Kafka 进行多源合并和下游同步更新 - - - - -编辑:谢帮桂 - -# 前言 - - - - - -本文主要是针对 Flink SQL 使用 Flink CDC 无法实现多库多表的多源合并问题,以及多源合并后如何对下游 Kafka 同步更新的问题,因为目前 Flink SQL 也只能进行单表 Flink CDC 的作业操作,这会导致数据库 CDC 的连接数过多。 - -但是 Flink CDC 的 DataStream API 是可以进行多库多表的同步操作的,本文希望利用 Flink CDC 的 DataStream API 进行多源合并后导入一个总线 Kafka,下游只需连接总线 Kafka 就可以实现 Flink SQL 的多源合并问题,资源复用。 - -# 环境 - - - - - -|Flink|1.13.3| -|:----|:----| -|Flink CDC|2.0| -|Kafka|2.13| -|Java|1.8| -|Dinky|5.0| - -我们先打印一下 Flink CDC 默认的序列化 JSON 格式如下: - -```json -SourceRecord{sourcePartition={server=mysql_binlog_source}, sourceOffset={ts_sec=1643273051, file=mysql_bin.000002, pos=5348135, row=1, server_id=1, event=2}} -ConnectRecord{topic='mysql_binlog_source.gmall.spu_info', kafkaPartition=null, key=Struct{id=12}, keySchema=Schema{mysql_binlog_source.gmall.spu_info.Key:STRUCT}, value=Struct{before=Struct{id=12,spu_name=华为智慧屏 14222K1 全面屏智能电视机,description=华为智慧屏 4K 全面屏智能电视机,category3_id=86,tm_id=3},after=Struct{id=12,spu_name=华为智慧屏 2K 全面屏智能电视机,description=华为智慧屏 4K 全面屏智能电视机,category3_id=86,tm_id=3},source=Struct{version=1.4.1.Final,connector=mysql,name=mysql_binlog_source,ts_ms=1643273051000,db=gmall,table=spu_info,server_id=1,file=mysql_bin.000002,pos=5348268,row=0,thread=3742},op=u,ts_ms=1643272979401}, valueSchema=Schema{mysql_binlog_source.gmall.spu_info.Envelope:STRUCT}, timestamp=null, headers=ConnectHeaders(headers=)} -``` - -可以看到,这种格式的 JSON,传给下游有很大的问题,要实现多源合并和同步更新,我们要解决以下两个问题。 - -**①总线 Kafka 传来的 Json,无法识别源库和源表来进行具体的表创建操作,因为不是固定的 Json 格式,建表 with 配置里也无法指定具体的库和表。** - -**②总线 Kafka 传来的 Json 如何进行 CRUD 等事件对 Kafka 流的同步操作,特别是 Delete,下游 kafka 如何感知来更新 ChangeLog。** - -# 查看文档 - - - - - -![see_debezium_document](http://pic.dinky.org.cn/dinky/docs/zh-CN/extend/practice_guide/cdc_kafka_multi_source_merge/see_debezium_document.png) - - -![see_debezium_document_create_table](http://pic.dinky.org.cn/dinky/docs/zh-CN/extend/practice_guide/cdc_kafka_multi_source_merge/see_debezium_document_create_table.png) - - - -我们可以看到红框部分,基于 Debezium 格式的 json 可以在 Kafka connector 建表中可以实现表的 CRUD 同步操作。只要总线 Kafka 的 json 格式符合该模式就可以对下游 kafka 进行 CRUD 的同步更新,刚好 Flink CDC 也是基于 Debezium。 - -那这里就已经解决了问题②。 - -剩下问题①,如何解决传来的多库多表进行指定表和库的识别,毕竟建表语句没有进行 where 的设置参数。 - -再往下翻文档: - -![see_debezium_document_create_table_info](http://pic.dinky.org.cn/dinky/docs/zh-CN/extend/practice_guide/cdc_kafka_multi_source_merge/see_debezium_document_create_table_info.png) - -可以看到,基于 Debezium-json 格式,可以把上面的 schema 定义的 json 格式的元数据给取出来放在字段里。 - -比如,我把 table 和 database 给放在建表语句里,那样我就可以在 select 语句中进行库和表的过滤了。 - -如下: - -```sql -CREATE TABLE Kafka_Table ( - origin_database STRING METADATA FROM 'value.source.database' VIRTUAL, //schema 定义的 json 里的元数据字段 - origin_table STRING METADATA FROM 'value.source.table' VIRTUAL, - `id` INT, - `spu_name` STRING, - `description` STRING, - `category3_id` INT, - `tm_id` INT -) WITH ( - 'connector' = 'kafka', - 'topic' = 'input_kafka4', - 'properties.group.id' = '57', - 'properties.bootstrap.servers' = '10.1.64.156:9092', - 'scan.startup.mode' = 'latest-offset', - 'debezium-json.ignore-parse-errors' = 'true', - 'format' = 'debezium-json' -); - -select * from Kafka_Table where origin_database='gmall' and origin_table = 'spu_info'; //这里就实现了指定库和表的过滤操作 -``` -那这样问题②就解决了。 -那我们现在就要做两个事情: - -**①写一个Flink CDC 的 DataStream 项目进行多库多表同步,传给总线 Kafka。** - -**②自定义总线 Kafka 的 json 格式。** - -# 新建Flink CDC的dataStream项目 - - - - - -```java -import com.alibaba.ververica.cdc.connectors.mysql.MySQLSource; -import com.alibaba.ververica.cdc.connectors.mysql.table.StartupOptions; -import com.alibaba.ververica.cdc.debezium.DebeziumSourceFunction; -import com.alibaba.ververica.cdc.debezium.StringDebeziumDeserializationSchema; -import org.apache.flink.api.common.serialization.SimpleStringSchema; -import org.apache.flink.runtime.state.filesystem.FsStateBackend; -import org.apache.flink.streaming.api.CheckpointingMode; -import org.apache.flink.streaming.api.datastream.DataStreamSource; -import org.apache.flink.streaming.api.environment.StreamExecutionEnvironment; -import org.apache.flink.streaming.connectors.kafka.FlinkKafkaProducer; - -public class FlinkCDC { - - public static void main(String[] args) throws Exception { - - //1.获取执行环境 - StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment(); - env.setParallelism(1); - - //1.1 设置 CK&状态后端 - //略 - - //2.通过 FlinkCDC 构建 SourceFunction 并读取数据 - DebeziumSourceFunction sourceFunction = MySQLSource.builder() - .hostname("10.1.64.157") - .port(3306) - .username("root") - .password("123456") - .databaseList("gmall") //这个注释,就是多库同步 - //.tableList("gmall.spu_info") //这个注释,就是多表同步 - .deserializer(new CustomerDeserialization()) //这里需要自定义序列化格式 - //.deserializer(new StringDebeziumDeserializationSchema()) //默认是这个序列化格式 - .startupOptions(StartupOptions.latest()) - .build(); - DataStreamSource streamSource = env.addSource(sourceFunction); - - //3.打印数据并将数据写入 Kafka - streamSource.print(); - String sinkTopic = "input_kafka4"; - streamSource.addSink(getKafkaProducer("10.1.64.156:9092",sinkTopic)); - - //4.启动任务 - env.execute("FlinkCDC"); - } - - //kafka 生产者 - public static FlinkKafkaProducer getKafkaProducer(String brokers,String topic) { - return new FlinkKafkaProducer(brokers, - topic, - new SimpleStringSchema()); - } - -} -``` - -## -# 自定义序列化类 - - - - - -```java - -import com.alibaba.fastjson.JSONObject; -import com.alibaba.ververica.cdc.debezium.DebeziumDeserializationSchema; -import io.debezium.data.Envelope; -import org.apache.flink.api.common.typeinfo.BasicTypeInfo; -import org.apache.flink.api.common.typeinfo.TypeInformation; -import org.apache.flink.util.Collector; -import org.apache.kafka.connect.data.Field; -import org.apache.kafka.connect.data.Schema; -import org.apache.kafka.connect.data.Struct; -import org.apache.kafka.connect.source.SourceRecord; -import java.util.ArrayList; -import java.util.List; - -public class CustomerDeserialization implements DebeziumDeserializationSchema { - - - @Override - public void deserialize(SourceRecord sourceRecord, Collector collector) throws Exception { - - //1.创建 JSON 对象用于存储最终数据 - JSONObject result = new JSONObject(); - - //2.获取库名&表名放入 source - String topic = sourceRecord.topic(); - String[] fields = topic.split("\\."); - String database = fields[1]; - String tableName = fields[2]; - JSONObject source = new JSONObject(); - source.put("database",database); - source.put("table",tableName); - - Struct value = (Struct) sourceRecord.value(); - //3.获取"before"数据 - Struct before = value.getStruct("before"); - JSONObject beforeJson = new JSONObject(); - if (before != null) { - Schema beforeSchema = before.schema(); - List beforeFields = beforeSchema.fields(); - for (Field field : beforeFields) { - Object beforeValue = before.get(field); - beforeJson.put(field.name(), beforeValue); - } - } - - //4.获取"after"数据 - Struct after = value.getStruct("after"); - JSONObject afterJson = new JSONObject(); - if (after != null) { - Schema afterSchema = after.schema(); - List afterFields = afterSchema.fields(); - for (Field field : afterFields) { - Object afterValue = after.get(field); - afterJson.put(field.name(), afterValue); - } - } - - //5.获取操作类型 CREATE UPDATE DELETE 进行符合 Debezium-op 的字母 - Envelope.Operation operation = Envelope.operationFor(sourceRecord); - String type = operation.toString().toLowerCase(); - if ("insert".equals(type)) { - type = "c"; - } - if ("update".equals(type)) { - type = "u"; - } - if ("delete".equals(type)) { - type = "d"; - } - if ("create".equals(type)) { - type = "c"; - } - - //6.将字段写入 JSON 对象 - result.put("source", source); - result.put("before", beforeJson); - result.put("after", afterJson); - result.put("op", type); - - //7.输出数据 - collector.collect(result.toJSONString()); - - } - - @Override - public TypeInformation getProducedType() { - return BasicTypeInfo.STRING_TYPE_INFO; - } -} -``` - -OK,运行 flinkCDC 项目,同步的数据库表插入一条记录,得出以下自定义格式后的 JSON: - -```json -{ - "op": "u", - "before": { - "spu_name": "香奈儿(Chanel)女士香水 5 号香水 粉邂逅柔情淡香水 EDT ", - "tm_id": 11, - "description": "香奈儿(Chanel)女士香水 5 号香水 粉邂逅柔情淡香水 EDT 111", - "id": 11, - "category3_id": 473 - }, - "source": { - "database": "gmall", - "table": "spu_info" - }, - "after": { - "spu_name": "香奈儿(Chanel)女士香水 5 号香水 粉邂逅柔情淡香水 EDTss ", - "tm_id": 11, - "description": "香奈儿(Chanel)女士香水 5 号香水 粉邂逅柔情淡香水 EDT 111", - "id": 11, - "category3_id": 473 - } -} -``` -PS:没放 schema{}这个对象,看文档说加了识别会影响效率。 -# 总线 Kafka - - - - - -![kafka_consumer_info](http://pic.dinky.org.cn/dinky/docs/zh-CN/extend/practice_guide/cdc_kafka_multi_source_merge/kafka_consumer_info.png) - - -# Dinky 里面进行建表,提交作业 - - - - - -![dinky_create_kafka_table](http://pic.dinky.org.cn/dinky/docs/zh-CN/extend/practice_guide/cdc_kafka_multi_source_merge/dinky_create_kafka_table.png) -PS:yarn-session 模式,记得开启预览结果和打印流,不然观察不到数据 changelog - - -# 查看结果 - - - - - -![mysql_insert_one_data](http://pic.dinky.org.cn/dinky/docs/zh-CN/extend/practice_guide/cdc_kafka_multi_source_merge/mysql_insert_one_data.png) - -![dinky_show_data](http://pic.dinky.org.cn/dinky/docs/zh-CN/extend/practice_guide/cdc_kafka_multi_source_merge/dinky_show_data.png) - -可以看到在指定库和表中新增一条数据,在下游 kafka 作业中实现了同步更新,然后试试对数据库该表的记录进行 delete,效果如下: - -![dinky_show_data_again](http://pic.dinky.org.cn/dinky/docs/zh-CN/extend/practice_guide/cdc_kafka_multi_source_merge/dinky_show_data_again.png) - -可以看到"是是是.."这条记录同步删除了。 - -此时 Flink CDC 的记录是这样: - -![show_cdc_data](http://pic.dinky.org.cn/dinky/docs/zh-CN/extend/practice_guide/cdc_kafka_multi_source_merge/show_cdc_data.png) - -原理主要是 op 去同步下游 kafka 的 changeLog 里的 op - -我们浏览一下 changeLog:(Dinky 选中打印流即可) - -![print_streaming](http://pic.dinky.org.cn/dinky/docs/zh-CN/extend/practice_guide/cdc_kafka_multi_source_merge/print_streaming.png) - -可以看到,op 自动识别总线 kafka 发来的 JSON 进行了同步来记录操作。 - -后续我们就可以插入 upsert-kafka 表进行具体的表操作了。 - -**完成!这样只需建一个 DataStream 的总线 jar,在 Dinky 中进行提交,后续下游的作业只需要 kafka 去接总线 kafka 就可以进行 Flink CDC 在 Flink SQL 里的多源合并和同步更新。** - -灵感和代码来自于尚硅谷,请支持 Dinky 和尚硅谷,另外是在测试环境进行,生产环境调优自行解决,如有更好的实践欢迎对文档进行 pr,感谢! - - - diff --git a/docs/docs/extend/practice_guide/clickhouse.md b/docs/docs/extend/practice_guide/clickhouse.md deleted file mode 100644 index 3222bbaf70..0000000000 --- a/docs/docs/extend/practice_guide/clickhouse.md +++ /dev/null @@ -1,10 +0,0 @@ ---- -sidebar_position: 7 -id: clickhouse -title: Clickhouse ---- - - - - -敬请期待 \ No newline at end of file diff --git a/docs/docs/extend/practice_guide/cross_join.md b/docs/docs/extend/practice_guide/cross_join.md deleted file mode 100644 index 984f14588b..0000000000 --- a/docs/docs/extend/practice_guide/cross_join.md +++ /dev/null @@ -1,116 +0,0 @@ ---- -sidebar_position: 17 -id: cross_join -title: cross join ---- - -## 列转行 - -也就是将数组展开,一行变多行,使用到 `cross join unnest()` 语句。 - -读取 hive 表数据,然后写入 hive 表。 - -### source - -`source_table` 表信息如下 - -```sql -CREATE TABLE `test.source_table`( - `col1` string, - `col2` array COMMENT '数组类型的字段') -ROW FORMAT SERDE - 'org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe' -STORED AS INPUTFORMAT - 'org.apache.hadoop.mapred.TextInputFormat' -OUTPUTFORMAT - 'org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat' -LOCATION - 'hdfs://hadoopCluster/user/hive/warehouse/test.db/source_table' -TBLPROPERTIES ( - 'transient_lastDdlTime'='1659261419') -; -``` - -`source_table` 表数据如下 - -![img.png](http://pic.dinky.org.cn/dinky/docs/zh-CN/sql_development_guide/example/hive_to_hive_explode_source_table_data.png) - -### sink - -`sink_table` 表信息如下 - -```sql -CREATE TABLE `test.sink_table`( - `col1` string, - `col2` string) -ROW FORMAT SERDE - 'org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe' -STORED AS INPUTFORMAT - 'org.apache.hadoop.mapred.TextInputFormat' -OUTPUTFORMAT - 'org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat' -LOCATION - 'hdfs://hadoopCluster/user/hive/warehouse/test.db/sink_table' -TBLPROPERTIES ( - 'transient_lastDdlTime'='1659261915') -; -``` - -`sink_table` 表数据如下 - -![img.png](http://pic.dinky.org.cn/dinky/docs/zh-CN/sql_development_guide/example/hive_to_hive_explode_sink_table_data.png) - -### flink sql 语句 - -下面将使用两种方言演示如何将数组中的数据展开 - -#### 使用flink方言 - -```sql -set 'table.local-time-zone' = 'GMT+08:00'; - --- 在需要读取hive或者是写入hive表时,必须创建hive catalog。 --- 创建catalog -create catalog hive with ( - 'type' = 'hive', - 'hadoop-conf-dir' = '/data/soft/dlink-0.6.6/hadoop-conf', - 'hive-conf-dir' = '/data/soft/dlink-0.6.6/hadoop-conf' -) -; - -use catalog hive; - - -insert overwrite test.sink_table -select col1, a.col -from test.source_table -cross join unnest(col2) as a (col) -; -``` - -#### 使用hive方言 - -```sql -set 'table.local-time-zone' = 'GMT+08:00'; - --- 在需要读取hive或者是写入hive表时,必须创建hive catalog。 --- 创建catalog -create catalog hive with ( - 'type' = 'hive', - 'hadoop-conf-dir' = '/data/soft/dlink-0.6.6/hadoop-conf', - 'hive-conf-dir' = '/data/soft/dlink-0.6.6/hadoop-conf' -) -; - -use catalog hive; - -load module hive; - -set 'table.sql-dialect' = 'hive'; - -insert overwrite table test.sink_table -select col1, a.col -from test.source_table -lateral view explode(col2) a as col -; -``` diff --git a/docs/docs/extend/practice_guide/dataspherestudio.md b/docs/docs/extend/practice_guide/dataspherestudio.md deleted file mode 100644 index 2dd3e26971..0000000000 --- a/docs/docs/extend/practice_guide/dataspherestudio.md +++ /dev/null @@ -1,10 +0,0 @@ ---- -sidebar_position: 13 -id: dataspherestudio -title: DataSphere Studio ---- - - - - -## 敬请期待 \ No newline at end of file diff --git a/docs/docs/extend/practice_guide/dolphinscheduler.md b/docs/docs/extend/practice_guide/dolphinscheduler.md deleted file mode 100644 index 48d38b2693..0000000000 --- a/docs/docs/extend/practice_guide/dolphinscheduler.md +++ /dev/null @@ -1,10 +0,0 @@ ---- -sidebar_position: 12 -id: dolphinscheduler -title: Dolphinscheduler ---- - - - - -## 敬请期待 \ No newline at end of file diff --git a/docs/docs/extend/practice_guide/doris.md b/docs/docs/extend/practice_guide/doris.md deleted file mode 100644 index ed8800eaec..0000000000 --- a/docs/docs/extend/practice_guide/doris.md +++ /dev/null @@ -1,208 +0,0 @@ ---- -sidebar_position: 8 -id: doris -title: Doris ---- - - - - -## 背景 - -Apache Doris是一个现代化的MPP分析型数据库产品。仅需亚秒级响应时间即可获得查询结果,有效地支持实时数据分析。例如固定历史报表,实时数据分析,交互式数据分析和探索式数据分析等。 - -目前 Doris 的生态正在建设中,本文将分享如何基于 Dlink 实现 Mysql 变动数据通过 Flink 实时入库 Doris。 - -## 准备 - -老规矩,列清各组件版本: - -| 组件 | 版本 | -| :-------------: | :----------: | -| Flink | 1.13.3 | -| Flink-mysql-cdc | 2.1.0 | -| Doris | 0.15.1-rc09 | -| doris-flink | 1.0-SNAPSHOT | -| Mysql | 8.0.13 | -| Dlink | 0.4.0 | - -需要注意的是,本文的 Doris 是基于 OracleJDK1.8 和 Scala 2.11 通过源码进行编译打包的,所以所有组件的 scala 均为 2.11,此处和 Doris 社区略有不同。 - -## 部署 - -本文的 Flink 和 Doris 的部署不做描述,详情请查阅官网。 - -[Doris]: https://doris.apache.org/master/zh-CN/extending-doris/flink-doris-connector.html#%E4%BD%BF%E7%94%A8%E6%96%B9%E6%B3%95 "Doris" - -本文在 Dlink 部署成功的基础上进行,如需查看具体部署步骤,请阅读《flink sql 知其所以然(十六):flink sql 开发企业级利器之 Dlink》。 - -Dlink 的 plugins 下添加 `doris-flink-1.0-SNAPSHOT.jar` 和 `flink-sql-connector-mysql-cdc-2.1.0.jar` 。重启 Dlink。 - -```java -plugins/ -- Flink 相关扩展 -|- doris-flink-1.0-SNAPSHOT.jar -|- flink-csv-1.13.3.jar -|- flink-dist_2.11-1.13.3.jar -|- flink-format-changelog-json-2.1.0.jar -|- flink-json-1.13.3.jar -|- flink-shaded-zookeeper-3.4.14.jar -|- flink-sql-connector-mysql-cdc-2.1.0.jar -|- flink-table_2.11-1.13.3.jar -|- flink-table-blink_2.11-1.13.3.jar -``` - -当然,如果您想直接使用 FLINK_HOME 的话,可以在 `auto.sh` 文件中 `SETTING` 变量添加`$FLINK_HOME/lib` 。 - -## 数据表 - -### 学生表 (student) - -```sql --- Mysql -DROP TABLE IF EXISTS `student`; -CREATE TABLE `student` ( - `sid` int(11) NOT NULL, - `name` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, - PRIMARY KEY (`sid`) USING BTREE -) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic; - -INSERT INTO `student` VALUES (1, '小红'); -INSERT INTO `student` VALUES (2, '小黑'); -INSERT INTO `student` VALUES (3, '小黄'); -``` - -### 成绩表(score) - -```sql --- Mysql -DROP TABLE IF EXISTS `score`; -CREATE TABLE `score` ( - `cid` int(11) NOT NULL, - `sid` int(11) NULL DEFAULT NULL, - `cls` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, - `score` int(11) NULL DEFAULT NULL, - PRIMARY KEY (`cid`) USING BTREE -) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic; - -INSERT INTO `score` VALUES (1, 1, 'chinese', 90); -INSERT INTO `score` VALUES (2, 1, 'math', 95); -INSERT INTO `score` VALUES (3, 1, 'english', 93); -INSERT INTO `score` VALUES (4, 2, 'chinese', 92); -INSERT INTO `score` VALUES (5, 2, 'math', 75); -INSERT INTO `score` VALUES (6, 2, 'english', 80); -INSERT INTO `score` VALUES (7, 3, 'chinese', 100); -INSERT INTO `score` VALUES (8, 3, 'math', 60); -``` - -### 学生成绩宽表(scoreinfo) - -```sql --- Doris -CREATE TABLE scoreinfo -( - cid INT, - sid INT, - name VARCHAR(32), - cls VARCHAR(32), - score INT -) -UNIQUE KEY(cid) -DISTRIBUTED BY HASH(cid) BUCKETS 10 -PROPERTIES("replication_num" = "1"); -``` - - - -## FlinkSQL - -```sql -CREATE TABLE student ( - sid INT, - name STRING, - PRIMARY KEY (sid) NOT ENFORCED -) WITH ( -'connector' = 'mysql-cdc', -'hostname' = '127.0.0.1', -'port' = '3306', -'username' = 'test', -'password' = '123456', -'database-name' = 'test', -'table-name' = 'student'); -CREATE TABLE score ( - cid INT, - sid INT, - cls STRING, - score INT, - PRIMARY KEY (cid) NOT ENFORCED -) WITH ( -'connector' = 'mysql-cdc', -'hostname' = '127.0.0.1', -'port' = '3306', -'username' = 'test', -'password' = '123456', -'database-name' = 'test', -'table-name' = 'score'); -CREATE TABLE scoreinfo ( - cid INT, - sid INT, - name STRING, - cls STRING, - score INT, - PRIMARY KEY (cid) NOT ENFORCED -) WITH ( -'connector' = 'doris', -'fenodes' = '127.0.0.1:8030' , -'table.identifier' = 'test.scoreinfo', -'username' = 'root', -'password'='' -); -insert into scoreinfo -select -a.cid,a.sid,b.name,a.cls,a.score -from score a -left join student b on a.sid = b.sid -``` - -## 调试 - -### 在 Dinky 中提交 - -本示例采用了 yarn-session 的方式进行提交。 -http://pic.dinky.org.cn/dinky/docs/zh-CN/extend/practice_guide -![dinky_submit](http://pic.dinky.org.cn/dinky/docs/zh-CN/extend/practice_guide/doris/dinky_submit.png) - -### FlinkWebUI - -![flink_webui](http://pic.dinky.org.cn/dinky/docs/zh-CN/extend/practice_guide/doris/flink_webui.png) - -上图可见,流任务已经成功被 Dinky 提交的远程集群了。 - -### Doris 查询 - -![doris_query](http://pic.dinky.org.cn/dinky/docs/zh-CN/extend/practice_guide/doris/doris_query.png) - -上图可见,Doris 已经被写入了历史全量数据。 - -### 增量测试 - -在 Mysql 中执行新增语句: - -```sql -INSERT INTO `score` VALUES (9, 3, 'english', 100); -``` - -Doris 成功被追加: - -![doris_show_data_change](http://pic.dinky.org.cn/dinky/docs/zh-CN/extend/practice_guide/doris/doris_show_data_change.png) - -### 变动测试 - -在 Mysql 中执行新增语句: - -```sql -update score set score = 100 where cid = 1 -``` - -Doris 成功被修改: - -![doris_show_data_change_again](http://pic.dinky.org.cn/dinky/docs/zh-CN/extend/practice_guide/doris/doris_show_data_change_again.png) \ No newline at end of file diff --git a/docs/docs/extend/practice_guide/flinkcdc.md b/docs/docs/extend/practice_guide/flinkcdc.md deleted file mode 100644 index 11c33227b3..0000000000 --- a/docs/docs/extend/practice_guide/flinkcdc.md +++ /dev/null @@ -1,12 +0,0 @@ ---- -sidebar_position: 4 -id: flinkcdc -title: Flink CDC ---- - - - - -## 扩展 Flink-CDC - -把 `flink-sql-connector-mysql-cdc-2.1.0.jar` 等 CDC 依赖加入到 Dlink 的 `plugins` 下即可。 \ No newline at end of file diff --git a/docs/docs/extend/practice_guide/hive.md b/docs/docs/extend/practice_guide/hive.md deleted file mode 100644 index 3a27e84952..0000000000 --- a/docs/docs/extend/practice_guide/hive.md +++ /dev/null @@ -1,98 +0,0 @@ ---- -sidebar_position: 6 -id: hive -title: Hive ---- - - - -## 前言 - -最近有很多小伙伴问,Dinky 如何连接 Hive 进行数据开发? - -关于 Dinky 连接 Hive 的步骤同 Flink 的 `sql-client ` ,只不过它没有默认加载的配置文件。下文将详细讲述对 Hive 操作的全过程。 - -## 准备工作 - -由于搭建 Hive 的开发环境会涉及到重多组件和插件,那其版本对应问题也是至关重要,它能帮我们避免很多不必要的问题,当然小版本号之间具备一定的兼容性。 - -我们先来梳理下本教程的各个组件版本: - -| 组件 | 版本 | -|:------:| :----: | -| Dinky | 0.3.2 | -| Flink | 1.12.4 | -| Hadoop | 2.7.7 | -| Hive | 2.3.6 | -| Mysql | 8.0.15 | - -再来梳理下本教程的各个插件版本: - -| 所属组件 | 插件 | 版本 | -|:-------------:|:-----------------------------------------------------:|:---------------------:| -| Dinky | dlink-client | 1.12 | -| Dinky & Flink | flink-sql-connector-hive | 2.3.6_2.11-1.12.3 | -| Dinky & Flink | flink-shaded-hadoop-3-uber | 3.1.1.7.2.8.0-224-9.0 | -| Hive | hive-exec & hive-jdbc & hive-metastore & hive-service | 2.1.1(根据自身hive版本定) | - -## 部署扩展 - -部署扩展的工作非常简单(前提是 Dlink 部署完成并成功连接 Flink 集群,相关部署步骤请查看《Dlink实时计算平台——部署篇》),只需要把 `flink-sql-connector-hive-2.3.6_2.11-1.12.3.jar` 和 `flink-shaded-hadoop-3-uber-3.1.1.7.2.8.0-224-9.0.jar` 两个插件分别加入到 Dlink 的 plugins 目录与 Flink 的 lib 目录下即可,然后重启二者。当然,还需要放置 `hive-site.xml`,位置自定义,Dlink 可以访问到即可。 - -## 创建 Hive Catalog - -已知,Hive 已经新建了一个数据库实例 `hdb` ,创建了一张表 `htest`,列为 `name` 和 `age`,存储位置默认为 `hdfs:///usr/local/hadoop/hive-2.3.9/warehouse/hdb.db` 。(此处为何 2.3.9 呢,因为 `flink-sql-connector-hive-2.3.6_2.11-1.12.3.jar` 只支持到最高版本 2.3.6,小编先装了个 2.3.9 后装了个 2.3.6,尴尬 > _ < ~) - -```sql -CREATE CATALOG myhive WITH ( - 'type' = 'hive', - 'default-database' = 'hdb', - 'hive-conf-dir' = '/usr/local/dlink/hive-conf' -); --- set the HiveCatalog as the current catalog of the session -USE CATALOG myhive; -select * from htest -``` - -在 Dinky 编辑器中输入以上 sql ,创建 Hive Catalog,并查询一张表。 - -其中,`hive-conf-dir` 需要指定 `hive-site.xml` 的路径,其他同 Flink 官方解释。 - -执行查询后(记得选中执行配置的预览结果),可以从查询结果中查看到 htest 表中只有一条数据。(这是正确的,因为小编太懒了,只随手模拟了一条数据) - -此时可以使用 FlinkSQL 愉快地操作 Hive 的数据了。 - -## 使用 Hive Dialect - -很熟悉 Hive 的语法以及需要对 Hive 执行其自身特性的语句怎么办? - -同 Flink 官方解释一样,只需要使用 `SET table.sql-dialect=hive` 来启用方言即可。注意有两种方言 `default` 和 `hive` ,它们的使用可以随意切换哦~ - -```sql -CREATE CATALOG myhive WITH ( - 'type' = 'hive', - 'default-database' = 'hdb', - 'hive-conf-dir' = '/usr/local/dlink/hive-conf' -); --- set the HiveCatalog as the current catalog of the session -USE CATALOG myhive; --- set hive dialect -SET table.sql-dialect=hive; --- alter table location -alter table htest set location 'hdfs:///usr/htest'; --- set default dialect -SET table.sql-dialect=default; -select * from htest; -``` - -上述 sql 中添加了 Hive Dialect 的使用,FlinkSQL 本身不支持 `alter table .. set location ..` 的语法,使用 Hive Dialect 则可以实现语法的切换。本 sql 内容对 htest 表进行存储位置的改变,将其更改为一个新的路径,然后再执行查询。 - -由上图可见,被更改过 location 的 htest 此时查询没有数据,是正确的。 - -然后将 location 更改为之前的路径,再执行查询,则可见原来的那条数据,如下图所示。 - -## 总结 - -由上所知,Dlink 以更加友好的交互方式展现了 Flink 集成 Hive 的部分功能,当然其他更多的 Hive 功能需要您自己在使用的过程中去体验与挖掘。 - -目前,Dlink 支持 Flink 绝大多数特性与功能,集成与拓展方式与 Flink 官方文档描述一致,只需要在 Dlink 的 plugins 目录下添加依赖即可。 \ No newline at end of file diff --git a/docs/docs/extend/practice_guide/hudi.md b/docs/docs/extend/practice_guide/hudi.md deleted file mode 100644 index c64f2a4dd1..0000000000 --- a/docs/docs/extend/practice_guide/hudi.md +++ /dev/null @@ -1,298 +0,0 @@ ---- -sidebar_position: 9 -id: hudi -title: Hudi ---- - - - -## 背景资料 - -Apache hudi (发音为“ hoodie”)是下一代流式数据湖平台。Apache Hudi 将核心仓库和数据库功能直接引入到数据库中。Hudi 提供表、事务、高效的升级/删除、高级索引、流式摄入服务、数据集群/压缩优化和并发,同时保持数据以开放源码文件格式存储 , Apache Hudi 不仅非常适合流式工作负载,而且它还允许您创建高效的增量批处理管道。 - -实时数仓流批一体已经成为大势所趋。 - -为什么要使用 Hudi ? - -1. 目前业务架构较为繁重 - -2. 维护多套框架 - -3. 数据更新频率较大 - -## 准备&&部署 - -| 组件 | 版本 | 备注 | -| ------------- | ----------------------------------- | ---------- | -| Flink | 1.13.5 | 集成到CM | -| Flink-SQL-CDC | 2.1.1 | | -| Hudi | 0.10.0-patch | 打过补丁的 | -| Mysql | 8.0.13 | 阿里云 | -| Dlink | dlink-release-0.5.0-SNAPSHOT.tar.gz | | -| Scala | 2.12 | | - -### 1. 部署Flink1.13.5 - -flink 集成到CM中 - -此步骤略。 - -### 2. 集成Hudi 0.10.0 - -​ ①. 地址: https://github.com/danny0405/hudi/tree/010-patch 打过补丁的 大佬请忽略^_^ - -​ a. 下载压缩包 分支010-patch 不要下载 master 上传 解压 - -​ b. unzip 010-patch.zip - -​ c. 找到 `packging--hudi-flink-bundle` 下的 `pom.xml`,更改 `flink-bundel-shade-hive2` 下的 `hive-version` 更改为 `2.1.1-chd6.3.2` 的版本。 - -```shell -vim pom.xml # 修改hive版本为 : 2.1.1-cdh6.3.2 -``` - -​ d. 执行编译: - -```shell -mvn clean install -DskipTests -DskipITs -Dcheckstyle.skip=true -Drat.skip=true -Dhadoop.version=3.0.0 -Pflink-bundle-shade-hive2 -Dscala-2.12 -``` - -​ 因为 `chd6.3.0` 使用的是 `hadoop3.0.0` ,所以要指定 `hadoop` 的版本, `hive` 使用的是 `2.1.1` 的版本,也要指定 `hive` 的版本,不然使用 `sync to hive` 的时候,会报类的冲突问题。 `scala` 版本是 `2.12` 。 - -​ 同时 flink 集成到 cm 的时候也是 `scala2.12` 版本统一。 - -编译完成如下图: - -![hudill](http://pic.dinky.org.cn/dinky/docs/zh-CN/extend/practice_guide/hudi/hudill.png) - -②. 把相关应的jar包 放到相对应的目录下 - -```shell -# hudi的包 -ln -s /opt/module/hudi-0.10.0/hudi-hadoop-mr-bundle/target/hudi-hadoop-mr-bundle-0.10.0.jar /opt/cloudera/parcels/CDH/jars/ -ln -s /opt/module/hudi-0.10.0/hudi-hive-sync-bundle/target/hudi-hive-sync-bundle-0.10.0.jar /opt/cloudera/parcels/CDH/jars/ -ln -s /opt/module/hudi-0.10.0/hudi-hive-sync-bundle/target/hudi-hive-sync-bundle-0.10.0.jar /opt/cloudera/parcels/CDH/lib/hive/lib -# 同步sync to hive 每台节点都要放 -cp /opt/module/hudi-0.10.0/hudi-flink-bundle/target/hudi-flink-bundle_2.12-0.10.0.jar /opt/cloudera/parcels/FLINK/lib/flink/lib/ -# 以下三个jar 放到flink/lib 下 否则同步数据到hive的时候会报错 -cp /opt/cloudera/parcels/CDH/lib/hadoop-mapreduce/hadoop-mapreduce-client-core-3.0.0-cdh6.3.2.jar /opt/module/flink-1.13.5/lib/ -cp /opt/cloudera/parcels/CDH/lib/hadoop-mapreduce/hadoop-mapreduce-client-common-3.0.0-cdh6.3.2.jar /opt/module/flink-1.13.5/lib/ -cp /opt/cloudera/parcels/CDH/lib/hadoop-mapreduce/hadoop-mapreduce-client-jobclient-3.0.0-cdh6.3.2.jar /opt/module/flink-1.13.5/lib/ -# 执行以下命令 -cd /opt/module/flink-1.13.5/lib/ -scp -r ./* cdh5:`pwd` -scp -r ./* cdh6:`pwd` -scp -r ./* cdh7:`pwd` -``` - - - -### 3. 安装 Dlink-0.5.0 - -a. github 地址: https://github.com/DataLinkDC/dlink - -b. 部署步骤见 github-readme.md 传送门: https://github.com/DataLinkDC/dlink/blob/main/README.md - -ps: 注意 还需要将 `hudi-flink-bundle_2.12-0.10.0.jar` 这个包放到 dlink的 `plugins` 下 。 - -`plugins` 下的包 如下图所示: - -![dlinkll](http://pic.dinky.org.cn/dinky/docs/zh-CN/extend/practice_guide/hudi/dlinkll.png) - -c. 访问: [http://ip:port/#/user/login](http://cdh7.vision.com:8811/#/user/login) 默认用户: admin 密码: admin - -d. 创建集群实例: - -![hudi_cluster](http://pic.dinky.org.cn/dinky/docs/zh-CN/extend/practice_guide/hudi/hudi_cluster.png) - -![hudi_clustertable](http://pic.dinky.org.cn/dinky/docs/zh-CN/extend/practice_guide/hudi/hudi_clustertable.png) - -## 数据表 - -### 1. DDL准备 - -(以下ddl 通过Python程序模板生成 大佬请略过! O(∩_∩)O ) - -```sql -------------- '订单表' order_mysql_goods_order ----------------- -CREATE TABLE source_order_mysql_goods_order ( - `goods_order_id` bigint COMMENT '自增主键id' - , `goods_order_uid` string COMMENT '订单uid' - , `customer_uid` string COMMENT '客户uid' - , `customer_name` string COMMENT '客户name' - , `student_uid` string COMMENT '学生uid' - , `order_status` bigint COMMENT '订单状态 1:待付款 2:部分付款 3:付款审核 4:已付款 5:已取消' - , `is_end` bigint COMMENT '订单是否完结 1.未完结 2.已完结' - , `discount_deduction` bigint COMMENT '优惠总金额(单位:分)' - , `contract_deduction` bigint COMMENT '老合同抵扣金额(单位:分)' - , `wallet_deduction` bigint COMMENT '钱包抵扣金额(单位:分)' - , `original_price` bigint COMMENT '订单原价(单位:分)' - , `real_price` bigint COMMENT '实付金额(单位:分)' - , `pay_success_time` timestamp(3) COMMENT '完全支付时间' - , `tags` string COMMENT '订单标签(1新签 2续费 3扩科 4报名-合新 5转班-合新 6续费-合新 7试听-合新)' - , `status` bigint COMMENT '是否有效(1.生效 2.失效 3.超时未付款)' - , `remark` string COMMENT '订单备注' - , `delete_flag` bigint COMMENT '是否删除(1.否,2.是)' - , `test_flag` bigint COMMENT '是否测试数据(1.否,2.是)' - , `create_time` timestamp(3) COMMENT '创建时间' - , `update_time` timestamp(3) COMMENT '更新时间' - , `create_by` string COMMENT '创建人uid(唯一标识)' - , `update_by` string COMMENT '更新人uid(唯一标识)' - ,PRIMARY KEY(goods_order_id) NOT ENFORCED -) COMMENT '订单表' -WITH ( - 'connector' = 'mysql-cdc' - ,'hostname' = 'rm-bp1t34384933232rds.aliyuncs.com' - ,'port' = '3306' - ,'username' = 'app_kfkdr' - ,'password' = 'CV122fff0E40' - ,'server-time-zone' = 'UTC' - ,'scan.incremental.snapshot.enabled' = 'true' - ,'debezium.snapshot.mode'='latest-offset' -- 或者key是scan.startup.mode,initial表示要历史数据,latest-offset表示不要历史数据 - ,'debezium.datetime.format.date'='yyyy-MM-dd' - ,'debezium.datetime.format.time'='HH-mm-ss' - ,'debezium.datetime.format.datetime'='yyyy-MM-dd HH-mm-ss' - ,'debezium.datetime.format.timestamp'='yyyy-MM-dd HH-mm-ss' - ,'debezium.datetime.format.timestamp.zone'='UTC+8' - ,'database-name' = 'order' - ,'table-name' = 'goods_order' - -- ,'server-id' = '2675788754-2675788754' -); -CREATE TABLE sink_order_mysql_goods_order( - `goods_order_id` bigint COMMENT '自增主键id' - , `goods_order_uid` string COMMENT '订单uid' - , `customer_uid` string COMMENT '客户uid' - , `customer_name` string COMMENT '客户name' - , `student_uid` string COMMENT '学生uid' - , `order_status` bigint COMMENT '订单状态 1:待付款 2:部分付款 3:付款审核 4:已付款 5:已取消' - , `is_end` bigint COMMENT '订单是否完结 1.未完结 2.已完结' - , `discount_deduction` bigint COMMENT '优惠总金额(单位:分)' - , `contract_deduction` bigint COMMENT '老合同抵扣金额(单位:分)' - , `wallet_deduction` bigint COMMENT '钱包抵扣金额(单位:分)' - , `original_price` bigint COMMENT '订单原价(单位:分)' - , `real_price` bigint COMMENT '实付金额(单位:分)' - , `pay_success_time` timestamp(3) COMMENT '完全支付时间' - , `tags` string COMMENT '订单标签(1新签 2续费 3扩科 4报名-合新 5转班-合新 6续费-合新 7试听-合新)' - , `status` bigint COMMENT '是否有效(1.生效 2.失效 3.超时未付款)' - , `remark` string COMMENT '订单备注' - , `delete_flag` bigint COMMENT '是否删除(1.否,2.是)' - , `test_flag` bigint COMMENT '是否测试数据(1.否,2.是)' - , `create_time` timestamp(3) COMMENT '创建时间' - , `update_time` timestamp(3) COMMENT '更新时间' - , `create_by` string COMMENT '创建人uid(唯一标识)' - , `update_by` string COMMENT '更新人uid(唯一标识)' - ,PRIMARY KEY (goods_order_id) NOT ENFORCED -) COMMENT '订单表' -WITH ( - 'connector' = 'hudi' - , 'path' = 'hdfs://cluster1/data/bizdata/cdc/mysql/order/goods_order' -- 路径会自动创建 - , 'hoodie.datasource.write.recordkey.field' = 'goods_order_id' -- 主键 - , 'write.precombine.field' = 'update_time' -- 相同的键值时,取此字段最大值,默认ts字段 - , 'read.streaming.skip_compaction' = 'true' -- 避免重复消费问题 - , 'write.bucket_assign.tasks' = '2' -- 并发写的 bucekt 数 - , 'write.tasks' = '2' - , 'compaction.tasks' = '1' - , 'write.operation' = 'upsert' -- UPSERT(插入更新)\INSERT(插入)\BULK_INSERT(批插入)(upsert性能会低些,不适合埋点上报) - , 'write.rate.limit' = '20000' -- 限制每秒多少条 - , 'table.type' = 'COPY_ON_WRITE' -- 默认COPY_ON_WRITE , - , 'compaction.async.enabled' = 'true' -- 在线压缩 - , 'compaction.trigger.strategy' = 'num_or_time' -- 按次数压缩 - , 'compaction.delta_commits' = '20' -- 默认为5 - , 'compaction.delta_seconds' = '60' -- 默认为1小时 - , 'hive_sync.enable' = 'true' -- 启用hive同步 - , 'hive_sync.mode' = 'hms' -- 启用hive hms同步,默认jdbc - , 'hive_sync.metastore.uris' = 'thrift://cdh2.vision.com:9083' -- required, metastore的端口 - , 'hive_sync.jdbc_url' = 'jdbc:hive2://cdh1.vision.com:10000' -- required, hiveServer地址 - , 'hive_sync.table' = 'order_mysql_goods_order' -- required, hive 新建的表名 会自动同步hudi的表结构和数据到hive - , 'hive_sync.db' = 'cdc_ods' -- required, hive 新建的数据库名 - , 'hive_sync.username' = 'hive' -- required, HMS 用户名 - , 'hive_sync.password' = '123456' -- required, HMS 密码 - , 'hive_sync.skip_ro_suffix' = 'true' -- 去除ro后缀 -); ----------- source_order_mysql_goods_order=== TO ==>> sink_order_mysql_goods_order ------------ -insert into sink_order_mysql_goods_order select * from source_order_mysql_goods_order; -``` - -## 调试 - -### 1.对上述SQL执行语法校验: - -![hudi_explainsql](http://pic.dinky.org.cn/dinky/docs/zh-CN/extend/practice_guide/hudi/hudi_explainsql.png) - -### 2. 获取JobPlan - -![hudi_jobplan](http://pic.dinky.org.cn/dinky/docs/zh-CN/extend/practice_guide/hudi/hudi_jobplan.png) - -### 3. 执行任务 - -![hudi_executesql](http://pic.dinky.org.cn/dinky/docs/zh-CN/extend/practice_guide/hudi/hudi_executesql.png) - -### 4. dlink 查看执行的任务 - -![hudi_process](http://pic.dinky.org.cn/dinky/docs/zh-CN/extend/practice_guide/hudi/hudi_process.png) - -### 5. Flink-webUI 查看 作业 - -![hudi_flink](http://pic.dinky.org.cn/dinky/docs/zh-CN/extend/practice_guide/hudi/hudi_flink.png) - -### 6. 查看hdfs路径下数据 - -![hudi_hdfs](http://pic.dinky.org.cn/dinky/docs/zh-CN/extend/practice_guide/hudi/hudi_hdfs.png) - -### 7. 查看hive表: - -![hudi_hiveupdate](http://pic.dinky.org.cn/dinky/docs/zh-CN/extend/practice_guide/hudi/hudi_hiveupdate.png) - -查看订单号对应的数据 - -![hudi_hiveupdate](http://pic.dinky.org.cn/dinky/docs/zh-CN/extend/practice_guide/hudi/hudi_hiveupdate.png) - -### 8.更新数据操作 - -​ - -```sql - UPDATE `order`.`goods_order` - SET - `remark` = 'cdc_test update' - WHERE - `goods_order_id` = 73270; -``` - -再次查看 hive 数据 发现已经更新 - -![hudi_hiveupdate](http://pic.dinky.org.cn/dinky/docs/zh-CN/extend/practice_guide/hudi/hudi_hiveupdate.png) - -### 9.删除数据操作 - -(内部业务中采用逻辑删除 不使用物理删除 此例仅演示/测试使用 谨慎操作) - -```sql - delete from `order`.`goods_order` where goods_order_id='73270'; -``` - - - -![hudi_hivedelete](http://pic.dinky.org.cn/dinky/docs/zh-CN/extend/practice_guide/hudi/hudi_hivedelete.png) - -### 10.将此数据再次插入 - -​ - -```sql -INSERT INTO `order`.`goods_order`(`goods_order_id`, `goods_order_uid`, `customer_uid`, `customer_name`, `student_uid`, `order_status`, `is_end`, `discount_deduction`, `contract_deduction`, `wallet_deduction`, `original_price`, `real_price`, `pay_success_time`, `tags`, `status`, `remark`, `delete_flag`, `test_flag`, `create_time`, `update_time`, `create_by`, `update_by`) VALUES (73270, '202112121667480848077045760', 'VA100002435', 'weweweywu', 'S100002435', 4, 1, 2000000, 0, 0, 2000000, 0, '2021-12-12 18:51:41', '1', 1, '', 1, 1, '2021-12-12 18:51:41', '2022-01-10 13:53:59', 'VA100681', 'VA100681'); -``` - -再次查询hive数据 数据正常进入。 - -![hudi_hiveinsert](http://pic.dinky.org.cn/dinky/docs/zh-CN/extend/practice_guide/hudi/hudi_hiveinsert.png) - -至此 Dlink在Flink-SQL-CDC 到Hudi Sync Hive 测试结束 - -## 结论 - -通过 Dlink + Flink-Mysql-CDC + Hudi 的方式大大降低了我们流式入湖的成本,其中 Flink-Mysql-CDC 简化了CDC的架构与成本,而 Hudi 高性能的读写更有利于变动数据的存储,最后 Dlink 则将整个数据开发过程 sql 平台化,使我们的开发运维更加专业且舒适,期待 Dlink 后续的发展。 - - -## 作者 -zhumingye \ No newline at end of file diff --git a/docs/docs/extend/practice_guide/iceberg.md b/docs/docs/extend/practice_guide/iceberg.md deleted file mode 100644 index d869f2d86b..0000000000 --- a/docs/docs/extend/practice_guide/iceberg.md +++ /dev/null @@ -1,9 +0,0 @@ ---- -sidebar_position: 10 -id: iceberg -title: Iceberg ---- - - - -## 敬请期待 \ No newline at end of file diff --git a/docs/docs/extend/practice_guide/kafka_to_hive.md b/docs/docs/extend/practice_guide/kafka_to_hive.md deleted file mode 100644 index 1334cddc39..0000000000 --- a/docs/docs/extend/practice_guide/kafka_to_hive.md +++ /dev/null @@ -1,208 +0,0 @@ ---- -sidebar_position: 14 -id: kafka_to_hive -title: kafka写入hive ---- - - - - -## 写入无分区表 - -下面的案例演示的是将 kafka 表中的数据,经过处理之后,直接写入 hive 无分区表,具体 hive 表中的数据什么时候可见,具体请查看 `insert` 语句中对 hive 表使用的 sql 提示。 - -### hive 表 - -```sql -CREATE TABLE `test.order_info`( - `id` int COMMENT '订单id', - `product_count` int COMMENT '购买商品数量', - `one_price` double COMMENT '单个商品价格') -ROW FORMAT SERDE - 'org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe' -STORED AS INPUTFORMAT - 'org.apache.hadoop.mapred.TextInputFormat' -OUTPUTFORMAT - 'org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat' -LOCATION - 'hdfs://hadoopCluster/user/hive/warehouse/test.db/order_info' -TBLPROPERTIES ( - 'transient_lastDdlTime'='1659250044') -; -``` - -### flink sql 语句 - -```sql --- 如果是 flink-1.13.x ,则需要手动设置该参数 -set 'table.dynamic-table-options.enabled' = 'true'; - --- 在需要读取hive或者是写入hive表时,必须创建hive catalog。 --- 创建catalog -create catalog hive with ( - 'type' = 'hive', - 'hadoop-conf-dir' = '/data/soft/dlink-0.6.6/hadoop-conf', - 'hive-conf-dir' = '/data/soft/dlink-0.6.6/hadoop-conf' -) -; - -use catalog hive; - --- 创建连接 kafka 的虚拟表作为 source,此处使用 temporary ,是为了不让创建的虚拟表元数据保存到 hive,可以让任务重启是不出错。 --- 如果想让虚拟表元数据保存到 hive ,则可以在创建语句中加入 if not exist 语句。 -CREATE temporary TABLE source_kafka( - id integer comment '订单id', - product_count integer comment '购买商品数量', - one_price double comment '单个商品价格' -) WITH ( - 'connector' = 'kafka', - 'topic' = 'data_gen_source', - 'properties.bootstrap.servers' = 'node01:9092,node02:9092,node03:9092', - 'properties.group.id' = 'for_source_test', - 'scan.startup.mode' = 'latest-offset', - 'format' = 'csv', - 'csv.field-delimiter' = ' ' -) -; - -insert into test.order_info --- 下面的语法是 flink sql 提示,用于在语句中使用到表时手动设置一些临时的参数 -/*+ -OPTIONS( - -- 设置写入的文件滚动时间间隔 - 'sink.rolling-policy.rollover-interval' = '10 s', - -- 设置检查文件是否需要滚动的时间间隔 - 'sink.rolling-policy.check-interval' = '1 s', - -- sink 并行度 - 'sink.parallelism' = '1' -) - */ -select id, product_count, one_price -from source_kafka -; -``` - -flink sql 写入 hive ,依赖的是 fileSystem 连接器,该连接器写入到文件系统的文件可见性,依赖于 flink 任务的 checkpoint , -所以 dlink 界面提交任务时,一定要开启 checkpoint ,也就是设置 checkpoint 的时间间隔参数 `execution.checkpointing.interval` ,如下图所示,设置为 10000 毫秒。 - -![img.png](http://pic.dinky.org.cn/dinky/docs/zh-CN/sql_development_guide/example/kafka_to_hive_dlink_ui.jpg) - -任务运行之后,就可以看到如下的 fink ui 界面了 - -![img.png](http://pic.dinky.org.cn/dinky/docs/zh-CN/sql_development_guide/example/kafka_to_hive_flink_ui.png) - -本案例使用 streaming 方式运行, checkpoint 时间为 10 s,文件滚动时间为 10 s,在配置的时间过后,就可以看到 hive 中的数据了 - -![img.png](http://pic.dinky.org.cn/dinky/docs/zh-CN/sql_development_guide/example/kafka_to_hive_hive_data.png) - -从 hdfs 上查看 hive 表对应文件的数据,如下图所示 - -![img.png](http://pic.dinky.org.cn/dinky/docs/zh-CN/sql_development_guide/example/kafka_to_hive_hive_table_hdfs_file.png) - -可以看到,1 分钟滚动生成了 6 个文件,最新文件为 .part 开头的文件,在 hdfs 中,以 `.` 开头的文件,是不可见的,说明这个文件是由于我关闭了 flink sql 任务,然后文件无法滚动造成的。 - -有关读写 hive 的一些配置和读写 hive 表时其数据的可见性,可以看考[读写hive](https://nightlies.apache.org/flink/flink-docs-release-1.15/docs/connectors/table/hive/hive_read_write/)页面。 - -## 写入分区表 - -### hive 表 - -```sql -CREATE TABLE `test.order_info_have_partition`( - `product_count` int COMMENT '购买商品数量', - `one_price` double COMMENT '单个商品价格') -PARTITIONED BY ( - `minute` string COMMENT '订单时间,分钟级别', - `order_id` int COMMENT '订单id') -ROW FORMAT SERDE - 'org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe' -STORED AS INPUTFORMAT - 'org.apache.hadoop.mapred.TextInputFormat' -OUTPUTFORMAT - 'org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat' -LOCATION - 'hdfs://hadoopCluster/user/hive/warehouse/test.db/order_info_have_partition' -TBLPROPERTIES ( - 'transient_lastDdlTime'='1659254559') -; -``` - -### flink sql 语句 - -```sql --- 如果是 flink-1.13.x ,则需要手动设置该参数 -set 'table.dynamic-table-options.enabled' = 'true'; - --- 在需要读取hive或者是写入hive表时,必须创建hive catalog。 --- 创建catalog -create catalog hive with ( - 'type' = 'hive', - 'hadoop-conf-dir' = '/data/soft/dlink-0.6.6/hadoop-conf', - 'hive-conf-dir' = '/data/soft/dlink-0.6.6/hadoop-conf' -) -; - -use catalog hive; - --- 创建连接 kafka 的虚拟表作为 source,此处使用 temporary ,是为了不让创建的虚拟表元数据保存到 hive,可以让任务重启是不出错。 --- 如果想让虚拟表元数据保存到 hive ,则可以在创建语句中加入 if not exist 语句。 -CREATE temporary TABLE source_kafka( - event_time TIMESTAMP(3) METADATA FROM 'timestamp', - id integer comment '订单id', - product_count integer comment '购买商品数量', - one_price double comment '单个商品价格' -) WITH ( - 'connector' = 'kafka', - 'topic' = 'data_gen_source', - 'properties.bootstrap.servers' = 'node01:9092,node02:9092,node03:9092', - 'properties.group.id' = 'for_source_test', - 'scan.startup.mode' = 'latest-offset', - 'format' = 'csv', - 'csv.field-delimiter' = ' ' -) -; - -insert into test.order_info_have_partition --- 下面的语法是 flink sql 提示,用于在语句中使用到表时手动设置一些临时的参数 -/*+ -OPTIONS( - -- 设置分区提交触发器为分区时间 - 'sink.partition-commit.trigger' = 'partition-time', --- 'partition.time-extractor.timestamp-pattern' = '$year-$month-$day $hour:$minute', - -- 设置时间提取器的时间格式,要和分区字段值的格式保持一直 - 'partition.time-extractor.timestamp-formatter' = 'yyyy-MM-dd_HH:mm', - -- 设置分区提交延迟时间,这儿设置 1 分钟,是因为分区时间为 1 分钟间隔 - 'sink.partition-commit.delay' = '1 m', - -- 设置水印时区 - 'sink.partition-commit.watermark-time-zone' = 'GMT+08:00', - -- 设置分区提交策略,这儿是将分区提交到元数据存储,并且在分区目录下生成 success 文件 - 'sink.partition-commit.policy.kind' = 'metastore,success-file', - -- sink 并行度 - 'sink.parallelism' = '1' -) - */ -select - product_count, - one_price, - -- 不要让分区值中带有空格,分区值最后会变成目录名,有空格的话,可能会有一些未知问题 - date_format(event_time, 'yyyy-MM-dd_HH:mm') as `minute`, - id as order_id -from source_kafka -; -``` - -flink sql 任务运行的 UI 界面如下 - -![img.png](http://pic.dinky.org.cn/dinky/docs/zh-CN/sql_development_guide/example/kafka_to_hive_partition_table_flink_ui.png) - -1 分钟之后查看 hive 表中数据,如下 - -![img.png](http://pic.dinky.org.cn/dinky/docs/zh-CN/sql_development_guide/example/kafka_to_hive_partition_table_data.png) - -查看 hive 表对应 hdfs 上的文件,可以看到 - -![img.png](http://pic.dinky.org.cn/dinky/docs/zh-CN/sql_development_guide/example/kafka_to_hive_partition_table_hdfs_file.png) - -从上图可以看到,具体的分区目录下生成了 `_SUCCESS` 文件,表示该分区提交成功。 - - diff --git a/docs/docs/extend/practice_guide/kudu.md b/docs/docs/extend/practice_guide/kudu.md deleted file mode 100644 index e988d82547..0000000000 --- a/docs/docs/extend/practice_guide/kudu.md +++ /dev/null @@ -1,118 +0,0 @@ ---- -sidebar_position: 13 -id: kudu -title: kudu ---- - - - -# Kudu - -> 编辑: roohom - - - -## 说在前面 - -下面介绍如何通过Dinky整合Kudu,以支持写SQL来实现数据的读取或写入Kudu。 - -Flink官网介绍了如何去自定义一个支持Source或者Sink的[Connector](https://nightlies.apache.org/flink/flink-docs-release-1.13/docs/dev/table/sourcessinks/),这不是本文探讨的重点,本文侧重于用别人已经写好的Connector去与Dinky做集成以支持读写Kudu。 - -> 注意:以下内容基于Flink1.13.6 Dinky0.6.2,当然其他版本同理。 - - - -## 准备工作 - -在Kudu上创建一个表,这里为test - -![kudu-table](http://pic.dinky.org.cn/dinky/docs/zh-CN/docs/extend/practice_guide/kudu/kudu-table.png) - -我们还需要一个Flink可以使用的针对kudu的Connector,我们找到[**[flink-connector-kudu](https://github.com/collabH/flink-connector-kudu)**]这个项目,clone该项目并在本地适当根据本地所使用组件的版本修改代码进行编译。 - -1、修改pom - -~~~xml -1.13.6 -1.14.0 - - - - org.apache.maven.plugins - maven-shade-plugin - 3.2.4 - - - package - - shade - - - - - -~~~ - -这里将Flink版本修改为1.13.6, 并且使用1.14.0版本的kudu-client,因为项目作者在README中已经说明了使用1.10.0会存在问题,并且添加了shade方式打包 - -![kudu-client](http://pic.dinky.org.cn/dinky/docs/zh-CN/docs/extend/practice_guide/kudu/kudu-client.png) - -2、修改`org.colloh.flink.kudu.connector.table.catalog.KuduCatalogFactory` - -![catalog-factory](http://pic.dinky.org.cn/dinky/docs/zh-CN/docs/extend/practice_guide/kudu/catalog-factory.png) - -## 构建及使用 - -1、OK,准备工作完毕,我们将项目编译打包(步骤略),将得到的jar放在flink的lib目录下以及dinky的plugins目录下,如果需要使用yarn-application模式提交任务,还需要将jar放在HDFS上合适位置让flink能访问到。 - -2、OK,重启Dinky,如果使用yarn-session模式,咱们需要重启得到一个session集群,进入dinky的注册中心配置一个合适的集群实例 - -![register-session](http://pic.dinky.org.cn/dinky/docs/zh-CN/docs/extend/practice_guide/kudu/register-session.png) - -3、接下来我们去dinky的数据开发界面,写一个读取的SQL demo - -~~~sql -CREATE TABLE IF NOT EXISTS kudu_test ( - id BIGINT, - name STRING -) WITH ( - 'connector' = 'kudu', - 'kudu.masters' = 'cdh001:7051,cdh002:7051,cdh003:7051', - 'kudu.table' = 'impala::xxx.test', - 'kudu.hash-columns' = 'id', - 'kudu.primary-key-columns' = 'id' -); - -SELECT * FROM kudu_test; - -~~~ - -点击运行 - -![read-test](http://pic.dinky.org.cn/dinky/docs/zh-CN/docs/extend/practice_guide/kudu/read-test.png) - -4、再来一个写入数据的SQL demo - -~~~sql -CREATE TABLE IF NOT EXISTS kudu_test ( - id BIGINT, - name STRING -) WITH ( - 'connector' = 'kudu', - 'kudu.masters' = 'cdh001:7051,cdh002:7051,cdh003:7051', - 'kudu.table' = 'impala::xxx.test', - 'kudu.hash-columns' = 'id', - 'kudu.primary-key-columns' = 'id' -); - -INSERT INTO kudu_test -SELECT 5 AS id , NULLIF('', '') AS name; -~~~ - -![write-test](http://pic.dinky.org.cn/dinky/docs/zh-CN/docs/extend/practice_guide/kudu/write-test.png) - -成功运行,再去查看kudu表的数据 - -![write-test-show](http://pic.dinky.org.cn/dinky/docs/zh-CN/docs/extend/practice_guide/kudu/write-test-show.png) - -集成完毕。 \ No newline at end of file diff --git a/docs/docs/extend/practice_guide/lookup_join.md b/docs/docs/extend/practice_guide/lookup_join.md deleted file mode 100644 index 59c6dfdf29..0000000000 --- a/docs/docs/extend/practice_guide/lookup_join.md +++ /dev/null @@ -1,128 +0,0 @@ ---- -sidebar_position: 15 -id: lookup_join -title: lookup join ---- - - - -## lookup join - -该例中,将 mysql 表作为维表,里面保存订单信息,之后去关联订单流水表,最后输出完整的订单流水信息数据到 kafka。 - -### kafka 主题 (order_water) - -订单流水表读取的是 kafka `order_water` 主题中的数据,数据内容如下 - -![img.png](http://pic.dinky.org.cn/dinky/docs/zh-CN/sql_development_guide/example/kafka_order_water_data.png) - -### mysql 表 (dim.order_info) - -**表结构** - -```sql -CREATE TABLE `order_info` ( - `id` int(11) NOT NULL COMMENT '订单id', - `user_name` varchar(50) DEFAULT NULL COMMENT '订单所属用户', - `order_source` varchar(50) DEFAULT NULL COMMENT '订单所属来源', - PRIMARY KEY (`id`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8; -``` - -**数据** - -![img.png](http://pic.dinky.org.cn/dinky/docs/zh-CN/sql_development_guide/example/kafka_lookup_join_mysql_mysql_data1.png) - -### flink sql 语句 - -```sql -set 'table.local-time-zone' = 'GMT+08:00'; - --- 订单流水 -CREATE temporary TABLE order_flow( - id int comment '订单id', - product_count int comment '购买商品数量', - one_price double comment '单个商品价格', - -- 一定要添加处理时间字段,lookup join 需要该字段 - proc_time as proctime() -) WITH ( - 'connector' = 'kafka', - 'topic' = 'order_water', - 'properties.bootstrap.servers' = 'node01:9092,node02:9092,node03:9092', - 'properties.group.id' = 'for_source_test', - 'scan.startup.mode' = 'latest-offset', - 'format' = 'csv', - 'csv.field-delimiter' = ' ' -) -; - --- 订单信息 -create table order_info ( - id int PRIMARY KEY NOT ENFORCED comment '订单id', - user_name string comment '订单所属用户', - order_source string comment '订单所属来源' -) with ( - 'connector' = 'jdbc', - 'url' = 'jdbc:mysql://node01:3306/dim?useSSL=false', - 'table-name' = 'order_info', - 'username' = 'root', - 'password' = 'root' -) -; - --- 创建连接 kafka 的虚拟表作为 sink -create table sink_kafka( - id int PRIMARY KEY NOT ENFORCED comment '订单id', - user_name string comment '订单所属用户', - order_source string comment '订单所属来源', - product_count int comment '购买商品数量', - one_price double comment '单个商品价格', - total_price double comment '总价格' -) with ( - 'connector' = 'upsert-kafka', - 'topic' = 'for_sink', - 'properties.bootstrap.servers' = 'node01:9092,node02:9092,node03:9092', - 'key.format' = 'csv', - 'value.format' = 'csv', - 'value.csv.field-delimiter' = ' ' -) -; - --- 真正要执行的任务 -insert into sink_kafka -select - a.id, - b.user_name, - b.order_source, - a.product_count, - a.one_price, - a.product_count * a.one_price as total_price -from order_flow as a --- 一定要添加 for system_time as of 语句,否则读取 mysql 的子任务会被认为是有界流,只读取一次,之后 mysql 维表中变化后的数据无法被读取 -left join order_info for system_time as of a.proc_time as b -on a.id = b.id -; -``` - -flink sql 任务运行之后,flink UI 界面显示为 - -![img.png](http://pic.dinky.org.cn/dinky/docs/zh-CN/sql_development_guide/example/kafka_lookup_join_mysql_flink_ui.png) - -最后查看写入 kafka 中的数据为 - -![img.png](http://pic.dinky.org.cn/dinky/docs/zh-CN/sql_development_guide/example/kafka_lookup_join_mysql_sink_kafka_data1.png) - -此时,修改 mysql 中的数据,修改之后为 - -![img.png](http://pic.dinky.org.cn/dinky/docs/zh-CN/sql_development_guide/example/kafka_lookup_join_mysql_mysql_data2.png) - -再查看写入 kafka 中的数据为 - -![img.png](http://pic.dinky.org.cn/dinky/docs/zh-CN/sql_development_guide/example/kafka_lookup_join_mysql_sink_kafka_data2.png) - -**其他** - -如果 kafka 中的订单流数据中的某个订单 id 在维表 mysql 中找不到,而且 flink sql 任务中使用的是 left join 连接, -则匹配不到的订单中的 user_name 和 product_count 字段将为空字符串,具体如下图所示 - -![img.png](http://pic.dinky.org.cn/dinky/docs/zh-CN/sql_development_guide/example/kafka_lookup_join_mysql_sink_kafka_data3.png) \ No newline at end of file diff --git a/docs/docs/extend/practice_guide/principle.md b/docs/docs/extend/practice_guide/principle.md deleted file mode 100644 index 406e6be73f..0000000000 --- a/docs/docs/extend/practice_guide/principle.md +++ /dev/null @@ -1,178 +0,0 @@ ---- -sidebar_position: 2 -id: principle -title: Dlink 核心概念及实现原理详解 ---- - - - - -## Dlink 是什么 - -Dlink 是一个基于 Apache Flink 二次开发的网页版的 FlinkSQL Studio,可以连接多个 Flink 集群实例,并在线开发、执行、提交 FlinkSQL 语句以及预览其运行结果,支持 Flink 官方所有语法并进行了些许增强。 - -## 与 Flink 的不同 - -Dlink 基于 Flink 源码二次开发,主要应用于 SQL 任务的管理与执行。以下将介绍 Dlink-0.2.3 与 Flink 的不同。 - -### Dlink 的原理 - -![dinky_principle](http://pic.dinky.org.cn/dinky/docs/zh-CN/extend/practice_guide/principle/dinky_principle.png) - -### Dlink 的 FlinkSQL 执行原理 - -![execution_principle](http://pic.dinky.org.cn/dinky/docs/zh-CN/extend/practice_guide/principle/execution_principle.png) - -### Connector 的扩展 - -Dlink 的 Connector 的使用与扩展同 Flink 的完全一致,即当使用 Flink 集成 Dlink 时,只需要将 Flink 扩展的依赖加入 Dlink 的 lib 下即可。 - -当然,Dlink 自身源码也提供了一些 Connector ,它们遵循 Flink 的扩展要求,可以直接被加入到 Flink 的 lib 下进行使用。 - -### 多版本支持 - -Dlink 的单机版只能同时稳定连接同一大版本号下的不同版本的 Flink 集群实例,连接其他大版本号的集群实例在提交任务时可能存在问题;而 DataLink 中的 Dlink 微服务版可以同时稳定连接所有版本号的 Flink 集群实例。 - -Dlink 提供了多版本的 `dlink-client.jar`,根据需求选择对应版本的依赖加入到 lib 下即可稳定连接该版本的 Flink 集群实例。 - -### Catalog 共享 - -Dlink 提供了共享会话对 Flink 的 Catalog、环境配置等进行了长期管理,可以实现团队开发共享 Catalog 的效果。 - -### Sql 语法增强 - -Dlink 对 FlinkSQL 的语法进行增强,主要表现为 Sql 片段与表值聚合 Sql 化。 - -#### Sql 片段 - -```sql -sf:=select * from;tb:=student; -${sf} ${tb} -## 效果等同于 -select * from student -``` - -#### 表值聚合 - -```sql -CREATE AGGTABLE aggdemo AS -SELECT myField,value,rank -FROM MyTable -GROUP BY myField -AGG BY TOP2(value) as (value,rank); -``` - -### 同步执行结果预览 - -Dlink 可以对同步执行的 FlinkSQL 进行运行完成的结果预览,同 `sql-client`。 - -## 概念原理 - -在 Dlink 中具有六个概念,当熟悉他们的原理时,可以搭配出更强大的使用效果。 - -### 本地环境 - -本地环境即为`LocalEnvironment`,是在本地模式运行 Flink 程序的句柄,在本地的 JVM (standalone 或嵌入其他程序)里运行程序,通过调用`ExecutionEnvironment.createLocalEnvironment()`方法来实现。 - -Dlink 通过本地环境来实现隔离调试,本地环境执行时所需要的 `connector` 等资源在 `lib` 目录下引入。本地环境执行过程包含完整的 sql 执行过程。 - -### 远程环境 - -远程环境即为`RemoteEnvironment`,是在远程模式中向指定集群提交 Flink 程序的句柄,在目标集群的环境里运行程序,通过调用`ExecutionEnvironment.createRemoteEnvironment(host,port)`方法来实现,其中 host 为 `rest.address` ,port 为 `rest.port` 。 - -Dlink 可以对任意 standalone、on yarn等运行模式的远程集群进行 sql 提交。远程环境执行过程只包含 sql 任务的准备工作,即解析、优化、转化物理执行计划、生成算子、提交作业执行图。所以远程环境执行时所需要的 connector 等资源也需要在 lib 目录下引入。 - -### 共享会话 - -共享会话为用户与执行环境的操作会话,主要包含 Catalog、片段、执行环境配置等内容。可以认为官方的 `sql-client` 是一个会话,保留了本次命令窗口的操作结果,当退出 `sql-client` 后,会话结束。 - -Dlink 的共享会话相当于可以启动多个 `sql-client` 来进行会话操作,并且其他用户可以使用您的会话 key ,在对应环境中共享您的会话的所有信息。例如,通过执行环境 + 共享会话可以确定唯一的 Catalog。 - -### 临时会话 - -临时会话指不启用共享会话,您每次交互执行操作时,都会创建临时的独立的会话,操作解释后立即释放,适合作业解耦处理。 - -Dlink 的临时会话相当于只启动一个 `sql-client` ,执行完语句后立即关闭再启动。 - -### 同步执行 - -同步执行指通过 Studio 进行操作时为同步等待,当语句运行完成后返回运行结果。 - -Dlink 的语句与官方语句一致,并做了些许增强。Dlink 将所有语句划分为三种类型,即 `DDL`、`DQL` 和 `DML` 。对于同步执行来说, `DDL` 和 `DQL` 均为等待语句执行完成后返回运行结果,而 `DML` 语句则立即返回异步提交操作的执行结果。 - -### 异步提交 - -异步提交指通过 Studio 进行操作时为异步操作,当语句被执行后立马返回操作执行结果。 - -对于三种语句类型,Dlink 的异步提交均立即返回异步操作的执行结果。当前版本的 Dlink 的异步提交不进行历史记录。 - -### 搭配使用 - -| 执行环境 | 会话 | 运行方式 | 适用场景 | -| -------- | -------- | -------- | ------------------------------------------------------------ | -| 本地环境 | 临时会话 | 同步执行 | 无集群或集群不可用的情况下单独开发FlinkSQL作业,需要查看运行结果 | -| 本地环境 | 共享会话 | 同步执行 | 无集群或集群不可用的情况下复用Catalog或让同事排查bug,需要查看运行结果 | -| 本地环境 | 临时会话 | 异步提交 | 无集群或集群不可用的情况下快速启动一个作业,不需要查看运行结果 | -| 本地环境 | 共享会话 | 异步提交 | 共享会话效果无效 | -| 远程环境 | 临时会话 | 同步执行 | 依靠集群单独开发FlinkSQL作业,需要查看运行结果 | -| 远程环境 | 共享会话 | 同步执行 | 依靠集群复用Catalog或让同事排查bug,需要查看运行结果 | -| 远程环境 | 临时会话 | 异步提交 | 快速向集群提交任务,不需要查看运行结果 | -| 远程环境 | 共享会话 | 异步提交 | 共享会话效果无效 | - - - -## 源码扩展 - -Dlink 的源码是非常简单的, Spring Boot 项目轻松上手。 - -### 项目结构 - -```java -dlink -- 父项目 -|-dlink-admin -- 管理中心 -|-dlink-client -- Client 中心 -| |-dlink-client-1.13 -- Client-1.13 实现 -|-dlink-connectors -- Connectors 中心 -| |-dlink-connector-jdbc -- Jdbc 扩展 -|-dlink-core -- 执行中心 -|-dlink-doc -- 文档 -| |-bin -- 启动脚本 -| |-bug -- bug 反馈 -| |-config -- 配置文件 -| |-doc -- 使用文档 -| |-sql -- sql脚本 -|-dlink-function -- 函数中心 -|-dinky-web -- React 前端 -``` - -### 模块介绍 - -#### dlink-admin - -该模块为管理模块,基于 `Spring Boot + MybatisPlus` 框架开发,目前版本对作业、目录、文档、集群、语句等功能模块进行管理。 - -#### dlink-client - -该模块为 Client 的封装模块,依赖了 `flink-client`,并自定义了新功能的实现如 `CustomTableEnvironmentImpl`、`SqlManager ` 等。 - -通过该模块完成对不同版本的 Flink 集群的适配工作。 - -#### dlink-connectors - -该模块为 Connector 的封装模块,用于扩展 Flink 的 `Connector`。 - -#### dlink-core - -该模块为 Dlink 的核心处理模块,里面涉及了共享会话、拦截器、执行器等任务执行过程使用到的功能。 - -#### dlink-doc - -该模块为 Dlink 的文档模块,部署相关资源以及使用文档等资料都在该模块下。 - -#### dlink-function - -该模块为 UDF 的封装模块,用于扩展 Flink 的 `UDF` 。 - -#### dinky-web - -该模块为 Dlink 的前端工程,基于 `Ant Design Pro` 开发,属于 `React` 技术栈,其中的 Sql 在线编辑器是基于 `Monaco Editor` 开发。 diff --git a/docs/docs/extend/practice_guide/temporal_join.md b/docs/docs/extend/practice_guide/temporal_join.md deleted file mode 100644 index 7ebe7aac2c..0000000000 --- a/docs/docs/extend/practice_guide/temporal_join.md +++ /dev/null @@ -1,165 +0,0 @@ ---- -sidebar_position: 16 -id: temporal_join -title: temporal join ---- - - -## temporal join (时态连接) - - -该案例中,将 upsert kafka 主题 `order_info` 中的数据作为维表数据,然后去关联订单流水表,最后输出完整的订单流水信息数据到 kafka。 - -### kafka 主题 (order_water) - -订单流水表读取的是 kafka `order_water` 主题中的数据,数据内容如下 - -![img.png](http://pic.dinky.org.cn/dinky/docs/zh-CN/sql_development_guide/example/kafka_order_water_data.png) - -### kafka 主题 (order_info) - -订单信息维表读取的是 kafka `order_info` 主题中的数据,数据内容如下 - -![img.png](http://pic.dinky.org.cn/dinky/docs/zh-CN/sql_development_guide/example/kafka_temporal_join_kafka_dim_data1.png) - -### flink sql 语句 - -```sql -set 'table.local-time-zone' = 'GMT+08:00'; --- 如果 source kafka 主题中有些分区没有数据,就会导致水印无法向下游传播,此时需要手动设置空闲时间 -set 'table.exec.source.idle-timeout' = '1 s'; - --- 订单流水 -CREATE temporary TABLE order_flow( - id int comment '订单id', - product_count int comment '购买商品数量', - one_price double comment '单个商品价格', - -- 定义订单时间为数据写入 kafka 的时间 - order_time TIMESTAMP_LTZ(3) METADATA FROM 'timestamp' VIRTUAL, - WATERMARK FOR order_time AS order_time -) WITH ( - 'connector' = 'kafka', - 'topic' = 'order_water', - 'properties.bootstrap.servers' = 'node01:9092,node02:9092,node03:9092', - 'properties.group.id' = 'for_source_test', - 'scan.startup.mode' = 'latest-offset', - 'format' = 'csv', - 'csv.field-delimiter' = ' ' -) -; - --- 订单信息 -create table order_info ( - id int PRIMARY KEY NOT ENFORCED comment '订单id', - user_name string comment '订单所属用户', - order_source string comment '订单所属来源', - update_time TIMESTAMP_LTZ(3) METADATA FROM 'timestamp' VIRTUAL, - WATERMARK FOR update_time AS update_time -) with ( - 'connector' = 'upsert-kafka', - 'topic' = 'order_info', - 'properties.bootstrap.servers' = 'node01:9092,node02:9092,node03:9092', - 'key.format' = 'csv', - 'value.format' = 'csv', - 'value.csv.field-delimiter' = ' ' -) -; - --- 创建连接 kafka 的虚拟表作为 sink -create table sink_kafka( - id int PRIMARY KEY NOT ENFORCED comment '订单id', - user_name string comment '订单所属用户', - order_source string comment '订单所属来源', - product_count int comment '购买商品数量', - one_price double comment '单个商品价格', - total_price double comment '总价格' -) with ( - 'connector' = 'upsert-kafka', - 'topic' = 'for_sink', - 'properties.bootstrap.servers' = 'node01:9092,node02:9092,node03:9092', - 'key.format' = 'csv', - 'value.format' = 'csv', - 'value.csv.field-delimiter' = ' ' -) -; - --- 真正要执行的任务 -insert into sink_kafka -select - order_flow.id, - order_info.user_name, - order_info.order_source, - order_flow.product_count, - order_flow.one_price, - order_flow.product_count * order_flow.one_price as total_price -from order_flow -left join order_info FOR SYSTEM_TIME AS OF order_flow.order_time -on order_flow.id = order_info.id -; -``` - -flink sql 任务运行的 flink UI 界面如下 - -![img.png](http://pic.dinky.org.cn/dinky/docs/zh-CN/sql_development_guide/example/kafka_temporal_join_flink_ui.png) - -查看结果写入的 kafka `for_sink` 主题的数据为 - -![img.png](http://pic.dinky.org.cn/dinky/docs/zh-CN/sql_development_guide/example/kafka_temporal_join_kafka_sink_data1.png) - -此时新增数据到 kafka 维表主题 `order_info` 中,新增的数据如下 - -![img.png](http://pic.dinky.org.cn/dinky/docs/zh-CN/sql_development_guide/example/kafka_temporal_join_kafka_dim_data2.png) - -再查看结果写入的 kafka `for_sink` 主题的数据为 - -![img.png](http://pic.dinky.org.cn/dinky/docs/zh-CN/sql_development_guide/example/kafka_temporal_join_kafka_sink_data2.png) - -**注意** - -经过测试发现,当将 upsert kafka 作为 source 时,主题中的数据必须有 **key**,否则会抛出无法反序列化数据的错误,具体如下 - -```log -[INFO] [2022-07-31 21:18:22][org.apache.flink.runtime.executiongraph.ExecutionGraph]Source: order_info[5] (2/8) (f8b093cf4f7159f9511058eb4b100b2e) switched from RUNNING to FAILED on bbc9c6a6-0a76-4efe-a7ea-0c00a19ab400 @ 127.0.0.1 (dataPort=-1). -java.io.IOException: Failed to deserialize consumer record due to - at org.apache.flink.connector.kafka.source.reader.KafkaRecordEmitter.emitRecord(KafkaRecordEmitter.java:56) ~[flink-connector-kafka-1.15.1.jar:1.15.1] - at org.apache.flink.connector.kafka.source.reader.KafkaRecordEmitter.emitRecord(KafkaRecordEmitter.java:33) ~[flink-connector-kafka-1.15.1.jar:1.15.1] - at org.apache.flink.connector.base.source.reader.SourceReaderBase.pollNext(SourceReaderBase.java:143) ~[flink-connector-base-1.15.1.jar:1.15.1] - at org.apache.flink.streaming.api.operators.SourceOperator.emitNext(SourceOperator.java:385) ~[flink-streaming-java-1.15.1.jar:1.15.1] - at org.apache.flink.streaming.runtime.io.StreamTaskSourceInput.emitNext(StreamTaskSourceInput.java:68) ~[flink-streaming-java-1.15.1.jar:1.15.1] - at org.apache.flink.streaming.runtime.io.StreamOneInputProcessor.processInput(StreamOneInputProcessor.java:65) ~[flink-streaming-java-1.15.1.jar:1.15.1] - at org.apache.flink.streaming.runtime.tasks.StreamTask.processInput(StreamTask.java:519) ~[flink-streaming-java-1.15.1.jar:1.15.1] - at org.apache.flink.streaming.runtime.tasks.mailbox.MailboxProcessor.runMailboxLoop(MailboxProcessor.java:203) ~[flink-streaming-java-1.15.1.jar:1.15.1] - at org.apache.flink.streaming.runtime.tasks.StreamTask.runMailboxLoop(StreamTask.java:804) ~[flink-streaming-java-1.15.1.jar:1.15.1] - at org.apache.flink.streaming.runtime.tasks.StreamTask.invoke(StreamTask.java:753) ~[flink-streaming-java-1.15.1.jar:1.15.1] - at org.apache.flink.runtime.taskmanager.Task.runWithSystemExitMonitoring(Task.java:948) ~[flink-runtime-1.15.1.jar:1.15.1] - at org.apache.flink.runtime.taskmanager.Task.restoreAndInvoke(Task.java:927) ~[flink-runtime-1.15.1.jar:1.15.1] - at org.apache.flink.runtime.taskmanager.Task.doRun(Task.java:741) ~[flink-runtime-1.15.1.jar:1.15.1] - at org.apache.flink.runtime.taskmanager.Task.run(Task.java:563) ~[flink-runtime-1.15.1.jar:1.15.1] - at java.lang.Thread.run(Thread.java:748) ~[?:1.8.0_311] -Caused by: java.io.IOException: Failed to deserialize consumer record ConsumerRecord(topic = order_info, partition = 0, leaderEpoch = 0, offset = 7, CreateTime = 1659273502239, serialized key size = 0, serialized value size = 18, headers = RecordHeaders(headers = [], isReadOnly = false), key = [B@2add8ff2, value = [B@2a633689). - at org.apache.flink.connector.kafka.source.reader.deserializer.KafkaDeserializationSchemaWrapper.deserialize(KafkaDeserializationSchemaWrapper.java:57) ~[flink-connector-kafka-1.15.1.jar:1.15.1] - at org.apache.flink.connector.kafka.source.reader.KafkaRecordEmitter.emitRecord(KafkaRecordEmitter.java:53) ~[flink-connector-kafka-1.15.1.jar:1.15.1] - ... 14 more -Caused by: java.io.IOException: Failed to deserialize CSV row ''. - at org.apache.flink.formats.csv.CsvRowDataDeserializationSchema.deserialize(CsvRowDataDeserializationSchema.java:162) ~[flink-csv-1.15.1.jar:1.15.1] - at org.apache.flink.formats.csv.CsvRowDataDeserializationSchema.deserialize(CsvRowDataDeserializationSchema.java:47) ~[flink-csv-1.15.1.jar:1.15.1] - at org.apache.flink.api.common.serialization.DeserializationSchema.deserialize(DeserializationSchema.java:82) ~[flink-core-1.15.1.jar:1.15.1] - at org.apache.flink.streaming.connectors.kafka.table.DynamicKafkaDeserializationSchema.deserialize(DynamicKafkaDeserializationSchema.java:119) ~[flink-connector-kafka-1.15.1.jar:1.15.1] - at org.apache.flink.connector.kafka.source.reader.deserializer.KafkaDeserializationSchemaWrapper.deserialize(KafkaDeserializationSchemaWrapper.java:54) ~[flink-connector-kafka-1.15.1.jar:1.15.1] - at org.apache.flink.connector.kafka.source.reader.KafkaRecordEmitter.emitRecord(KafkaRecordEmitter.java:53) ~[flink-connector-kafka-1.15.1.jar:1.15.1] - ... 14 more -Caused by: org.apache.flink.shaded.jackson2.com.fasterxml.jackson.databind.exc.MismatchedInputException: No content to map due to end-of-input - at [Source: UNKNOWN; line: -1, column: -1] - at org.apache.flink.shaded.jackson2.com.fasterxml.jackson.databind.exc.MismatchedInputException.from(MismatchedInputException.java:59) ~[flink-shaded-jackson-2.12.4-15.0.jar:2.12.4-15.0] - at org.apache.flink.shaded.jackson2.com.fasterxml.jackson.databind.DeserializationContext.reportInputMismatch(DeserializationContext.java:1601) ~[flink-shaded-jackson-2.12.4-15.0.jar:2.12.4-15.0] - at org.apache.flink.shaded.jackson2.com.fasterxml.jackson.databind.ObjectReader._initForReading(ObjectReader.java:358) ~[flink-shaded-jackson-2.12.4-15.0.jar:2.12.4-15.0] - at org.apache.flink.shaded.jackson2.com.fasterxml.jackson.databind.ObjectReader._bindAndClose(ObjectReader.java:2023) ~[flink-shaded-jackson-2.12.4-15.0.jar:2.12.4-15.0] - at org.apache.flink.shaded.jackson2.com.fasterxml.jackson.databind.ObjectReader.readValue(ObjectReader.java:1528) ~[flink-shaded-jackson-2.12.4-15.0.jar:2.12.4-15.0] - at org.apache.flink.formats.csv.CsvRowDataDeserializationSchema.deserialize(CsvRowDataDeserializationSchema.java:155) ~[flink-csv-1.15.1.jar:1.15.1] - at org.apache.flink.formats.csv.CsvRowDataDeserializationSchema.deserialize(CsvRowDataDeserializationSchema.java:47) ~[flink-csv-1.15.1.jar:1.15.1] - at org.apache.flink.api.common.serialization.DeserializationSchema.deserialize(DeserializationSchema.java:82) ~[flink-core-1.15.1.jar:1.15.1] - at org.apache.flink.streaming.connectors.kafka.table.DynamicKafkaDeserializationSchema.deserialize(DynamicKafkaDeserializationSchema.java:119) ~[flink-connector-kafka-1.15.1.jar:1.15.1] - at org.apache.flink.connector.kafka.source.reader.deserializer.KafkaDeserializationSchemaWrapper.deserialize(KafkaDeserializationSchemaWrapper.java:54) ~[flink-connector-kafka-1.15.1.jar:1.15.1] - at org.apache.flink.connector.kafka.source.reader.KafkaRecordEmitter.emitRecord(KafkaRecordEmitter.java:53) ~[flink-connector-kafka-1.15.1.jar:1.15.1] - ... 14 more -``` \ No newline at end of file diff --git a/docs/docs/extend/practice_guide/udf.md b/docs/docs/extend/practice_guide/udf.md deleted file mode 100644 index 51d6bfee48..0000000000 --- a/docs/docs/extend/practice_guide/udf.md +++ /dev/null @@ -1,11 +0,0 @@ ---- -sidebar_position: 11 -id: udf -title: UDF ---- - - - -## 扩展 UDF - -将 Flink 集群上已扩展好的 UDF 直接放入 Dlink 的 lib 或者 plugins 下,然后重启即可。定制 UDF 过程同 Flink 官方一样。 diff --git a/docs/docs/extend/practice_guide/yarnsubmit.md b/docs/docs/extend/practice_guide/yarnsubmit.md deleted file mode 100644 index 2c9a4435ac..0000000000 --- a/docs/docs/extend/practice_guide/yarnsubmit.md +++ /dev/null @@ -1,206 +0,0 @@ ---- -sidebar_position: 1 -id: yarnsubmit -title: Yarn提交实践指南 ---- - - - - ## Yarn-Session 实践 - - ### 注册 Session 集群 - -![register_session_cluster](http://pic.dinky.org.cn/dinky/docs/zh-CN/extend/practice_guide/yarnsubmit//register_session_cluster.png) - - ### 创建 Session 集群 - -进入集群中心进行远程集群的注册。点击新建按钮配置远程集群的参数。图中示例配置了一个 Flink on Yarn 的高可用集群,其中 JobManager HA 地址需要填写集群中所有可能被作为 JobManager 的 RestAPI 地址,多个地址间使用英文逗号分隔。表单提交时可能需要较长时间的等待,因为 dlink 正在努力的计算当前活跃的 JobManager 地址。 - -保存成功后,页面将展示出当前的 JobManager 地址以及被注册集群的版本号,状态为正常时表示可用。 - -注意:只有具备 JobManager 实例的 Flink 集群才可以被成功注册到 dlink 中。( Yarn-Per-Job 和 Yarn-Application 也具有 JobManager,当然也可以手动注册,但无法提交任务) - -如状态异常时,请检查被注册的 Flink 集群地址是否能正常访问,默认端口号为8081,可能更改配置后发生了变化,查看位置为 Flink Web 的 JobManager 的 Configuration 中的 rest 相关属性。 - -### 执行 Hello World - -万物都具有 Hello World 的第一步,当然 Dinky 也是具有的。我们选取了基于 datagen 的流查询作为第一行 Flink Sql。具体如下: - -```sql -CREATE TABLE Orders ( - order_number BIGINT, - price DECIMAL(32,2), - buyer ROW, - order_time TIMESTAMP(3) -) WITH ( - 'connector' = 'datagen', - 'rows-per-second' = '1' -); -select order_number,price,order_time from Orders -``` - -该例子使用到了 datagen,需要在 dlink 的 plugins 目录下添加 flink-table.jar。 - -点击 **数据开发** 进入开发页面: - -![data_devops](http://pic.dinky.org.cn/dinky/docs/zh-CN/extend/practice_guide/yarnsubmit/data_devops.png) - -在中央的编辑器中编辑 Flink Sql。 - -右边作业配置: - -1. 执行模式:选中 Yarn-session; -2. Flink 集群:选中上文注册的测试集群; -3. SavePoint 策略:选中禁用; -4. 按需进行其他配置。 - -右边执行配置: - -1. 预览结果:启用; -2. 远程执行:启用。 - -点击快捷操作栏的三角号按钮同步执行该 FlinkSQL 任务。 - -### 预览数据 - -![data_devops_showdata](http://pic.dinky.org.cn/dinky/docs/zh-CN/extend/practice_guide/yarnsubmit/data_devops_showdata.png) - -切换到历史选项卡点击刷新可以查看提交进度。切换到结果选项卡,等待片刻点击获取最新数据即可预览 SELECT。 - -### 停止任务 - -![data_devops_showprocess](http://pic.dinky.org.cn/dinky/docs/zh-CN/extend/practice_guide/yarnsubmit/data_devops_showprocess.png) - -切换到进程选项卡,选则对应的集群实例,查询当前任务,可执行停止操作。 - -## Yarn-Per-Job 实践 - -### 注册集群配置 - -进入集群中心——集群配置,注册配置。 - -![create_cluster_settiong](http://pic.dinky.org.cn/dinky/docs/zh-CN/extend/practice_guide/yarnsubmit/create_cluster_settiong.png) - -1. Hadoop 配置文件路径:指定配置文件路径(末尾无/),需要包含以下文件:core-site.xml,hdfs-site.xml,yarn-site.xml; -2. Flink 配置 lib 路径:指定 lib 的 hdfs 路径(末尾无/),需要包含 Flink 运行时的所有依赖,即 flink 的 lib 目录下的所有 jar; -3. Flink 配置文件路径:指定配置文件 flink-conf.yaml 的具体路径(末尾无/); -4. 按需配置其他参数(重写效果); -5. 配置基本信息(标识、名称等); -6. 点击测试或者保存。 - -### 执行升级版 Hello World - -之前的 hello world 是个 SELECT 任务,改良下变为 INSERT 任务: - -```sql -CREATE TABLE Orders ( - order_number INT, - price DECIMAL(32,2), - order_time TIMESTAMP(3) -) WITH ( - 'connector' = 'datagen', - 'rows-per-second' = '1', - 'fields.order_number.kind' = 'sequence', - 'fields.order_number.start' = '1', - 'fields.order_number.end' = '1000' -); -CREATE TABLE pt ( -ordertotal INT, -numtotal INT -) WITH ( - 'connector' = 'print' -); -insert into pt select 1 as ordertotal ,sum(order_number)*2 as numtotal from Orders -``` - -![create_sql](http://pic.dinky.org.cn/dinky/docs/zh-CN/extend/practice_guide/yarnsubmit/create_sql.png) - -编写 Flink SQL; - -作业配置: - -1. 执行模式:选中 yarn-per-job ; -2. Flink 集群配置:选中刚刚注册的配置; -3. SavePoint 策略:选中最近一次。 - -快捷操作栏: - -1. 点击保存按钮保存当前所有配置; -2. 点击小火箭异步提交作业。 - -![async_submit_job](http://pic.dinky.org.cn/dinky/docs/zh-CN/extend/practice_guide/yarnsubmit/async_submit_job.png) - -注意,执行历史需要手动刷新。 - -### 自动注册集群 - -点击集群中心——集群实例,即可发现自动注册的 Per-Job 集群。 - -![cluster_instance](http://pic.dinky.org.cn/dinky/docs/zh-CN/extend/practice_guide/yarnsubmit/cluster_instance.png) - -### 查看 Flink Web UI - -提交成功后,点击历史的蓝色地址即可快速打开 Flink Web UI地址。 - -![flink_webui](http://pic.dinky.org.cn/dinky/docs/zh-CN/extend/practice_guide/yarnsubmit/flink_webui.png) - -### 从 Savepoint 处停止 - -在进程选项卡中选择自动注册的 Per-Job 集群,查看任务并 SavePoint-Cancel。 - -![begin_savepoint_stop](http://pic.dinky.org.cn/dinky/docs/zh-CN/extend/practice_guide/yarnsubmit/begin_savepoint_stop.png) - -在右侧保存点选项卡可以查看该任务的所有 SavePoint 记录。 - -![show_job_status](http://pic.dinky.org.cn/dinky/docs/zh-CN/extend/practice_guide/yarnsubmit/show_job_status.png) -### 从 SavePoint 处启动 - -再次点击小火箭提交任务。 - -![flink_webui_show_data](http://pic.dinky.org.cn/dinky/docs/zh-CN/extend/practice_guide/yarnsubmit/flink_webui_show_data.png) -查看对应 Flink Web UI,从 Stdout 输出中证实 SavePoint 恢复成功。 - -## Yarn-Application 实践 - -### 注册集群配置 - -使用之前注册的集群配置即可。 - -### 上传 dlink-app.jar - -第一次使用时,需要将 dlink-app.jar 上传到 hdfs 指定目录,目录可修改如下: - -![upload_app_jar](http://pic.dinky.org.cn/dinky/docs/zh-CN/extend/practice_guide/yarnsubmit/upload_app_jar.png) - -50070 端口 浏览文件系统如下: - -![hdfs_app_jar](http://pic.dinky.org.cn/dinky/docs/zh-CN/extend/practice_guide/yarnsubmit/hdfs_app_jar.png) - -### 执行升级版 Hello World - -作业配置: - -1. 执行模式:选中 yarn-application ; - -快捷操作栏: - -1. 点击保存按钮保存当前所有配置; -2. 点击小火箭异步提交作业。 - -### 其他同 Per-Job - -其他操作同 yarn-per-job ,本文不再做描述。 - -### 提交 User Jar - -作业中心—— Jar 管理,注册 User Jar 配置。 - -![weihu_jar](http://pic.dinky.org.cn/dinky/docs/zh-CN/extend/practice_guide/yarnsubmit/weihu_jar.png) - -右边作业配置的可执行 Jar 选择刚刚注册的 Jar 配置,保存后点击小火箭提交作业。 - -![execution_history](http://pic.dinky.org.cn/dinky/docs/zh-CN/extend/practice_guide/yarnsubmit/execution_history.png) - -由于提交了个批作业,Yarn 可以发现已经执行完成并销毁集群了。 - -![yarn_job_destory](http://pic.dinky.org.cn/dinky/docs/zh-CN/extend/practice_guide/yarnsubmit/yarn_job_destory.png) diff --git a/docs/docs/faq.md b/docs/docs/faq.md index 2c717ec870..bcc79870ae 100644 --- a/docs/docs/faq.md +++ b/docs/docs/faq.md @@ -1,5 +1,5 @@ --- -sidebar_position: 14 +sidebar_position: 15 id: faq title: FAQ --- diff --git a/docs/docs/thanks.md b/docs/docs/thanks.md index 61af4c9530..7cf7b606b8 100644 --- a/docs/docs/thanks.md +++ b/docs/docs/thanks.md @@ -4,37 +4,55 @@ id: thanks title: 致谢 --- -### 首先我们要感谢以下开源组织,为我们的项目提供了宝贵的资源和支持 -[Apache Flink](https://github.com/apache/flink) +> 以下排名不分先后 + +### 开源项目 +[Apache Flink](https://github.com/apache/flink) - Apache Flink 是一个分布式流处理框架,支持事件驱动的应用程序。它提供了高吞吐量、低延迟的数据处理能力,适用于实时数据分析和处理。 -[Ant Design Pro](https://github.com/ant-design/ant-design-pro) +[CDC Connectors for Apache Flink®](https://ververica.github.io/flink-cdc-connectors/master/index.html) +- CDC Connectors for Apache Flink® 是一个开源项目,它提供了从数据库到 Apache Flink 的 CDC 连接器。这些连接器允许从数据库中读取更改数据捕获(CDC)数据,并将其发送到 Apache Flink 作业。 +[Ant Design Pro](https://github.com/ant-design/ant-design-pro) - Ant Design Pro 是基于 Ant Design 设计体系的 React 实现,是一个企业级的 UI 设计语言和 React 组件库。它提供了一套完整的前端开发解决方案,用于构建现代化的企业级应用。 [Docusaurus]( https://github.com/facebook/docusaurus/) - - Docusaurus是一个由 Facebook 开源的静态网站生成器,用于构建易于维护和部署的文档网站。它被广泛用于开源项目和团队的文档撰写。 [Mybatis Plus](https://github.com/baomidou/mybatis-plus) - - Mybatis Plus 是 Mybatis 的增强工具,简化了 Mybatis 的开发流程。它提供了更多的特性和便利方法,帮助开发者更高效地进行数据库操作。 [Monaco Editor](https://github.com/Microsoft/monaco-editor) - - Monaco Editor是一个基于浏览器的代码编辑器,由 Microsoft 开发。它被广泛用于各种在线开发工具和集成开发环境(IDE)。 [SpringBoot](https://spring.io/projects/spring-boot) - - SpringBoot是一种用于创建独立的、基于 Spring 框架的 Java 应用程序的框架。它简化了 Spring 应用的开发过程,提供了一种快速构建应用的方式。 -    此外,特别感谢 [JetBrains](https://www.jetbrains.com/?from=dlink) 提供的免费开源 License 赞助,JetBrains是一家软件开发工具提供商,提供了许多受欢迎的集成开发环境,如 IntelliJ IDEA。他们支持开源社区,为一些开源项目提供免费的开源许可证,以促进软件开发的进步。 -(以上排名不分先后) +[HuTool](https://hutool.cn/) +- HuTool 是一个 Java 工具包,它提供了一系列工具类,帮助开发者更高效地进行 Java 开发。 + +[SMS4J](https://sms4j.com/doc3/) +- SMS4J 是一个集成各个短信厂商的短信发送平台,它提供了一套统一的短信发送接口,帮助开发者更方便地进行短信发送。Dinky 项目短信告警功能就是基于 SMS4J 实现的。 + +[FlinkSQL数据脱敏和行级权限解决方案](https://github.com/HamaWhiteGG/flink-sql-security) +- FlinkSQL数据脱敏和行级权限解决方案是一个基于 Apache Flink 的数据脱敏和行级权限解决方案,它提供了一套完整的数据脱敏和行级权限解决方案,帮助开发者更方便地进行数据脱敏和行级权限控制。Dinky 中的行级权限功能基于该解决方案实现。 + +[Sa-Token](http://sa-token.dev33.cn/) +- Sa-Token 是一款简单易用、功能强大的Java权限认证框架。它提供了一套简单、灵活、高效的权限认证方案,帮助开发者更方便地进行权限认证。Dinky 项目的登录认证功能/权限控制基于 Sa-Token 实现。 + [![JetBrains](http://pic.dinky.org.cn/dinky/docs/zh-CN/thanks/jetbrains.svg)](https://www.jetbrains.com/?from=dlink) +此外,特别感谢 [JetBrains](https://www.jetbrains.com/?from=dlink) 提供的免费开源 License 赞助,JetBrains是一家软件开发工具提供商,提供了许多受欢迎的集成开发环境,如 IntelliJ IDEA。他们支持开源社区,为一些开源项目提供免费的开源许可证,以促进软件开发的进步 + +### 贡献者 + + + + + + -        最后,我们要感谢各位Dinky贡献者对项目的辛勤努力和无私奉献,我们欢迎更多的开发者和贡献者加入Dinky的大家庭!如果您对我们的项目感兴趣,不论是提交 bug 报告、贡献代码、提出建议,还是分享您的使用经验,我们都非常欢迎。在这个开源社区中,每个人的贡献都有着巨大的价值,您的参与将使我们的项目更加丰富多彩。 diff --git a/docs/docs/upgrade.md b/docs/docs/upgrade.md index fd207ec60d..c4111a181f 100644 --- a/docs/docs/upgrade.md +++ b/docs/docs/upgrade.md @@ -1,5 +1,5 @@ --- -sidebar_position: 13 +sidebar_position: 14 id: upgrade title: 升级指南 --- diff --git a/docs/docs/user_guide/devops_center/deveops_center_intro.md b/docs/docs/user_guide/devops_center/deveops_center_intro.md deleted file mode 100644 index 7ade6fd51c..0000000000 --- a/docs/docs/user_guide/devops_center/deveops_center_intro.md +++ /dev/null @@ -1,36 +0,0 @@ ---- -sidebar_position: 1 -id: deveops_center_intro -title: 运维中心概述 ---- - -运维中心包括 FlinkSQL 任务运维、周期任务运维、手动任务运维、作业监控等运维功能模块,为您提供任务操作与状态等多方位的运维能力。 - -## 运维中心功能模块 - -当您在数据开发中完成作业开发,并提交和发布至集群后,即可在运维中心对任务进行运维操作,包括作业实例运行详情查看,针对作业任务的关键指标查看、集群信息、作业快照、异常信息、作业日志、自动调优、配置信息、FlinkSQL、数据地图、即席查询、历史版本、告警记录。 - -下表为运维中心各模块功能使用的简单说明: - -| 模块 | 说明 | -|:--------:|:------------------------:| -| 作业实例 | 查看及修改 FlinkSQL 的作业实例状态 | -| 作业总览 | 查看 FlinkSQL 各监控指标 | -| 集群信息 | 查看 FlinkSQL 的集群实例信息 | -| 作业快照 | 查看 该任务的 CheckPoint SavePoint
并且可以基于某一个 CheckPoint/SavePoint 重启该任务 | -| 异常信息 | 查看 FlinkSQL 启动及运行时的异常 | -| 作业日志 | 完整的 FlinkSQL 日志 | -| 自动调优 | - | -| 配置信息 | 查看 FlinkSQL 的作业配置 | -| FlinkSQL | 查看 FlinkSQL 的 SQL 语句 | -| 数据地图 | 查看 FlinkSQL 的字段血缘 | -| 即席查询 | | -| 历史版本 | 对比查看 FlinkSQL 作业发布后的多个版本 | -| 告警记录 | 查看 FlinkSQL 提交和发布后的告警信息 | -| 一键上下线 | 已发布的作业可以进行一键上下线 | - -:::warning 注意事项 - - 仅异步提交和发布功能,支持在运维中心查看监控任务。 - -::: \ No newline at end of file diff --git a/docs/docs/user_guide/devops_center/indicators_list.md b/docs/docs/user_guide/devops_center/indicators_list.md deleted file mode 100644 index 911b74eb0d..0000000000 --- a/docs/docs/user_guide/devops_center/indicators_list.md +++ /dev/null @@ -1,62 +0,0 @@ ---- -sidebar_position: 3 -id: indicators_list -title: 监控指标一览 ---- - -通过查阅监控指标一览,您可以了解到监控指标中每个指标的指标含义。这有助于您更好的使用 Dinky 的监控功能。 - -:::info 信息 - -您可以在运维中心查看以下指标,同时也可以 [修改作业状态](./job_instance_status#修改作业状态) - -::: - -## 作业总览 - -| 指标名称 | 指标含义 | -| :------: |:---------------:| -| 作业状态 | Flink 的 Task 状态 | -| 重启次数 | 未实现 | -| 耗时 | Flink 作业总耗时 | -| 启动时间 | 作业实例启动时间 | -| 更新时间 | 作业实例更新时间 | -| 完成时间 | 作业实例完成时间 | - - -| 指标名称 | 指标含义 | -| :------: |:----------------:| -| 名称 | Flink Task 名称 | -| 状态 | Task 状态 | -| 接收字节 | 从上游 Task 接收的字节数 | -| 接收记录 | 从上游 Task 接收的记录数 | -| 发送字节 | 发给下游 Task 的字节数 | -| 发送记录 | 发给下游 Task 的记录数 | -| 并行度 | Task 并行读 | -| 开始时间 | Task 开始时间 | -| 结束时间 | Task 完成时间 | -| 算子 | Task 具体的算子各状态的数量 | - -:::tip 说明 - -如果作业只有一个 Task 时,接收字节、接收记录、发送字节、发送记录是均无法从上下游 Task 获取相关 Metrics 统计信息,所以显示为 0。 -如果非要查看具体的 Metrics,可以通过 Flink 配置更改 chain 策略。 - -::: - -## 配置信息 - -| 指标名称 | 指标含义 | -|:-------------------:|:---------------------:| -| 执行模式 | 作业的执行模式 | -| 集群实例 | 手动或自动注册的集群实例 | -| 集群配置 | 手动注册的集群配置 | -| 共享会话 | 是否开启共享会话及其 Key | -| 片段机制 | 是否开启全局变量 | -| 语句集 | 是否开启 Insert 语句集 | -| 任务类型 | FlinkSQL、FlinkJar、SQL | -| 批模式 | 是否开启 batch mode | -| SavePoint 机制 | 最近一次、最早一次、指定一次 | -| SavePoint | SavePoint 机制对应的 Path | -| Flink Configuration | 自定义的其他 Flink 配置 | - diff --git a/docs/docs/user_guide/devops_center/job_details.md b/docs/docs/user_guide/devops_center/job_details.md index 871ef991f5..99b57c6e35 100644 --- a/docs/docs/user_guide/devops_center/job_details.md +++ b/docs/docs/user_guide/devops_center/job_details.md @@ -1,17 +1,112 @@ --- -sidebar_position: 4 +sidebar_position: 2 +position: 2 id: job_details -title: 作业详情 +title: 任务详情 --- -1.在运维中心,单击**点击目标作业名** -2.单击**作业总览**,进入作业详情页面,可以看到各个模块的详情信息。 +:::info 信息 -![detail](http://pic.dinky.org.cn/dinky/docs/administrator_guide/devops_center/job_details/detail.png) +在此页面内,可以直观的看到 Flink 任务的详细信息. -:::info 信息 +并且可以在点击某一Dag 节点后,查看该节点的详细信息. + +以及支持读取该算子的 CheckPoint 信息(注意: 该功能需要 Flink 任务开启 CheckPoint 功能) +::: + + +## 头部功能区域 + +![header_btns](http://pic.dinky.org.cn/dinky/docs/zh-CN/user_guide/devops_center/header_btns.png) + +> 头部按钮功能区放置了一些常用的操作按钮, 以便于您快速的进行操作.包括: + +- `编辑`: 注意: 此按钮并非修改任务信息的功能,而是在某些情况下任务失联,无法连接任务关联的集群,需要重新映射集群信息,以便于 Dinky 侧能够正确的连接到远端 Flink 集群,以便重新获取任务详细信息. +- `刷新`: 手动刷新当前任务实例的信息 +- `FlinkWebUI`: 跳转到远端 Flink 任务的 WebUI 页面 +- `重新启动`: 重新启动当前任务实例,并生成新的任务实例,并非在当前任务实例上进行重启 +- `智能停止`: 触发此操作后,会在当前任务实例上触发 SavePoint 操作,并在 SavePoint 成功后,停止当前任务实例(注意: 该操作后台会检测当前任务是否配置了 SavePoint 路径,如果没有配置,则不会触发 SavePoint 操作,直接停止任务实例,由 Flink 端调用 SavePoint+Stop 操作) +- `SavePoint 触发`: 触发此操作后,会在当前任务实例上触发 SavePoint 操作 (注意: 此操作不会停止当前任务实例,请确保该任务配置了 SavePoint 路径) +- `SavePoint 暂停`: 暂停当前任务实例的 SavePoint 操作 +- `SavePoint 停止`: 触发此操作后,会在当前任务实例上触发 SavePoint 操作,并在 SavePoint 成功后,停止当前任务实例(注意: 此操作会停止当前任务实例,请确保该任务配置了 SavePoint 路径) +- `普通停止`: 停止当前任务实例,并不会触发 SavePoint 操作 + + +## 作业信息 + +![job_detail_info](http://pic.dinky.org.cn/dinky/docs/zh-CN/user_guide/devops_center/job_detail_info.png) + +如上图所示, 该 Tag 展示了 Flink 任务的基本信息, 包含了 Dinky 侧定义的一些配置, 以及远端 Flink 任务的运行状态, Dag 执行图, 任务的 输入输出记录等信息. + +:::tip 提示 + +- 在配置信息展示区域,可以点击 `Flink实例` 的值,直接跳转至该任务使用的 Flink 实例 + +::: + + +## 作业日志 + +![job_logs](http://pic.dinky.org.cn/dinky/docs/zh-CN/user_guide/devops_center/job_logs.png) + +如上图所示, 该 Tag 展示了 Flink 任务的日志信息, 包含 Root Exception, 以及 Flink JobManager 和 TaskManager 的日志信息.以便于您快速的定位问题. + +## 版本信息 - 如果您要使用并查看运维中心的更多功能,请详见操作指南 +![job_version](http://pic.dinky.org.cn/dinky/docs/zh-CN/user_guide/devops_center/job_version.png) +如上图所示, 该 Tag 展示了 Flink 任务的历史版本信息, 包含了 Flink 任务的历史版本, 以及每个版本的详细信息,此功能在每次任务执行`发布`时,会自动记录当前任务的版本信息,以便于您快速的回滚到某个版本.点击左侧列表中的 `版本号` 即可查看该版本的详细信息. +:::warning 注意 +注意: 此功能提供删除历史版本的功能,但是请谨慎操作,删除后无法恢复. ::: +## 作业快照 + +![job_checkpoint_list](http://pic.dinky.org.cn/dinky/docs/zh-CN/user_guide/devops_center/job_checkpoint_list.png) + +如上图所示, 该 Tag 展示了 Flink 任务的 CheckPoint 信息, 包含了 CheckPoint 列表和 SavePoint 列表, 以及每个 CheckPoint 的详细信息. + +:::tip 提示 +在 CheckPoint 列表中,可以点击 `此处恢复` 按钮,触发从该 CheckPoint 恢复任务的操作,并停止当前任务实例,启动新的任务实例 +::: + + +## 监控 + +![job_metrics_list](http://pic.dinky.org.cn/dinky/docs/zh-CN/user_guide/devops_center/job_metrics_list.png) + +如上图所示, 该 Tag 展示了 Flink 任务的监控信息, 包含了 Flink 任务的监控指标, 以及每个指标的详细信息.此功能需要再任务运行时,自行配置 Flink 任务的监控指标. + +:::tip 拓展 +此功能产生的监控数据 由 Apache Paimon 进行存储,存储方式为`本地文件存储`, 并由后端通过 SSE(Server-Sent Events) 技术进行实时推送,以便于前端实时展示监控数据. +::: + +:::warning 注意 +此功能必须要在任务状态为 `运行中` 时才能正常使用,否则 `任务监控配置` 按钮则不会出现,无法新增监控指标和实时刷新监控指标,但是该任务下已经定义的监控指标,依然可以正常查看. +::: + +## SQL 血缘 + +![job_lineage](http://pic.dinky.org.cn/dinky/docs/zh-CN/user_guide/devops_center/job_lineage.png) + +如上图所示, 该 Tag 展示了 Flink 任务的 SQL 血缘信息,可以直观的看到 Flink 任务的 SQL 血缘关系,以及字段之间的最终关系. +:::tip RoadMap +目前 SQL 血缘功能还在开发中,后续会支持更多的功能,包括: +- [ ] 连接线展示其转换逻辑关系 +- [ ] 血缘关系图的导出 +- [ ] 血缘关系图的搜索 +- [ ] 全局血缘影响分析 +- ... +::: + +## 告警记录 + +![job_alert_list](http://pic.dinky.org.cn/dinky/docs/zh-CN/user_guide/devops_center/job_alert_list.png) + +如上图所示, 该 Tag 展示了 Flink 任务的告警信息,可以直观的看到 Flink 任务的告警信息,以及告警的详细信息. + +:::warning 注意 + +任务告警只有当 任务的生命周期为 `已发布`时,且满足告警规则,并关联了告警组,当任务某个指标满足告警规则时,会触发告警,并在此处展示. + +::: \ No newline at end of file diff --git a/docs/docs/user_guide/devops_center/job_instance_status.md b/docs/docs/user_guide/devops_center/job_instance_status.md deleted file mode 100644 index 7f8488a4b8..0000000000 --- a/docs/docs/user_guide/devops_center/job_instance_status.md +++ /dev/null @@ -1,150 +0,0 @@ ---- -sidebar_position: 2 -id: job_instance_status -title: 作业实例状态 ---- - -如果您已经提交作业或者发布上线作业,可通过运维中心查看和修改作业实例状态。默认显示当前实例,切换后显示历史实例。 - -**当前实例** - -![current_instance](http://pic.dinky.org.cn/dinky/docs/administrator_guide/devops_center/job_manage/job_instance_status/current_instance.png) - -**历史实例** - -![history_instance](http://pic.dinky.org.cn/dinky/docs/administrator_guide/devops_center/job_manage/job_instance_status/history_instance.png) - -## 实例状态 - -运行信息为您展示作业的实时运行信息。您可以通过作业的状态来分析、判断作业的状态是否健康、是否达到您的预期。**Task状态** 为您显示作业各状态的数量。Task存在以下11种状态,均为 Flink 作业状态 - -- 已创建 -- 初始化 -- 运行中 -- 已完成 -- 异常中 -- 已异常 -- 已暂停 -- 停止中 -- 停止 -- 重启中 -- 未知 - -作业提交或者发布后,可看到作业实例的详情信息。 - -:::tip 说明 - -如果作业长时间处于初始化状态而未发生改变时,一般是后台发生了异常,却没有被 Dinky 捕捉到,需要自行查看 log 来排查问题。 -目前 Per-Job 和 Application 作业在停止时会被识别为 **未知** 状态。如果网络受限或者集群已被手动关闭,作业也会被识别为 **未知**。 - -::: - -## 作业实例信息 - -作业实例详细包含配置信息及运行状态和时间,各字段的含义 - -| 字段名称 | 说明 | -| :------: |:-------------------------------------------------------------------------------------------------------------------:| -| 作业名 | 创建的作业名称,即pipeline.name | -| 生命周期 | 开发中
已发布
已上线 | -| 运行模式 | Standalone
Yarn Session
Yarn Per-job
Yarn Application
Kubernetes Session
Kubernetes Application | -| 集群实例 | 手动或自动注册的 Flink 集群 | -| 作业ID | Flink 作业的 JID | -| 状态 | 实例状态 | -| 开始时间 | 作业创建时的时间 | -| 耗时 | 作业运行的时长 | - -:::tip 说明 - -如果作业状态有问题,可以进入作业信息后点击刷新按钮强制刷新作业实例状态。 - -::: - -## 修改作业状态 - -1.在运维中心,单击**点击目标作业名** - -2.单击**作业总览**,进入作业详情页面 - -3.根据需要单击以下按钮,修改作业状态 - -![Modify_instance](http://pic.dinky.org.cn/dinky/docs/administrator_guide/devops_center/job_manage/job_instance_status/Modify_instance.png) - -其中,每个按钮含义如下表所示 - -| 操作名称 | 说明 | -| :------------: |:---------------------------:| -| 重新启动 | 作业只重新启动 | -| 停止 | 作业只停止 | -| 重新上线 | 作业重新启动,并且从保存点恢复 | -| 下线 | 作业触发 SavePoint 并同时停止 | -| SavePoint 触发 | 作业触发 SavePoint 操作,创建一个新的保存点 | -| SavePoint 暂停 | 作业触发 SavePoint 操作,并暂停作业 | -| SavePoint 停止 | 作业触发 SavePoint 操作,并停止作业 | -| 普通停止 | 作业只停止 | - -## 一键上下线功能说明 - -一键上下线功能,只针对发布后的作业 - -1、 一键上线: - (1)点击一键上线后,出现检索和操作弹窗; - (2)点击下拉框可以根据目录进行针对性的检索,检索结果出现在下面; - (3)点击全选可以进行全选; - (4)右上角,可以选择默认保存点或者最新保存点启动; - (I) 默认保存点:以studio页面,任务页面的任务内部配置的保存点策略和点位为准; - (II)最新保存点:会检索此instance的最后一次成功的保存点,进行任务保存点策略和点位的修改; - (5)点击提交,即可开始提交任务 - (6)可以转向上线明细功能,进行操作结果和状态的查看; - -2、 上线明细: - (1)名称:任务名称 - (2)状态: - (I)INIT:初始化 - (II)OPERATING_BEFORE:操作前准备,一般指正在排队等待; - (III)TASK_STATUS_NO_DONE:任务不是完成状态,任务真正执行时,状态不一致; - (IV)OPERATING:正在操作 - (V)EXCEPTION:系统发生异常 - (VI)SUCCESS:成功 - (VII)FAIL:失败 - (3)结果: - (I)0:CodeEnum.SUCCESS - (II)1:CodeEnum.ERROR - (III)5:CodeEnum.EXCEPTION - (IV)401:CodeEnum.NOTLOGIN - (4)信息: 上线结果描述 - 异常的情况下,打印异常截取 - 鼠标放到该字段对应位置,可以查看超长内容 - (5)点位配置选择: - DEFAULT_CONFIG:默认配置 - LATEST:最新保存点 - - -3、 一键下线: - (1)点击一键下线后,出现检索和操作弹窗; - (2)点击下拉框可以根据目录进行针对性的检索,检索结果出现在下面; - (3)点击全选可以进行全选; - (5)点击提交,即可开始提交任务 - (6)可以转向下线明细功能,进行操作结果和状态的查看; - -4、 下线明细: - (1)名称:任务名称 - (2)状态: - (I)INIT:初始化 - (II)OPERATING_BEFORE:操作前准备,一般指正在排队等待; - (III)TASK_STATUS_NO_DONE:任务不是完成状态,任务真正执行时,状态不一致; - (IV)OPERATING:正在操作 - (V)EXCEPTION:系统发生异常 - (VI)SUCCESS:成功 - (VII)FAIL:失败 - (3)结果: - (I)0:CodeEnum.SUCCESS - (II)1:CodeEnum.ERROR - (III)5:CodeEnum.EXCEPTION - (IV)401:CodeEnum.NOTLOGIN - (4)信息: 上线结果描述 - 异常的情况下,打印异常截取 - 鼠标放到该字段对应位置,可以查看超长内容 - - - diff --git a/docs/docs/user_guide/devops_center/job_overview.md b/docs/docs/user_guide/devops_center/job_overview.md new file mode 100644 index 0000000000..baddd22f15 --- /dev/null +++ b/docs/docs/user_guide/devops_center/job_overview.md @@ -0,0 +1,26 @@ +--- +sidebar_position: 1 +position: 1 +id: job_overview +title: 任务总览 +--- + +:::info 简介 + +运维中心包括 FlinkSQL 任务运维、FlinkJar 任务运维. + +在运维中心,您可以查看作业实例运行详情,针对任务的关键指标查看,集群信息,作业快照,异常信息,作业日志,配置信息,FlinkSQL,SQL 血缘,历史版本,告警记录。 + +以便全方位的了解 Flink 任务的运行情况,及时发现问题,解决问题。 + +请注意: 目前只针对于 Flink 任务进行运维管理, 普通 DB SQL 任务暂不支持. +::: + +## 任务总览 +![devops_overview](http://pic.dinky.org.cn/dinky/docs/zh-CN/user_guide/devops_center/devops_overview.png) + +- 可以点击 `指标卡片` 进行筛选对应状态下的任务,如 `运行中`, `已取消`, `异常作业`, `重启中`, `已完成`, `未知作业` +- 在此页面内,可以直观的看到 Flink 任务的运行状态. 生命周期,及任务耗时等信息. +- 在列表区 右上角可以进行筛选任务所属的`生命周期` +- 如上图所示.子表格中展示的是 `该任务名称所有的历史任务`,可以按需查看历史任务的详情信息.可以点击作业名称左侧的小图标进行打开/关闭 +- 如果您需要查看某个任务的详情,可以点击操作栏的 `小眼睛图标` 进行查看[任务详情](job_details) diff --git a/docs/docs/user_guide/metrics_overview.md b/docs/docs/user_guide/metrics_overview.md index 6ff84a6981..7e47a419fb 100644 --- a/docs/docs/user_guide/metrics_overview.md +++ b/docs/docs/user_guide/metrics_overview.md @@ -7,7 +7,7 @@ title: 监控 :::info 简介 Dinky1.0增加了Metrics监控功能,可以实现对 Dinky Server的 JVM 信息的监控 -如需要查看 Dinky Server 的实时的 JVM 等信息,需要再 **配置中心** > **全局配置** > **[Metrics 配置](../system_setting/global_settings/metrics_setting)** 中开启 Dinky JVM Monitor 开关 +如需要查看 Dinky Server 的实时的 JVM 等信息,需要再 **配置中心** > **全局配置** > **[Metrics 配置](./system_setting/global_settings/metrics_setting)** 中开启 Dinky JVM Monitor 开关 注意: 在 Dinky v1.0.0 版本及以上,Metrics 监控功能默认关闭,需要手动开启,否则无法正常监控 diff --git a/docs/docs/user_guide/system_setting/alert_strategy.md b/docs/docs/user_guide/system_setting/alert_strategy.md index 76e84867fd..bd3384d36c 100644 --- a/docs/docs/user_guide/system_setting/alert_strategy.md +++ b/docs/docs/user_guide/system_setting/alert_strategy.md @@ -27,17 +27,16 @@ title: 告警策略 ### 触发规则 -| 规则名称 | 说明 | 可选规则 | -|---------------|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|-------------------| -| 作业 ID | 指 Flink 作业的 ID | = | -| 运行时间 | Flink 作业运行时间,即耗时 | >,<,=,<=,>=,!= ,= | -| 作业状态 | Flink 作业状态,可对如下状态值判断:
FINISHED
RUNNING
FAILED
CANCELED
INITIALIZING
RESTARTING
CREATED
FAILING
SUSPENDED
CANCELLING
RECONNECTING
UNKNOWN | = | -| 执行模式 | local
yarn-session
yarn-per-job
yarn-application
kubernetes-session
kubernetes-per-job
kubernetes-application | = | | 无 | | 无 | -| 批模式 | 可选值:
True,False | = | | 无 | | 无 | -| CheckPoint 时间 | 自定义时间 | >,<, = | -| CheckPoint 失败 | 可选值:
True,False | = | -| 任务产生异常 | 可选值:
True,False | = | | 无 | - +| 规则名称 | 说明 | 可选规则 | 值类型 | 示例值 | +|---------------|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|-------------------|--------------|----------------------------------| +| 作业 ID | 指 Flink 作业的 ID | = | 字符串 | 495c4e271dc64a4b7e78b8b1eb8d75f5 | +| 运行时间 | Flink 作业运行时间,即耗时 | >,<,=,<=,>=,!= ,= | 数值(单位:毫秒) | 1000 | +| 作业状态 | Flink 作业状态,可对如下状态值判断:
FINISHED
RUNNING
FAILED
CANCELED
INITIALIZING
RESTARTING
CREATED
FAILING
SUSPENDED
CANCELLING
RECONNECTING
UNKNOWN | = | 字符串 | 'FINISHED' | +| 执行模式 | local
yarn-session
yarn-per-job
yarn-application
kubernetes-session
kubernetes-per-job
kubernetes-application | = | 字符串 | yarn-session | | 无 | +| 批模式 | 可选值:
True,False | = | 下拉框(值类型:字符串) | True | 无 | +| CheckPoint 时间 | 自定义时间 | >,<,=,<=,>=,!= ,= | 数值(单位:毫秒) | 1000 | +| CheckPoint 失败 | 可选值:
True,False | = | 下拉框(值类型:字符串) | True | +| 任务产生异常 | 可选值:
True,False | = | 下拉框(值类型:字符串) | True | ## 自定义告警策略