在 Superset 上启用 Impala 模拟

Posted

技术标签:

【中文标题】在 Superset 上启用 Impala 模拟【英文标题】:Enable Impala Impersonation on Superset 【发布时间】:2020-08-06 16:02:01 【问题描述】:

有没有办法让登录用户(在超集上)在 impala 上进行查询? 我尝试在数据库上启用“模拟登录用户”选项,但没有成功,因为所有查询都在具有超集用户的 impala 上运行。

【问题讨论】:

【参考方案1】:

我正在努力实现同样的目标!这不会完全回答这个问题,因为它仍然不起作用,但我想分享我的研究,以便可能帮助另一个试图在非常基本的用例之外使用这个工具的人。

我深入研究了代码,发现模拟没有为 Impala 实现。因此,您无法从 UI 中实现这一点。我发现这个 PR https://github.com/apache/superset/pull/4699 无论出于何种原因从未合并到代码库中,并试图在我的 Superset 版本(1.1.0)中复制和粘贴代码,但它不起作用。添加一些日志,我可以看到带有模拟的配置已更新,但实际的 Impala 查询是使用我用来启动该过程的用户。

如你所想,我在这方面完全是个菜鸟。但是我发现当你创建一个 cursor 并且有一个构造函数参数可以传递模拟配置时会发生模拟。

我成功地(至少在我的理解中)为 SQL 实验室部分实现了模拟。

sql_lab.py 类中,您必须在execute_sql_statements 方法中添加以下几行

    with closing(engine.raw_connection()) as conn:
        # closing the connection closes the cursor as well
        cursor = conn.cursor(**database.cursor_kwargs)

其中 cursor_kwargs 在db_engine_specs/impala.py 中定义如下

    @classmethod
    def get_configuration_for_impersonation(cls, uri, impersonate_user, username):
        logger.info(
            'Passing Impala execution_options.cursor_configuration for impersonation')
        return 'execution_options': 
            'cursor_configuration': 'impala.doas.user': username

    @classmethod
    def get_cursor_configuration_for_impersonation(cls, uri, impersonate_user,
                                                   username):
        logger.debug('Passing Impala cursor configuration for impersonation')
        return 'configuration': 'impala.doas.user': username

最后,在models/core.py 中,您必须在get_sqla_engine def 中添加以下位

 params = extra.get("engine_params", ) # that was already there just for you to find out the line

self.cursor_kwargs = self.db_engine_spec.get_cursor_configuration_for_impersonation(
            str(url), self.impersonate_user, effective_username) # this is the line I added

...

 params.update(self.get_encrypted_extra()) # already there
 
#new stuff
configuration = 
configuration.update(
            self.db_engine_spec.get_configuration_for_impersonation(
                str(url),
                self.impersonate_user,
                effective_username))

if configuration:
   params.update(configuration)

如您所见,我只是厚颜无耻地粘贴了 PR 中的代码。但是,正如我已经说过的,这种方法仅适用于 SQL 实验室。对于仪表板,有一种完全不同的查询 Impala 的方法,我仍然没有发现。

这意味着仪表板的查询以不同的方式处理,并且没有类似的东西

 with closing(engine.raw_connection()) as conn:
        # closing the connection closes the cursor as well
        cursor = conn.cursor(**database.cursor_kwargs)

我的直觉(和调试)感觉是,您需要首先了解 sqlalchemy 部分并扩展一个新的 ImpalaEngine 类,该类使用自定义光标和模拟 conf。或者类似的东西,但是它并不简单(如果我们想称之为简单)作为 sql_lab 部分。因此,诀窍是找出执行查询的位置并使用模拟配置创建游标。很简单,不是吗?

我希望这可以为您和其他遇到此问题的人提供一些启示。如果您确实找到了解决此问题的其他方法,或者此评论是否有用,请告诉我。

更新:一些非常有用的东西

我的一位同事成功地使用 impala 实现了模拟,而没有触及任何相关的超集,而是直接使用 impyla 库。 PR 已打开,其中包含要更改的代码。您可以直接在 superset 使用的 impyla src 中应用补丁。您必须同时编辑 dbapi.pyhiveserver2.py

提醒一下:我们仍在对此进行测试,我们不知道它是否适用于使用相同超集实例的不同帐户。

【讨论】:

以上是关于在 Superset 上启用 Impala 模拟的主要内容,如果未能解决你的问题,请参考以下文章

使用 Apache Superset 启用自定义错误页面(例如 404)的最佳方法是啥?

如何启用Impala的动态资源池

使用Java代码通过JDBC连接只启用Sentry的Impala异常分析

markdown 在Ubuntu VM上安装Superset - Notes

如何在模拟器上启用暗模式?

Superset 在Winodw安装以及问题整理