2017-12-07 1 views
0

私はApache Sparkを学び、RDDとキャッシュRDDプロセスを扱っています。RDD.getStorageLevel.useMemoryがtrueを返しますが、Spark UIストレージがキャッシュされたデータを表示しないのはなぜですか?

スカラー端末でrdd.getStorageLevel.useMemoryコマンドを使用してRDDがキャッシュされているかどうかを確認できます。だからここ

は私が続くコマンドです:

scala> years.getStorageLevel.useMemory 
res12: Boolean = false 

scala> years.cache(); 
res13: years.type = MapPartitionsRDD[2] at filter at <console>:29 

scala> years.getStorageLevel.useMemory 
res14: Boolean = true 

だから、今RDD年がキャッシュされてしまったことを意味します。

しかし、私は火花UIのストレージタブをチェックしたとき、私は何も見つけることができませんでした。 ここにスクリーンショットがあります: enter image description here

何かが欠けていますか?コマンドラインにキャッシュされていることが示されている場合(trueの場合)、UIに表示されないのはなぜですか?

+1

少なくとも1回計算されるまでキャッシュされません。アクションを呼び出します。 'years.first'を使い、Storageタブをチェックしてください。 – philantrovert

+0

しかし、years.getStorageLevel.useMemoryコマンドはtrueを返します。それがキャッシュされていることを指定していませんか? – KayV

+1

キャッシュされていることを指定しますが、アクションを呼び出さない限り実際にキャッシュには表示されません。これは 'sc.textFile'を使うときと同じように動作するRDDを取得しますが、アクションが含まれていない限り、マテリアライズされません。レイジー評価FTW。 – philantrovert

答えて

1

years.cache()を呼び出すと、次にアクションが実行されたときにキャッシュされるのはyearsとなります。

RDD.cacheは、ストレージレベルがMEMORY_ONLYです。

キャッシュ():RDD.this.typeは、デフォルトのストレージ・レベル(MEMORY_ONLY)と、このRDDを持続。

スカーラ> years.getStorageLevel.useMemory res14:ブール=真

それ単に「クエリ」属性のあなたに次のコードを実行するときに、あなたがtrueを取得し、なぜ答えを与える

MEMORY_AND_DISKストレージレベルは、yearsが実際にキャッシュされているかどうか、またはキャッシュされようとしているかどうかはわかりません。


私は、データセットがすでにキャッシュされているかどうかを知るには非常に深く考えなければならないと思います。

最も簡単な解決策は、SparkListener APIとインターセプトSparkListenerBlockUpdatedを使用することですが、以前は行っていないと思います。


以下は、関連性のあるデータセットAPIについてのものです(データセットAPIに関する質問に間違いがあります)。

は、記憶レベルがであるため、必要に応じてメモリとディスクを使用します。

キャッシュ():Dataset.this.typeは、デフォルトのストレージ・レベル(MEMORY_AND_DISK)と、このデータセットを永続化します。

scala> years.getStorageLevel.useMemory 
res14: Boolean = true 

それは単に「クエリ」MEMORY_AND_DISKストレージレベルの属性がyearsが実際にあったかどうかを教えてくれません。次のコードを実行するときに、あなたがtrueを取得し、なぜあなたに答えを与える

既にキャッシュされているか、まもなくなる。


データセットがすでにキャッシュされるようにマークされているかどうかを確認するためには、(それがSharedStateを通じてSparkSessions全体で共有し、spark.sharedState.cacheManagerとして利用される)CacheManagerを使用することができます。

内部APIなので注意して使用してください。実際のところ

val cached = spark.range(5).cache 
scala> spark.sharedState.cacheManager.lookupCachedData(cached.queryExecution.logical) 
res20: Option[org.apache.spark.sql.execution.CachedData] = 
Some(CachedData(Range (0, 5, step=1, splits=Some(8)) 
,InMemoryRelation [id#331L], true, 10000, StorageLevel(disk, memory, deserialized, 1 replicas) 
    +- *Range (0, 5, step=1, splits=8) 
)) 

あなたが二回データセットと同じ(の論理的な計画)をキャッシュしようとした場合、CacheManagerはあなたに警告します。

scala> val cached = spark.range(5).cache 
17/12/07 15:00:34 WARN CacheManager: Asked to cache already cached data. 
cached: org.apache.spark.sql.Dataset[Long] = [id: bigint] 
関連する問題