Apache Sparkの紹介

Apache Sparkの概要

1. 前書き

Apache Spark is an open-source cluster-computing framework。 Scala、Java、Python、およびR向けのエレガントな開発APIを提供し、開発者がHDFS、Cassandra、HBase、S3などを含む多様なデータソースでさまざまなデータ集約型ワークロードを実行できるようにします。

歴史的に、HadoopのMapReduceは、一部の反復的でインタラクティブなコンピューティングジョブに対して非効率的であることが証明され、最終的にSparkの開発につながりました。 With Spark, we can run logic up to two orders of magnitude faster than with Hadoop in memory, or one order of magnitude faster on disk

2. Sparkアーキテクチャ

以下のdiagramで説明されているように、Sparkアプリケーションはクラスター上で独立したプロセスのセットとして実行されます。

image

 

これらの一連のプロセスは、メインプログラム(ドライバープログラムと呼ばれる)のSparkContextオブジェクトによって調整されます。 SparkContextは、アプリケーション間でリソースを割り当てるいくつかのタイプのクラスターマネージャー(Spark独自のスタンドアロンクラスターマネージャー、MesosまたはYARN)に接続します。

接続されると、Sparkはクラスター内のノードでエグゼキューターを取得します。これは、計算を実行し、アプリケーションのデータを保存するプロセスです。

次に、アプリケーションコード(SparkContextに渡されるJARまたはPythonファイルで定義)をエグゼキュータに送信します。 最後に、SparkContext sends tasks to the executors to run

3. コアコンポーネント

次のdiagramは、Sparkのさまざまなコンポーネントを明確に示しています。

image

 

3.1. スパークコア

Spark Coreコンポーネントは、すべての基本的なI / O機能、sparkクラスターでのジョブのスケジューリングと監視、タスクのディスパッチ、さまざまなストレージシステムとのネットワーク、障害回復、効率的なメモリ管理に責任を負います。

Hadoopとは異なり、Sparkは、RDD(Resilient Distributed Datasets)として知られる特別なデータ構造を使用することにより、共有データがAmazon S3やHDFSなどの中間ストアに保存されるのを防ぎます。

Resilient Distributed Datasets are immutable, a partitioned collection of records that can be operated on – in parallel and allows – fault-tolerant ‘in-memory’ computations

RDDは2種類の操作をサポートします。

  • 変換– Spark RDD変換は、既存のRDDから新しいRDDを生成する関数です。 The transformer takes RDD as input and produces one or more RDD as output。 変換は本質的に怠け者です。つまり、アクションを呼び出すと実行されます

  • アクション変換は、相互にRDDを作成しますが、実際のデータセットを操作する場合は、その時点でアクションが実行されます。 したがって、Actions are Spark RDD operations that give non-RDD values.アクションの値は、ドライバーまたは外部ストレージシステムに保存されます。

アクションは、Executorからドライバーにデータを送信する方法の1つです。

エグゼキューターは、タスクの実行を担当するエージェントです。 ドライバーは、ワーカーとタスクの実行を調整するJVMプロセスです。 Sparkの一部のアクションはカウントおよび収集です。

3.2. Spark SQL

Spark SQLは、構造化データ処理用のSparkモジュールです。 これは主にSQLクエリを実行するために使用されます。 DataFrameは、SparkSQLの主要な抽象化を構成します。 名前付き列に順序付けられたデータの分散コレクションは、SparkではDataFrameと呼ばれます。

Spark SQLは、Hive、Avro、Parquet、ORC、JSON、JDBCなどのさまざまなソースからのデータのフェッチをサポートしています。 また、Sparkエンジンを使用して数千のノードと数時間のクエリに対応し、クエリ中の完全なフォールトトレランスを提供します。

3.3. スパークストリーミング

Spark Streamingは、スパークAPIのコアの拡張機能であり、ライブデータストリームのスケーラブルで高スループットのフォールトトレラントストリーム処理を可能にします。 データは、Kafka、Flume、Kinesis、TCPソケットなど、さまざまなソースから取り込むことができます。

最後に、処理されたデータをファイルシステム、データベース、ライブダッシュボードにプッシュできます。

3.4. Spark Mlib

MLlibは、Sparkの機械学習(ML)ライブラリです。 その目標は、実用的な機械学習をスケーラブルかつ簡単にすることです。 高レベルでは、次のようなツールを提供します。

  • MLアルゴリズム–分類、回帰、クラスタリング、協調フィルタリングなどの一般的な学習アルゴリズム

  • 機能化-特徴抽出、変換、次元削減、および選択

  • パイプライン– MLパイプラインを構築、評価、および調整するためのツール

  • 永続性-アルゴリズム、モデル、およびパイプラインの保存と読み込み

  • ユーティリティ-線形代数、統計、データ処理など

3.5. Spark GraphX

