私はS3からデータセットをロードする必要があるアプリケーションを構築しています。機能は正常に動作していますが、パフォーマンスは驚くほど遅いです。S3からのCSVファイルをSparkデータフレームに読み込むのが遅いと予想されていますか?
データセットはCSV形式です。各ファイルには約7Mのレコード(行)があり、各ファイルは600〜700MBです。
val spark = SparkSession
.builder()
.appName("MyApp")
.getOrCreate()
val df = spark
.read
.option("header", "true")
.option("inferSchema", "true")
.csv(inFileName:_*)
// inFileName is a list that current contains 2 file names
// eg. s3://mybucket/myfile1.csv
val r = df.rdd.flatMap{ row =>
/*
* Discard poorly formated input records
*/
try {
totalRecords.add(1)
// this extracts several columns from the dataset
// each tuple of indexColProc specifies the index of the column to
// select from the input row, and a function to convert
// the value to an Int
val coords = indexColProc.map{ case (idx, func) => func(row.get(idx).toString) }
List((coords(0), coords))
}
catch {
case e: Exception => {
badRecords.add(1)
List()
}
}
}
println("Done, row count " + r.count)
これは、5台のマシンのAWSクラスタで、それぞれm3.xlargeで実行しました。 maximizeResourceAllocationパラメーターはtrueに設定され、これはクラスター上で実行されている唯一のアプリケーションでした。
私はアプリケーションを2回実行しました。 S3のファイルを指す 'inFileName'と、hadoopファイルシステムのファイルのローカルコピーを指しているのは、初めてです。
私はSparkヒストリサーバーを見て、最後のr.countアクションに対応するジョブにドリルダウンすると、s3上のファイルにアクセスするのに2.5分かかります。 hdfs。私は、「私は、ローカル設定=小さいクラスタ上またはマスターで同じ実験を実行したときに比例し、同様の結果を得まし。
私は
aws s3 cp <file>
を使用してクラスタにS3のファイルをコピーするとそれだけで6.5sかかります
s3にアクセスするとこのようなパフォーマンスが低下しますか?そうでない場合、このようなパフォーマンスは低下しますか?そうでない場合は、誰かが私が間違っている場所を指摘してもらえますか?それが予想される場合は、パフォーマンスを向上させるためにこれを行う他の方法がありますか?アプリケーションを実行する前にs3からhdfsにファイルを単純にコピーするようなものを開発しますか?
'flatMap'を実行する前に' df.cache() 'を試してみてください/ – maxymoo
私はそれを試しましたが、効果がなかったか、パイプラインがハングアップしました(私は試したときに別のマシンインスタンスでしたその実験)。 –