Hue的Impala模块没有释放连接的问题解决

最近在研究Impala的准入控制这块,其中一个参数是限制一个池中的最大并行执行的查询数,假设这个值是20,那么当提交一个查询到impala,而集群中已经有20个查询正在执行了,那么这个新加入的查询就会被加入到一个等待队列中,直到正在执行的查询执行完毕,并释放资源。

这个参数可以有效的缓解Impala的Memory Limit Exceeded问题。但是有一个问题,有两种情况hue会长时间占用查询资源,导致其他查询不得不等待。

我们用的Hue版本是3.11.0,如上图所示:

第一个查询是hue进行配置校验的时候发起的,查询执行成功,但没有取出结果并关闭连接。

第二个是在hue中执行impala查询时,界面上先加载100条,当我们向下滚动到底部时候继续加载剩下的数据。数据没拿完,查询不关闭似乎也说的过去。

接着做了一个实验,在hue上执行 SELECT 'hello' ,可以看到页面发送了一个execute请求,和三个fetch_result_data请求,其中后面两次fetch_result_data的返回都是空的,并且has_more为false,因为我们的查询只有一行返回。

现在我们在同一个窗口在执行一遍刚才的查询,发现比上次多发送了一个close_statement请求。hue会保证一个会话窗口只创建一个impala连接,当同一个窗口提交新的查询时会强制关闭上一个查询。

当查询结果没有拿完之前不关闭连接是可以理解的,但是为什么我的结果都已经拿完了,还不释放连接呢,其实是hue有一个数据下载功能要复用当前连接。如果关闭连接的话,会导致下载失败。即便

如此,我还是希望fetch完所有数据后立即关闭连接,因为大多数查询都只会返回少量数据,并且不需要下载的。当有大量数据需要下载时,只有不把页面滑动到数据的最末端对下载是没有影响的。

经过以上实验,我们总结出hue的两个问题

1.配置校验没有释放连接,是bug 还是 我们自己的环境问题?

2.能否在fetch完所有数据后关闭impala连接?

带着这两个问题,下载了hue的源码https://github.com/cloudera/hue

看到hue/apps/impala/src/impala/conf.py 文件发现确实没有fetch和close这样的操作

这个问题在最新的版本中已经修正了。

现在我希望在fetch_result_data返回所有数据后(及result.has_more 为false时)自动发起一次close_statement请求。通过一番搜索找到fetch_result_data请求的处理函数

在 hue/desktop/libs/notebook/src/notebook/static/notebook/js/notebook.ko.js 文件,修改如下:

修改过我们再次执行 SELECT 'hello',可以看到第二fetch_result_data之后跟了一个close_statement请求。并且在impala后台可以看到连接已经成功释放了。虽然后面还跟了一个错误的fetch_result_data,但是无伤大雅。

你可能感兴趣的:(Hue的Impala模块没有释放连接的问题解决)