7

文字列のインデックス作成、ワンホットエンコーディング、分位点の離散化などの手順を含む 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
4

0 に答える 0