2016-12-21 20 views
0

私はマシン(5機)のクラスタ上で2つの大きなデータセット(2GBのJSONファイル/ 10.000.000タプルそれぞれ)に参加しようとしているが、私はいつも同じエラーを取得Java。 SparkSQLは、大規模なデータセット

java.lang.OutOfMemoryError: GC overhead limit exceeded 

よに参加しますスパークスクリプトは

public static void main(String[] args) throws Exception { 
SparkSession spark = SparkSession 
.builder() 
.appName("Java Spark Translator") 
.master("local") 
.getOrCreate(); 

StructType rainSchema = new StructType().add("id","integer").add("altitude","double").add("city_name","string").add("latitude","double").add("longitude","double").add("rainfall","double").add("station_name","string").add("time","timestamp"); 
Dataset<Row> s1 = spark.read().schema(rainSchema).json("dataset/rainfall.json"); 

StructType humiditySchema = new StructType().add("id","integer").add("altitude","double").add("city_name","string").add("latitude","double").add("longitude","double").add("humidity","double").add("station_name","string").add("time","timestamp"); 
Dataset<Row> s2 = spark.read().schema(humiditySchema).json("dataset/humidity.json"); 



Dataset<Row> j1 = s1.join(s2, s2.col("station_name").equalTo(s1.col("station_name")), "inner"); 

j1.show(); 

私は何か間違っていますか?解決策は何でしょうか?

ありがとう

+0

スパーク送信を引数で貼り付けることはできますか? –

+0

'/ home/hadoopuser/spark_test_lf/spark/bin/spark-submit --class" spark.examples.App " - マスタースパーク:// :7077ターゲット/ Java_Spark-1.0-SNAPSHOT.jar' –

答えて

0

"local"をマスターとして使用するようにsparkを設定します。つまり、クラスタを実際に使用するのではなく、単一のノードだけを使用しているということです。さらに、エグゼキュータのデフォルトサイズにsparkのデフォルトを設定していない場合、エグゼキュータはごくわずかです(デフォルトでは1 GB)。

これは、sparkがデータの読み込みを開始し、メモリ不足やGCのためにクラッシュすることを意味します(データが速すぎるとデータを作成して破壊するだけの場合)。

最初に行うべきことは、使用しているリソースマネージャーにマスターを設定することです(つまり、まずマスターを設定する必要があります)。

あなたはまた、他に

(あなたが各などのために、どのくらいのメモリを使用しているどのようにそれらの多くの)異なる執行を設定する必要があり、JSONはで動作するように効率的なフォーマットではありません。これは、すべてを処理するメモリがない場合、いくつかの要素が追い出され、読み直す必要がある(または何かクラッシュする)ことが遅いことを意味します。さらに悪いことに、問題がある場合は、常にゼロから始めます。

代わりにデータフレーム(データセット)を寄木張りファイルに書き込んだ後、寄木張りから読み込んで結合します。そうすれば、寄木細工のファイルを生成した後に何かがクラッシュしても、次のステップがずっと速くなります。

+0

ありがとうございます。ここでコードを貼り付けるのは間違いだと思います。 '.master(" local ")'は私のコードにはありません。しかし、私は寄木張りを書いて、彼らと一緒に参加しようとします。 –

関連する問題