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) {
      
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值