記事ディレクトリ
1.初期スパーク
1.1Sparkとは
Apache Sparkは、大規模なデータ処理用に設計された高速で用途の広いコンピューティングエンジンです。Sparkは、Hadoop MapReduceに似た汎用コンピューティングフレームワークであり、UC Berkeley AMPラボ(カリフォルニア大学、BerkeleyのAMPラボ)によってオープンソース化されています。SparkにはHadoopMapReduceの利点があります。MapReduceとの唯一の違いは、DHFSの読み取りと書き込みを必要とせずにJobの中間結果をメモリに保存できることです。したがって、Sparkは、データマイニングやマシン学習などの反復を必要とするMapReduceアルゴリズムにより適しています。
1.2SparkとMapReduceの違い
- 分散コンピューティングフレームワークですか
- Sparkはメモリに基づいており、MRはHDFSに基づいています
- Spark処理のデータ容量は一般的にMRの10倍以上です
- Sparkは、DAG向けの非周期的グラフに基づいてタスクの実行順序を分割します
1.3スパーク動作モード
-
地元
これは主に、日食やアイデアでプログラムテストを作成するなどのローカルテストに使用されます。
-
スタンドアロン
スタンドアロンは、完全分散をサポートするSparkに付属するリソーススケジューリングフレームワークです。
-
糸
HadoopエコシステムのリソーススケジューリングフレームワークであるSparkは、Yarnに基づいて計算することもできます。
-
月
リソーススケジューリングフレームワーク
Yarnに基づいてリソーススケジューリングを実行するには、ApplicationMasterインターフェイスを実装する必要があります。Sparkはこのインターフェースを実装し、Yarnに基づくことができます。
2. SparkCore
2.1 RDD
2.1.1コンセプト
RDD(Resilient Distributed Dateset)、柔軟な分散データセット。
2.1.2RDDの5つの特徴
- RDDは、一連のパーティションで構成されています。
- この機能は各パーティションに適用されます。
- RDD間には一連の依存関係があります。
- パーティショナーは、K、V形式のRDDで機能します。
- RDDは、一連の最適な計算位置を提供します。
2.1.3RDD図
上から見た場合:
-
textFileメソッドの最下層は、MRがファイルを読み取る方法をカプセル化します。ファイルを読み取る前に分割します。デフォルトの分割サイズはブロックサイズです。
-
RDDは実際にはデータを保存しません。理解の便宜上、一時的にデータを保存するものとして理解されます。
-
KおよびV形式のRDDとは何ですか?
RDDに格納されているデータがすべてバイナリオブジェクトである場合、このRDDはK、V形式のRDDと呼ばれます。
-
RDDの回復力/障害耐性はどこに反映されますか?
パティションの数とRDDのサイズは、RDDシステムの柔軟性を制限しません。
RDD間の依存関係は、以前のRDDに基づいて再計算できます。
-
分散RDDはどこに反映されますか?
RDDは、さまざまなノードに分散されたパーティションで構成されています。
-
RDDは計算に最適な場所を提供し、データのローカリゼーションを反映します。ビッグデータにおける「移動しないモバイルデータの計算」の概念は構造化されています。
2.2スパークタスク実行の原則
上の図の4つのマシンノードであるDriverとWorkerは、ノードで開始され、JVMで実行されるプロセスです。
- ドライバノードとクラスタノード間の頻繁な通信。
- ドライバーは、タスクの配布とリサイクルの結果、タスクのスケジューリングを担当します。タスクの計算結果が非常に大きい場合は、リサイクルする必要がないため、OOMが発生します。
- ワーカーは、スタンドアロンリソーススケジューリングフレームワークのリソース管理のスレーブノードです。これはJVMプロセスでもあります。
- マスターは、スタンドアロンリソーススケジューリングフレームワークのリソース管理のマスターノードです。これはJVMプロセスでもあります。
2.3スパークコードフロー
-
SparkConfオブジェクトを作成します
appNameを設定できます
動作モードとリソース要件を設定できます
-
SparkContextオブジェクトを作成します。
-
Sparkコンテキストに基づいてRDDを作成し、RDDを処理します。
-
アプリケーションには、Transformationクラス演算子の実行をトリガーするActionクラス演算子が必要です。
-
SparkコンテキストオブジェクトSparkContextを閉じます。
2.4変換変換演算子
2.4.1コンセプト
変換演算子は、変換演算子と呼ばれる演算子(関数)の一種です。例:map、flatMap、reduceByKeyなど。変換演算子は実行を遅らせました。レイジーロード実行とも呼ばれます。
2.4.2変換クラス演算子
変換算子 | 効果 |
---|---|
map(func) | 新しい分散データセットを返します。各要素は、func関数を介してソースRDDの要素から変換されます。 |
フィルタ(func) | func関数を介してソースRDDの要素をフィルタリングした結果からの要素を含む新しいデータセットを返します(func関数がtrueを返した結果) |
flatMap(func) | mapに似ていますが、各要素を0からnの出力要素にマップできます(func関数は単一の要素ではなくシーケンス(Seq)を返す必要があります) |
mapPartitions(func) | mapに似ていますが、RDDの各パーティション(またはデータブロック)に基づいて独立して実行されるため、RDDに要素タイプTが含まれている場合、func関数はIterator => Iteratorのマッピング関数である必要があります。 |
mapPartitionsWithIndex(func) | mapPartitionsと似ていますが、funcにもう1つの整数パーティションインデックスがあるため、RDDに要素タイプTが含まれているため、func関数はIterator => Iteratorのマッピング関数である必要があります。 |
mapWith(func1、func2) | mapWithはmapの別の変形であり、mapには1つの入力関数のみが必要であり、mapWithには2つの入力関数があります。最初の関数はRDDの分割インデックス(インデックスは0から始まります)を入力として受け取り、出力は新しいタイプAです。2番目の関数fは2タプル(T、A)を入力として受け取ります(ここで、Tは元のRDDの要素です。 Aは最初の関数の出力です)、出力タイプはUです |
reduceByKey(func、[numTasks]) | ソースRDDに要素タイプの(K、V)ペアが含まれている場合、オペレーターは(K、V)ペアを含むRDDも返します。ただし、各キーに対応する値は、func関数とfunc関数の集計の結果です。これは(V、V)=> Vのマッピング関数です。さらに、groupByKeyタイプ。削減タスクの数は、オプションのパラメーターnumTasksで指定できます。 |
AggregateByKey(zeroValue、seqOp、combOp、[numTasks]) | ソースRDDに(K、V)ペアが含まれている場合、返される新しいRDDには(K、V)ペアが含まれ、各キーに対応する値は、combOp関数と「0」値zeroValueによって集約されます。集計を実行した後、値タイプは入力値タイプとは異なり、不要なオーバーヘッドを回避します。groupByKeyに似ています。レデューサータスクの数は、オプションのパラメーターnumTasksを使用して指定できます。 |
sortByKey([ascending]、[numTasks]) | ソースRDDに要素のペア(K、V)が含まれていて、Kを並べ替えることができる場合、(K、V)ペアを含む新しいRDDが返され、Kで並べ替えられます(昇順パラメーターによって、昇順か降順かが決まります) |
sortBy(func、[ascending]、[numTasks]) | sortByKeyと似ていますが、sortByKeyはKeyでのみ並べ替えることができ、sortByはより柔軟性があり、キーまたは値で並べ替えることができます。 |
randomSplit(Array [Double]、Long) | この関数は、RDDを重みに従って複数のRDDに分割します。重みパラメータはDouble配列であり、2番目のパラメータはランダムのシードです。これは基本的に無視できます。 |
glom() | この関数は、RDDの各パーティションのタイプTの要素をArray [T]に変換するため、各パーティションには1つの配列要素しかありません。 |
zip(otherDataSet) | 2つのRDDをKとVの形式でRDDに結合するために使用されます。デフォルトでは、2つのRDDのパーティション数と要素数は同じです。それ以外の場合は例外がスローされます。 |
partitionBy(パーティション) | この関数は、パーティショナー関数に従って新しいShuffleRDDを生成し、元のRDDを再パーティション化します。 |
join(otherDataset、[numTasks]) | mysqlのINNERJOINに相当し、結合の左側と右側にデータセットが存在する場合にのみ返されます。結合後のパーティションの数は、親RDDパーティションが多いパーティションの数と同じです。 |
leftOuterJoin(otherDataset) | mysqlのLEFTJOINと同等で、leftOuterJoinは、データセットの左側にあるすべてのデータと、データセットの左側と右側に交差があるデータを返し、存在しないデータはNoneで埋められます。 |
rightOuterJoin(otherDataset) | MySQLのRIGHTJOINと同等で、rightOuterJoinは、データセットの右側にあるすべてのデータと、データセットの右側と左側が交差するデータを返し、存在しないデータはNoneで埋められます。 |
fullOuterJoin(otherDataset) | 左右のデータセットのすべてのデータを返し、左側と右側に「なし」と入力します。 |
連合 | 2つのデータセットを結合します。2つのデータセットのタイプは一貫している必要があります。返される新しいRDDのパーティションの数は、マージされたRDDパーティションの数の合計です。 |
交差点 | 2つのデータセットの共通部分を取得し、親RDDと一致するパーティションが多い新しいRDDを返します |
減算 | 2つのデータセットの差をとると、結果のRDDのパーティションの数は、減算する前のRDDのパーティションの数と同じになります。 |
明確な | (map + reduceByKey + map)と同等の重複排除 |
コグループ | タイプ(K、V)および(K、W)のデータを呼び出すと、データセット(K、(Iterable、Iterable))が返され、子RDDのパーティションは親RDDとより整合性があります。 |
2.5アクションオペレーター
2.5.1コンセプト
アクション演算子は、foreachなどのアクション演算子と呼ばれる一種の演算子(関数)でもあります。収集、カウントなど。変換演算子は実行の遅延、アクション演算子は実行のトリガーです。APPアプリケーションで実行されるアクションクラス演算子がいくつかあり、いくつかのジョブが実行されています。
2.5.2アクションオペレーター
アクションオペレーター | 効果 |
---|---|
reduce(func) | 将RDD中元素按func函数进行聚合,func函数是一个(T,T) ==> T 的映射函数,其中T为源RDD的元素类型,并且func需要满足交换律和结合律以便支持并行计算 |
collect() | 将数据集集中,所有元素以数组形式返回驱动器(driver)程序。通常用于在RDD进行了filter或其他过滤后,将足够小的数据子集返回到驱动器内存中,否则会OOM。 |
count() | 返回数据集中元素个数 |
first() | 返回数据中首个元素(类似于take(1)) |
take(n) | 返回数据集中前n个元素 |
takeSample(withReplacement,num,[seed]) | 返回数据集的随机采样子集,最多包含num个元素,withReplacement表示是否使用回置采样,最后一个参数为可选参数seed,随机数生成器的种子。 |
takeOrderd(n,[ordering]) | 按元素排序(可以通过ordering自定义排序规则)后,返回前n个元素 |
foreach(func) | 循环遍历数据集中的每个元素,运行相应的逻辑 |
foreachParition(func) | foreachParition和foreach类似,只不过是对每个分区使用函数,性能比foreach要高,推荐使用。 |
2.6 控制算子
2.6.1 概念
控制算子有三种:cache、persist、checkpoint。以上算子都是可以将RDD持久化,持久化单位是partition。cache和persist都是懒执行的,必须有一个action 类算子触发执行。checkpoint算子不仅能将RDD持久化到磁盘,还能切断RDD之间的依赖关系。
2.6.2 控制算子介绍
-
cache
默认将RDD的数据持久化到内存中。cache是懒执行。
cache() = persist(StorageLevel.MEMORY_ONLY());
-
persist
可以指定持久化的级别。最常用的是
StorageLevel.MEMORY_ONLY()
和StorageLevel.MEMORY_AND_DISK()
。"_2"表示有副本。持久化级别如下:
def useDisk : scala.Boolean = { /* compiled code */ } def useMemory : scala.Boolean = { /* compiled code */ } def useOffHeap : scala.Boolean = { /* compiled code */ } def deserialized : scala.Boolean = { /* compiled code */ } def replication : scala.Int = { /* compiled code */ }
持久化级别 作用 NONE
不做持久化 DISK_ONLY
只持久化到磁盘 DISK_ONLY_2
只持久化到磁盘,并且有2个副本 MEMORY_ONLY
メモリにのみ保持 MEMORY_ONLY_2
メモリにのみ保持され、2つのコピーがあります MEMORY_ONLY_SER
メモリに永続化してシリアル化するだけ MEMORY_ONLY_SER_2
メモリに永続化し、2つのコピーを保存し、シリアル化するだけです MEMORY_AND_DISK
メモリとディスクに永続化し、メモリが不足している場合はディスクに保存します MEMORY_AND_DISK_2
メモリとディスクに永続化し、メモリが不足している場合はディスクに保存し、2つのコピーを作成します MEMORY_AND_DISK_SER
メモリとディスクに永続化し、メモリが不足している場合はディスクに保存し、シリアル化します MEMORY_AND_DISK_SER_2
メモリとディスクに永続化し、メモリが十分でない場合はディスクに保存し、2つのコピーを作成して、シリアル化します。 OFF_HEAP
オフヒープメモリに永続化 キャッシュと永続化に関する注意:
- cacheとpersistはどちらも遅延実行され、実行をトリガーするにはアクションクラス演算子が必要です。
- キャッシュ演算子と永続演算子の戻り値を変数に割り当てることができます。この変数を他のジョブで直接使用するには、永続データを使用します。永続性の単位はパーティションです。
- キャッシュおよび永続化演算子は、アクション演算子の直後に続くことはできません。
- キャッシュおよび永続演算子の永続データは、APPの実行後にクリアされます。
エラー:rdd.cache()。count()によって返されるデプロイされた永続RDDは数値です。
-
チェックポイント
チェックポイントはRDDをディスクに永続化し、RDD間の依存関係を遮断することもできます。APPの実行後、チェックポイントディレクトリデータはクリアされません。
チェックポイントの実行原理:
- RDDジョブが実行されると、finalRDDからフロントに戻ります。
- 特定のRDDに対してチェックポイントメソッドが呼び出されると、現在のRDDにマークが付けられます。
- Sparkフレームワークは、このRDDのデータを再計算するための新しいジョブを自動的に開始します。データをHDFSに永続化します。
最適化:RDDでチェックポイントを実行する前に、まずこのRDDでキャッシュを実行することをお勧めします。これにより、新しく開始されたジョブはメモリ内のデータをHDFSにコピーするだけで済み、ステップを再計算する必要がなくなります。
使用する:
SparkSession spark = SparkSession.builder() .appName("JavaLogQuery").master("local").getOrCreate(); JavaSparkContext sc = new JavaSparkContext(spark.sparkContext()); JavaRDD<String> dataSet = sc.parallelize(exampleApacheLogs); dataSet = dataSet.cache(); sc.setCheckpointDir("/checkpoint/dir"); dataSet.checkpoint();
-
持続しない
メモリとディスクに保持されているデータを削除します。