0


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

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/[email protected]"

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/[email protected]'
    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/[email protected]  #激活票据

⑧ 再执行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


本文转载自: https://blog.csdn.net/sx157559322/article/details/131950753
版权归原作者 沧海寄馀生 所有, 如有侵权,请联系我们删除。

“Python语言连接访问Kerberos认证下的HA HDFS”的评论:

还没有评论