web-dev-qa-db-ja.com

Pyspark-ロードファイル:パスが存在しません

私はSparkの初心者です。 EMRクラスター内のローカルcsvファイルを読み取ろうとしています。ファイルは/ home/hadoop /にあります。私が使用しているスクリプトは次のスクリプトです。

spark = SparkSession \
    .builder \
    .appName("Protob Conversion to Parquet") \
    .config("spark.some.config.option", "some-value") \
    .getOrCreate()\

df = spark.read.csv('/home/hadoop/observations_temp.csv, header=True)

スクリプトを実行すると、次のエラーメッセージが表示されます。

pyspark.sql.utils.AnalysisException:u'Pathが存在しません:hdfs://ip-172-31-39-54.eu-west-1.compute.internal:8020/home/hadoop/observations_temp.csv

次に、ローカルでファイルを読み取ることができるように、ファイルパスにfile://を追加する必要があることがわかりました。

df = spark.read.csv('file:///home/hadoop/observations_temp.csv, header=True)

しかし、今回は、上記のアプローチで別のエラーが発生しました。

ステージ0.0でタスク0.3を失った(TID 3、
ip-172-31-41-81.eu-west-1.compute.internal、executor 1):Java.io.FileNotFoundException:ファイルfile:/home/hadoop/observations_temp.csvが存在しません

File //拡張子はファイルをローカルで読み取るだけで、他のノードにファイルを分散しないためだと思います。

Csvファイルを読み取って、他のすべてのノードで使用できるようにする方法を知っていますか?

5
ebertbm

あなたはあなたのファイルがワーカーノードから欠落しているという事実について正しいので、それはあなたが得たエラーを引き起こします。

これが公式ドキュメント Ref。External Datasets です。

ローカルファイルシステム上のパスを使用する場合、ワーカーノード上の同じパスでファイルにアクセスできる必要もあります。ファイルをすべてのワーカーにコピーするか、ネットワークにマウントされた共有ファイルシステムを使用します。

したがって、基本的に2つの解決策があります。

ジョブを開始する前に、ファイルを各ワーカーにコピーします。

または、次のようなHDFSでアップロードします:(推奨ソリューション)

hadoop fs -put localfile /user/hadoop/hadoopfile.csv

これでそれを読むことができます:

df = spark.read.csv('/user/hadoop/hadoopfile.csv', header=True)

AWS S3も使用しているようです。ダウンロードせずにいつでもS3から直接読み取ることができます。 (もちろん、適切な資格情報が必要です)

一部の人は、spark-submitで提供される--filesタグがファイルを実行ディレクトリにアップロードすることを提案しています。 csvファイルが非常に小さい場合を除き、この方法はお勧めしませんが、Sparは必要ありません。

または、HDFS(または任意の分散ファイルシステム)を使用します。

12
eliasah