使用Python脚本连接MRS安全集群执行Impala SQL
第一步:在执行任务的服务器上安装相应的包
pip install krbcontext(版本0.10)
pip install kerberos(版本1.3.1)
pip install impala
命令样例如下:
pip install krbcontext == 0.10
执行pip命令需要查看服务器安装的版本(有可能是pip3),执行如下命令进行查看:
which pip
第二步:在执行任务的服务器上安装Impala客户端(也可以装整个MRS客户端)并上传Impala用户认证凭证
- 在Manager主页下载的客户端软件包,包含了集群内所有服务(除Flume之外)的客户端。如果只需要安装单个服务的客户端,请选择“集群 > 服务 > 服务名称 > 更多 > 下载客户端”,弹出“下载客户端”信息提示框。
- MRS 3.3.0及之后版本,在Manager主页中直接单击“下载客户端”即可。
- 登录MRS控制台。
- 选择“MRS集群 > 现有集群”。
- 单击所需集群的名称进入MRS集群的概览页面。单击“前往Manager”,登录MRS服务的管理面。
“Kerberos认证”为“开启”状态。
图1 前往Manager
如果跳出提示框,选择访问MRS Manager页面的访问方式,详细内容请参考访问FusionInsight Manager(MRS 3.x及之后版本)。
- 进入FusionInsight Manager登录页面,登录FusionInsight Manager(登录用户名和密码找系统管理员获取)。
- 单击“集群”,在“概览”页签下,从右上方选择“更多 > 下载客户端”。
图2 下载客户端
- 弹出“下载集群客户端”提示框,选择相关下载参数后单击“确定”,下载客户端。
图3 下载集群客户端
- 选择客户端类型、平台类型(与执行任务的服务器保持一致),如果不修改保存路径,会自动下载客户端到MRS主节点对应路径下,在拷贝客户端软件包到待安装客户端节点的指定目录。以待安装客户端的用户登录将要安装客户端的节点,并解压客户端软件包后,执行install命令进行安装,详细内容请参考安装客户端(3.x及之后版本)。
MRS 3.x之前版本集群在集群创建后,在主Master节点默认安装有客户端,安装目录为“/opt/client”。
- 在FusionInsight Manager界面下载用户认证凭证到本地。
用户为安全模式集群进行应用开发的场景下,需要获取用户keytab文件用于安全认证。管理员可以通过FusionInsight Manager导出keytab文件。用户凭据获取方法如下:
修改用户密码后,之前导出的keytab将失效,需要重新导出。
- 登录FusionInsight Manager。
MRS 3.x及之后版本:选择“系统 > 权限 > 用户”。
MRS 3.x之前版本:选择“系统设置 > 权限配置 > 用户管理”。
- 在需导出文件的用户所在行,选择“更多 > 下载认证凭据”,待文件自动生成后指定保存位置,并妥善保管该文件。
人机用户创建好后,需要登录一次FusionInsight Manager重置密码后才有效。
认证凭据中会携带kerberos服务的“krb5.conf”文件。
解压认证凭据文件后可以获取两个文件:
- “krb5.conf”文件包含认证服务连接信息。
- “user.keytab”文件包含用户认证信息。
下载认证凭据的详细信息请参考下载MRS集群用户认证凭据文件。
图4 下载认证凭据
- 登录FusionInsight Manager。
- 上传Impala用户认证凭据到待操作节点的Impala客户端安装目录下,例如“客户端安装目录/impala/”。
- 进入Impala客户端路径,查看用户的principal,执行以下命令查看用户的principal。
Kerberos认证时需要配置Kerberos认证所需要的文件参数,主要包含keytab文件路径、Kerberos认证的用户名称、Kerberos认证所需要的客户端配置“krb5.conf”文件。
登录MRS集群客户端所在节点,进入客户端安装目录。 cd {客户端安装目录} 执行以下命令配置环境变量。 source bigdata_env 执行以下命令进行用户认证。 kinit MRS集群业务用户 输入密码 执行如下命令,查询用户的principal。 klist -kt 客户端安装目录/impala/user.keytab
图5 查看principal
Python3代码样例参考
Python2和python3导入包的版本(krbcontext)有差异。
## ******************************************************************** ## from impala.dbapi import connect from krbcontext.context import krbcontext #from krbcontext import krbcontext python2导入包 #from subprocess import Popen, PIPE #kinit = Popen(['/opt/bigdata/client/KrbClient/kerberos/bin/kinit', 'impala1@F5840AB1_7495_448E_BC63_A8D2B0E2EE69.COM'], stdin=PIPE, stdout=PIPE, stderr=PIPE) #kinit.stdin.write('Admin@123$#\n'.encode()) #kinit.wait() with krbcontext(using_keytab=True,principal='impala1@F5840AB1_7495_448E_BC63_A8D2B0E2EE69.COM',keytab_file='/opt/bigdata/user.keytab'): conn = connect(host="192.168.0.136", port=21050, auth_mechanism='GSSAPI', kerberos_service_name='impala',database='default') cursor = conn.cursor() cursor.execute("show databases;") data = cursor.fetchall() print (data) cursor.close() conn.close()