Apache Sparkとは何ですか?Hadoopを粉砕したビッグデータプラットフォーム

ApacheSparkが定義されました

Apache Sparkは、非常に大きなデータセットで処理タスクをすばやく実行できるデータ処理フレームワークであり、データ処理タスクを単独で、または他の分散コンピューティングツールと連携して複数のコンピューターに分散することもできます。これらの2つの品質は、ビッグデータと機械学習の世界の鍵であり、大規模なデータストアを処理するために大規模なコンピューティングパワーのマーシャリングが必要です。Sparkはまた、分散コンピューティングとビッグデータ処理の面倒な作業の多くを抽象化する使いやすいAPIを使用して、開発者の肩からこれらのタスクのプログラミング負担の一部を取り除きます。

2009年にカリフォルニア大学バークレー校のAMPLabで謙虚に始まって以来、ApacheSparkは世界の主要なビッグデータ分散処理フレームワークの1つになりました。Sparkはさまざまな方法でデプロイでき、Java、Scala、Python、およびRプログラミング言語のネイティブバインディングを提供し、SQL、ストリーミングデータ、機械学習、グラフ処理をサポートします。銀行、通信会社、ゲーム会社、政府、そしてApple、Facebook、IBM、Microsoftなどのすべての主要なテクノロジー大手によって使用されています。

ApacheSparkアーキテクチャ

基本的なレベルでは、Apache Sparkアプリケーションは2つの主要なコンポーネントで構成されます。ユーザーのコードをワーカーノードに分散できる複数のタスクに変換するドライバーと、それらのノードで実行され、割り当てられたタスクを実行するエグゼキューターです。 2つの間を仲介するには、何らかの形式のクラスターマネージャーが必要です。

箱から出して、Sparkはスタンドアロンクラスターモードで実行できます。このモードでは、クラスター内の各マシンにApacheSparkフレームワークとJVMが必要です。ただし、より堅牢なリソースまたはクラスター管理システムを利用して、オンデマンドでワーカーを割り当てることができる可能性が高くなります。企業では、これは通常、Hadoop YARNで実行することを意味します(これはClouderaおよびHortonworksディストリビューションがSparkジョブを実行する方法です)が、ApacheSparkはApacheMesos、Kubernetes、およびDockerSwarmでも実行できます。

マネージドソリューションをお探しの場合、Apache Sparkは、Amazon EMR、Google Cloud Dataproc、およびMicrosoft AzureHDInsightの一部として見つけることができます。Apache Sparkの創設者を採用しているDatabricksは、Databricks Unified Analytics Platformも提供しています。これは、Apache Sparkクラスター、ストリーミングサポート、統合されたWebベースのノートブック開発、および最適化されたクラウドI / Oパフォーマンスを提供する包括的なマネージドサービスです。標準のApacheSparkディストリビューション。

Apache Sparkは、ユーザーのデータ処理コマンドを有向非巡回グラフ(DAG)に組み込みます。DAGはApacheSparkのスケジューリングレイヤーです。どのタスクがどのノードでどの順序で実行されるかを決定します。  

SparkとHadoop:なぜApache Sparkを使用するのですか?

ApacheSparkとApacheHadoopは少し誤解されていることを指摘する価値があります。最近のほとんどのHadoopディストリビューションにはSparkが含まれています。しかし、2つの大きな利点により、Sparkはビッグデータを処理する際に選択されるフレームワークになり、Hadoopを際立たせた古いMapReduceパラダイムを追い越しました。

最初の利点はスピードです。Sparkのインメモリデータエンジンは、特定の状況で、特にステージ間でディスクに状態を書き戻す必要があるマルチステージジョブと比較した場合に、MapReduceよりも最大100倍高速にタスクを実行できることを意味します。本質的に、MapReduceは、データのマッピングと削減で構成される2段階の実行グラフを作成しますが、Apache SparkのDAGには、より効率的に分散できる複数の段階があります。データをメモリ内に完全に含めることができないApacheSparkジョブでさえ、対応するMapReduceジョブよりも約10倍高速になる傾向があります。

2番目の利点は、開発者にとって使いやすいSparkAPIです。Sparkのスピードアップは重要ですが、SparkAPIの使いやすさはさらに重要であると主張することができます。

Spark Core

MapReduceや他のApacheHadoopコンポーネントと比較すると、Apache Spark APIは開発者にとって非常に使いやすく、単純なメソッド呼び出しの背後に分散処理エンジンの複雑さの多くを隠しています。これの標準的な例は、ドキュメント内の単語をカウントするためのMapReduceコードのほぼ50行をApache Sparkのほんの数行に削減する方法です(ここではScalaで示されています)。

