
# 使用Python脚本连接MRS安全集群执行Impala SQL
#### 第一步：在执行任务的服务器上安装相应的包
pip install krbcontext（版本0.10）
pip install kerberos（版本1.3.1）
pip install impala
命令样例如下：
```
pip install krbcontext == 0.10
```
![](https://support.huaweicloud.com/bestpractice-dataartsstudio/public_sys-resources/note_3.0-zh-cn.png)
执行pip命令需要查看服务器安装的版本（有可能是pip3），执行如下命令进行查看：
**which pip**
#### 第二步：在执行任务的服务器上安装Impala客户端（也可以装整个MRS客户端）并上传Impala用户认证凭证
![](https://support.huaweicloud.com/bestpractice-dataartsstudio/public_sys-resources/note_3.0-zh-cn.png)
- 在Manager主页下载的客户端软件包，包含了集群内所有服务（除Flume之外）的客户端。如果只需要安装单个服务的客户端，请选择"集群 \> 服务 \> *服务名称* \> 更多 \> 下载客户端"，弹出"下载客户端"信息提示框。
- MRS 3.3.0及之后版本，在Manager主页中直接单击"下载客户端"即可。
 
1. 登录MRS控制台。
2. 选择"MRS集群 \> 现有集群"。
3. 单击所需集群的名称进入MRS集群的概览页面。单击"前往Manager"，登录MRS服务的管理面。 
   ![](https://support.huaweicloud.com/bestpractice-dataartsstudio/public_sys-resources/note_3.0-zh-cn.png)
   "Kerberos认证"为"开启"状态。
   图1前往Manager   
   ![](https://support.huaweicloud.com/bestpractice-dataartsstudio/zh-cn_image_0000001875122108.png "点击放大")
   ![](https://support.huaweicloud.com/bestpractice-dataartsstudio/public_sys-resources/note_3.0-zh-cn.png)
   如果跳出提示框，选择访问MRS Manager页面的访问方式，详细内容请参考[访问FusionInsight Manager（MRS 3.x及之后版本）](https://support.huaweicloud.com/usermanual-mrs/mrs_01_0128.html)。
   
   
4. 进入FusionInsight Manager登录页面，登录FusionInsight Manager（登录用户名和密码找系统管理员获取）。
5. 单击"集群"，在"概览"页签下，从右上方选择"更多 \> 下载客户端"。 
   图2下载客户端   
   ![](https://support.huaweicloud.com/bestpractice-dataartsstudio/zh-cn_image_0000001921238949.png "点击放大")
   
   
6. 弹出"下载集群客户端"提示框，选择相关下载参数后单击"确定"，下载客户端。 
   图3下载集群客户端   
   ![](https://support.huaweicloud.com/bestpractice-dataartsstudio/zh-cn_image_0000001921594385.png "点击放大")
   
   
7. 选择客户端类型、平台类型（与执行任务的服务器保持一致），如果不修改保存路径，会自动下载客户端到MRS主节点对应路径下，再拷贝客户端软件包到待安装客户端节点的指定目录。以待安装客户端的用户登录将要安装客户端的节点，并解压客户端软件包后，执行install命令进行安装，详细内容请参考[安装客户端（3.x及之后版本）](https://support.huaweicloud.com/usermanual-mrs/mrs_01_0089.html)。
   
   ![](https://support.huaweicloud.com/bestpractice-dataartsstudio/public_sys-resources/note_3.0-zh-cn.png)
   MRS 3.x之前版本集群在集群创建后，在主Master节点默认安装有客户端，安装目录为"/opt/client"。
   
   
8. 在FusionInsight Manager界面下载用户认证凭证到本地。 
   用户为安全模式集群进行应用开发的场景下，**需要获取用户keytab文件用于安全认证**。管理员可以通过FusionInsight Manager导出keytab文件。用户凭据获取方法如下：
   ![](https://support.huaweicloud.com/bestpractice-dataartsstudio/public_sys-resources/note_3.0-zh-cn.png)
   修改用户密码后，之前导出的keytab将失效，需要重新导出。
   1. 登录FusionInsight Manager。 MRS 3.x及之后版本：选择"系统 \> 权限 \> 用户"。
      MRS 3.x之前版本：选择"系统设置 \> 权限配置 \> 用户管理"。
      
   
   2. 在需导出文件的用户所在行，选择"更多 \> 下载认证凭据"，待文件自动生成后指定保存位置，并妥善保管该文件。
      ![](https://support.huaweicloud.com/bestpractice-dataartsstudio/public_sys-resources/note_3.0-zh-cn.png)
      人机用户创建好后，需要登录一次FusionInsight Manager重置密码后才有效。
      认证凭据中会携带kerberos服务的"krb5.conf"文件。
      解压认证凭据文件后可以获取两个文件：
      - "krb5.conf"文件包含认证服务连接信息。
      
      - "user.keytab"文件包含用户认证信息。
      
      
      下载认证凭据的详细信息请参考[下载MRS集群用户认证凭据文件](https://support.huaweicloud.com/usermanual-mrs/mrs_01_0352.html)。
      图4下载认证凭据   
      ![](https://support.huaweicloud.com/bestpractice-dataartsstudio/zh-cn_image_0000001875345720.png "点击放大") 
   
   
   
   
9. 上传Impala用户认证凭据到待操作节点的Impala客户端安装目录下，例如"*客户端安装目录*/impala/"。
10. 进入Impala客户端路径，查看用户的principal，执行以下命令查看用户的principal。 
    ![](https://support.huaweicloud.com/bestpractice-dataartsstudio/public_sys-resources/note_3.0-zh-cn.png)
    Kerberos认证时需要配置Kerberos认证所需要的文件参数，主要包含keytab文件路径、Kerberos认证的用户名称、Kerberos认证所需要的客户端配置"krb5.conf"文件。
    ```
    登录MRS集群客户端所在节点，进入客户端安装目录。
    cd {客户端安装目录}
    执行以下命令配置环境变量。
    source bigdata_env
    执行以下命令进行用户认证。
    kinit MRS集群业务用户
    输入密码
    执行如下命令，查询用户的principal。
    klist -kt 客户端安装目录/impala/user.keytab
    ```
    图5查看principal   
    ![](https://support.huaweicloud.com/bestpractice-dataartsstudio/zh-cn_image_0000001875340816.png "点击放大")
    
    
 
#### Python3代码样例参考
![](https://support.huaweicloud.com/bestpractice-dataartsstudio/public_sys-resources/note_3.0-zh-cn.png)
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()
```
