Pyspark PCA с большим количеством функций - PullRequest
0 голосов
/ 24 мая 2018

Я пытаюсь запустить пример кода PCA pyspark из https://spark.apache.org/docs/2.2.0/ml-features.html#pca

Я загрузил DataFrame с 5 000 000 записей, 23 000 функций.После запуска кода PCA у меня появляются следующие ошибки:

Py4JJavaError: An error occurred while calling o908.fit.
: java.lang.OutOfMemoryError
    at java.io.ByteArrayOutputStream.hugeCapacity(ByteArrayOutputStream.java:123)
    at java.io.ByteArrayOutputStream.grow(ByteArrayOutputStream.java:117)
    at java.io.ByteArrayOutputStream.ensureCapacity(ByteArrayOutputStream.java:93)
    at java.io.ByteArrayOutputStream.write(ByteArrayOutputStream.java:153)
    at org.apache.spark.util.ByteBufferOutputStream.write(ByteBufferOutputStream.scala:41)
    at java.io.ObjectOutputStream$BlockDataOutputStream.drain(ObjectOutputStream.java:1877)
    at java.io.ObjectOutputStream$BlockDataOutputStream.setBlockDataMode(ObjectOutputStream.java:1786)
    at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1189)
    at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:348)
    at org.apache.spark.serializer.JavaSerializationStream.writeObject(JavaSerializer.scala:43)
    at org.apache.spark.serializer.JavaSerializerInstance.serialize(JavaSerializer.scala:100)
    at org.apache.spark.util.ClosureCleaner$.ensureSerializable(ClosureCleaner.scala:295)
    at org.apache.spark.util.ClosureCleaner$.org$apache$spark$util$ClosureCleaner$$clean(ClosureCleaner.scala:288)
    at org.apache.spark.util.ClosureCleaner$.clean(ClosureCleaner.scala:108)
    at org.apache.spark.SparkContext.clean(SparkContext.scala:2287)
    at org.apache.spark.rdd.RDD$$anonfun$mapPartitions$1.apply(RDD.scala:794)
    at org.apache.spark.rdd.RDD$$anonfun$mapPartitions$1.apply(RDD.scala:793)
    at org.apache.spark.rdd.RDDOperationScope$.withScope(RDDOperationScope.scala:151)
    at org.apache.spark.rdd.RDDOperationScope$.withScope(RDDOperationScope.scala:112)
    at org.apache.spark.rdd.RDD.withScope(RDD.scala:362)
    at org.apache.spark.rdd.RDD.mapPartitions(RDD.scala:793)
    at org.apache.spark.rdd.RDD$$anonfun$treeAggregate$1.apply(RDD.scala:1137)
    at org.apache.spark.rdd.RDDOperationScope$.withScope(RDDOperationScope.scala:151)
    at org.apache.spark.rdd.RDDOperationScope$.withScope(RDDOperationScope.scala:112)
    at org.apache.spark.rdd.RDD.withScope(RDD.scala:362)
    at org.apache.spark.rdd.RDD.treeAggregate(RDD.scala:1128)
    at org.apache.spark.mllib.linalg.distributed.RowMatrix.computeGramianMatrix(RowMatrix.scala:122)
    at org.apache.spark.mllib.linalg.distributed.RowMatrix.computeCovariance(RowMatrix.scala:344)
    at org.apache.spark.mllib.linalg.distributed.RowMatrix.computePrincipalComponentsAndExplainedVariance(RowMatrix.scala:387)
    at org.apache.spark.mllib.feature.PCA.fit(PCA.scala:48)
    at org.apache.spark.ml.feature.PCA.fit(PCA.scala:99)
    at org.apache.spark.ml.feature.PCA.fit(PCA.scala:70)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)
    at py4j.reflection.MethodInvoker.invoke(MethodInvoker.java:244)
    at py4j.reflection.ReflectionEngine.invoke(ReflectionEngine.java:357)
    at py4j.Gateway.invoke(Gateway.java:280)
    at py4j.commands.AbstractCommand.invokeMethod(AbstractCommand.java:132)
    at py4j.commands.CallCommand.execute(CallCommand.java:79)
    at py4j.GatewayConnection.run(GatewayConnection.java:214)
    at java.lang.Thread.run(Thread.java:748)

версия спарка 2.2. Я запускаю спарк с пряжей и параметры искры:

spark.executor.memory=32G
spark.driver.memory=32G
spark.driver.maxResultSize=32G

Нужно ли удалять функции для запуска PCA?Или другие решения?

1 Ответ

0 голосов
/ 22 августа 2018

Я подозреваю, что вы можете запустить это с другой конфигурацией.Сколько у вас исполнителей?Если у вас есть 100 исполнителей, и каждому из них выделено 32 ГБ в системе, которая имеет общую память 1 ТБ, вы быстро исчерпаете себя, поскольку каждый исполнитель пытается получить часть общей памяти объемом 3,2 ТБ (которая не существует).Если, с другой стороны, у вас работает 1 исполнитель, 32 ГБ, вероятно, недостаточно для выполнения задачи.Вы можете обнаружить, что запуск 20 исполнителей с 8 ГБ памяти каждый даст вам достаточно для выполнения задания (хотя, может быть, и медленно).

Когда у меня возникают проблемы с кадром данных в процессе ML, я обычно выполняю эти шаги дляУстранение неполадок: 1) Протестируйте метод на тривиально-маленьком фрейме данных: 10 объектов и 1000 строк.Чтобы избежать проблем с происхождением, я предлагаю вам уменьшить пример кадра в источнике, либо в вашем SQL с помощью оператора «limit», либо передав меньший CSV.Если метод не работает с вашим кодом, проблема с памятью может быть вторичной.2) Если метод не работает на банально малом массиве данных, начните исследовать ваши данные сами.Ваши функции все числовые?Есть ли у ваших функций нулевые значения?Наличие нечисловых или нулевых значений в ваших функциях может привести к сбою процедуры PCA (но не обязательно с ошибкой OutOfMemory). 3) Если данные правильно сформированы, а код правильно сформирован, начните масштабирование и убедитесь, чтосмотрите в ваш stderr и stdout в ваших узлах, как продолжить.Чтобы добраться до ваших узлов, у вас должна быть утилита (например, дистрибутив Cloudera из hadoop включает ClouderaManager, который позволяет вам просматривать ваши задания, затем этапы, а затем отдельные задачи для поиска stderr).

...