私は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ファイルを読み取って、他のすべてのノードで使用できるようにする方法を知っていますか?
あなたはあなたのファイルがワーカーノードから欠落しているという事実について正しいので、それはあなたが得たエラーを引き起こします。
これが公式ドキュメント 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(または任意の分散ファイルシステム)を使用します。