温馨提示:如果使用电脑查看图片不清晰,可以使用手机打开文章单击文中的图片放大查看高清原图。
Fayson的github: https://github.com/fayson/cdhproject
提示:代码块部分可以左右滑动查看噢
1
文档编写目的
在集群启用Kerberos后,使用同一个OS用户在客户端并发调度Python代码获取Hive数据(代码中使用不同的kerberos用户kinit),会出现两个作业的认证混乱获取到的票据串掉。本文Fayson主要分析Kerberos环境同一OS用户下并发执行不同身份认证的Python代码会导致Principal串掉问题解决。
- 测试环境
1.CDH5.15.0
2.Redhat7.3
3.集群已启用Kerberos
2
问题描述
Fayson通过一段简单的示例代码说明问题,在代码中执行kinit命令初始化Kerberos信息,通过impyla包访问Hive,具体代码如下:
代码语言:javascript复制from impala.dbapi import connect
import os
os.system('kinit -k -t /data/disk1/pythonkb/hbase.keytab hbase/cdh04.fayson.net')
os.system('klist')
conn = connect(host='cdh02.fayson.net',port=10000,database='default',auth_mechanism='GSSAPI',kerberos_service_name='hive')
print(conn)
cursor = conn.cursor()
cursor.execute('show databases')
print (cursor.description) # prints the result set's schema
results = cursor.fetchall()
print(results)
在同一个用户的OS下创建test_hbase.py和test_yarn.py的两个Python脚本,分别使用hbase和yarn用户初始化Kerberos信息。
在crontab中添加两个定时任务,使两个任务同时并发
在生成的testhbase.log和testyarn.log中可以看到两个脚本会获取到对方的Principal信息
3
问题分析
1.首先在客户端进行Kinit操作后,默认的Ticket Cache是存储在tmp/krb5cc_0临时文件中(Ticket cache文件是根据当前用户的uid在/tmp目录下生成一个以krb5cc_开头的临时文件)。
2.由于上述的两个脚本是在同一个OS用户下,所以两个不同的Kerberos用户在进行Kinit操作后都会覆盖/tmp/krb5cc_{uid}文件
根据上述两点基本可以定位问题的原因,因为Ticket cache文件被覆盖导致Kerberos的票据信息串掉。
4
问题解决
由于两个Python脚本使用了同一份Ticket cache文件导致Kerberos的票据信息串掉,那通过在代码中指定Ticket cache文件,而不使用默认的文件。Fayson对上述代码做了如下改动,在代码中增加了OS环境变量KRB5CCNAME的设置,具体代码如下:
代码语言:javascript复制from impala.dbapi import connect
import os
os.environ['KRB5CCNAME']='/tmp/krb5_ccname_hbase'
os.system('kinit -k -t /data/disk1/pythonkb/hbase.keytab hbase/cdh04.fayson.net')
os.system('klist')
conn = connect(host='cdh02.fayson.net',port=10000,database='default',auth_mechanism='GSSAPI',kerberos_service_name='hive')
print(conn)
cursor = conn.cursor()
cursor.execute('show databases')
print (cursor.description) # prints the result set's schema
results = cursor.fetchall()
print(results)
通过修改上述两个脚本,在两个脚本中都指定KRB5CCNAME环境变量为不同的文件,再次进行测试未发现两个应用的票据信息串掉的问题。
5
总结
1.默认Ticket cache文件的生成是根据用户的uid在/tmp目录下生成一个以krb5cc_开头的缓存文件。
2.如果在同一个OS用户下使用不同的Kerberos用户进行kinit会覆盖/tmp/krb5cc_{uid}文件,从而导致应用中的票据信息串掉。
3.可以通过在应用中为不同的Kerberos用户指定一个独立的Ticket cache文件,以防止票据信息串掉。
提示:代码块部分可以左右滑动查看噢
为天地立心,为生民立命,为往圣继绝学,为万世开太平。 温馨提示:如果使用电脑查看图片不清晰,可以使用手机打开文章单击文中的图片放大查看高清原图。
推荐关注Hadoop实操,第一时间,分享更多Hadoop干货,欢迎转发和分享。
原创文章,欢迎转载,转载请注明:转载自微信公众号Hadoop实操