2016-04-06 12 views
2

私のsparkジョブで10Mエントリを持つキャッシュからigniteRDDを作成すると、10MすべてがSparkコンテキストにロードされますか?参考までに私のコードを見つけてください。Apache IgniteとApache Sparkの統合、IgniteRDDを使用したSpark Contextへのキャッシュのロード

SparkConf conf = new SparkConf().setAppName("IgniteSparkIntgr").setMaster("local"); 
    JavaSparkContext context = new JavaSparkContext(conf);   


    JavaIgniteContext<Integer, Subscriber> igniteCxt = new JavaIgniteContext<Integer,Subscriber>(context,"example-ignite.xml"); 

    JavaIgniteRDD<Integer,Subscriber> cache = igniteCxt.fromCache("subscriberCache"); 

    DataFrame query_res = cache.sql("select id, lastName, company from Subscriber where id between ? and ?", 12, 15); 
    DataFrame input = loadInput(context); 
    DataFrame joined_df = input.join(query_res,input.col("id").equalTo(query_res.col("ID"))); 
    System.out.println(joined_df.count()); 

上記のコードでは、subscriberCacheは10M以上のエントリを持っています。上記のコードのどの時点でも、10M SubscriberオブジェクトがJVMにロードされますか?または、クエリ出力のみを読み込みますか? FYI

答えて

0

cache.sql(...)方法は、これを行う前にデータをロードする必要がありますので、のIgniteメモリ内キャッシュ内に既にあるデータを照会(のIgniteは別のJVMで実行されています)。これにはIgniteRDD.saveValues(...)またはIgniteRDD.savePairs(...)メソッドを使用できます。それぞれがすべてのパーティションを反復処理し、現在Sparkに存在するすべてのデータをIgniteにロードします。

結果のDataFrameで実行している変換または結合は、ドライバでローカルに行われることに注意してください。 Ignite SQLエンジンから最高のパフォーマンスを得るには、できるだけこれを避けるべきです。

関連する問題