python3.6.5基于kerberos认证的hive和hdfs连接调用方式


Posted in Python onJune 06, 2020

1. Kerberos是一种计算机网络授权协议,用来在非安全网络中,对个人通信以安全的手段进行身份认证。具体请查阅官网

2. 需要安装的包(基于centos)

yum install libsasl2-dev
yum install gcc-c++ python-devel.x86_64 cyrus-sasl-devel.x86_64
yum install python-devel 
yum install krb5-devel
yum install python-krbV
 
pip install krbcontext==0.9
pip install thrift==0.9.3
pip install thrift-sasl==0.2.1
pip install impyla==0.14.1
pip install hdfs[kerberos]
pip install pykerberos==1.2.1

3. /etc/krb5.conf 配置, 在这个文件里配置你服务器所在的域

4./etc/hosts 配置, 配置集群机器和域所在机器

5. 通过kinit 生成 ccache_file或者keytab_file

6. 连接hive代码如下

import os
from impala.dbapi import connect
from krbcontext import krbcontext
keytab_path = os.path.split(os.path.realpath(__file__))[0] + '/xxx.keytab'
principal = 'xxx'
with krbcontext(using_keytab=True,principal=principal,keytab_file=keytab_path):
 conn = connect(host=ip, port=10000, auth_mechanism='GSSAPI', kerberos_service_name='hive')
 cursor = conn.cursor()
 cursor.execute('SELECT * FROM default.books')
 for row in cursor:
  print(row)

7. 连接hdfs代码如下

from hdfs.ext.kerberos import KerberosClient
from krbcontext import krbcontext
 
hdfs_url = 'http://' + host + ':' + port
data = self._get_keytab(sso_ticket)
self._save_keytab(data)
with krbcontext(using_keytab=True, keytab_file=self.keytab_file, principal=self.user):
 self.client = KerberosClient(hdfs_url)
 self.client._list_status(path).json()['FileStatuses']['FileStatus'] #获取path下文件及文件夹

8. 注:krbcontext这个包官方说支持python2,但是python3也能用

这个hdfs_url 一定要带"http://"不然会报错

9. 我新增了一些配置文件配置,具体的操作如下

python3.6.5基于kerberos认证的hdfs,hive连接调用(含基础环境配置)

1需要准备的环境

yum包(需要先装yum包,再装python包,不然会有问题)

yum install openldap-clients -y
 yum install krb5-workstation krb5-libs -y
 yum install gcc-c++ python-devel.x86_64 cyrus-sasl-devel.x86_64
 yum install python-devel 
 yum install krb5-devel
 yum install python-krbV
 yum install cyrus-sasl-plain cyrus-sasl-devel cyrus-sasl-gssapi

python包安装(pip或pip3,请根据实际情况选择)

pip install krbcontext==0.9
 pip install thrift==0.9.3
 pip install thrift-sasl==0.2.1
 pip install impyla==0.14.1
 pip install hdfs[kerberos]
 pip install pykerberos==1.2.1

配置/etc/hosts文件(需要把大数据平台的机器和域名进行配置)

10.xxx.xxx.xxx name-1 panel.test.com
10.xxx.xxx.xxx name-1

配置/etc/krb5.conf(具体查看kerberos服务配置中心)

参考配置(仅供参考,具体更具自己实际配置修改)

[libdefaults]
  renew_lifetime = 9d
  forwardable = true
  default_realm = PANEL.COM
  ticket_lifetime = 24h
  dns_lookup_realm = false
  dns_lookup_kdc = false
  default_ccache_name = /tmp/krb5cc_%{uid}
 [logging]
  default = FILE:/var/log/krb5kdc.log
  admin_server = FILE:/var/log/kadmind1.log
  kdc = FILE:/var/log/krb5kdc1.log
 [realms]
  PANEL.COM = {
  admin_server = panel.test1.com
  kdc = panel.test1.com
  }

连接代码:

hdfs:

import json, os
from hdfs.ext.kerberos import KerberosClient
from krbcontext import krbcontext
 
 def _connect(self, host, port, sso_ticket=None):
  try:
   hdfs_url = 'http://' + host + ':' + port
   active_str = 'kinit -kt {0} {1}'.format(self.keytab_file, self.user)
   # 激活当前kerberos用户认证,因为python缓存机制,切换用户,这个缓存不会自动切换,需要手动处理下
   os.system(active_str)
   with krbcontext(using_keytab=True, keytab_file=self.keytab_file, principal=self.user):
    self.client = KerberosClient(hdfs_url)
  except Exception as e:
   raise e

hive

import os
from krbcontext import krbcontext
from impala.dbapi import connect
from auto_model_platform.settings import config

 def _connect(self, host, port, sso_ticket=None):
  try:
   active_str = 'kinit -kt {0} {1}'.format(self.keytab_file, self.user)
   # 同hdfs
   os.system(active_str)
   with krbcontext(using_keytab=True, principal=self.user, keytab_file=self.keytab_file):
    self.conn = connect(host=host, port=port, auth_mechanism='GSSAPI', kerberos_service_name='hive')
    self.cursor = self.conn.cursor()
  except Exception as e:
   raise e

