Dinky-数据开发源码详解

最近用了Dinky之后,感觉Dinky功能真的很强大,特别是近几年平台开发越来越火,作为一位没有做过平台开发的攻城狮,总感觉差点意思,但是看了Dinky之后,这个平台比朋友公司的实时平台差不了多少,甚至还更优,所以打算花点时间好好看看这个平台的功能和代码逻辑。

我们先看看Dinky的页面:

数据开发:主要是创建作业的交互页面,还可以看到作业之中的血缘

运维中心 :主要管理作业的上下线,查看作业明细

元数据中心:主要管理各种数据库的各种表和元数据

注册中心:主要做Flink集群的管理,jar包管理,数据源管理,报警管理等

 

认证中心:主要做角色管理和权限管理 

上面就是Dinky比较重要的功能模块和其主要作用

1.Dinky作业类型

下面为Dinky的作业类型

其中有很多我们常见的数据库,里面有一个FlinkSqlEnv,他主要是用来做表和库的初始化,如果你有一些库和表经常要用,可以把他放在FlinkSqlEnv,写flink sql作业时选择对应的环境即可完成对应表的初始化 

我这里创建了一个11的FlinkSqlEnv ,里面就放了一个源表的初始化SQL

然后dinky作业还支持,scala,java,python作业,这三个主要是给我们用来写UDF和UDTF时使用的

2.Dinky源码作业类型划分和提交作业源码深入讲解

 上一节我们大致看了一下提交作业的源码,这一节我们详细看下,我们从TaskServiceImpl#submitTask方法开始看起

 @Override
    public JobResult submitTask(Integer id) {
        // 通过taskId获取task信息
        Task task = this.getTaskInfoById(id);
        Asserts.checkNull(task, Tips.TASK_NOT_EXIST);
        // 判断task的Dialect是否是flink sql 不是的话调用executeCommonSql方法执行sql
        if (Dialect.notFlinkSql(task.getDialect())) {
            return executeCommonSql(SqlDTO.build(task.getStatement(),
                    task.getDatabaseId(), null));
        }
        ProcessEntity process = null;
        // 获取进程实例 ProcessEntity
        if (StpUtil.isLogin()) {
            process = ProcessContextHolder.registerProcess(
                    ProcessEntity.init(ProcessType.FLINKSUBMIT, StpUtil.getLoginIdAsInt()));
        } else {
            process = ProcessEntity.NULL_PROCESS;
        }
        process.info("Initializing Flink job config...");
        JobConfig config = buildJobConfig(task);

        // 如果GatewayType是k8s appplication,加载容器
        if (GatewayType.KUBERNETES_APPLICATION.equalsValue(config.getType())) {
            loadDocker(id, config.getClusterConfigurationId(), config.getGatewayConfig());
        }

        // 创建jobmanager
        JobManager jobManager = JobManager.build(config);
        process.start();
        // 判断配置的是否是jarTask,是的话调用jobManager.executeJar(),不是的话调用jobManager.executeSql
        if (!config.isJarTask()) {

            JobResult jobResult = jobManager.executeSql(task.getStatement());
            process.finish("Submit Flink SQL finished.");
            return jobResult;
        } else {
            JobResult jobResult = jobManager.executeJar();
            process.finish("Submit Flink Jar finished.");
            return jobResult;
        }
    }

我们来看第一小节代码:根据taskId获取task信息,然后根据task的dialect判断是否是flink sql,不是的话执行executeCommonSql方法,所以dinky sql作业只会分类两类flink sql和common sql,hive,starrocks,clickhouse都属于common sql 了

 然后我们看看他是怎么通过taskId获取到task信息的

 @Override
    public Task getTaskInfoById(Integer id) {
        //获取task
        Task task = this.getById(id);
        if (task != null) {
            task.parseConfig();
            //获取statement,statement中存储的我们写的sql
            Statement statement = statementService.getById(id);
            if (task.getClusterId() != null) {
                Cluster cluster = clusterService.getById(task.getClusterId());
                if (cluster != null) {
      
在用户尝试安装或运行 Dinky 时,若出现 `dinky-metadata` 包缺失的问题,尤其是在涉及 MySQL 依赖的情况下,通常与项目依赖配置或数据库连接设置相关。以下是可能的解决方法和配置建议: ### 检查 Maven 依赖配置 确保 `dinky-metadata` 模块的依赖已正确添加到项目的 `pom.xml` 文件中。如果该模块是 Dinky 的一部分且未被正确引入,可以在 `dinky-admin` 或相关模块的 `pom.xml` 文件中添加如下依赖: ```xml <dependency> <groupId>com.dinky</groupId> <artifactId>dinky-metadata</artifactId> <version>1.0.0-rc2</version> </dependency> ``` 如果 `dinky-metadata` 依赖仍然无法解析,可以检查本地 Maven 仓库中是否存在该模块的 JAR 包。如果不存在,可尝试手动下载并安装到本地仓库: ```bash mvn install:install-file -Dfile=path/to/dinky-metadata-1.0.0-rc2.jar -DgroupId=com.dinky -DartifactId=dinky-metadata -Dversion=1.0.0-rc2 -Dpackaging=jar ``` ### 确认 MySQL 驱动依赖 由于 `dinky-metadata` 可能与数据库交互,特别是 MySQL 数据库,需要确保 MySQL JDBC 驱动已被正确引入。在 `pom.xml` 中添加以下依赖: ```xml <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>8.0.26</version> </dependency> ``` 如果项目使用的是较旧版本的 Dinky(如 Dinky 0.7.5),可能会遇到依赖冲突或版本不兼容的问题。此时可参考类似问题的处理方式,如在 Dinky 0.7.5 中,为了解决 Kafka 数据源调试问题,向 `dlink-admin` 的 `pom.xml` 添加 `flink-json` 依赖[^2]。同理,对于 MySQL 相关问题,也可以通过调整依赖版本来解决。 ### 检查数据库连接配置 `dinky-metadata` 模块缺失也可能与数据库初始化有关。确保 `application.yml` 或 `application.properties` 文件中的数据库连接配置正确无误: ```yaml spring: datasource: driver-class-name: com.mysql.cj.jdbc.Driver url: jdbc:mysql://localhost:3306/dinky?useSSL=false&serverTimezone=UTC&allowPublicKeyRetrieval=true username: root password: root ``` 如果数据库尚未创建,需手动创建并执行 Dinky 提供的建表 SQL 脚本,以确保 `dinky-metadata` 能够正常访问数据库。 ### 构建与部署 完成上述配置后,重新构建项目以确保所有依赖被正确解析: ```bash mvn clean package -DskipTests ``` 随后,解压构建好的 Dinky 包并启动服务: ```bash tar -zxvf dinky-release-1.0.0-rc2.tar.gz mv dinky-release-1.0.0-rc2 dinky cd dinky && ./bin/startup.sh ``` ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值