5

最初の 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 を使用してツリーを平坦化できますか?

4

3 に答える 3

6

現在のスパーク コンテキストの Hadoop 構成で、SQL ctx を取得する前に、Hadoop InputFormat の「再帰的」読み取りを構成します。

val hadoopConf = sparkCtx.hadoopConfiguration
hadoopConf.set("mapreduce.input.fileinputformat.input.dir.recursive", "true")

これにより、「ファイルではない」という解決策が得られます。次に、複数のファイルを読み取るには:

複数のディレクトリから入力ファイルを取得する Hadoop ジョブ

またはファイルのリストを単一のデータフレームに結合します:

Spark を使用してディレクトリから複数のファイルを読み取る

于 2015-11-06T22:29:50.777 に答える
1

パラメータは、spark バージョン 2.1.0 で次のように設定する必要があります。

.set("spark.hive.mapred.supports.subdirectories","true")
.set("spark.hadoop.mapreduce.input.fileinputformat.input.dir.recursive","true")
于 2018-01-09T18:31:45.043 に答える