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 相关文章推荐
将Django使用的数据库从MySQL迁移到PostgreSQL的教程
Apr 11 Python
python获取本机外网ip的方法
Apr 15 Python
Python实现Windows上气泡提醒效果的方法
Jun 03 Python
python编程开发之日期操作实例分析
Nov 13 Python
Python三级目录展示的实现方法
Sep 28 Python
python email smtplib模块发送邮件代码实例
Apr 26 Python
Python设计模式之策略模式实例详解
Jan 21 Python
初探利用Python进行图文识别(OCR)
Feb 26 Python
python创建与遍历List二维列表的方法
Aug 16 Python
浅析PEP572: 海象运算符
Oct 15 Python
Pytorch对Himmelblau函数的优化详解
Feb 29 Python
TensorFlow的reshape操作 tf.reshape的实现
Apr 19 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
destoon切换城市后实现logo旁边显示地区名称的方法
2014/08/21 PHP
PHP全功能无变形图片裁剪操作类与用法示例
2017/01/10 PHP
Js获取事件对象代码
2010/08/05 Javascript
jquery1.83 之前所有与异步列队相关的模块详细介绍
2012/11/13 Javascript
IE中图片的onload事件无效问题和解决方法
2014/06/06 Javascript
jQuery使用之设置元素样式用法实例
2015/01/19 Javascript
NodeJS中利用Promise来封装异步函数
2015/02/25 NodeJs
Jquery中基本选择器用法实例详解
2015/05/18 Javascript
Node.js编写爬虫的基本思路及抓取百度图片的实例分享
2016/03/12 Javascript
JS把内容动态插入到DIV的实现方法
2016/07/19 Javascript
nodejs 实现钉钉ISV接入的加密解密方法
2017/01/16 NodeJs
jQuery插件echarts实现的循环生成图效果示例【附demo源码下载】
2017/03/04 Javascript
AngulaJS路由 ui-router 传参实例
2017/04/28 Javascript
详解vue.js 开发环境搭建最简单攻略
2017/06/12 Javascript
如何通过非数字与字符的方式实现PHP WebShell详解
2017/07/02 Javascript
VueRouter导航守卫用法详解
2017/12/25 Javascript
Vue+webpack+Element 兼容问题总结(小结)
2018/08/16 Javascript
Nodejs 识别图片类型的方法
2019/08/15 NodeJs
nodejs各种姿势断点调试的方法
2020/06/18 NodeJs
[00:36]TI7不朽珍藏III——斯温不朽展示
2017/07/15 DOTA
python基于socket实现网络广播的方法
2015/04/29 Python
python使用wxpython开发简单记事本的方法
2015/05/20 Python
Python使用matplotlib绘制余弦的散点图示例
2018/03/14 Python
Python小游戏之300行代码实现俄罗斯方块
2019/01/04 Python
详解使用python绘制混淆矩阵(confusion_matrix)
2019/07/14 Python
与Django结合利用模型对上传图片预测的实例详解
2019/08/07 Python
python如何查看安装了的模块
2020/06/23 Python
pytorch Dataset,DataLoader产生自定义的训练数据案例
2021/03/03 Python
多视角3D逼真HTML5水波动画
2016/03/03 HTML / CSS
爱淘宝:淘宝网购物分享平台
2017/04/28 全球购物
学生会主席就职演讲稿
2014/01/14 职场文书
运动会入场词200字
2014/02/15 职场文书
大学英语专业求职信
2014/06/21 职场文书
2015公务员试用期工作总结
2014/12/12 职场文书
出纳工作检讨书范文
2014/12/27 职场文书
党支部鉴定意见
2015/06/02 职场文书