一直使用mac或者wsl来解决访问带有kerberos的impala服务,但WSL毕竟也稍微麻烦了一点,就想着试下能不能再windows解决这个问题。一直使用的是jdbc的impala,看到官网有odbc的,于是就想着试一下,看看能不能解决。

下载odbc impala驱动

打开cloudera官网->下载产品下载 | Cloudera (clouderacn.cn),找到数据库驱动程序,点击Impala ODBC 驱动程序下载打开ODBC Connector下载页面,Download Impala ODBC Connector 2.6.17 (cloudera.com)。选择对应的操作系统版本,下载即可。

image-20230403152806685

安装Cloudera Impala ODBC驱动

双击ClouderaImpalaODBC64.msi,除了选择路径,其他无脑下一步。

配置Microsoft ODBC数据源管理程序

powertoys中搜索ODBC 数据源(64 位)

image-20230403153318920

打开ODBC 数据源(64 位),在系统DSN中找到了默认添加的一条数据源

image-20230403153412995

配置

点击配置,根据自己实际情况进行配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# IMPALA JDBC URL jdbc:impala://impala.proxy.xxx.com:21050;AuthMech=1;KrbRealm=XXX.COM;KrbHostFQDN=impala.proxy.xxx.com;KrbServiceName=impala;REQUEST_POOL=test;mem_limit=2gb;
Data Source Name : prod_impala
Description : 描述信息随便填
Host : 输入你得impala地址即可,例如:impala.proxy.xxx.com
Port : impala的端口,默认就是21050
DataBase : 数据库名,例如 test
# 在Authentication 中设置认证方式
Mechanism: : 认证方式,选择kerberos
Realm : 填写realm信息,例如 XXX.COM
Host FQDN : 填写KrbHostFQDN信息,一般都是和host一直,所以默认值 _host 即可
Service Name : kerberos的服务名 默认是impala
# 勾选Use keytab ,点击Keytab Options设置keytab的路径
Username : 输入给你分配的kerberos的用户名,例如:test
# 其他的就不用管了

点击Test按钮,经过短暂的卡顿以后,提示如下表示成功:

image-20230403154522854

编写代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
import pyodbc


def test():
pyodbc.autocommit = True
# DSN填写刚才配置的名称,autocommit一定设置为True,不然会报错
con = pyodbc.connect('DSN=prod_impala;Database=test', autocommit=True)
cursor = con.cursor()
cursor.execute("show tables;")

datas = cursor.fetchall()
print(datas)
cursor.close()
con.close()

if __name__ == '__main__':
test()

此时控制台便会打印该库里所有的表名,完美解决Windows下访问带有Kerberos认证的impala失败的问题。

补充

其实在Linux或者Mac中也可以使用ODBC来编写代码。

以RHEL、CentOS为例

安装

1
yum –nogpgcheck localinstall ClouderaImpalaODBC-2.6.10.1010-1.x86_64.rpm

Cloudera ODBC Driver for Impala 安装在 /opt/cloudera/impalaodbc 目录中。

配置

在非 Windows 计算机上创建数据源名称。在 /opt/cloudera/impalaodbc/lib/64/cloudera.impalaodbc.ini添加以下内容:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
[Driver]
ErrorMessagesPath=/opt/cloudera/impalaodbc/ErrorMessages/
LogLevel=0
LogPath=

Driver=/opt/cloudera/impalaodbc/lib/64/libclouderaimpalaodbc64.so
Host=impala.proxy.xxx.com
Port=21050
AuthMech=1
# Cloudera ODBC Driver for Impala 64-bit
KrbRealm=XXX.COM
# Cloudera ODBC Driver for Impala 64-bit
KrbFQDN=impala.proxy.xxx.com
KrbServiceName=impala

In /etc/odbc.ini add below lines:

[ODBC Data Sources]
# Cloudera ODBC Driver for Impala 64-bit
your-odbc-dsn=prod_impala

[your-odbc-dsn]
Driver=/opt/cloudera/impalaodbc/lib/64/libclouderaimpalaodbc64.so

测试impala连接

1
2
3
4
5
6
7
8
9
10
11
12
13
14
$ kinit your-kerberos-userid
# isql -v your-odbc-dsn

+---------------------------------------+
| Connected! |
| |
| sql-statement |
| help [tablename] |
| quit |
| |
+---------------------------------------+
SQL>

This shows that the connection to impala is successful.

现在就可以运行python脚本来测试了

1
2
3
4
5
6
import pyodbc
conn = pyodbc.connect('DSN=your-odbc-dsn',autocommit=True)

crsr = conn.cursor()
crsr.execute('select * from mydb.mytable limit 5;')
print(crsr.fetchall())

同样,autocommit必须为True。否则会打印一个错误 (‘HYC00’, ‘[HYC00] [Cloudera][ODBC] (11470) Transactions are not supported