问题描述

安装好 superset,通过命令 superset run -p 8088 -h 0.0.0.0 启动,在界面配置 hive 数据库连接时出现错误。在服务器上看到日志信息如下:

1
2
3
Unexpected error TTransportException
WARNING:superset.views.core:Unexpected error TTransportException
INFO:werkzeug:10.10.17.34 - - [11/Jan/2022 12:07:37] "POST /superset/testconn HTTP/1.1" 400 -

看到 TTransportException,第一感觉是缺少依赖包(Python、系统),不过日志并没有记录具体的错误信息,没有办法直接定位到底是缺少哪个依赖包。

解决方法

看到 TTransportException,第一感觉是缺少依赖包(Python、系统),不过日志并没有记录具体的错误信息,没有办法直接定位到底是缺少哪个依赖包。

从网上搜索的结果来看,可能是缺少以下些包导致的:

  • sasl
  • thrift
  • thrift-sasl
  • pythrifthiveapi
  • pure-sasl
  • ……

也有可能是 Hive 驱动版本不一致引起的,如 pyhive、pyhive[presto]、pyhive==0.6.0 等。

或者也可能是相关 Hive 连接参数没有配置正确,如 kerberos 认证等。

但最后是缺少哪一个依赖或是哪几个依赖、哪些参数没有配置正确,并没有明确。

当然,我们可以选择把以上的依赖包或指定依赖包版本都一一安装测试一遍,就是比较费时和低效。

我们可以通过另一种“曲线救国”方法。具体如下:

因为 superset 是用 pyhive 连接数据库的,我们可以在服务器上写脚本测试用 pyhive 是否可以连接到 hive 数据库,代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
import json
from pyhive import hive

conn = hive.connect(
host="10.10.17.61",
port=10000, # 服务器地址
# auth="KERBEROS",
# kerberos_service_name="sql_prc", #验证方式
configuration={
'mapreduce.map.memory.mb':'4096',
'mapreduce.reduce.memory.mb':'4096',
'mapreduce.map.java.opts':'-Xmx3072m',
'mapreduce.reduce.java.opts':'-Xmx3072m',
'hive.input.format':'org.apache.hadoop.hive.ql.io.HiveInputFormat',
'hive.limit.optimize.enable':'false',
'mapreduce.job.queuename':'root.default' # 队列
}
)

#查询数据
import pandas as pd
sql = "SHOW PARTITIONS dw.dm_user_info"
df = pd.read_sql(sql, conn)
print(df)

执行该 Python 文件:

1
2
3
4
5
6
7
8
9
10
11
python3 test.py
Traceback (most recent call last):
File "test.py", line 15, in <module>
'mapreduce.job.queuename':'root.production.miot_group.test.data' # 队列
File "/home/hadoop/.local/lib/python3.6/site-packages/pyhive/hive.py", line 104, in connect
return Connection(*args, **kwargs)
File "/home/hadoop/.local/lib/python3.6/site-packages/pyhive/hive.py", line 243, in __init__
self._transport.open()
File "/home/hadoop/.local/lib/python3.6/site-packages/thrift_sasl/__init__.py", line 85, in open
message=("Could not start SASL: %s" % self.sasl.getError()))
thrift.transport.TTransport.TTransportException: Could not start SASL: b'Error in sasl_client_start (-4) SASL(-4): no mechanism available: No worthy mechs found'

可以清楚地看到,导致连接 Hive 失败的具体错误信息或原因(若提示缺少 Python 依赖包,则用 pip install 安装):

1
thrift.transport.TTransport.TTransportException: Could not start SASL: b'Error in sasl_client_start (-4) SASL(-4): no mechanism available: No worthy mechs found'

这是因为缺少 cyrus-sasl-plain cyrus-sasl-devel cyrus-sasl-gssapi 三个系统依赖包,使用 yum install 安装即可:

1
yum install cyrus-sasl-plain  cyrus-sasl-devel  cyrus-sasl-gssapi

再次执行 python3 test.py 可以看到以下输出:

1
2
3
4
5
6
7
8
9
    partition
0 dt=20211203
1 dt=20211226
2 dt=20211227
3 dt=20211228
4 dt=20211229
5 dt=20211230
6 dt=20211231
7 dt=20220101

说明在服务器上使用 pyhive 可以正确连接 hive,最后在 superset 界面重新配置 Hive 数据库,点击 TEST CONNECTION 按钮,可以看到 Seems OK! 的提示,表明连接 Hive 成功。

Hive 连接如下:

1
hive://hive@10.10.17.61:10000/mydw

(END)