val textFile = sparkSession.sparkContext.textFile(“ hdfs:/// tmp / words”)

val counts = textFile.flatMap(line => line.split(““))

                      .map(word =>(word、1))

                      .reduceByKey(_ + _)

counts.saveAsTextFile(“ hdfs:/// tmp / words_agg”)

Apache Sparkは、PythonやRなどのデータ分析用の一般的な言語や、よりエンタープライズ向けのJavaやScalaへのバインディングを提供することで、アプリケーション開発者からデータサイエンティストまで、誰もがアクセス可能な方法でそのスケーラビリティと速度を活用できるようにします。

Spark RDD

Apache Sparkの中心となるのは、Resilient Distributed Dataset(RDD)の概念です。これは、コンピューティングクラスター全体で分割できるオブジェクトの不変のコレクションを表すプログラミングの抽象化です。RDDの操作は、クラスター全体で分割して並列バッチプロセスで実行することもできるため、高速でスケーラブルな並列処理が可能になります。

RDDは、単純なテキストファイル、SQLデータベース、NoSQLストア(CassandraやMongoDBなど)、AmazonS3バケットなどから作成できます。Spark Core APIの多くはこのRDDの概念に基づいて構築されており、従来のマップとリデュース機能を有効にするだけでなく、データセットの結合、フィルタリング、サンプリング、および集計の組み込みサポートも提供します。

Sparkは、Sparkアプリケーションをタスクに分割し、それらを作業を行う多くのエグゼキュータープロセスに分散するドライバーコアプロセスを組み合わせることにより、分散方式で実行されます。これらのエグゼキュータは、アプリケーションのニーズに応じてスケールアップおよびスケールダウンできます。

Spark SQL

元々Sharkとして知られていたSparkSQLは、ApacheSparkプロジェクトにとってますます重要になっています。これは、今日の開発者がアプリケーションを作成するときに最も一般的に使用するインターフェースである可能性があります。 Spark SQLは、RとPython(Pandas)から借用したデータフレームアプローチを使用して、構造化データの処理に重点を置いています。しかし、その名前が示すように、Spark SQLは、データをクエリするためのSQL2003準拠のインターフェースも提供し、ApacheSparkのパワーをアナリストと開発者にもたらします。

標準のSQLサポートに加えて、Spark SQLは、JSON、HDFS、Apache Hive、JDBC、Apache ORC、ApacheParquetなどの他のデータストアとの間で読み取りおよび書き込みを行うための標準インターフェイスを提供します。これらはすべてそのままでサポートされます。他の人気のあるストア(Apache Cassandra、MongoDB、Apache HBase、およびその他の多く)は、Sparkパッケージエコシステムから個別のコネクターをプルすることで使用できます。

データフレームからいくつかの列を選択するのは、次の行と同じくらい簡単です。

citysDF.select(“ name”、“ pop”)

SQLインターフェイスを使用して、データフレームを一時テーブルとして登録します。その後、SQLクエリを発行できます。

citysDF.createOrReplaceTempView( "cities")

spark.sql( "SELECT name、pop FROM citys")

舞台裏では、Apache SparkはCatalystと呼ばれるクエリオプティマイザーを使用して、データとクエリを調べ、クラスター全体で必要な計算を実行するデータの局所性と計算のための効率的なクエリプランを作成します。Apache Spark 2.xの時代では、データフレームとデータセットのSpark SQLインターフェイス(基本的に、コンパイル時に正確性をチェックし、実行時にさらなるメモリと計算の最適化を利用できる型付きデータフレーム)が開発に推奨されるアプローチです。 。RDDインターフェースは引き続き使用できますが、SparkSQLパラダイム内でニーズに対応できない場合にのみ推奨されます。

Spark 2.4では、配列やその他の高階データ型を直接操作するための一連の組み込み高階関数が導入されました。

Spark MLlib

Apache Sparkには、機械学習とグラフ分析の手法を大規模なデータに適用するためのライブラリもバンドルされています。 Spark MLlibには、機械学習パイプラインを作成するためのフレームワークが含まれているため、構造化されたデータセットに特徴抽出、選択、変換を簡単に実装できます。 MLlibには、k-meansクラスタリングやランダムフォレストなどのクラスタリングおよび分類アルゴリズムの分散実装が付属しており、カスタムパイプラインに簡単にスワップインおよびスワップアウトできます。モデルは、RまたはPythonを使用してApache Sparkのデータサイエンティストがトレーニングし、MLlibを使用して保存し、JavaベースまたはScalaベースのパイプラインにインポートして本番環境で使用できます。

Spark MLlibは、分類、回帰、クラスタリング、フィルタリングなどの基本的な機械学習をカバーしていますが、ディープニューラルネットワークのモデリングとトレーニングのための機能は含まれていません(詳細については、のSpark MLlibレビューを参照してください)。ただし、ディープラーニングパイプラインは現在準備中です。

Spark GraphX

Spark GraphXには、GoogleのPageRankの実装を含む、グラフ構造を処理するための分散アルゴリズムの選択肢が付属しています。これらのアルゴリズムは、SparkCoreのRDDアプローチを使用してデータをモデリングします。GraphFramesパッケージを使用すると、グラフクエリにCatalystオプティマイザを利用するなど、データフレームでグラフ操作を実行できます。

Sparkストリーミング

Spark Streamingは、Apache Sparkに早期に追加されたもので、リアルタイムまたはほぼリアルタイムの処理を必要とする環境で牽引力を獲得するのに役立ちました。以前は、ApacheHadoopの世界でのバッチ処理とストリーム処理は別々のものでした。バッチ処理のニーズに合わせてMapReduceコードを記述し、リアルタイムストリーミングの要件にApacheStormのようなものを使用します。これは明らかに、完全に異なるフレームワークに基づいており、異なるリソースを必要とし、それらを実行するための異なる運用上の懸念を伴うにもかかわらず、アプリケーションドメインの同期を維持する必要がある異なるコードベースにつながります。

Spark Streamingは、ストリームを連続した一連のマイクロバッチに分割し、Apache Spark APIを使用して操作できるようにすることで、バッチ処理のApacheSparkの概念をストリーミングに拡張しました。このようにして、バッチ操作とストリーミング操作のコードは、(ほとんど)同じコードを共有し、同じフレームワークで実行できるため、開発者とオペレーターの両方のオーバーヘッドが削減されます。誰もが勝ちます。

Spark Streamingアプローチに対する批判は、着信データへの低遅延応答が必要なシナリオでは、マイクロバッチ処理が、Apache Storm、Apache Flink、ApacheApexなどの他のストリーミング対応フレームワークのパフォーマンスに匹敵しない可能性があることです。これらはすべて、マイクロバッチではなく純粋なストリーミング方法を使用しています。

構造化ストリーミング

構造化ストリーミング(Spark 2.xで追加)は、SparkSQLがSparkCoreAPIに与えたものをSparkStreamingに提供します。アプリケーションを作成するための高レベルのAPIとより簡単な抽象化です。構造ストリーミングの場合、高レベルのAPIを使用すると、開発者は基本的に無限のストリーミングデータフレームとデータセットを作成できます。また、特にイベント時の集計やメッセージの遅延配信の処理に関して、ユーザーが以前のフレームワークで苦労していたいくつかの非常に現実的な問題点も解決します。構造化ストリームのすべてのクエリはCatalystクエリオプティマイザを通過し、インタラクティブな方法で実行することもできるため、ユーザーはライブストリーミングデータに対してSQLクエリを実行できます。

構造化ストリーミングは元々、ストリーミングデータを処理するSparkStreamingのマイクロバッチ処理スキームに依存していました。しかし、Spark 2.3では、Apache Sparkチームが構造化ストリーミングに低レイテンシの連続処理モードを追加し、1ミリ秒という短いレイテンシで応答を処理できるようにしました。これは非常に印象的です。 Spark 2.4の時点で、連続処理はまだ実験的なものと見なされています。構造化ストリーミングはSparkSQLエンジンの上に構築されていますが、継続的ストリーミングは制限されたクエリのセットのみをサポートします。

構造化ストリーミングは、プラットフォームを使用したスト​​リーミングアプリケーションの未来であるため、新しいストリーミングアプリケーションを構築する場合は、構造化ストリーミングを使用する必要があります。従来のSparkStreaming APIは引き続きサポートされますが、新しい方法によりストリーミングコードの記述と保守がはるかに耐えられるようになるため、プロジェクトでは構造化ストリーミングへの移植を推奨しています。

ディープラーニングパイプライン

Apache Sparkは、ディープラーニングパイプラインを介したディープラーニングをサポートしています。MLlibの既存のパイプライン構造を使用して、低レベルの深層学習ライブラリを呼び出し、わずか数行のコードで分類子を構築したり、カスタムTensorFlowグラフまたはKerasモデルを受信データに適用したりできます。これらのグラフとモデルは、カスタムSpark SQL UDF(ユーザー定義関数)として登録することもできるため、深層学習モデルをSQLステートメントの一部としてデータに適用できます。

ApacheSparkチュートリアル

Apache Sparkに飛び込んで学ぶ準備はできましたか?EvanHeitmanのPythonでのApacheSparkのネアンデルタール人ガイドを強くお勧めします。このガイドでは、Apache Sparkの動作の基本を比較的簡単に説明するだけでなく、フレームワークを利用する簡単なPythonアプリケーションを作成するプロセスについても説明しています。 。この記事はデータサイエンティストの視点から書かれています。データサイエンスはビッグデータと機械学習がますます重要になっている世界であるため、これは理にかなっています。

プラットフォームで何ができるのか、どのように実行されるのかを理解するためのApache Sparkの例を探している場合は、Spark By {Examples}を確認してください。ここには、Sparkプログラミングの構成要素を構成するいくつかの基本的なタスクのサンプルコードがたくさんあるので、ApacheSparkが作成されているより大きなタスクを構成するコンポーネントを確認できます。

もっと深くする必要がありますか?DZoneには、Apache Sparkコレクション全体と呼ばれるものがあります。これは、ApacheSparkの多くのトピックに関する多数の役立つチュートリアルで構成されています。幸せな学習!