2015-04-17 5 views
10

Ho ricevuto un errore quando si utilizza mllib RandomForest per addestrare i dati. Dato che il mio set di dati è enorme e la partizione di default è relativamente piccola. così un'eccezione sollevata che indica che "Formato supera Integer.MAX_VALUE", la traccia dello stack orignal come seguendo,Perché la partizione Spark RDD ha un limite di 2 GB per HDFS?

15/04/16 14:13:03 WARN scheduler.TaskSetManager: Perso compito 19,0 in fase 6.0 (TID 120, 10.215.149.47): java.lang.IllegalArgumentException: Dimensioni supera Integer.MAX_VALUE
a sun.nio.ch.FileChannelImpl.map (FileChannelImpl.java:828) a org.apache.spark.storage.DiskStore .getBytes (DiskStore.scala: 123) a org.apache.spark.storage.DiskStore.getBytes (DiskStore.scala: 132) a org.apache.spark.storage.BlockManager.doGetLocal (BlockManager.scala: 517) allo org.apache.spark.storage.BlockManager.getLocal (BlockManager.scala: 432) all'indirizzo org.apache.spark.storage.BlockManager.get (BlockManager.scala: 618) a org.apache.spark.CacheManager. putInBlockManager (CacheManager.scala: 146) a org.apache.spark.CacheManager.getOrCompute (CacheManager.scala: 70)

L'Integer.MAX_SIZE è 2GB, sembra che alcuni partizione di memoria. Così ripartisco la mia partizione rdd a 1000, in modo che ogni partizione possa contenere molti meno dati di prima. Finalmente il problema è risolto !!!

Quindi, la mia domanda è: Perché la dimensione della partizione ha il limite 2G? Sembra che non ci sia un set di configurazione per il limite nella scintilla

+1

http://stackoverflow.com/questions/8076472/filechannel-map-integer-max-value-limit-error – experquisite

risposta

10

L'astrazione di base per i blocchi nella scintilla è un ByteBuffer, che purtroppo ha un limite di Integer.MAX_VALUE (~ 2 GB).

È un critical issue che impedisce l'utilizzo di scintilla con dataset molto grandi. L'aumento del numero di partizioni può risolverlo (come nel caso dell'OP), ma non è sempre possibile, ad esempio quando vi è una grande catena di trasformazioni, una parte dei quali può aumentare i dati (flatMap ecc.) O nei casi in cui i dati sono distorti.

La soluzione proposta è di creare un'astrazione come LargeByteBuffer che può supportare un elenco di bytebuffer per un blocco. Questo ha un impatto sull'architettura generale delle scintille, quindi è rimasto irrisolto per un bel po '.

+1

Vedere anche https://issues.apache.org/jira/browse/SPARK-5928 –

+1

Are c'è qualche buona soluzione per risolvere questo problema? Aumentare il numero di partizioni o diminuire? Suddividere gli RDD in parti, eseguire il comando e quindi unione? Disattiva Kryo? Usa i dataframe? Sto incontrando il bug da 2 GB nel tentativo di eseguire una (ri) semplice ripartizione per chiave di un RDD di dimensioni modeste (84 GB) e di bassa inclinazione (AFAIK). Ho le mie richieste di memoria per esecutore, per nodo principale, per Java, ecc., Tutte avviate fino in fondo, e attualmente sto provando a suddividere questo RDD su 6800 partizioni. È troppi e causa il mio problema? –

+0

Vedere https://issues.apache.org/jira/browse/SPARK-6235 che a settembre 2016 sembra essere una correzione. – pd40