すべてのデータサイエンティストが知っておくべき5つのSpark最適化手法
公開: 2020-06-12小さなスタートアップであろうと大企業であろうと、データはいたるところにあります。 このデータは、顧客ログ、オフィスの請求書、コストシート、従業員データベースなど、さまざまなソースから収集されます。 企業はこれらのデータチャンクを収集および分析して、パターンと傾向を判断します。 これらのパターンは、ビジネスの強化のための重要な決定を下すのに役立ちます。
しかし、このデータ分析と数値計算は、Excelシートだけでは不可能です。 そこで、データ処理ソフトウェアテクノロジーが登場します。最も高速で広く使用されているデータ処理フレームワークの1つは、ApacheSparkです。 Spark最適化手法は、パフォーマンスを最大限に活用するためにパフォーマンスを調整するために使用されます。
テクニックについて少し学びます。 このソフトウェアフレームワークの基本に頭を悩ませましょう。
目次
Apache Sparkとは何ですか?
Apache Sparkは、企業で膨大なデータセットを処理するために使用される世界的に有名なオープンソースのクラスターコンピューティングフレームワークです。 これらの巨大なデータセットを処理し、複数のシステムに分散することは、ApacheSparkを使用すると簡単です。 プログラマーや開発者の生活を楽にするシンプルなAPIを提供します。
Sparkは、Python、R、Scala、Javaなどのプログラミング言語にネイティブバインディングを提供します。 機械学習、グラフ処理、 SQLデータベースをサポートしています。 これらの驚くべき利点により、Sparkは銀行、テクノロジー企業、金融機関、電気通信部門、および政府機関で使用されています。 apache sparkの詳細については、認定された大学のデータサイエンスコースをご覧ください。
ApacheSparkのアーキテクチャ
Apache Sparkのランタイムアーキテクチャは、次のコンポーネントで構成されています。
Sparkドライバーまたはマスタープロセス
これにより、プログラムがタスクに変換され、エグゼキュータ(スレーブプロセス)用にスケジュールされます。 タスクスケジューラは、これらのタスクをエグゼキュータに分散します。
クラスターマネージャー
Sparkクラスターマネージャーは、エグゼキューターとドライバーの起動を担当します。 クラスターの複数のホストマシンにリソースをスケジュールして割り当てます。
エグゼキュータ
スレーブプロセスとも呼ばれるエグゼキュータは、ジョブのタスクが実行されるエンティティです。 起動後、Sparkアプリケーションのライフサイクルが終了するまで実行されます。 エグゼキュータに障害が発生しても、Sparkジョブの実行は停止しません。
復元力のある分散データセット(RDD)
これは不変であり、Sparkクラスターのノードに分散されているデータセットのコレクションです。 特に、クラスターは、Sparkをインストールできる分散システムのコレクションです。 RDDは複数のパーティションに分割されています。 また、データ障害が発生した場合にデータの問題を修正できるため、復元力と呼ばれます。
SparkでサポートされるRDDのタイプは次のとおりです。
- Hadoop分散ファイルシステム上のファイルから構築されたHadoopデータセット
- Scalaコレクションに基づくことができる並列化されたコレクション
DAG(有向非巡回グラフ)
Sparkは、コードがSparkコンソールに入力されるとすぐにグラフを作成します。 何らかのアクション(操作を実行するための命令)がトリガーされると、このグラフはDAGSchedulerに送信されます。
このグラフは、一連のデータアクションと見なすことができます。 DAGは、頂点とエッジで構成されます。 頂点はRDDを表し、エッジはその特定のRDDで実行される計算を表します。 グラフ内にループやサイクルがないため、有向グラフと呼ばれます。
スパーク最適化手法
Sparkの最適化手法を使用して、Sparkの設定とプロパティを変更し、リソースが適切に使用され、ジョブが迅速に実行されるようにします。 これはすべて、最終的にデータを効率的に処理するのに役立ちます。
最も一般的なSpark最適化手法を以下に示します。
1.データのシリアル化
ここで、メモリ内オブジェクトは、ファイルに保存したり、ネットワーク経由で送信したりできる別の形式に変換されます。 これにより、分散アプリケーションのパフォーマンスが向上します。 データをシリアル化する2つの方法は次のとおりです。
- Java シリアル化– ObjectOutputStreamフレームワークは、オブジェクトのシリアル化に使用されます。 java.io.Externalizableを使用して、シリアル化のパフォーマンスを制御できます。 このプロセスは、軽量の永続性を提供します。
- Kyroシリアル化– SparkはKryoシリアル化ライブラリ(v4)を使用して、Javaシリアル化よりも高速で、よりコンパクトなプロセスであるオブジェクトをシリアル化します。 パフォーマンスを向上させるには、registerKryoClassesメソッドを使用してクラスを登録する必要があります。
2.キャッシング
これは、データがより頻繁に必要になる場合に使用される効率的な手法です。 Cache()とpersist()は、この手法で使用されるメソッドです。 これらのメソッドは、RDD、DataSet、およびDataFrameの計算を格納するために使用されます。 ただし、cache()はそれをメモリに保存し、persist()はそれをユーザー定義のストレージレベルに保存します。

