当前位置: 代码网 > it编程>前端脚本>Python > Python语言连接访问Kerberos认证下的HA HDFS

Python语言连接访问Kerberos认证下的HA HDFS

2024年07月28日 Python 我要评论
「目的描述」此篇文章目的是使用Python语言对启用Kerberos、High Availability的HDFS文件系统进行访问,主要介绍KerberosClient、pyarrow、hdfs3三种方式。「环境说明」Python运行环境为3.7.0集群环境为CDH6.2.1(已启用Kerberos认证)Namenode实例所在机器分别为cm111、cm112废话不多说,直接上代码1、HdfsCl...

114783f3c0ce23929d3c08be935d73ec.png

c8fb485dfc56df9265c248f0c2f31ea3.png

「目的描述」

6027ed28e07ad2efbbd9fc66e0c982f1.png

此篇文章目的是使用python语言对启用kerberos、high availability的hdfs文件系统进行访问,主要介绍kerberosclient、pyarrow、hdfs3三种方式。

c2d813f234c86bc4bb093470a74de64d.png

04cafffe6a2b2face9ad9b4a5ab5457f.png

「环境说明」

bdbda8d352039d44f8b38f9011662c57.png

python运行环境为3.7.0

集群环境为cdh6.2.1(已启用kerberos认证)

namenode实例所在机器分别为cm111、cm112

废话不多说,直接上代码

2f1c4638dab03528798fdfc68eeddd84.png

1、hdfscli方式

950d508a14fb86a3c219f71d59dd2b7a.png

代码示例

from hdfs.ext.kerberos import kerberosclient
from krbcontext import krbcontext




keytab_file = "/root/hdfs.keytab"
principal = "hdfs/cm111@wmm.com"




with krbcontext(using_keytab=true, keytab_file=keytab_file, principal=principal, ccache_file="/tmp/cache_keytab_zds"):
    client = kerberosclient(url="http://192.168.242.112:9870;http://192.168.242.111:9870")
    hdfs_save_path = "/tmp/nuannuaanwqg"
    #client.makedirs(hdfs_save_path)
    print("hdfs中的目录为:", client.list(hdfs_path="/", status=true))
if __name__ == '__main__':
    krbcontext()

所需条件

提供keytab票据及主体名称即可

参考链接

https://hdfscli.readthedocs.io/en/latest/api.html

846d5153d014a50386eef83e2e34d26c.png

2、pyarrow方式

50fe5315948c31c43cc00ce9f7298e22.png

ba307958d1951af8773829bb6c78c32b.png

598311d7c6726eec8c7b6a4e3dde5ec4.png

「简要说明」

537214890983441088fb5256c20272ed.png

apache arrow是内存分析的开发平台。它包含一组技术,使大数据系统能够快速存储、处理和移动数据。arrow python是其一个分支。

arrow python 绑定(也称为“pyarrow”) 与numpy、panda和内置python对象具有一流的集成。它们基于arrow的c++实现。

代码示例

#!/bin/python3.7.0
from pyarrow import fs
import os
import subprocess


def run_cmd(args_list):
  """
  run linux commands
  """
  # import subprocess
  print('running system command: {0}'.format(' '.join(args_list)))
  proc = subprocess.popen(args_list, stdout=subprocess.pipe, stderr=subprocess.pipe)
  s_output, s_err = proc.communicate()
  s_return =  proc.returncode
  return s_return, s_output, s_err
if __name__ == '__main__':
    (ret, out, err)= run_cmd(['/root/test/pythond/cdh-6.2.1-1.cdh6.2.1.p0.1425774/bin/hadoop','classpath','--glob'])
    lines = bytes.decode(out).split('\n')
    for path in lines:
     classpath = path
     break
    classpath = "/root/test/pythond/conf/cm111/conf:{classpath}".format(classpath=classpath)
    os.environ['classpath'] = classpath
    os.environ['arrow_libhdfs_dir'] = '/root/test/pythond/cdh-6.2.1-1.cdh6.2.1.p0.1425774/lib64/'
    hdfs_host = 'nameservice1'
    hdfs_port = 0
    user= 'hdfs/cm111@wmm.com'
    kerb_ticket = '/root/test/pythond/pyarrow/krb5cc_0'
    args = {
     'host': hdfs_host,
     'user': user, #可选,此处与kerb_ticket一起使用,如果不选择则选择客户端上默认激活的用户
     'kerb_ticket': kerb_ticket, #可选,描述同上
     'port': 8020,
    }
    fs2 = fs.hadoopfilesystem(**args)
    print(fs2)
    fs2.create_dir("/tmp/pyarrow_testa")

所需条件

①parcels目录下的依赖包(需要将parcels下的目录拷贝到脚本所在机器)

②kerberos的缓存文件(非必须项,不使用缓存文件时,需要将user及kerb_ticket两个参数去掉,这样就默认使用本地激活的票据了)

③hadoop conf文件目录(使用ha模式方式hdfs需要)

④兼容的java环境(因为此原因kerberos验证不通过,会直接报权限不足异常。卡了很久,特此记录一下)

参考链接

https://arrow.apache.org/docs/python/generated/pyarrow.fs.hadoopfilesystem.html

5fd6deead714fc870ff984115bb6eb0b.png

3、hdfs3方式

e1451b3d161a3590b965ceeea2a4fe41.png

45360ab43fcc4ae0f7cf8c1109298afb.png

64d06af77feca72f5e57d95de8562644.png

「简要说明」

de88e796464c37ff81d84b559a24c6be.png

