在 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.py
和 hiveserver2.py
。
提醒一下:我们仍在对此进行测试,我们不知道它是否适用于使用相同超集实例的不同帐户。
【讨论】:
以上是关于在 Superset 上启用 Impala 模拟的主要内容,如果未能解决你的问题,请参考以下文章
使用 Apache Superset 启用自定义错误页面(例如 404)的最佳方法是啥?
使用Java代码通过JDBC连接只启用Sentry的Impala异常分析