このセクションの内容
重要な概念をスパーク
柔軟な分散データ・セット(RDD)の基礎
1.スパーク重要な概念
このセクションの一部は公式文書から導出されます。http://spark.apache.org/docs/latest/cluster-overview.html
(1)スパーク動作モード
スパーク操作の現在最も一般的なモードは以下のとおりです。
- ローカル:主にアプリケーション開発とデバッグスパークのローカルスレッドの実行、
- スタンドアロン:スパークマスター/スレーブ構成を使用して、独自のリソース管理やスケジューリング、実行スパーククラスタを使用して、単一障害点を解決するために、高い信頼性のZooKeeper(ハイアベイラビリティ、HA)を達成するために使用することができます
- ApacheのMesos:有名なMesosにクラスタリソース管理モデルに基づいて、リソース管理フレームワークはMesosに実行される実行されている、スパークがスケジューリングタスクと計算のための唯一の責任があります
- Hadoopの糸:糸にリソースマネージャーで実行されている糸クラスタ、リソース管理、スパークは、タスクのスケジュール設定と計算のための唯一の責任があります
最初の過程でスパーク動作モードのHadoop YARNクラスタ操作モードは、最も一般的に使用されているが、ビルドクラスタへのHadoop YARNスパークの方法を使用することです。スパーク彼らは強力なクラスタ構成のHadoopエコシステム、と完全に一致するので、それは全能のように記述することができます。
(2)Sparkコンポーネント(部品)
以下のようにプログラムSparkWordCount、クラスタの動作を提出するとき、それは構成要素に関連している完全なアプリケーションを、スパーク。
クラスタ上で実行中のプロセスの各独立したセットにスパークアプリケーション、SparkContextオブジェクトによって調整、オブジェクトは、ドライバプログラムと呼ばれる、SparkContext入口スパークアプリケーションとして見ることができる、SparkContext(クラスタ・リソース・マネージャの異なるタイプであってもよいです所望のランに割り当てられたリソースは、リソースを取得した後、クラスタを実行するために必要な、SparkContextクラスタノード内の他の作業に対応して得られるようにクラスタマネージャ)、例えばHadoopの糸、Mesos他の通信、(ワーカーノード)エグゼキュータ(それらは別のプロセスである間にスパーク異なるアプリケーションは、異なる執行を有する、エグゼキュータは、最後のタスク(タスク)の割り当てを計算し、次いでSparkContextアプリケーションコードがエグゼキュータに配布アプリケーションへのデータストレージ機能)、分散提供します実行するための執行。
ターム(用語)の意味(説明)
ユーザプログラムスパーク、(SparkContextオブジェクトを含む)クラスタ上のドライバプログラムおよびスレッド実行部の複数上で実行されるアプリケーション(スパークアプリケーション)
クラスタで実行されているジャーパッケージに提出したい場合は、他のスパークパケットに依存する必要が実行時に行われていない、(スパークアプリケーションのJARパッケージ)を含むパッケージジャースパークユーザアプリケーションアプリケーションJAR
プログラムドライバプログラムは、オブジェクトの作成を担当mainメソッドが含まれていますSparkContext
クラスタマネージャのクラスタ・リソース・マネージャ、例えばMesos、Hadoopの糸
展開モード展開モード、差分用ドライバプログラムの動作モード:クラスタモード(cluterモード)、クラスタ内の駆動開始、クライアント・モード(クライアントモード)、クラスタが起動外部からドライバプロセス
アプリケーションのスパークを実行することができ、クラスタ内のワーカーノードのノードワーカーノード
エグゼキュータワーカーノード上のプロセス、(メモリ内またはディスク上のデータ)タスク間のデータのメンテナンスを担当する特定スパークアプリケーションタスクの実装方法。スパーク異なるアプリケーションは異なるエグゼキュータを持っています
ユニット、スパーク最終的なアプリケーションプログラムを実行中のタスクエグゼキュータのタスクが(次のセクションで詳細に説明する)、最適化のセットを介して複数のタスクに分割されています
このような)等、保存、収集として作用スパーク動作のための特定のタスク複数の構築ジョブの並列コンピューティングタスク、
ステージ各ジョブは、(マップステージと同様とでステージのMapReduceを減らす)互いに独立して、タスクセットがステージと呼ばれる、小さく設定タスクに各ステージに分割されるが、そのためので、タスクの複数から構成されていますまた、タスクセットとして知られています
2.柔軟な分散型データセット(RDD)の基礎
2011年にバークレー研究所が提案した弾力性のある分散型データセット(RDD、弾力性のある分散型データセット)、元の紙の名称:弾力性の分散型データセット:Aフォールトトレラント抽象インメモリクラスタコンピューティングのオリジナル紙は読書、研究価値があるためRDD最初の手の情報は、このセクションでは、論文の大部分に基づいて説明します。
(1)RDDの設計目標
RDDは効率も高いフォールト・トレランスおよびフレームワークを計算するMapReduceの平行として等を有し、計算の並列中間結果、単純なプログラミング・モデルの支持体の使用をサポートすることができ、効率的なスケジューリングおよびスケーラビリティを行うことが可能となります。エラーが発生した系統関係レコードRDD変換動作によって行わRDDフォールトトレランス、家族関係RDDの系譜レコード、直接系統を通じて回復。RDDは、ほとんどのフィッティングデータマイニング、機械学習と描画の計算は、これらのアプリケーションは非常に分散環境でその実装の効率を高めることができるメモリに基づいてすべての人の反復計算に関係する; RDDは、このような分散型クローラには適用されません頻繁に更新する必要が共有状態タスク。
下記のリネージュで火花シェルでRDDを表示する方法であります
//テキストファイルは、ルートディレクトリにREADME.md HDFSファイルを読み込み、その後、スパークを含むすべての行を除外する
スカラ>ヴァルRDD2 = sc.textFile( "/ README.md")フィルタ(ライン=> line.contains( "スパーク"))
RDD2:21:<コンソール>にフィルタのorg.apache.spark.rdd.RDD [文字列] = MapPartitionsRDD [2]
// toDebugString方法は、RDDの家族関係を出力します
//あなたが見ることができるテキストファイルの方法は、それぞれ2つのRDD、HadoopRDDを生成し、
// MapPartitionsRDD、およびフィルタは、新しいMapPartitionsRDDを生成します。
スカラ> rdd2.toDebugString
15/09/20 1時35分27秒INFO mapred.FileInputFormat:プロセスへの総入力経路:1
RES0:文字列=
(2)MapPartitionsRDD [2] <コンソール>フィルタリングする:21 []を
| <コンソール>でテキストファイルでMapPartitionsRDD [1]:21 []
| <コンソール>でテキストファイルで/README.md HadoopRDD [0]:21 []
1
2
3
4
5
6
7
8
9
10
11
12
(2)RDD抽象
RDDは、記録されたパーティションのセットを介して、スパークの読み出し専用(valのタイプ)です。;(2)他のRDDを作成する(1)ストレージシステムから作成された:RDDは、Sparkにのみ2つの方法で作成しました。さまざまな方法がストアから持って作成され、ローカルファイルシステムにすることができ、それはファイルシステムを分散させることができ、それはまた、メモリ内のデータとすることができます。
次のコードに示すHDFSにRDDから作成することです。
スカラ> sc.textFile( "/ README.md")
RES1:org.apache.spark.rdd.RDD [文字列] = MapPartitionsRDD [4] <コンソール>にテキストファイルのための:22
1
2
次のコードに示すRDDメモリから作成することです。
//メモリの配列を定義
スカラ>ヴァルデータ=配列(1、2、3、4、5)
データ:配列[INT] =配列(1、2、3、4、5)
//並列化法によるParallelCollectionRDDを作成します。
スカラ>ヴァルdistData = sc.parallelize(データ)
distData:org.apache.spark.rdd.RDD [INT] = ParallelCollectionRDD [5] <コンソール>に並列化する:23
1
2
3
4
5
6
7
次のコードに示すRDD他から新しいRDDを作成することです
新しいdistData RDD RDDに変換する//フィルタ機能
スカラ>ヴァルdistDataFiletered = distData.filter(E => E> 2)
distDataFiletered:25:<コンソール>にフィルタのorg.apache.spark.rdd.RDD [INT] = MapPartitionsRDD [6]
//操作の内容(その後私たちは話しましょう)した後、トリガアクション、フィルタビュー
//使用するのに適して注意コレクト場合にのみ、以下のデータ
スカラ> distDataFiltered.collect
RES3:配列[INT] =アレイ(3、4、5)
1
2
3
4
5
6
7
8
(3)RDDプログラミングモデル
前の例では、我々はどのようにRDDプログラムにさらされている、我々は先に述べました
新しいdistData RDD RDDに変換する//フィルタ機能
スカラ>ヴァルdistDataFiletered = distData.filter(E => E> 2)
//操作の内容(その後私たちは話しましょう)した後、トリガアクション、フィルタビュー
//使用するのに適して注意コレクト場合にのみ、以下のデータ
スカラ> distDataFiltered.collect
1
2
3
4
5
それは私たちにコアアイデアRDDプログラミングモデルについて説明しています。このコード:「新しいdistData RDD RDDに変換するにはフィルタ機能を」、「トリガー・アクション操作。」その操作はRDD(変換)、アクション二種類の変換を含みます。
RDD RDDが新しい、特別な注意に変換して動作します変換は、すべての変換が怠惰であり、人々のScalaの怠惰な理解は、それがすぐに変換した後に実行されないことがわかっている場合ではなく、覚えているだろうということですライブ変換データセットに対応し、実際に使用する時は、変換後、例えばdistData.filter(E => E> 2)で実行される、それは直ちに起こらないが、実行方法distDataFiltered.collectまで待機します図に示すように、それは、実行されます。
我々は、実行のdistDataFiltered.collect方法の後、実行は最後の変換をトリガーする、チャートから見ることができます。
私たちが知っている変革の導入から、アクション最終決済手続きのためのインセンティブが行われ、アクション操作は、プログラムの実行結果に戻ります実行を収集したり、そのようなsaveAsTextFile方法SparkWordCountとして演算結果、保存。
1.5.0サポートが含ま変換をスパーク:
(1)地図
関数メソッドのパラメータをマッピングします。
/ **
*このRDDのすべての要素に関数を適用することにより、新しいRDDを返します。
* /
(F:T => U):RDD [U]:DEF [ClassTag U]マップ
1
2
3
4
使用例//
スカラ>ヴァルRDD1 = sc.parallelize(配列(1,2,3,4))。地図(X => 2 * X).collect
RDD1:配列[INT] =配列(2、4、6、8)
1
2
(2)フィルタ
メソッドパラメータ:
/ **
*述語を満たす要素だけを含む新しいRDDを返します。
* /
DEFフィルタ(F:T =>ブール):EET [T]
1
2
3
4
使用例
スカラ>ヴァルRDD1 = sc.parallelize(配列(1,2,3,4))。フィルタ(X => X> 1).collect
RDD1:配列[INT] =配列(2、3、4)
1
2
3
(3)flatMap
メソッドパラメータ:
/ **
*最初にこのすべての要素に関数を適用することにより、新しいRDDを返します。
* RDD、その後、結果を平坦化します。
* /
DEF flatMap [U:ClassTag](F:T => TraversableOnce [U]):RDD [U]
1
2
3
4
5
使用例:
スカラ>ヴァルデータ=配列(配列(1、2、3、4、5)、アレイ(4,5,6))
データ:配列[配列[INT]] =配列(配列(1、2、3、4、5)、アレイ(4、5、6))
スカラ>ヴァルRDD1 = sc.parallelize(データ)
RDD1:<コンソール>に並列化するorg.apache.spark.rdd.RDD [配列[INT]] = ParallelCollectionRDD [2]:23
スカラ>ヴァルRDD2 = rdd1.flatMap(X => x.map(Y => Y))
RDD2:org.apache.spark.rdd.RDD [INT] = MapPartitionsRDD [3] flatMapに<コンソール>に25
スカラ> rdd2.collect
RES0:配列[INT] =配列(1、2、3、4、5、4、5、6)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
(4)mapPartitions(FUNC)
このmapPartitionsから例します。https://www.zybuluo.com/jewes/note/35032
mapPartitionsは、マップの変形です。各要素の入力関数マップはRDDに適用され、mapPartitions入力機能は、全体のプロセスとして、各パーティションに各パーティションの内容、すなわち印加されます。その機能は次のように定義されています。
DEF mapPartitions [U:ClassTag](F:イテレータ[T] =>イテレータ[U]、preservesPartitioning:ブール=偽):RDD [U]
fは、各パーティションの内部の内容を処理し、入力関数です。各パーティションの内容は、Fの出力は、イテレータ[U]入力にイテレータ[T]伝達関数fであろう。すべてのパーティションの処理を経てRDD入力機能の最終結果は、合流します。
スカラ>ヴァルA = sc.parallelize(1〜9、3)
スカラ> DEFてmyfunc [T](ITER:イテレータ[T]):イテレータ[(T、T)] = {
)(すべてのVAR = [(T、T)]をリスト
varが事前= iter.next
一方、(iter.hasNext){
ヴァルCUR = iter.next。
RES。:: =(前、CUR)
事前= CUR。
}
res.iterator
}
スケール> a.mapPartitions(myFuncという).collect
RES0:配列[(INT、INT)] =配列((2,3)、(1,2)、(5,6)、(4,5)、(8,9)、(7,8))
1
2
3
4
5
6
7
8
9
10
11
12
13
関数は、上記の例では、要素とその次の要素のタプルを分割することであるMYFUNC。最後の項目なし次パーティションの要素なので、(3,4)及び(6,7)は結果ではないからです。
mapPartitions例えばmapPartitionsWithContextなどのいくつかの変異体を、ユーザが指定した入力機能にプロセス情報の状態に対応することができます。そこmapPartitionsWithIndexは、それはユーザーが指定した入力機能に索引をパーティション化することができます渡します。
(5)mapPartitionsWithIndex
次のようにmapPartitionsWithIndex mapPartitions関数は、その関数のパラメータの変化の関数です。
(:mapPartitionsWithIndex [ClassTag U] DEF
F:(INT、イテレータ[T])=>イテレータ[U]
preservesPartitioning:ブール=偽):RDD [U]
`` `
スカラ>ヴァルA = sc.parallelize(1〜9、3)
//パーティションインデックスの関数の組の最初の要素は、インデックスがパーティションによって返さ
スカラ> DEFてmyfunc [T](屈折率:T、ITER:イテレータ[T]):イテレータ[(T、T、T)] = {
VaRのRES =リスト[(T、T、T)]()
varが事前= iter.next
一方、(iter.hasNext){
ヴァルCUR = iter.next
RES。:: =(指数、前、CUR)
事前のお尻=
}
res.iterator
}
スカラ> a.mapPartitionsWithIndex(myfunc関数).collect
res11:配列[(INT、INT、INT)] =配列((0,2,3)、(0,1,2)、(1,5,6)、(1,4,5)、(2、 8,9)、(2,7,8-))
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
(6)サンプル
メソッドパラメータ:
/ **
*このRDDのサンプリングされたサブセットを返します。
*
* @paramにwithReplacement要素が複数回(うちサンプリングする際置換)をサンプリングすることができ
* @param画分は、このRDDのサイズの一部として、サンプルのサイズを予想しました
*交換なし:各要素が選択される確率。画分は[0、1]である必要があります
*置換を有する:各要素が選択される回数の期待数。画分は> = 0でなければなりません
乱数生成のための* @paramシードシード
* /
デフサンプル(
withReplacement:ブール、
分数:ダブル、
種子:長い= Utils.random.nextLong):RDD [T]
1
2
3
4
5
6
7
8
9
10
11
12
13
使用例:
スカラ>ヴァルA = sc.parallelize(1〜9、3)
そして:org.apache.spark.rdd.RDD [INT] = ParallelCollectionRDD [12] <コンソール>に並列化する:21
スカラ>ヴァルsmapledA = a.sample(真、0.5)
smapledA:23:<コンソール>の試料についてorg.apache.spark.rdd.RDD [INT] = PartitionwiseSampledRDD [13]
スカラ> smapledA.collect
res12:配列[INT] =アレイ(3、3、3、5、6、8、8)
スカラ>ヴァルsmapledA2 = a.sample(偽、0.5).collect
smapledA2:配列[INT] =配列(1、4)