我正在尝试使用 pyspark 进行数据准备,其中包括字符串索引、一种热编码和分位数离散化等步骤。我的数据框在 100 万行中有很多列(1000 列,包括 500 个间隔列、250 个分类和 250 个二进制文件)。
我的观察是,某些数据转换比其他数据转换慢得多。正如下面的摘要所示,有些步骤甚至持续大约 3 小时,而其他步骤只需要几分钟。
步骤(执行时间):
- 所有区间变量的 Log10 转换 (00:02:22)
- 数据帧的随机数据划分 (00:02:48)
- 区间的分位数离散化和向量组装 ( 02:31:37 )
- 一种用于分类的热编码和向量组装 ( 03:13:51 )
- 二进制文件的字符串索引和向量组装 ( 03:17:34 )
似乎表现最差的步骤是字符串索引、一种热编码、分位数离散化或向量汇编器。
你能建议我在我的 spark 配置或代码中检查或调整什么以显着提高这些步骤的性能吗?
我使用了 Pyspark.ml.feature 中的上述特征工程步骤方法 QuantileDiscretizer、VectorAssembler、OneHotEncoder、StringIndexer。我确信数据已完全上传到集群内存中(persist(StorageLevel.MEMORY_ONLY))。
我的集群包含 7 个节点(每个节点 4 个内核和 16GB RAM)。Spark 版本是 2.2。使用 Pyspark。
应用 Spark 配置:
- spark.serializer = org.apache.spark.serializer.KryoSerializer
- spark.kryo.unsafe = true
- spark.rdd.compress = false
- 主人=纱线
- 部署模式 = 集群
- spark.driver.cores=4
- 驱动内存 = 4G
- 执行者数 = 6
- 执行器内存 = 10G
- 执行器核心 = 4
- spark.yarn.maxAppAttempts=1
- spark.sql.cbo.enabled=true
- spark.sql.constraintPropagation.enabled=false