Hue在最新的4.6.0版本中,提供了编译docker镜像的选项,然后我们可以使用已经编译好的镜像来启动hue服务。在之前的版本中(例如4.2.0、4.3.0等),如果要部署hue服务,我们需要在相应的服务器上安装依赖包,然后下载hue的源码,编译完成之后再启动服务。对于有些系统,编译会出现各种问题,不同的版本错误还不一样,非常麻烦。因此,docker部署hue还是非常方便的,省去了我们每次都要重复编译的麻烦,并且可以在一个服务器上启动多个hue服务,配置文件保持不变的情况下,只要hue默认的端口号映射到宿主机的不同端口号即可。下面就跟大家介绍一些,在使用docker部署hue的时候,我们该如何配置连接到带有kerberos认证的Impala集群。
连接不带认证的集群非常简单,我们直接按照官方的教程做就可以了,直接执行如下命令从官方仓库拉取镜像到本地:
docker pull gethue/hue:latest
复制./hue/tools/docker/hue/conf/hue.ini或者hue-overrides.ini到本地服务器上,然后修改下面两个配置:
[impala]
server_host=impalad_host
server_port=21050
这里建议使用hue-overrides.ini,因为hue.ini中的配置项太多,其中绝大部分都是不需要我们关注的。请注意,这里连接的是不带kerberos认证的impala集群,然后通过如下命令启动:
docker run -it -p 9999:8888 \
-v /home/impala/hue/hue.ini:/usr/share/hue/desktop/conf/hue-overrides.ini \
gethue/hue
将本地的hue-overrides.ini映射到container中,然后将本地的9999端口映射到container的8888(hue的web端口),就可以通过hostname:9999访问hue服务了。首次访问需要创建用户名和密码(超级用户),在登录之后,查询出现以下错误:
该错误主要是由于默认使用的是sqlite数据库导致的,这里我们将数据源替换为mysql数据库,修改本地hue-overrides.ini中的以下配置项:
[[database]]
engine=mysql
host=mysql_host
port=3306
user=hue
password=xxx
name=hue_docker_test
重新使用上述docker run命令启动hue的image,服务正常可以用。
上面介绍的是没有kerberos认证的Impala集群,相对比较简单,下面就来介绍,如何连接带kerberos认证的Impala集群。虽然在hue.ini配置文件里面可以直接配置kerberos相关的配置项,但是在官方pull的镜像中,没有kerberos相关的配置,因此我们没办法直接使用上面下载的配置项,需要修改原先的Dockerfile,加入相关的依赖,然后重新编译镜像(该代码目前在最新的master分支中已经有了,我们无需再额外增加,参见:HUE-9165)。我们使用如下的命令下载并编译代码:
git clone ssh://[email protected]:22222/datawarehouse/impala-project/hue.git
cd hue
git fetch origin neteast-branch-4.6.0:neteast-branch-4.6.0
git checkout neteast-branch-4.6.0
docker build -t netease/hue:4.6.0 -f tools/docker/hue/Dockerfile .
编译时间可能会比较久,我在测试过程中耗费30min-60min左右。编译完成之后,我们可以使用docker images查看本地的镜像仓库会有最新生成的镜像。然后我们就可以通过如下命令来启动hue服务了:
docker run -it -p 9999:8888 \
-v /home/impala/hue/hue.ini.kerberos:/usr/share/hue/desktop/conf/hue-overrides.ini \
-v /home/impala/hue/hue.keytab:/home/hue/hue.keytab \
-v /home/impala/hue/krb5.conf:/etc/krb5.conf \
product/hue:4.6.1
各个参数含义如下:
在启动过程中,会遇到如下的一些错误:
问题一 TSocket read 0 bytes (code THRIFTTRANSPORT): TTransportException('TSocket read 0 bytes',)
需要对impala插件配置use_sasl=true,如下所示:
[impala]
server_host=impalad_host
server_port=21050
use_sasl=true
需要注意的是,这个配置项必须要配置在impal下面才会对impala生效,其他的插件也需要单独配置,例如hdfs、spark等。
问题二 Could not start SASL: Error in sasl_client_start (-1) SASL(-1): generic failure: GSSAPI Error: Unspecified GSS failure.
详细错误信息如下所示:
需要通过pip安装thrift-sasl,这个需要修改代码,重新编译,该问题在最新的master分支上也已经提交。
问题三 GSSAPI Error: Unspecified GSS failure. Minor code may provide more information
在使用docker启动hue服务之后,在短时间内登录页面之后,查询会出现如下的错误:
Could not start SASL: Error in sasl_client_start (-1) SASL(-1): generic failure: GSSAPI Error: Unspecified GSS failure. Minor code may provide more information (No Kerberos credentials available (default cache: /home/hue/hue_krb5_ccache)) (code THRIFTTRANSPORT): TTransportException('Could not start SASL: Error in sasl_client_start (-1) SASL(-1): generic failure: GSSAPI Error: Unspecified GSS failure. Minor code may provide more information (No Kerberos credentials available (default cache: /home/hue/hue_krb5_ccache))',)
通过排查HUE启动之后的日志发现,kerberos的认证是通过一个专门的kt_renewer进程来操作的,但是在服务启动之后,虽然kt_renewer进行也跟着启动了,但是真正的第一次kinit操作是在kt_renewer启动之后的2min左右才执行的,如下所示:
[24/Feb/2020 14:15:04 ] supervisor INFO Starting process /usr/share/hue/build/env/bin/hue kt_renewer
[24/Feb/2020 14:15:04 ] supervisor INFO Started proceses (pid 127) /usr/share/hue/build/env/bin/hue kt_renewer
[24/Feb/2020 14:17:16 +0800] kt_renewer INFO Reinitting kerberos retry attempt 0 from keytab /usr/bin/kinit -k -t /home/hue/impala.keytab -c /home/hue/hue_krb5_ccache impala/[email protected]
[24/Feb/2020 14:17:17 +0800] kt_renewer INFO Renewing kerberos ticket to work around kerberos 1.8.1: /usr/bin/kinit -R -c /home/hue/hue_krb5_ccache
因此造成了我们在短时间内执行SQL提示认证相关的问题,过几分钟又恢复正常了,该问题社区已经有相关的JIRA,但是目前没有反馈,参见:HUE-9164,不过该问题目前不影响服务的可用性。
以上就是关于在使用docker部署hue的时候,我们该如何配置来连接带kerberos认证的Impala集群,其他集群的配置也是大同小异,大家可以自行测试。下面附上配置文件参考示例:
[desktop]
secret_key=kasdlfjknasdfl3hbaksk3bwkasdfkasdfba23asdf
http_host=0.0.0.0
http_port=8888
time_zone=Asia/Shanghai
django_debug_mode=false
http_500_debug_mode=false
[[kerberos]]
hue_keytab=/home/hue/hue.keytab
hue_principal=hue/xxx@xxx
ccache_path=/home/hue/hue_krb5_ccache
kinit_path=/usr/bin/kinit
[[database]]
engine=mysql
host=mysql_host
port=3306
user=username
password=password
name=database_name
[impala]
server_host=impalad_host
server_port=21050
impala_principal=impala/_HOST@xxx
use_sasl=true