GraphX is a component for graphs and graph-parallel computations.高レベルでは、GraphXは新しいグラフ抽象化を導入することによってSpark RDDを拡張します。これは、各頂点とエッジにプロパティがアタッチされた有向マルチグラフです。

グラフの計算をサポートするために、GraphXは一連の基本的な演算子(subgraphjoinVerticesaggregateMessagesなど)を公開します。

さらに、GraphXには、グラフ分析タスクを簡素化するためのグラフアルゴリズムとビルダーのコレクションが増えています。

4. Sparkの「HelloWorld」

コアコンポーネントを理解したので、単純なMavenベースのSparkプロジェクト–for calculating word countsに進むことができます。

マスターノード、エグゼキューターノード、またはSparkのスタンドアロンクラスターマネージャーである同じマシン上ですべてのコンポーネントがローカルで実行されているローカルモードで実行されているSparkのデモを行います。

4.1. Mavenセットアップ

pom.xmlファイルにSpark-related dependenciesを含むJavaMavenプロジェクトをセットアップしましょう。


    
        org.apache.spark
    spark-core_2.10
    1.6.0
    

4.2. ワードカウント– Spark Job

次に、Sparkジョブを作成して、文を含むファイルを処理し、ファイル内の個別の単語とその数を出力します。

public static void main(String[] args) throws Exception {
    if (args.length < 1) {
        System.err.println("Usage: JavaWordCount ");
        System.exit(1);
    }
    SparkConf sparkConf = new SparkConf().setAppName("JavaWordCount");
    JavaSparkContext ctx = new JavaSparkContext(sparkConf);
    JavaRDD lines = ctx.textFile(args[0], 1);

    JavaRDD words
      = lines.flatMap(s -> Arrays.asList(SPACE.split(s)).iterator());
    JavaPairRDD ones
      = words.mapToPair(word -> new Tuple2<>(word, 1));
    JavaPairRDD counts
      = ones.reduceByKey((Integer i1, Integer i2) -> i1 + i2);

    List> output = counts.collect();
    for (Tuple2 tuple : output) {
        System.out.println(tuple._1() + ": " + tuple._2());
    }
    ctx.stop();
}

Sparkジョブへの引数としてローカルテキストファイルのパスを渡すことに注意してください。

SparkContextオブジェクトはSparkのメインエントリポイントであり、すでに実行中のSparkクラスターへの接続を表します。 アプリケーション構成を記述するためにSparkConfオブジェクトを使用します。 SparkContextは、メモリ内のテキストファイルをJavaRDDオブジェクトとして読み取るために使用されます。

次に、flatmapメソッドを使用して行JavaRDDオブジェクトを単語JavaRDDオブジェクトに変換し、最初に各行をスペースで区切られた単語に変換してから、各行処理の出力をフラット化します。

再度、変換操作mapToPairを適用します。これは、基本的に、単語の各出現を単語のタプルと1のカウントにマップします。

次に、reduceByKey演算を適用して、カウント1の単語の複数の出現を単語のタプルにグループ化し、カウントを合計します。

最後に、collectのRDDアクションを実行して、最終結果を取得します。

4.3. 実行中– Spark Job

Mavenを使用してプロジェクトをビルドし、ターゲットフォルダーにapache-spark-1.0-SNAPSHOT.jarを生成しましょう。

次に、このWordCountジョブをSparkに送信する必要があります。

${spark-install-dir}/bin/spark-submit --class com.example.WordCount
  --master local ${WordCount-MavenProject}/target/apache-spark-1.0-SNAPSHOT.jar
  ${WordCount-MavenProject}/src/main/resources/spark_example.txt

上記のコマンドを実行する前に、SparkインストールディレクトリとWordCount Mavenプロジェクトディレクトリを更新する必要があります。

提出時には、いくつかのステップが舞台裏で行われます。

  1. ドライバーコードから、SparkContextはクラスターマネージャーに接続します(この場合、ローカルで実行されているSparkスタンドアロンクラスターマネージャー)

  2. Cluster Managerは他のアプリケーション全体にリソースを割り当てます

  3. Sparkはクラスター内のノードでエグゼキューターを取得します。 ここでは、ワードカウントアプリケーションが独自のexecutorプロセスを取得します

  4. アプリケーションコード(jarファイル)がエグゼキューターに送信されます

  5. タスクはSparkContextによってエグゼキュータに送信されます。

最後に、sparkジョブの結果がドライバーに返され、ファイル内の単語数が出力として表示されます。

Hello 1
from 2
Baledung 2
Keep 1
Learning 1
Spark 1
Bye 1

5. 結論

この記事では、Apache Sparkのアーキテクチャとさまざまなコンポーネントについて説明しました。 また、ファイルから単語数を与えるSparkジョブの実例を示しました。

いつものように、完全なソースコードはover on GitHubで利用できます。