pivotal生产了libhdfs3,这是一种替代的本机c/c++hdfs客户端,它在没有jvm的情况下与hdfs交互,向python等非jvm语言提供了一流的支持。

这个名为hdfs3的库是围绕c/c++libhdfs3库的轻量级python包装器。它提供了从python直接访问libhdfs3以及一个典型的pythonic接口。

代码示例

from hdfs3 import hdfilesystem
host = "nameservice1"


conf = {"dfs.nameservices": "nameservice1",
        "dfs.ha.namenodes.nameservice1": "namenode29,namenode32",
        "dfs.namenode.rpc-address.nameservice1.namenode29": "cm111:8020",
        "dfs.namenode.rpc-address.nameservice1.namenode32": "cm112:8020",
        "dfs.namenode.http-address.nameservice1.namenode29": "cm111:9870",
        "dfs.namenode.http-address.nameservice1.namenode32": "cm112:9870",
        "hadoop.security.authentication": "kerberos"
}
fs = hdfilesystem(host=host, pars=conf)
list_pat = fs.ls("/", detail=false)
print(list_pat)

hdfs3方式使用代码其实很简单,但是环境的依赖却是耗费了我好长时间。

下面是无法联网情况下如何使用这种方式访问hdfs。

这里我选择使用conda工具,目前可以大致确认通过pip无法实现。

(因为pip只能安装python相关的库,无法安装c++相关的依赖(如libhdfs3),有个方式是针对源码进行重新编译,由于测试过程中对c++不了解,且按照示例步骤一直失败,看不出原因这里就不再尝试)。

conda离线使用hdfs3访问hdfs步骤如下:

① 离线安装conda,步骤如第五篇章

② 在有网的机器进行安装,新建新的空间名称,再紧接着安装hdfs3模块

执行命令如下

conda create --name offline  python=3.7.6
conda install hdfs3 -c conda-forge

③ 验证执行python是否可以成功

python xxx.py(可能联网机器无法访问目标集群这步可省略)

④ 如成功则进入conda安装的路径(联网机器下)

conda info 命令可以查看安装路径

显示中的active env location 一行信息可知,我这里是/usr/local/anaconda3

05c90dff29c61cc18f36561ca7d06b8b.png

⑤ 进入envs目录

cd /usr/local/anaconda3/envs
压缩offline 路径
tar -zcf offline.tar.gz offline/

⑥ 将offline.tar.gz 包上传到断网机器并解压到conda安装路径下的envs目录下

tar -zxf offline.tar.gz -c /usr/local/anaconda3/envs/

c00a49836f7ea6642f7d0c2fa0e34782.png

⑦ 在不联网机器中执行以下命令

conda activate offline  #切换conda环境
kinit -kt hdfs.keytab hdfs/cm115@wqg.com  #激活票据

⑧ 再执行python xxx.py,显示如下图即为成功

2447383872b470c250414002476ccfed.png

所需条件

①、安装anaconda3(非必须项,但是通过其他方式会遇到各种问题,其安装使用步骤见第四篇章)

②、部署kerberos客户端,并激活有权限的票据(我这里是使用hdfs.keytab)。

③、配置/etc/hadoop/conf/路径,里面的配置要求与要访问的目标集群配置文件一致。

④、兼容的java环境(不兼容会导致kerberos认证失败)。

83d91bd8d340f5af48561f70c7e140c6.png

anaconda3安装使用(联网情况)

f3715e2b6188c2c989a0e8468679cc51.png

1、下载anaconda3(选择linux版本即可)

下载地址

https://www.anaconda.com/products/distribution#downloads

2、安装所需依赖,否则后续会出现异常

yum install -y bzip2

3、直接执行安装脚本,按照提示一步步选择y或回车即可

bash anaconda3-2022.10-linux-x86_64.sh

4、添加镜像,为了安装hdfs3模块更快

conda config --add channels https://mirrors.bfsu.edu.cn/anaconda/pkgs/free/
conda config --add channels https://mirrors.bfsu.edu.cn/anaconda/pkgs/main/
conda config --add channels https://mirrors.bfsu.edu.cn/anaconda/cloud/conda-forge/
conda config --add channels https://mirrors.bfsu.edu.cn/anaconda/cloud/bioconda/

5、创建wqgdemo环境并且安装python3.7

conda create --name wqgdemo python=3.7

6、切换到wqgdemo环境

conda activate wqgdemo

7、安装hdfs3模块

conda install hdfs3 -c conda-forge

8、此时准备工作已完成,直接执行第三篇章的python脚本即可

python hdfs3_hahfds.py
注:此时python版本为python 3.7.1非本地默认的2.7.5

6879059c9034f1fe0bf05e12d9b0b12e.png

anaconda3安装使用(断网情况)

4a0b157e9edbaed73eabac007183c129.png

一般生产环境都是不允许联网的。

1、下载anaconda3(选择linux版本即可)

下载地址

https://www.anaconda.com/products/distribution#downloads

2、安装所需依赖,否则后续会出现异常

yum install -y bzip2

3、直接执行安装脚本,按照提示一步步选择y或回车即可

bash anaconda3-2022.10-linux-x86_64.sh

此步骤详细截图如下

  9a47e3b06bfca701a0836e8e3cc401db.png761eaf0659a83d2e9e3c1ce22f57d2d1.png

c6a54fa84748f37766f8c27050635174.png

然后shell退出重新连接

4、使用conda -v正常显示即可成功

21b6f66e40bc78d096172bf7fc564e12.png

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2025  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com