华为大数据平台使用pyhive连接hive的方法(Kerberos验证)

提示:转载请附原文链接


前言

近期想用python写个数据任务的调度工具,使用pyhive连接华为大数据平台的hive不成功,在彭老师的协助下最终完成了hive的连接,特此记录一下过程。


一、准备工作

  • PyHive源码包:我用的 PyHive-0.6.5

  • 安装系统依赖(CentOS,其他linux类似): yum安装以下包,cyrus-sasl、cyrus-sasl-lib、cyrus-sasl-devel、cyrus-sasl-md5、cyrus-sasl-plain、cyrus-sasl-gssapi (Kerberos需要用GSSAPI, 来自cyrus-sasl-gssapi)

    运行sasl2-shared-mechlist命令包含GSSAPI应该就可以了

二、处理过程

1. 前期报错情况

代码如下(ip、端口、主机名均替换为非真实值):

from pyhive import hive 
conn = hive.Connection(host="hive_server2_host", port=10000, auth="KERBEROS", kerberos_service_name="hive")

报错如下:

TTransportException                     Traceback (most recent call last)
/tmp/ipykernel 23431/908701831.py in <module>
----> 1 conn = hive.Connection(host=”hive_server2_host", port=10000, auth="KEBEROS", kerberos_service_name="hive" )
/data/anaconda3/lib/python3.9/site-packages/PyHive-0.6.5-py3.9. egg/pyhive/hive.py in __init__ (self, host, port, scheme, username, database, auth, configuration, kerberos_ service_name, password, check_hostname, ssl_cert, thrift_transport)
	  241
	  242             try:
-->   243                 self._transport.open()
      244                 open_session_req = ttypes.TOpenSessionReq(
      245                 client protocol=protocol version,

/data/anaconda3/lib/python3.9/site-packages/thrift_sasl/__init__.py in open(self)
       82     ret, chosen_mech, initial_response = self.sasl.start(self.mechanism)
       83     if not ret:
-->    84         raise TTransportException(type=TTransportException.NOT_OPEN,
       85             message=("Could not start SASL: %s" % self.sasl.getError()))
       86
 
TTransportException: Could not start SASL: b'Error in sasl_client_start (-1) SASL(-1): generic failure: GSSAPI Error: Unspecified GSS failure. Minor code may provide more information (Server hive/hive_server2_host@FI1.COM not found in Kerberos database)

简要分析:报错中提示“Server hive/hive_server2_host@FI1.COM not found in Kerberos database”,但我实际使用beeline的时候,看到的提示是:“Connecting to jdbc:hive2://…;principle=hive/hadoop_fi1_host@FI1.COM”,那么可能需要修改pyhive源码,尝试让验证时使用“hadoop_fi1_host”的priciple而不是“hive_server2_host”

2. 修改源码并测试

2.1 分析一下需要修改哪些位置

解压:PyHive-0.6.5.tar.gz,然后找到目录下的 pyhive/hive.py。从以上报错可以看到,在self._transport.open()时产生了错误,那么我们找到使用KERBEROS认证时源码中哪里定义了self._transport

            if auth == 'NOSASL':
                # NOSASL corresponds to hive.server2.authentication=NOSASL in hive-site.xml
                self._transport = thrift.transport.TTransport.TBufferedTransport(socket)
            elif auth in ('LDAP', 'KERBEROS', 'NONE', 'CUSTOM'):
                # Defer import so package dependency is optional
                import sasl
                import thrift_sasl

                if auth == 'KERBEROS':
                    # KERBEROS mode in hive.server2.authentication is GSSAPI in sasl library
                    sasl_auth = 'GSSAPI'
                else:
                    sasl_auth = 'PLAIN'
                    if password is None:
                        # Password doesn't matter in NONE mode, just needs to be nonempty.
                        password = 'x'

                def sasl_factory():
                    sasl_client = sasl.Client()
                    # 这里 第217行
                    sasl_client.setAttr('host', host)
                    if sasl_auth == 'GSSAPI':
                        sasl_client.setAttr('service', kerberos_service_name)
                    elif sasl_auth == 'PLAIN':
                        sasl_client.setAttr('username', username)
                        sasl_client.setAttr('password', password)
                    else:
                        raise AssertionError
                    sasl_client.init()
                    return sasl_client
                # 这里 第227行
                self._transport = thrift_sasl.TSaslClientTransport(sasl_factory, sasl_auth, socket)

第227行的self._transport = thrift_sasl.TSaslClientTransport(sasl_factory, sasl_auth, socket)中,sasl_factory是一个函数,用来创建sasl_client并设置相关属性。然后可以看到第217行设置了sasl的hostsasl_client.setAttr('host', host)

另外在源码中发现与Kerberos相关的host设置的地方还有(第160行):

            elif auth == "KERBEROS" and kerberos_service_name:
                self._set_kerberos_header(thrift_transport, kerberos_service_name, host)

对Kerberos了解不多,因此不确定此处是否需要修改,如果前面那处不行再作尝试。

2.2 修改源码

修改 class Connection__init__函数,添加krb_host参数,如下所示:

class Connection(object):
    """Wraps a Thrift session"""

    def __init__(
        self,
        host=None,
        port=None,
        scheme=None,
        username=None,
        database='default',
        auth=None,
        configuration=None,
        kerberos_service_name=None,
        password=None,
        check_hostname=None,
        ssl_cert=None,
        thrift_transport=None,
        krb_host=None
    ):

修改sasl_factory()函数(sasl_client.setAttr('host', host)处如果krb_host不为None就使用krb_host):

                def sasl_factory():
                    sasl_client = sasl.Client()
                    if krb_host is not None:
                        sasl_client.setAttr('host', krb_host)
                    else:
                        sasl_client.setAttr('host', host)
                    if sasl_auth == 'GSSAPI':
                        sasl_client.setAttr('service', kerberos_service_name)
                    elif sasl_auth == 'PLAIN':
                        sasl_client.setAttr('username', username)
                        sasl_client.setAttr('password', password)
                    else:
                        raise AssertionError
                    sasl_client.init()
                    return sasl_client

2.3 从源码安装pyhive并测试

# 卸载原有的
pip uninstall pyhive
# 从源码安装
cd PyHive-0.6.5
python setup.py install 

测试情况

from pyhive import hive

conn = hive.Connection(
	host="hive_server2_host", 
	port=10000, 
	auth="KERBEROS", 
	kerberos_service_name="hive",
	krb_host="hadoop_fi1_host"
)
cursor = conn.cursor()
cursor.execute("show databases")
print(cursor.fetchone())
cursor.close()
conn.close()

结果如下:

('default',)

成功!

三、踩坑

1. 环境引入问题

第一次按上述方法修改完成后依然报错:

TTransportException: Could not start SASL: b'Error in sasl_client_start (-1) SASL(-1): generic failure: GSSAPI Error: Unspecified GSS failure. Minor code may provide more information (Cannot find KDC for realm "FI1.COM")

一度以为以上的修改思路不对,百般尝试都不顺利。后在彭老师提醒下可能是环境引入的问题(我在jupyter中使用os.system或subprocess尝试的环境引入),建议在终端中先引入环境再在python中尝试。

然后在终端中尝试:

[user@centos ~]$ source /opt/hadoop_client/bigdata_env
[user@centos ~]$ kinit -kt ~/etc/user.keytab username
[user@centos ~]$ python
>>> from pyhive import hive
>>> conn = hive.Connection(host="hive_server2_host", port=10000, auth="KERBEROS", kerberos_service_name="hive", krb_host="hadoop_fi1_host")

一切正常,不再报错。

分析原因应该是,使用的 os.system 运行的 sourcekinit,运行的效果都在 os.system 新建的进程中,而不是作用于当前运行python的进程中,所以导致了不生效。

还有一个导致我一直测试不出来的就是是使用nohup在后台运行的jupyter服务,服务起得很早,后面大数据平台配置有变更,而我没有重启jupyter服务。

不管是运行python文件或开jupyter,都要先引入环境,然后再运行py文件或jupyter。


总结

以上就是本次记录的内容,特别注意的是环境引入的坑。

感谢彭老师花费时间协助解决问题。

  • 2
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
FusionInsightHD华为⼤数据平台 华为FusionInsight HD是⼀个分布式数据处理系统,对外提供⼤容量的数据存储、分析查询和实时流式数据处 理分析能⼒。 安全 架构安全、认证安全、⽂件系统层加密 可靠 所有管理节点组件均实现HA(High Availability) 集群异地灾备 数据备份恢复 易⽤ 统⼀运维管理 易集成 易开发 系统架构 Manager 作为运维系统,为FusionInsight HD提供⾼可靠、安全、容错、易⽤的集群管理能⼒,⽀持⼤规模集群的安装部署、监控、告警、⽤ 户管理、权限管理、审计、服务管理、健康检查、问题定位、升级和补丁等。 FusionInsight Manager由OMS和OMA组成: OMS:操作维护系统的管理节点,OMS⼀般有两个,互为主备。 OMA:操作维护系统中的被管理节点,⼀般有多个。 Hue Hue提供了FusionInsight HD应⽤的图形化⽤户界⾯。Hue⽀持展⽰多种组件,⽬前⽀持HDFS、Hive、YARN/MapReduce、 Oozie、Solr、ZooKeeper以及Spark。 Hue是建⽴在Django Python的Web框架上的Web应⽤程序,采⽤了MTV(模型M-模板T-视图V)的软件设计模式。(Django Python 是开放源代码的Web应⽤框架。)Hue由"Supervisor Process"和"WebServer"构成。"Supervisor Process"是Hue的核⼼ 进程,负责应⽤进程管理。"Supervisor Process"和"WebServer"通过"THRIFT/REST"接⼝与WebServer上的应⽤进⾏交 互,如图所⽰。 Loader 实现FusionInsight HD与关系型数据库、⽂件系统之间交换数据和⽂件的数据加载⼯具;同时也可以将数据从关系型数据库或者⽂件 服务器导⼊到FusionInsight HD的HDFS/HBase中,或者反过来从HDFS/HBase导出到关系型数据库或者⽂件服务器中。同时提供 REST API接⼝,供第三⽅调度平台调⽤。 Loader模型主要由Loader Client和Loader Server组成: - Flume ⼀个分布式、可靠和⾼可⽤的海量⽇志聚合系统,⽀持在系统中定制各类数据发送⽅,⽤于收集数据;同时,Flume提供对数据进⾏简 单处理,并写⼊各种数据接受⽅(可定制)的能⼒。 - FTP-Server FTP-Server是⼀个纯Java的、基于现有开放的FTP协议的FTP服务。FTP-Server⽀持FTP、FTPS协议,每个服务都⽀持PORT、 PASSIVE数据通信协议。⽤户或业务组件可通过通⽤的FTP客户端、传输协议提供对HDFS⽂件系统进⾏基本的操作,例如:⽂件上 传、⽂件下载、⽬录查看、⽬录创建、⽬录删除、⽂件权限修改等。 FTP-Server服务由多个FTP-Server进程或FTPS-Server进程组成。 FTP-Server服务可以部署在多个节点上,每个节点上只有⼀个FTP-Server实例,每个实例只有⼀个FTP Server进程。 Hive 建⽴在Hadoop基础上的开源的数据仓库,提供⼤数据平台批处理计算能⼒,能够对结构化/半结构化数据进⾏批量分析汇总完成数据 计算。提供类似SQL的Hive Query Language语⾔操作结构化数据存储服务和基本的数据分析服务。其基本原理是将HQL语⾔⾃动转 换成MapReduce任务,从⽽完成对Hadoop集群中存储的海量数据进⾏查询和分析。 Hive为单实例的服务进程,提供服务的原理是将HQL编译解析成相应的MapReduce或者HDFS任务,下图为Hive的结构概图。 Mapreduce 提供快速并⾏处理⼤量数据的能⼒,是⼀种分布式数据处理模式和执⾏环境。MapReduce是⼀种简化并⾏计算的编程模型,名字源于 该模型中的两项核⼼操作:Map和Reduce。Map将⼀个作业分解成为多个任务,Reduce将分解后多个任务处理的结果汇总起来,得 出最终的分析结果。 如图所⽰,MapReduce通过实现YARN的Client和ApplicationMaster接⼝集成到YARN中,利⽤YARN申请计算所需资源。 Storm 提供分布式、⾼性能、⾼可靠、容错的实时计算平台,可以对海量数据进⾏实时处理。CQL(Continuous Query Language)提供 的类SQL流处理语⾔,可以快速进⾏业务开发,缩短业务上线时间。 Spark 基于内存进⾏计算的分布式计算框架。在迭代计算的场景下,数据处理过程中的数据可以存储在内存中,提供了⽐MapReduce⾼10到 100倍的计算能⼒。Spa

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值