一直使用mac或者wsl来解决访问带有kerberos的impala服务,但WSL毕竟也稍微麻烦了一点,就想着试下能不能再windows解决这个问题。一直使用的是jdbc的impala,看到官网有odbc的,于是就想着试一下,看看能不能解决。
1. 下载odbc impala驱动
打开cloudera
官网->下载
,产品下载 | Cloudera (clouderacn.cn),找到数据库驱动程序
,点击Impala ODBC 驱动程序下载
打开ODBC Connector下载页面,Download Impala ODBC Connector 2.6.17 (cloudera.com)。选择对应的操作系统版本,下载即可。
2. 安装Cloudera Impala ODBC驱动
双击ClouderaImpalaODBC64.msi
,除了选择路径,其他无脑下一步。
3. 配置Microsoft ODBC数据源管理程序
在powertoys
中搜索ODBC 数据源(64 位)
打开ODBC 数据源(64 位)
,在系统DSN
中找到了默认添加的一条数据源
3.1 配置
点击配置,根据自己实际情况进行配置
# 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
按钮,经过短暂的卡顿以后,提示如下表示成功:
4. 编写代码
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失败的问题。
5. 补充
其实在Linux或者Mac中也可以使用ODBC来编写代码。
以RHEL、CentOS为例
5.1. 安装
yum –nogpgcheck localinstall ClouderaImpalaODBC-2.6.10.1010-1.x86_64.rpm
Cloudera ODBC Driver for Impala
安装在 /opt/cloudera/impalaodbc
目录中。
5.2. 配置
在非 Windows 计算机上创建数据源名称。在 /opt/cloudera/impalaodbc/lib/64/cloudera.impalaodbc.ini
添加以下内容:
[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
5.3. 测试impala连接
$ 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脚本来测试了
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