Пытаюсь поправить скрипт для pyspark в amazon emr и не получается читать из hdfs в нем.
Схема примерно такая:
С машины не в кластере запускается shell script:
aws emr add-steps ... --steps Type=CUSTOM_JAR .. Args=['s3://script.sh']
В нем внутри что-то типа такого — копирует данные снаружи в hdfs:
s3-dist-cp s3://some_file /mnt1/some_file
hdfs dfs -put /mnt1/some_file hdfs://home/hadoop/output/gzip
hdfs dfs -ls -h hdfs://home/hadoop/output/gzip (1)
Потом из него запускается программа на питоне:
spark-submit ... --master yarn --deploy-mode cluster s3://script.py
А внутри программы пытаюсь читать из hdfs:
if __name__=="main":
subprocess.check_output("hdfs dfs -ls hdfs://home/hadoop/output/gzip") #(2)
sc = SparkContext()
f = sc.binaryFiles("hdfs://home/hadoop/output/gzip") #(3)
f.keys().foreach(some_fn)
В (1) всё работает нормально, выдает файлы в hdfs. (3) тоже работает нормально, загружает их, параллелит итд.
Но почему-то не работает (2). Как я понимаю что скрипт, что (2), всё кроме some_fn запускается на master ноде. Пытаюсь поменять это тк тут данные из файлов не нужны, только имена, а binaryFiles, как я понял, загружают содержимое файлов в память и рассылают по нодам.
В спарке я не нашел способа получить просто имена файлов, только вместе с содержимым.