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使用urllib模块和pyquery实现阿里巴巴排名查询
Jan 16 Python
Python编程中用close()方法关闭文件的教程
May 24 Python
Python读写zip压缩文件的方法
Aug 29 Python
python抓取搜狗微信公众号文章
Apr 01 Python
对Django 中request.get和request.post的区别详解
Aug 12 Python
对Python中一维向量和一维向量转置相乘的方法详解
Aug 26 Python
python检测服务器端口代码实例
Aug 31 Python
python针对mysql数据库的连接、查询、更新、删除操作示例
Sep 11 Python
简单介绍一下pyinstaller打包以及安全性的实现
Jun 02 Python
Python列表嵌套常见坑点及解决方案
Sep 30 Python
python palywright库基本使用
Jan 21 Python
python实现计算图形面积
Feb 22 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
判断Keep-Alive模式的HTTP请求的结束的实现代码
2011/08/06 PHP
PHP SPL使用方法和他的威力
2013/11/12 PHP
PHP设计模式之迭代器模式
2016/06/17 PHP
php实现的中文分词类完整实例
2017/02/06 PHP
Yii2实现跨mysql数据库关联查询排序功能代码
2017/02/10 PHP
php 从指定数字中获取随机组合的简单方法(推荐)
2017/04/05 PHP
laravel框架的安装与路由实例分析
2019/10/11 PHP
javascript 清空form表单中某种元素的值
2009/12/26 Javascript
JQUERY操作JSON实例代码
2010/02/09 Javascript
Jquery优化效率 提升性能解决方案
2010/09/06 Javascript
自用js开发框架小成 学习js的朋友可以看看
2010/11/16 Javascript
node.js中的buffer.slice方法使用说明
2014/12/10 Javascript
js中匿名函数的创建与调用方法分析
2014/12/19 Javascript
JavaScript导航脚本判断当前导航
2016/07/12 Javascript
Vue2几种常见开局方式详解
2017/09/09 Javascript
JavaScript数据结构与算法之队列原理与用法实例详解
2017/11/22 Javascript
Vue中使用vux配置代码详解
2018/09/16 Javascript
Angularjs实现数组随机排序的方法
2018/10/02 Javascript
Vue组件内部实现一个双向数据绑定的实例代码
2019/04/04 Javascript
jQuery实现带3D切割效果的轮播图功能示例【附源码下载】
2019/04/04 jQuery
微信小程序实现录制、试听、上传音频功能(带波形图)
2020/02/27 Javascript
[59:00]OG vs TNC 2018国际邀请赛小组赛BO2 第一场 8.19
2018/08/21 DOTA
python脚本实现数据导出excel格式的简单方法(推荐)
2016/12/30 Python
Python 实现选择排序的算法步骤
2018/04/22 Python
浅谈django orm 优化
2018/08/18 Python
对python模块中多个类的用法详解
2019/01/10 Python
如何打包Python Web项目实现免安装一键启动的方法
2020/05/21 Python
在django中查询获取数据,get, filter,all(),values()操作
2020/08/09 Python
Python通过类的组合模拟街道红绿灯
2020/09/16 Python
PyCharm 光标变成黑块的解决方式
2021/02/06 Python
英国最好的温室之家:Greenhouses Direct
2019/07/13 全球购物
企业宣传策划方案
2014/05/29 职场文书
一份没有按时交货失信于客户的检讨书
2014/09/19 职场文书
2015年秋季小班开学寄语
2015/05/27 职场文书
OpenCV-Python实现油画效果的实例
2021/06/08 Python
古见同学有交流障碍症 第二季宣传CM公开播出
2022/04/11 日漫