文字列のインデックス作成、ワンホットエンコーディング、分位点の離散化などの手順を含む pyspark を使用してデータを準備しようとしています。私のデータ フレームには、100 万行の非常に多くの列 (500 間隔列、250 カテゴリおよび 250 バイナリを含む 1,000 列) があります。
私の観察によると、一部のデータ変換は他のものよりもはるかに遅くなります。以下の要約にあるように、約 3 時間かかるステップもあれば、数分しかかからないステップもあります。
ステップ (実行時間):
- すべての間隔変数の Log10 変換 (00:02:22)
- データ フレームのランダム データ分割 (00:02:48)
- 分位点の離散化と区間のベクトルの組み立て ( 02:31:37 )
- カテゴリカルの 1 つのホット エンコーディングとベクトル アセンブル ( 03:13:51 )
- バイナリの文字列インデックス作成とベクトル アセンブル ( 03:17:34 )
最悪のパフォーマンスのステップは、文字列のインデックス付け、1 つのホット エンコーディング、分位点の離散化、またはベクトル アセンブラーのようです。
これらのステップのパフォーマンスを大幅に向上させるために、スパーク構成またはコードで何を確認または調整する必要があるか教えてください。
上記の機能エンジニアリング ステップでは、Pyspark.ml.feature の QuantileDiscretizer、VectorAssembler、OneHotEncoder、StringIndexer メソッドを使用しました。データが完全にクラスター メモリにアップロードされたことを確認します (persist(StorageLevel.MEMORY_ONLY))。
私のクラスターには 7 つのノード (それぞれ 4 つのコアと 16GB の RAM) が含まれています。Spark のバージョンは 2.2 です。ピスパークを使用。
Spark 構成が適用されました:
- spark.serializer = org.apache.spark.serializer.KryoSerializer
- spark.kryo.unsafe = true
- spark.rdd.compress = false
- マスター = 糸
- デプロイモード = クラスター
- spark.driver.cores=4
- ドライバーメモリ = 4G
- num-executor = 6
- エグゼキュータメモリ = 10G
- エグゼキュータ コア = 4
- spark.yarn.maxAppAttempts=1
- spark.sql.cbo.enabled=true
- spark.sql.constraintPropagation.enabled=false