2017-08-17 9 views
0

私はいくつかのデータを収集し、永続化し、永続化されたRDDをさまざまな変換に複数回使用するかなり典型的なRDDシナリオを持っています。持続性は物事を一桁上げさせるので、永続化は確実です。spark MEMORY_AND_DISKがMEMORY_ONLYより遅いのはなぜですか?

しかし、私は、さまざまな持続方法の相対速度に驚いています。 MEMORY_AND_DISKを使用し続けると、持続的なRDDを使用するたびに、MEMORY_ONLYを使用する場合より約10%長くなります。何故ですか?私は、データがメモリに収まる場合には同じ速度を期待していましたが、一部のパーティションがメモリに収まらない場合には、より速くなると予想していました(MEMORY_AND_DISK)。なぜ私のタイミングは一貫して真実ではないのですか?

+0

キャッシュが破棄された場合、データを再クエリする必要があります。これらのクエリは遅く、ディスクへの/からのキャッシュの書き込み/読み込みよりも遅くなります。 – Darryl

答えて

0

通常、CPUは約10Gb/sでメモリにアクセスしますが、SSDへのアクセスには600Mb/sが必要です。 MEMORY_ONLYを選択したときにメモリに収まらないパーティションは、親rddsパーティションを使用して再計算されます。 [OK]を

+0

多分私は何かが欠けているが、私はこれが私が見ているものを説明しているとは思わない。親RDDはデータベースから直接データを照会しますが、それは非常に遅いです。だから私がpersist()への呼び出しを取り除くと、持続するときより10倍長い時間がかかります。 MEMORY_ONLYを使用しているときにパーティションがメモリに収まらない場合は、MEMORY_AND_DISKよりも遅いpersistを呼び出すことなく、パーティションを正確に再計算する必要はありませんか?そして、それがメモリに収まる場合、MEMORY_AND_DISKはディスクに移動する必要がないため、MEMORY_ONLYと同じ速さではありませんか? – Darryl

+0

はい、ディスクはメモリに余裕がない場合にのみ使用されるため、同じディスクにする必要があります。 データがディスクに保存されるときに、シリアル化プロセスが行われることがあります。できる場合は、kryoシリアライザを試してみてください。 conf.set( "spark.serializer"、 "org.apache.spark.serializer.KryoSerializer") – Tiffany

+0

私はそれを撃つでしょう。 – Darryl

0

する必要があります何の広い依存関係を持っていない場合には、コンテキストなしで伝えることは不可能ですが、MEMORY_AND_DISK少なくとも2例があります。

  • データが利用可能なメモリよりも大きくなっている - そのMEMORY_AND_DISKパーティションとはメモリに収まらない場合はディスクに保存されます。
  • パーティションはメモリから追い出されました。ディスクにはが格納されています。ディスクが格納されています。失われており、再計算する必要があり、大きなGCスイープが発生する可能性があります。

最後に、_DISKは異なるレベルのハードウェアとソフトウェアキャッシングを使用できるため、メインメモリに匹敵する速度で異なるブロックにアクセスできることを覚えておく必要があります。

関連する問題