私はApache Sparkを使って、Elasticsearchクラスタに格納しているデータの解析エンジンを作ることができるかどうかを試してきました。私は、RDDサイズ(つまり数百万レコード)があれば、最も簡単な操作でさえも1分以上かかることが分かっています。Apache Spark Map Job遅い
package es_spark;
import java.util.Map;
import org.apache.spark.SparkConf;
import org.apache.spark.api.java.JavaPairRDD;
import org.apache.spark.api.java.JavaRDD;
import org.apache.spark.api.java.JavaSparkContext;
import org.elasticsearch.spark.rdd.api.java.JavaEsSpark;
public class Main {
public static void main (String[] pArgs) {
SparkConf conf = new SparkConf().setAppName("Simple Application");
conf.set("es.nodes", pArgs[0]);
JavaSparkContext sc = new JavaSparkContext(conf);
long start = System.currentTimeMillis();
JavaPairRDD<String, Map<String, Object>> esRDD = JavaEsSpark.esRDD(sc, "test3");
long numES = esRDD.count();
long loadStop = System.currentTimeMillis();
JavaRDD<Integer> dummyRDD = esRDD.map(pair -> {return 1;});
long numDummy = dummyRDD.count();
long mapStop = System.currentTimeMillis();
System.out.println("ES Count: " + numES);
System.out.println("ES Partitions: " + esRDD.getNumPartitions());
System.out.println("Dummy Count: " + numDummy);
System.out.println("Dummy Partitions: " + dummyRDD.getNumPartitions());
System.out.println("Data Load Took: " + (loadStop - start) + "ms");
System.out.println("Dummy Map Took: " + (mapStop - loadStop) + "ms");
sc.stop();
sc.close();
}
}
私は3人の奴隷、それぞれ14個のコアを持つとRAMの49.0ギガバイトでスパーククラスタ上でこれを実行しようとしました:
は例えば、私はこの単純なテストプログラムを作りました。次のコマンドで:
./bin/spark-submit --class es_spark.Main --master spark://<master_ip>:7077 ~/es_spark-0.0.1.jar <elasticsearch_main_ip>
出力は次のとおりです。
ES Count: 8140270
ES Partitions: 80
Dummy Count: 8140270
Dummy Partitions: 80
Data Load Took: 108059ms
Dummy Map Took: 104128ms
それは8+万レコードにダミーのマップジョブを実行するため1.5+分かかります。地図の仕事は何もしないので、私はこのパフォーマンスが驚くほど低いことがわかります。私は何か間違っているのですか、これはSparkの通常のパフォーマンスですか?
私はまた、--executor-memory
と--executor-cores
を大きく変えずに試しました。
私はまた、カウントの直後にesRDDのキャッシュを呼び出そうとしました: 長いnumES = esRDD.count(); esRDD.cache(); これは、Elastic Searchからのダブルフェッチを防止しませんか? 地図のタイミングはあまり変わっていません。 – dubbervt
上記のサンプルコードをesRDD.count()の前にesRDD.cache()を呼び出すように変更しました。残念ながら、地図のパフォーマンスはそれほど助けになりませんでした。 ダミーマップTook:113298ms – dubbervt
私はesRDDのカウントを取り出して、** complete **テストプログラムを約1.5分で実行したので、何かが起きているかもしれません。だから地図の操作時間はほとんど何もない。 – dubbervt