总结

我在做的时候也遇到很多坑,其实在这个需要理解其中原理,比如kerberos的机制和对应命令

如果是做基础平台用,用多用户切换的情况,建议不要用python,因为一点都不友好,官方包问题很多,我都改用java的jdbc去操作hdfs和hive了

如果只是自己测试和和做算法研究,还是可以用的,因为这个代码简单,容易实现

补充

kinit命令

kinit -kt xxxx.keytab #激活xxxx用户当前缓存
kinit list #查看当前缓存用户

以上这篇python3.6.5基于kerberos认证的hive和hdfs连接调用方式就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Python查看多台服务器进程的脚本分享
Jun 11 Python
python统计文本文件内单词数量的方法
May 30 Python
Python编程判断一个正整数是否为素数的方法
Apr 14 Python
python机器学习库常用汇总
Nov 15 Python
python 从csv读数据到mysql的实例
Jun 21 Python
浅谈利用numpy对矩阵进行归一化处理的方法
Jul 11 Python
Python用61行代码实现图片像素化的示例代码
Dec 10 Python
Python input函数使用实例解析
Nov 22 Python
Numpy之reshape()使用详解
Dec 26 Python
python 识别登录验证码图片功能的实现代码(完整代码)
Jul 03 Python
vscode配置anaconda3的方法步骤
Aug 08 Python
Java Unsafe类实现原理及测试代码
Sep 15 Python
python访问hdfs的操作
Jun 06 #Python
Python API 操作Hadoop hdfs详解
Jun 06 #Python
python读取hdfs上的parquet文件方式
Jun 06 #Python
Python连接HDFS实现文件上传下载及Pandas转换文本文件到CSV操作
Jun 06 #Python
完美解决python针对hdfs上传和下载的问题
Jun 05 #Python
python读取hdfs并返回dataframe教程
Jun 05 #Python
python pymysql链接数据库查询结果转为Dataframe实例
Jun 05 #Python
You might like
phpmyadmin提示The mbstring extension is missing的解决方法
2014/12/17 PHP
php中的explode()函数实例介绍
2019/01/18 PHP
javascript在myeclipse中报错的解决方法
2013/10/29 Javascript
js 异步操作回调函数如何控制执行顺序
2013/12/24 Javascript
Javascript中数组sort和reverse用法分析
2014/12/30 Javascript
jquery实现的伪分页效果代码
2015/10/29 Javascript
JavaScript如何实现组合列表框中元素移动效果
2016/03/01 Javascript
通过node-mysql搭建Windows+Node.js+MySQL环境的教程
2016/03/01 Javascript
JavaScript数值千分位格式化的两种简单实现方法
2016/08/01 Javascript
js判断文件格式及大小的简单实例(必看)
2016/10/11 Javascript
基于vue-simplemde实现图片拖拽、粘贴功能
2018/04/12 Javascript
关于Vue在ie10下空白页的debug小结
2018/05/02 Javascript
浅谈Vue响应式(数组变异方法)
2018/05/07 Javascript
JavaScript格式化json和xml的方法示例
2019/01/22 Javascript
JavaScript中构造函数与原型链之间的关系详解
2019/02/25 Javascript
vue双向绑定数据限制长度的方法
2019/11/04 Javascript
基于Vue实现微前端的示例代码
2020/04/24 Javascript
举例讲解Python设计模式编程的代理模式与抽象工厂模式
2016/01/16 Python
Python创建普通菜单示例【基于win32ui模块】
2018/05/09 Python
Python图片转换成矩阵,矩阵数据转换成图片的实例
2018/07/02 Python
python pytest进阶之conftest.py详解
2019/06/27 Python
python3用PIL把图片转换为RGB图片的实例
2019/07/04 Python
Python绘制频率分布直方图的示例
2019/07/08 Python
django mysql数据库及图片上传接口详解
2019/07/18 Python
给你一面国旗 教你用python画中国国旗
2019/09/24 Python
pytorch 使用加载训练好的模型做inference
2020/02/20 Python
使用html5 canvas创建太空游戏的示例
2014/05/08 HTML / CSS
详解三种方式实现平滑滚动页面到顶部的功能
2019/04/23 HTML / CSS
Bose英国官方网站:美国知名音响品牌
2020/01/26 全球购物
Huda Beauty官方商店:化妆和美容产品
2020/09/05 全球购物
Overload和Override的区别
2012/09/02 面试题
遗体告别仪式主持词
2014/03/20 职场文书
争当四好少年演讲稿
2014/09/13 职场文书
文明单位汇报材料
2014/12/24 职场文书
高中英语教学反思范文
2016/03/02 职场文书
Python 使用dict实现switch的操作
2021/04/07 Python