Apache-spark-rdd

提供:Dev Guides
移動先:案内検索

Apache Spark-RDD

弾力性のある分散データセット

弾力性のある分散データセット(RDD)は、Sparkの基本的なデータ構造です。 オブジェクトの不変の分散コレクションです。 RDDの各データセットは論理パーティションに分割され、クラスターの異なるノードで計算できます。 RDDには、ユーザー定義クラスを含む、あらゆるタイプのPython、Java、またはScalaオブジェクトを含めることができます。

正式には、RDDは読み取り専用のパーティション化されたレコードのコレクションです。 RDDは、安定したストレージ上のデータまたは他のRDDのいずれかの決定論的操作によって作成できます。 RDDは、並列で操作できる要素のフォールトトレラントなコレクションです。

RDDを作成するには2つの方法があります-ドライバープログラムの既存のコレクションを並列化する*、または共有ファイルシステム、HDFS、HBase、またはHadoop入力を提供するデータソースなどの外部ストレージシステムで*データセットを参照する*フォーマット。

SparkはRDDの概念を利用して、より高速で効率的なMapReduce操作を実現します。 まず、MapReduceの操作がどのように行われ、なぜそれほど効率的でないのかを説明しましょう。

MapReduceでのデータ共有が遅い

MapReduceは、クラスター上の並列分散アルゴリズムを使用して大規模なデータセットを処理および生成するために広く採用されています。 ユーザーは、作業の分散とフォールトトレランスを心配することなく、一連の高レベル演算子を使用して並列計算を作成できます。

残念ながら、現在のほとんどのフレームワークでは、計算間(Ex-2つのMapReduceジョブ間)でデータを再利用する唯一の方法は、外部の安定したストレージシステム(Ex-HDFS)に書き込むことです。 このフレームワークは、クラスターの計算リソースにアクセスするための多数の抽象化を提供しますが、ユーザーはさらに多くのものを求めています。

反復*および*インタラクティブ*アプリケーションの両方で、並列ジョブ間でより高速なデータ共有が必要です。 *Replication、Serialization 、および disk IO により、MapReduceでのデータ共有が遅くなります。 ほとんどのHadoopアプリケーションであるストレージシステムに関しては、HDFSの読み取り/書き込み操作に90%以上の時間を費やしています。

MapReduceの反復操作

多段階アプリケーションでの複数の計算で中間結果を再利用します。 次の図は、MapReduceで反復操作を実行しながら、現在のフレームワークがどのように機能するかを説明しています。 これにより、データ複製、ディスクI/O、およびシリアル化のためにかなりのオーバーヘッドが発生し、システムが遅くなります。

MapReduceの反復操作

MapReduceのインタラクティブな操作

ユーザーは、データの同じサブセットでアドホッククエリを実行します。 各クエリは、安定したストレージでディスクI/Oを実行します。これにより、アプリケーションの実行時間が支配されます。

次の図は、MapReduceでインタラクティブクエリを実行しているときに、現在のフレームワークがどのように機能するかを説明しています。

MapReduceのインタラクティブな操作

Spark RDDを使用したデータ共有

*Replication、Serialization* 、および *disk IO* により、MapReduceでのデータ共有が遅くなります。 ほとんどのHadoopアプリケーションでは、90%以上の時間をHDFS読み取り/書き込み操作に費やしています。

この問題を認識して、研究者はApache Sparkと呼ばれる特別なフレームワークを開発しました。 スパークの重要なアイデアは、* R 耐障害性 D 配布 D *アセット(RDD)です。インメモリ処理の計算をサポートします。 つまり、メモリの状態をジョブ全体のオブジェクトとして保存し、オブジェクトはそれらのジョブ間で共有可能です。 メモリ内のデータ共有は、ネットワークおよびディスクよりも10〜100倍高速です。

ここで、Spark RDDで反復的かつインタラクティブな操作がどのように行われるかを調べてみましょう。

Spark RDDの反復操作

以下の図は、Spark RDDの反復操作を示しています。 安定したストレージ(ディスク)ではなく、分散メモリに中間結果を保存し、システムを高速化します。

注意-分散メモリ(RAM)が中間結果(JOBの状態)を格納するのに十分でない場合、それらの結果はディスクに格納されます。

Spark RDDの反復操作

Spark RDDでのインタラクティブな操作

この図は、Spark RDDでのインタラクティブな操作を示しています。 同じデータセットに対して異なるクエリを繰り返し実行すると、この特定のデータをメモリに保持して実行時間を短縮できます。

Spark RDDのインタラクティブ操作

デフォルトでは、変換された各RDDは、アクションを実行するたびに再計算されます。 ただし、RDDをメモリに*永続化*することもできます。この場合、Sparkは次回クエリを実行するときに、より高速なアクセスのために要素をクラスタ上に保持します。 また、ディスク上のRDDの永続化、または複数のノード間での複製のサポートもあります。