これらの方法は、繰り返し計算が使用されるため、コストを削減し、時間を節約するのに役立ちます。
読む: Apache PySparkのデータフレーム:包括的なチュートリアル
3.データ構造の調整
オーバーヘッドを追加する可能性のある特定のJava機能を微調整することで、Sparkの使用中にメモリ消費を削減できます。 これは、次の方法で可能です。
- キーの文字列の代わりに、列挙されたオブジェクトまたは数値IDを使用します。
- 多くのオブジェクトや複雑なネストされた構造の使用は避けてください。
- メモリサイズが32GB未満の場合は、JVMフラグをxx:+UseCompressedOopsに設定します。
4.ガベージコレクションの最適化
ガベージコレクターを最適化するには、Sparkアプリケーションの実行にG1とGCを使用する必要があります。 G1コレクターは、増大するヒープを管理します。 アプリケーションの予期しない動作を制御するには、生成されたログに応じてGCの調整が不可欠です。 ただし、その前に、プログラムのロジックとコードを変更して最適化する必要があります。
G1GCは、プロセス間の一時停止時間を最適化することにより、ジョブの実行時間を短縮するのに役立ちます。
5.メモリ管理
結合、シャッフル、並べ替え、集計などの計算を格納するために使用されるメモリは、実行メモリと呼ばれます。 ストレージメモリは、クラスタに格納されているデータのキャッシュと処理に使用されます。 両方のメモリは統一された領域Mを使用します。
実行メモリが使用されていないときは、ストレージメモリがスペースを使用できます。 同様に、ストレージメモリがアイドル状態の場合、実行メモリはそのスペースを利用できます。 これは、最も効率的なSpark最適化手法の1つです。
また読む: ApacheSparkの6つのゲーム変更機能
結論
さまざまなSpark最適化手法から、処理時間の短縮とデータ処理の高速化にどのように役立つかを理解できます。 開発者と専門家は、アプリケーションと問題のデータ量に応じてこれらの手法を適用します。
スパーク最適化、データサイエンスについて知りたい場合は、IIIT-B&upGradのデータサイエンスのエグゼクティブPGプログラムをご覧ください。これは、働く専門家向けに作成され、10以上のケーススタディとプロジェクト、実践的なハンズオンワークショップ、業界とのメンターシップを提供します。専門家、業界のメンターと1対1で、400時間以上の学習とトップ企業との仕事の支援。
Spark最適化手法とは何ですか?
Apache Sparkを使用すると、企業はデータを迅速に処理し、複雑なデータの問題を簡単に解決できます。 プログラムの開発中は、そのパフォーマンスに注意を払うことが非常に重要であることは明らかです。 Spark最適化手法は、メモリ内のデータ計算に役立ちます。 これらの計算を妨げる可能性があるのは、メモリ、CPU、またはその他のリソースだけです。
すべての火花最適化手法は異なる目的で使用され、特定の特定のアクションを実行します。 広く使用されている火花最適化手法のいくつかは次のとおりです。
1.シリアル化
2.APIの選択
3.アドバンス変数
4.キャッシュして永続化する
5.ByKey操作
6.ファイル形式の選択
7.ガベージコレクションの調整
8.並列性のレベル
Sparkの使用を検討すべきでないのはいつですか?
Apache Sparkには多くのユースケースがありますが、目的を達成するために他のビッグデータエンジンが必要な特定の特殊なニーズがあります。 このような場合、Sparkを使用する代わりに、他のテクノロジーを使用することをお勧めします。 以下は、Sparkの使用を検討すべきでないユースケースです。
1.低いコンピューティング容量– Apache Sparkでのデフォルトの処理は、クラスターメモリで行われます。 仮想マシンまたはクラスターのコンピューティング能力がほとんどない場合は、ApacheHadoopなどの他の代替手段を選択する必要があります。
2.パブリッシュ/サブスクライブモデルでのデータの取り込み–この場合、複数のソースと複数の宛先があり、数百万のデータが短時間で移動されます。 ここでは、Sparkを使用せず、代わりにApacheKafkaを使用してください。
パンダはApacheSparkよりも高速ですか?
PandasDataFrameとSparkDataFrameの両方の計算速度を比較すると、小さなデータセットの場合、PandasDataFrameのパフォーマンスがわずかに向上していることがわかります。 一方、データのサイズが大きくなると、SparkDataFrameはPandasDataFrameよりも十分に機能することがわかります。 したがって、データ量に大きく依存します。