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下用于监视文件系统的pyinotify包
Nov 13 Python
python爬虫之百度API调用方法
Jun 11 Python
详解Pandas之容易让人混淆的行选择和列选择
Jul 10 Python
Python队列RabbitMQ 使用方法实例记录
Aug 05 Python
在pytorch中为Module和Tensor指定GPU的例子
Aug 19 Python
python爬取Ajax动态加载网页过程解析
Sep 05 Python
使用Python的Turtle绘制哆啦A梦实例
Nov 21 Python
Python对象的属性访问过程详解
Mar 05 Python
python3+opencv 使用灰度直方图来判断图片的亮暗操作
Jun 02 Python
关于PySnooper 永远不要使用print进行调试的问题
Mar 04 Python
使用pytorch实现线性回归
Apr 11 Python
python爬虫之爬取笔趣阁小说
Apr 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
改进的IP计数器
2006/10/09 PHP
yii框架中的Url生产问题小结
2012/01/16 PHP
PHP时间戳与日期之间转换的实例介绍
2013/04/19 PHP
destoon会员注册提示“数据校验失败(2)”解决方法
2014/06/21 PHP
Java中final关键字详解
2015/08/10 PHP
My Desktop :) 桌面式代码
2008/12/29 Javascript
有趣的JavaScript数组长度问题代码说明
2011/01/20 Javascript
jquery 跳到顶部和底部动画2句代码简单实现
2013/07/18 Javascript
打造个性化的功能强大的Jquery虚拟键盘(VirtualKeyboard)
2014/10/11 Javascript
Javascript基础教程之比较操作符
2015/01/18 Javascript
javascript判断并获取注册表中可信任站点的方法
2015/06/01 Javascript
JavaScript基础知识点归纳(推荐)
2016/07/09 Javascript
Highcharts入门之基本属性
2016/08/02 Javascript
微信小程序 获取微信OpenId详解及实例代码
2016/10/31 Javascript
JS数字千分位格式化实现方法总结
2016/12/16 Javascript
微信小程序 高德地图SDK详解及简单实例(源码下载)
2017/01/11 Javascript
Angular排序实例详解
2017/06/28 Javascript
vue以组件或者插件的形式实现throttle或者debounce
2019/05/22 Javascript
Python+matplotlib+numpy实现在不同平面的二维条形图
2018/01/02 Python
Python键盘输入转换为列表的实例
2018/06/23 Python
python环形单链表的约瑟夫问题详解
2018/09/27 Python
使用python3构建文件传输的方法
2019/02/13 Python
简单了解Pandas缺失值处理方法
2019/11/16 Python
python matplotlib绘制三维图的示例
2020/09/24 Python
利用django创建一个简易的博客网站的示例
2020/09/29 Python
如何创建一个Flask项目并进行简单配置
2020/11/18 Python
利用Python实现学生信息管理系统的完整实例
2020/12/30 Python
推荐一些比较有用的css3新属性
2014/11/11 HTML / CSS
HTML5学习笔记之html5与传统html区别
2016/01/06 HTML / CSS
福克斯租车:Fox Rent A Car
2017/04/13 全球购物
Java编程面试题
2016/04/04 面试题
公务员转正鉴定材料
2014/02/11 职场文书
选秀节目策划方案
2014/06/06 职场文书
团支部书记竞选稿
2015/11/21 职场文书
浅谈PostgreSQL表分区的三种方式
2021/06/29 PostgreSQL
海康机器人重磅发布全新算法开发平台VM4.2
2022/04/21 数码科技