почему я получил ошибку: Размер превышает Integer.MAX_VALUE при использовании spark + cassandra?

У меня есть 7 узлов cassandra (5 nodes with 32 cores and 32G memory, and 4 nodes with 4 cores and 64G memory), и в этом кластере развернуты рабочие искры, а мастер искры находится в 8th node. И я использовал для них spark-cassandra-connector. Теперь моя кассандра имеет почти 1 миллиард записей с 30 полями, я пишу scala, включая следующий фрагмент:

def startOneCache(): DataFrame = {
val conf = new SparkConf(true)
  .set("spark.cassandra.connection.host", "192.168.0.184")
  .set("spark.cassandra.auth.username", "username")
  .set("spark.cassandra.auth.password", "password")
  .set("spark.driver.maxResultSize", "4G")
  .set("spark.executor.memory", "12G")
  .set("spark.cassandra.input.split.size_in_mb","64")

val sc = new SparkContext("spark://192.168.0.131:7077", "statistics", conf)
val cc = new CassandraSQLContext(sc)
val rdd: DataFrame = cc.sql("select user_id,col1,col2,col3,col4,col5,col6
,col7,col8 from user_center.users").limit(100000192)
val rdd_cache: DataFrame = rdd.cache()

rdd_cache.count()
return rdd_cache
}

В мастере искры я использую spark-submit для запуска приведенного выше кода, при выполнении инструкции: rdd_cache.count() я получил ERROR в одном рабочем узле: 192.168.0.185:

16/03/08 15:38:57 INFO ShuffleBlockFetcherIterator: Started 4 remote fetches in 221 ms
16/03/08 15:43:49 WARN MemoryStore: Not enough space to cache rdd_6_0 in memory! (computed 4.6 GB so far)
16/03/08 15:43:49 INFO MemoryStore: Memory use = 61.9 KB (blocks) + 4.6 GB (scratch space shared across 1 tasks(s)) = 4.6 GB. Storage limit = 6.2 GB.
16/03/08 15:43:49 WARN CacheManager: Persisting partition rdd_6_0 to disk instead.
16/03/08 16:13:11 ERROR Executor: Managed memory leak detected; size = 4194304 bytes, TID = 24002
16/03/08 16:13:11 ERROR Executor: Exception in task 0.0 in stage 1.0 (TID 24002)
java.lang.IllegalArgumentException: Size exceeds Integer.MAX_VALUE

Я просто подумал, что окончательная ошибка Size exceeds Integer.MAX_VALUE вызвана предупреждением: 16/03/08 15:43:49 WARN MemoryStore: Not enough space to cache rdd_6_0 in memory! (computed 4.6 GB so far) перед ней, но я не знаю, почему, или я должен установить больше, чем .set("spark.executor.memory", "12G") , что я должен сделать для исправления этого?


person abelard2008    schedule 08.03.2016    source источник


Ответы (1)


Нет Размер блока Spark Shuffle может превышать 2 ГБ.

Spark использует ByteBuffer в качестве абстракции для хранения блоков и его размер ограничен Integer.MAX_VALUE (2 миллиарда).

Малое количество разделов может привести к большому размеру блока тасования. Чтобы решить эту проблему, попробуйте увеличить количество разделов с помощью rdd.repartition() или rdd.coalesce() или.

Если это не помогает, это означает, что по крайней мере один из ваших разделов все еще слишком велик, и вам, возможно, придется использовать какой-то более сложный подход, чтобы уменьшить его — например, использовать случайность для выравнивания распределения данных RDD между отдельными разделами.

person Rado Buransky    schedule 08.03.2016
comment
Хотя это правильный ответ, было бы полезно некоторое объяснение. - person zero323; 08.03.2016
comment
Rado Buransky, спасибо! что мне делать, чтобы узнать, сколько разделов в текущем rdd? В моем интерфейсе spark общее количество задач равно 23660, что является текущим количеством разделов. Если да, то сколько разделов я должен установить для устранения этой ошибки? - person abelard2008; 08.03.2016
comment
@abelard2008 Попробуйте это: databricks.gitbooks.io/databricks -spark-база знаний/контент/ - person Rado Buransky; 08.03.2016
comment
Rado Buransky, спасибо! Из ссылки я могу получить номер через rdd.toJavaRDD.partitions.size() (мой тип rdd — DataFrame, поэтому я использую `rdd.toJavaRDD), но что мне делать, чтобы получить, сколько разделов я должен установить для моего случая? - person abelard2008; 08.03.2016
comment
@ abelard2008 Я не думаю, что вы можете найти общее правило. Вы должны понимать, какова природа ваших данных. На слайдах вы можете увидеть, что хорошим эмпирическим правилом является наличие разделов размером около 128 МБ. Так что, вероятно, вам нужно сделать экспертное предположение. - person Rado Buransky; 08.03.2016
comment
Rado Buransky, большое спасибо за терпение и знания! - person abelard2008; 08.03.2016