Index
windows 平台上使用 pyarrow 连接 hdfs 详细教程
因篇幅太长,因此先直接说结论,若有兴趣知道这个结论是怎么来的,可以跳到章节:踩坑记录,中进行细节上的阅览。
转载请注明出处,蟹蟹。
连接教程
- 使用
pip
安装pyarrow
。 - 下载
JDK
,解压后设置环境变量JAVA_HOME
和JDK_HOME
指向解压后的路径。 - 下载
hadoop
的预发布压缩包,并解压。解压后设置环境变量HADOOP_HOME
指向解压后的路径。 - 下载与步骤 3 对应的
hadoop
源码包,准备编译 windows 平台上的hdfs.dll
文件。 - 在解压后的
hadoop
源码hadoop-2.9.2-src\hadoop-hdfs-project\hadoop-hdfs-native-client\src
下,存在CMakeLists.txt
文件,使用该CMake
文件进行编译,以此编译出sln
文件。- 若在编译过程中出现报错:
JVM_ARCH_DATA_MODEL
未定义,则可在编译命令中加入以下参数-DJVM_ARCH_DATA_MODEL=64
(指定java
的平台版本,存疑)。 - 若在编译过程中出现报错:
OpenSSL_ROOT_DIR not defined (missing: OpenSSL_include_dir)
,则需进行第六步。
- 若在编译过程中出现报错:
- (若步骤 5 出现了报错 ,则进行该步骤,否则可跳过)根据
OpenSSL
的官方编译文档,在本机上编译,以此得到include
文件夹。 - 使用
Visual Studio
打开CMake
编译出的sln
文件。打开后设置为Release
和对应的平台版本(x64/x32
)后,在解决方案中选中hdfs
,右键后点击生成;即可在当前目录下的bin
文件夹中得到编译后的dll
文件。(举个例子:./bin/Release/hdfs.dll
) - 将生成的
hdfs.dll, hdfs.exp, hdfs.lib
三个文件放置在一个新的文件夹中,并设置环境变量ARROW_LIBHDFS_DIR
指向该路径。 - 在winutils上下载对应版本的
hadoop
文件夹,将bin
文件夹里面的文件拷贝覆盖到原有hadoop\bin
文件夹。 - 每次连接前使用
set_hadoop_classpath
函数设置环境变量后即可使用。import os import subprocess from pyarrow import fs # Thanks to: https://stackoverflow.com/a/66651006 def set_hadoop_classpath(): if 'hadoop' in os.environ.get('CLASSPATH', ''): return if 'HADOOP_HOME' in os.environ: hadoop_bin = os.path.normpath(os.environ['HADOOP_HOME']) + "/bin/" # '{0}/bin/hadoop'.format(os.environ['HADOOP_HOME']) else: hadoop_bin =