Что может быть объяснением этого «pyarrow.lib.ArrowIOError»?

Я работаю над кластером HDP и пытаюсь прочитать файл .csv из HDFS с помощью pyarrow. Я могу подключиться к hdfs и распечатать информацию о файле с помощью функции info(). Но когда дело доходит до чтения содержимого файла, я получаю ошибку pyarrow.lib.ArrowIOError. Что может быть источником проблемы?

Вот код, который я выполняю

# IMPORTS
import pyarrow as pa
from pyarrow import csv
import os
import subprocess

# GET HDFS CLASSPATH
classpath = subprocess.Popen(["/usr/hdp/current/hadoop-client/bin/hdfs", "classpath", "--glob"], stdout=subprocess.PIPE).communicate()[0]

# CONFIGURE ENVIRONMENT VARIABLES
os.environ["HADOOP_HOME"] = "/usr/hdp/current/hadoop-client"
os.environ["JAVA_HOME"] = "/home/G60070/installs/jdk1.8.0_201/"
os.environ["CLASSPATH"] = classpath.decode("utf-8")
os.environ["ARROW_LIBHDFS_DIR"] = "/usr/hdp/2.6.5.0-292/usr/lib/"

# USING PYARROW
## connect to hdfs
fs = pa.hdfs.connect("xxxxxxx.xxx.xxx.fr", 8020)
file = 'hdfs://xxxxxxx.xxx.xxx.fr:8020/user/F43479/trip_data_v2.csv'
print(str(fs.info(file))) # this instruction works well

## read csv file
csv_file = csv.read_csv(file) # this one doesn't work as expected
csv_file

Согласно документации pyarrow, я должен чтобы в результате получить список столбцов csv.

Но я получаю эту ошибку: pyarrow.lib.ArrowIOError: Не удалось открыть локальный файл: hdfs://xxxxxxx.xxx.xxx.fr:8020/user/F43479/trip_data_v2.csv, ошибка: файл не найден

Сначала я подумал, что неправильно написал путь к файлу. Я проверил hdfs и файл там.

[F43479@xxxxx dask_tests]$ hdfs dfs -ls /user/F43479/
Found 9 items
-rw-r-----   3 F43479 hdfs            0 2019-03-07 16:42 /user/F43479/-
drwx------   - F43479 hdfs            0 2019-04-03 02:00 /user/F43479/.Trash
drwxr-x---   - F43479 hdfs            0 2019-03-13 16:53 /user/F43479/.hiveJars
drwxr-x---   - F43479 hdfs            0 2019-03-13 16:52 /user/F43479/hive
drwxr-x---   - F43479 hdfs            0 2019-03-15 13:23 /user/F43479/nyctaxi_trip_data
-rw-r-----   3 F43479 hdfs           36 2019-04-15 11:13 /user/F43479/test.csv
-rw-r-----   3 F43479 hdfs  50486731416 2019-03-26 17:37 /user/F43479/trip_data.csv
-rw-r-----   3 F43479 hdfs   5097056230 2019-04-15 13:57 /user/F43479/trip_data_v2.csv
-rw-r-----   3 F43479 hdfs 504867312828 2019-04-02 11:15 /user/F43479/trip_data_x10.csv

Что может быть источником проблемы?

Спасибо за вашу потенциальную помощь.


person Sevy    schedule 16.04.2019    source источник


Ответы (1)


Попробуйте открыть файл через HadoopFileSystem объект:

with fs.open(file, 'rb') as f:
    ## read csv file
    csv_file = csv.read_csv(f) 
person isalgueiro    schedule 16.04.2019
comment
Я пошел посмотреть документацию о < b>fs.open(). Насколько я понял, эта функция использует интерфейс на основе C++, позволяющий pyarrow подключаться к файловой системе Hadoop. Но по умолчанию pyarrow использует libhdfs, основанный на JNI интерфейс для Java Hadoop Client, для взаимодействия с HDFS. Путь к libhdfs определяется в переменной env LD_LIBRARY_PATH (которую я настроил). Моя ошибка произошла из-за того, что pyarrow не смог получить доступ к hdfs, используя поведение по умолчанию? - person Sevy; 16.04.2019
comment
В csv.read_csv(file) переменной file является строка 'hdfs://xxxxxxx.xxx.xxx.fr:8020/user/F43479/trip_data_v2.csv'. Хотя вы создали объект файловой системы fs, csv.read_csv об этом не знает. Я думаю, что сообщение об ошибке могло бы быть лучше - person Wes McKinney; 23.04.2019