具有大量特征的 pyspark PCA
Posted
技术标签:
【中文标题】具有大量特征的 pyspark PCA【英文标题】:pyspark PCA with with large number of features 【发布时间】:2018-05-24 03:08:47 【问题描述】:我正在尝试从 https://spark.apache.org/docs/2.2.0/ml-features.html#pca 运行示例 pyspark PCA 代码
我加载了包含 5,000,000 条记录和 23,000 个特征的 DataFrame。 运行 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)
spark 版本是 2.2 我用 Yarn 运行 spark 和火花参数是:
spark.executor.memory=32G
spark.driver.memory=32G
spark.driver.maxResultSize=32G
我应该删除功能来运行 PCA 吗?还是其他解决方案?
【问题讨论】:
您请求多少个执行器,您的系统上可用的总内存是多少? 【参考方案1】:我怀疑您可以使用不同的配置运行它。你有几个执行者?如果您有 100 个执行程序,并且在一个总共有 1TB 内存的系统上为每个执行程序分配 32GB,那么您将很快用完,因为每个执行程序都试图获取总共 3.2TB 内存(不存在)的一部分。另一方面,如果您有 1 个执行程序正在运行,则 32GB 可能不足以运行该任务。您可能会发现运行 20 个每个 8GB 内存的执行器足以让您运行该作业(尽管速度可能很慢)。
当我在 ML 流程中遇到数据框问题时,我通常按照以下步骤进行故障排除: 1) 在一个很小的数据帧上测试该方法:10 个特征和 1000 行。为了帮助避免沿袭问题,我建议您在源代码中减少示例帧,或者在 SQL 中使用“限制”语句或通过传递较小的 CSV。如果该方法不适用于您的代码,则内存问题可能是次要的。 2)如果该方法不适用于非常小的数据框,请开始自己调查您的数据。你的特征都是数字的吗?您的任何功能都具有空值吗?在您的功能中包含非数字或空值可能会导致 PCA 例程中断(但不一定会出现 OutOfMemory 错误) 3) 如果数据格式正确并且您的代码格式正确,请开始扩大规模,并确保在您继续操作时查看节点中的 stderr 和 stdout。要访问您的节点,您应该有一个实用程序(例如,hadoop 的 Cloudera 发行版包括 ClouderaManager,它允许您查看您的作业,然后是阶段,然后是单个任务以查找标准错误)。
【讨论】:
以上是关于具有大量特征的 pyspark PCA的主要内容,如果未能解决你的问题,请参考以下文章
将 Pyspark Python k-means 模型预测插入具有原始 RDD 项和特征的 DF
Pyspark Dataframes:创建要在 python 中的聚类中使用的特征列