[Mac] HDFS에 있는 Parquet이 파일 읽기

2023. 3. 29. 21:56Project/FIFA Online 4 데이터 Airflow로 ETL 구성

728x90
반응형

로컬 HDFS에 있는 Parquet이 파일을 불러오는 방법은 hdfs 라이브러리 사용, pyarrow, spark 등등 여러 방법이 있었지만 spark를 사용하지 않고 파일을 불러올려고 노력을 했습니다.

 

1. hdfs 라이브러리와 pd.read_parquet() 사용

from hdfs import InsecureClient
import pandas as pd


file_path = '/path/to/directory'

client = InsecureClient('http://<namenode>:<port>', user='<username>')

with client.open(file_path) as f:
	df = pd.read_parquet(f)

df

이런식으로 진행을 하게 되면 Parquet 파일은 파일이 아니라 디렉토리 판정을 받기 때문에 파일 아니라는 오류가 발생하게 된다.

이 부분은 아직까지 해결방법을 찾지 못했습니다.

 

2. Pyarrow 라이브러리를 사용

그렇게 해서 pyarrow 라이브러리를 사용해서 HDFS 내에 있는 parquet 파일을 불러올려고 했습니다.

기본적으로 필요한 환경변수들을 설정해줘야 됩니다.

export HADOOP_HDFS_HOME=$HADOOP_HOME
export HADOOP_COMMON_HOME=$HADOOP_HOME
export PYARROW_HADOOP_HOME=$HADOOP_HOME
export LD_LIBRARY_PATH=$HADOOP_HOME/lib/native
export ARROW_LIBHDFS_DIR=$HADOOP_HOME/lib/native
export DYLD_LIBRARY_PATH=$HADOOP_HOME/lib/native:$DYLD_LIBRARY_PATH

그리고 기본적으로 불러오는 코드는 pyarrow.fs와 pyarrow.parquet를 활용하여 가져오게 됩니다.

import pyarrow.fs as fs
import pyarrow.parquet as pq

hdfs = fs.HadoopFileSystem(host='localhost', port=9000) 
dataset = pq.ParquetDataset('/path/to/parquet_file', filesystem=hdfs)
df = dataset.read().to_pandas()
df

Mac에서 실행하게 되면 libhdfs.dylib가 없다고 오류가 발생하는 경우가 생기게 됩니다.

이 경우 hadoop 공식 git에서 클론해오고 maven을 사용해 libhdfs.dylib 파일을 가져와야됩니다.

git clone https://github.com/apache/hadoop.git
# 버전에 맞게 바꿔줌
git checkout rel/release-3.3.2

cd hadoop/hadoop-hdfs-project/hadoop-hdfs-native-client
mvn package -Pdist,native -DskipTests -Dtar -Dmaven.javadoc.skip=true

이렇게 maven으로 파일을 풀고 파일을 $HADOOP_HOME/lib/native 안에 파일을 넣어두고 재부팅을 합니다.

그렇게 하고 실행을 했을 때 오류가 해결되었습니다

 

※ HadoopFileSystem의 종류가 구버전과 신버전 2개로 나뉘게 되는데 구버전으로 사용했음

728x90
반응형