最初の EMR ステップで、S3DistCPを使用してファイルのツリーを S3 から HDFS にコピーします。hdfs dfs -ls -R hdfs:///data_dir
次のような予想されるファイルを示します。
/data_dir/year=2015/
/data_dir/year=2015/month=01/
/data_dir/year=2015/month=01/day=01/
/data_dir/year=2015/month=01/day=01/data01.12345678
/data_dir/year=2015/month=01/day=01/data02.12345678
/data_dir/year=2015/month=01/day=01/data03.12345678
「ディレクトリ」はゼロバイトのファイルとしてリストされます。
次に、これらのファイルを読み取る必要があるスパーク ステップを実行します。したがって、読み込みコードは次のようになります。
sqlctx.read.json('hdfs:///data_dir, schema=schema)
ジョブが Java 例外で失敗する
java.io.IOException: Not a file: hdfs://10.159.123.38:9000/data_dir/year=2015
私は (おそらく単純に)、spark が「ディレクトリ ツリー」を再帰的に下降し、データ ファイルをロードすると想定していました。S3 を指定すると、データが正常にロードされます。
HDFS を誤解していますか? 0 バイトのファイルを無視するように spark に指示できますか? S3DistCp を使用してツリーを平坦化できますか?