dolphinscheduler 出现 “tenant not exists” 租户不存在的相关问题解决

dolphinscheduler 出现 “tenant not exists” 租户不存在的相关问题解决

问题描述:

在使用dolphinscheduler创建文件夹、上传文件时,出现“租户不存在” ,日志输出:

[INFO] 2021-04-27 14:35:38.513 org.apache.dolphinscheduler.api.controller.ResourcesController:[177] - query resource list, login user:admin, resource type:FILE
[INFO] 2021-04-27 14:35:38.557 org.apache.dolphinscheduler.api.controller.ResourcesController:[293] - query resource list, login user:admin, resource type:, program type:{}

问题排查

单从日志中看不出什么问题,查看配置文件。

# resource.storage.type=HDFS
resource.storage.type=HDFS

# resource store on HDFS/S3 path, resource file will store to this hadoop hdfs path, self configuration, please make sure the directory exists on hdfs and have read write permissions。"/dolphinscheduler" is re
commended
resource.upload.path=/data/dolphinscheduler

# user data local directory path, please make sure the directory exists and have read write permissions
#data.basedir.path=/tmp/dolphinscheduler

# whether kerberos starts
hadoop.security.authentication.startup.state=false

# java.security.krb5.conf.path=/opt/module/dolphinscheduler//conf/krb5.conf
java.security.krb5.conf.path=/opt/module/dolphinscheduler//conf/krb5.conf

# login user from keytab username
login.user.keytab.username=hdfs-mycluster@ESZ.COM

# login user from keytab path
login.user.keytab.path=/opt/module/dolphinscheduler//conf/hdfs.headless.keytab

#resource.view.suffixs
#resource.view.suffixs=txt,log,sh,conf,cfg,py,java,sql,hql,xml,properties

# if resource.storage.type=HDFS
hdfs.root.user=wang

# if resource.storage.type=HDFS
fs.defaultFS=hdfs://192.168.179.10:9000

配置文件也没问题,hdfs 路径也已经是777读写权限,然后从用户admin 入手。

解决思路

通过查看ds源码,资源上传ResourcesService接口:org.apache.dolphinscheduler.api.service.ResourcesService中的getTenantCode

 /**
     * get tenantCode by UserId
     *
     * @param userId user id
     * @param result return result
     * @return
     */
    private String getTenantCode(int userId,Result result){

        User user = userMapper.selectById(userId);
        if (user == null) {
            logger.error("user {} not exists", userId);
            putMsg(result, Status.USER_NOT_EXIST,userId);
            return null;
        }

        Tenant tenant = tenantMapper.queryById(user.getTenantId());
        if (tenant == null){
            logger.error("tenant not exists");
            putMsg(result, Status.TENANT_NOT_EXIST);
            return null;
        }
        return tenant.getTenantCode();
    }

获取租户ID的方法,发现Tenant是通过user.getTenantId() 对应找到的。

Tenant tenant = tenantMapper.queryById(user.getTenantId());

之后赶紧到库中查看:
在这里插入图片描述

发现租户ID 和用户的tenant_id 不对应,直接update :

 update t_ds_user set tenant_id =3 where user_name="admin";

在这里插入图片描述

解决问题!

  • 7
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 9
    评论
实现MySQL多租户数据隔离的另一种常见方法是通过在表中添加一个`tenant_id`列来标识不同的租户。下面是使用Java代码实现该方法的步骤: 1. 创建一个Java类来管理数据库连接和操作。这个类应该包含以下方法: ``` public class DatabaseManager { private static final String DATABASE_HOST = "localhost"; private static final String DATABASE_USERNAME = "root"; private static final String DATABASE_PASSWORD = "password"; private static final String DATABASE_NAME = "my_database"; private static final String DATABASE_DRIVER = "com.mysql.jdbc.Driver"; private Connection connection; public DatabaseManager() throws SQLException, ClassNotFoundException { Class.forName(DATABASE_DRIVER); this.connection = DriverManager.getConnection("jdbc:mysql://" + DATABASE_HOST + "/" + DATABASE_NAME, DATABASE_USERNAME, DATABASE_PASSWORD); } public void executeQuery(String query) throws SQLException { Statement statement = connection.createStatement(); statement.executeQuery(query); statement.close(); } public void executeUpdate(String query) throws SQLException { Statement statement = connection.createStatement(); statement.executeUpdate(query); statement.close(); } public void closeConnection() throws SQLException { this.connection.close(); } } ``` 2. 创建一个Java类来管理租户列表。这个类应该包含以下方法: ``` public class TenantManager { private Map<String, DatabaseManager> tenantDatabaseManagerMap = new HashMap<>(); public void addTenant(String tenantId) throws SQLException, ClassNotFoundException { if (!tenantDatabaseManagerMap.containsKey(tenantId)) { DatabaseManager databaseManager = new DatabaseManager(); databaseManager.executeUpdate("CREATE TABLE IF NOT EXISTS table_name (id INT PRIMARY KEY, column1 VARCHAR(255), column2 VARCHAR(255), tenant_id VARCHAR(36))"); tenantDatabaseManagerMap.put(tenantId, databaseManager); } } public DatabaseManager getDatabaseManager(String tenantId) { return tenantDatabaseManagerMap.get(tenantId); } public void closeAllConnections() throws SQLException { for (DatabaseManager databaseManager : tenantDatabaseManagerMap.values()) { databaseManager.closeConnection(); } tenantDatabaseManagerMap.clear(); } } ``` 3. 在每次请求到达时,从请求中获取租户ID,并使用TenantManager获取对应的DatabaseManager对象。然后使用该对象执行数据库操作。例如: ``` public class RequestHandler { private static final String TENANT_HEADER = "Tenant-Id"; private TenantManager tenantManager; public RequestHandler() { tenantManager = new TenantManager(); } public void handleRequest(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException, SQLException, ClassNotFoundException { String tenantId = request.getHeader(TENANT_HEADER); if (tenantId == null) { response.setStatus(HttpServletResponse.SC_BAD_REQUEST); response.getWriter().println("Tenant Id is required."); return; } DatabaseManager databaseManager = tenantManager.getDatabaseManager(tenantId); if (databaseManager == null) { tenantManager.addTenant(tenantId); databaseManager = tenantManager.getDatabaseManager(tenantId); } String insertQuery = "INSERT INTO table_name (id, column1, column2, tenant_id) VALUES (1, 'value1', 'value2', '" + tenantId + "')"; databaseManager.executeUpdate(insertQuery); String selectQuery = "SELECT * FROM table_name WHERE tenant_id = '" + tenantId + "'"; ResultSet resultSet = databaseManager.executeQuery(selectQuery); while (resultSet.next()) { int id = resultSet.getInt("id"); String column1 = resultSet.getString("column1"); String column2 = resultSet.getString("column2"); // process results } resultSet.close(); } public void destroy() throws SQLException { tenantManager.closeAllConnections(); } } ``` 以上就是使用Java代码实现MySQL通过表添加`tenant_id`列来标识不同租户的方法。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

王子健121

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值