Docker部署hue,连接带kerberos认证的Impala集群

2022-05-20 08:27:22 浏览数 (2)

Hue在最新的4.6.0版本中,提供了编译docker镜像的选项,然后我们可以使用已经编译好的镜像来启动hue服务。在之前的版本中(例如4.2.0、4.3.0等),如果要部署hue服务,我们需要在相应的服务器上安装依赖包,然后下载hue的源码,编译完成之后再启动服务。对于有些系统,编译会出现各种问题,不同的版本错误还不一样,非常麻烦。因此,docker部署hue还是非常方便的,省去了我们每次都要重复编译的麻烦,并且可以在一个服务器上启动多个hue服务,配置文件保持不变的情况下,只要hue默认的端口号映射到宿主机的不同端口号即可。下面就跟大家介绍一些,在使用docker部署hue的时候,我们该如何配置连接到带有kerberos认证的Impala集群。

无kerberos的Impala集群连接

连接不带认证的集群非常简单,我们直接按照官方的教程做就可以了,直接执行如下命令从官方仓库拉取镜像到本地:

代码语言:javascript复制
docker pull gethue/hue:latest

复制./hue/tools/docker/hue/conf/hue.ini或者hue-overrides.ini到本地服务器上,然后修改下面两个配置:

代码语言:javascript复制
[impala]
  server_host=impalad_host
  server_port=21050

这里建议使用hue-overrides.ini,因为hue.ini中的配置项太多,其中绝大部分都是不需要我们关注的。请注意,这里连接的是不带kerberos认证的impala集群,然后通过如下命令启动:

代码语言:javascript复制
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中的以下配置项:

代码语言:javascript复制
[[database]]
  engine=mysql
  host=mysql_host
  port=3306
  user=hue
  password=xxx
  name=hue_docker_test

重新使用上述docker run命令启动hue的image,服务正常可以用。

带kerberos的Impala集群连接

上面介绍的是没有kerberos认证的Impala集群,相对比较简单,下面就来介绍,如何连接带kerberos认证的Impala集群。虽然在hue.ini配置文件里面可以直接配置kerberos相关的配置项,但是在官方pull的镜像中,没有kerberos相关的配置,因此我们没办法直接使用上面下载的配置项,需要修改原先的Dockerfile,加入相关的依赖,然后重新编译镜像(该代码目前在最新的master分支中已经有了,我们无需再额外增加,参见:HUE-9165)。我们使用如下的命令下载并编译代码:

代码语言:javascript复制
git clone ssh://git@g.hz.netease.com: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服务了:

代码语言:javascript复制
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

各个参数含义如下:

  • hue-overrides.ini:增加了kerberos配置的配置文件,文章最后会给出一个完整的参考示例;
  • hue.keytab:用于本地进行kinit认证的keytab文件;
  • krb5.conf:包含kdc、realm等信息;

在启动过程中,会遇到如下的一些错误: 问题一 TSocket read 0 bytes (code THRIFTTRANSPORT): TTransportException('TSocket read 0 bytes',)

需要对impala插件配置use_sasl=true,如下所示:

代码语言:javascript复制
[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服务之后,在短时间内登录页面之后,查询会出现如下的错误:

代码语言:javascript复制
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左右才执行的,如下所示:

代码语言:javascript复制
[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/dev@HADOOP.HZ.NETEASE.COM
[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集群,其他集群的配置也是大同小异,大家可以自行测试。下面附上配置文件参考示例:

代码语言:javascript复制
[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

0 人点赞