ビッグデータ開発-スパーク-1つの記事で一般的なRDDを理解する

1.5つの基本的なプロパティ

  • パーティションのリスト

  • 各分割を計算するための関数

  • 他のRDDへの依存関係のリスト

  • オプションで、Key-Value RDDのパーティショナー(たとえば、RDDがハッシュパーティション化されていると言う)

  • オプションで、各分割を計算するための優先ロケーションのリスト(HDFSファイルのブロックロケーションなど)

これはRDDのソースコードのコメントに書かれています。5つの特徴的な属性を以下に紹介します。

1.1パーティション

パーティションは、データセットの基本単位です。RDDの場合、各シャードはコンピューティングタスクによって処理され、並列コンピューティングの粒度を決定します。ユーザーはRDDの作成時にRDDフラグメントの数を指定できます。指定しない場合は、デフォルト値が使用されます。

1.2計算された関数

パーティションデータを計算するための関数。SparkでのRDDの計算はシャードに基づいており、各RDDはこの目標を達成するために計算関数を実装します。計算関数はイテレータを組み合わせており、各計算の結果を保存する必要はありません。

1.3依存関係

RDD間には依存関係があります。RDDを変換するたびに、新しいRDDが生成され、パイプラインと同様の前面と背面の依存関係(系統)がRDD間で形成されます。パーティションデータの一部が失われた場合、Sparkは、RDDのすべてのパーティションを再計算する代わりに、この依存関係を通じて失われたパーティションデータを再計算できます。

1.4パーティショナー

key-valueRDD、可能なパーティションデバイス(Partitioner)。Sparkは2種類のフラグメンテーション関数を実装しています。1つはハッシュベースHashPartitionerで、もう1つは範囲に基づくRangePartitionerです。Key-Value RDDのみが可能Partitionerであり、非Key-ValueRDDの値ParititionerはNoneです。Partitionerこの関数はRDD、自身のシャードのparent RDD Shuffle数を決定し、出力時にシャードも決定します。

1.5優先保管場所

Partition優先ロケーション(優先ロケーション)を格納するリスト以下の場合はHDFS、ファイル、このリストには、節約Partitionの場所ブロックを。「コンピューティングではなくデータを移動する」という概念によればSpark、タスクのスケジューリング時に、コンピューティングタスクは処理されるデータブロックの保存場所に割り当てられます。

2.RDD変換間の一般的な演算子

以前のRDD基本機能から始めて、仕事で書かれることが多いプログラムは、作成RDDRDD変換、RDD演算子の実行、外部システムに対応するデータがSparkクラスターに流れるために必要なステップの作成です。コレクションから作成されたデータは一般的にテストで使用されるため、詳細には触れません。RDD変換はTransformation遅延読み込みと呼ばれる特別な演算子に対応しTransformationアクションは実行をトリガーする操作に対応します。通常、コレクションに出力されるか、出力されるか、値を返します。さらに、はクラスターから他のシステムに出力されますActionこれには専門用語があります。

2.1一般的な変換演算子

変換演算子、つまり、あるRDDから別のRDDへの変換操作は、一部の組み込みCompute関数に対応しますが、これらの関数は、シャッフルの有無にかかわらず、ワイド依存演算子とナロー依存演算子に分けられます。

2.1.1広い依存と狭い依存の違い

一般的に、オンライン記事の2種類があります。一つは、親かどうか、である交通の定義、あるRDDパーティションが複数の子パーティションに依存することになります。他にはどんな存在であるかどうかを確認することですShuffleそこにあれば、Shuffle広い依存性がある場合には、ありません、それは狭い依存関係です。スペクトルポイント、2番目はそれ自体をそれ自身と見なすことであるため、参照値はありません。2.1.3広い依存関係と狭い依存関係を区別する方法、これを見ることができます

2.1.2広い依存関係と狭い依存関係の一般的な演算子

狭い依存関係の一般的な演算子

map(func):データセット内の各要素にfuncを使用し、新しいRDDを返しfilter(func)ます:データセット内の各要素にfuncを使用し、funcをtrueにする要素を含むRDD返しますflatMap(func):mapと同様に、各入力要素はにマップされます0個以上の出力要素mapPartitions(func):mapと同様ですが、mapは各要素でfuncを使用し、mapPartitionsはパーティション全体でfuncを使用します。RDDにN個の要素とM個のパーティション(N >> M)があるとすると、mapの関数はN回呼び出され、mapPartitionsの関数はM回だけ呼び出され、一度に1つのパーティション内のすべての要素を処理しますmapPartitionsWithIndex(func)。 mapPartitions同様に、パーティションのインデックス値に関する詳細情報

glom():各パーティションを配列に形成して、新しいRDDタイプを形成しますRDD [Array [T]] sample(withReplacement, fraction, seed):サンプリング演算子。指定されたランダムシード(シード)を使用して、分数の数のデータをランダムにサンプリングします。withReplacementは、抽出されたデータが置換されるかどうかを示し、trueは置換ありのサンプリング、falseは置換なしのサンプリングです。

coalesce(numPartitions,false):シャッフルなし、通常はパーティションを減らすために使用されます

union(otherRDD):2つのRDDの和集合を見つける

cartesian(otherRDD):デカルト積

zip(otherRDD):2つのRDDをKey-Value RDDに結合します。デフォルトでは、パーティションの数と2つのRDDの要素の数は同じです。それ以外の場合は、例外がスローされます。

mapとmapPartitionsの違い map:一度に1つのデータmapPartitionsを処理する:一度に1つのデータパーティションを処理する場合、データはパーティションのデータ処理が完了した後にのみ解放できます。リソースが不足していると、簡単にOOM。ベストプラクティス:メモリリソースが十分な場合はmapPartitions、を使用することをお勧めします。処理効率を向上させるため

幅広い依存関係の一般的な演算子

groupBy(func):渡された関数の戻り値に従ってグループ化します。同じキー値をイテレータに入れます

distinct([numTasks])):RDD要素の重複を削除した後、新しいRDDを返します。numTasksパラメーターを渡して、RDDパーティションの数を変更できます

coalesce(numPartitions, true):シャッフルでは、パーティションを増やすか減らすかにかかわらず、通常は代わりに再パーティションを使用します

repartition(numPartitions):シャッフルを使用して、パーティションの数を増減します

sortBy(func, [ascending], [numTasks]):funcを使用してデータを処理し、処理された結果を並べ替えます

intersection(otherRDD):2つのRDDの交点を見つける

subtract (otherRDD):2つのRDDの違いを見つける

2.1.3広い依存と狭い依存を区別する方法

ここでは理解できない演算子を提案します。依存関係グラフからSparkhistory分割があるかStageどうかを確認します。分割されている場合は広い依存関係であり、分割されていない場合は狭い依存関係です。もちろん、これは実用的です。アプローチ。同僚やクラスメートに問題を説明することができます。時間になったら、show your codeそれを彼渡してから、依存関係グラフを渡してください。もちろん、理論と実践の並列として、別の方法で判断します。定義を理解することから始まります。定義は、親RDDパーティションが複数の子によって分割されているかどうかを示します。パーティションの依存関係は、この観点から考えることができます。親パーティションの単一のパーティション内のデータがに流れる可能性があります。たとえば、異なる子RDDのパーティションは、個別の演算子、またはsortBy演算子、グローバルな重複排除、およびグローバルな並べ替えについて考えます。最初に1、2、および3がパーティション内にあると仮定します。map(x => (x, null)).reduceByKey((x, y) => x).map(_._1)重複排除後、パーティションの数はが変更されていない場合、各パーティションのデータを他のパーティションのデータで読み取って、入力パーティションから出力パーティションまで、最終的に保持するかどうかを確認する必要があります。再構築の必然的な収束shuffle、 。sortBy同様に。

2.2一般的なアクション演算子

アクションはジョブをトリガーします。Sparkプログラム(ドライバープログラム)には、ジョブと同じ数のアクション演算子が含まれています。一般的なアクション演算子:collect / count collect()=> sc.runJob()=> ... => dagScheduler.runJob()=>ジョブは引き金になった

collect() / collectAsMap() stats / count / mean / stdev / max / min reduce(func) / fold(func) / aggregate(func)

first():このRDDの最初の要素を返す:RDDtake(n)の最初のnum要素を取得するtop(n):デフォルト(降順)または指定された並べ替え規則に従って、最初のnum要素を返します。takeSample(withReplacement, num, [seed]):サンプルデータを返すforeach(func) / foreachPartition(func):mapやmapPartitionsと同様ですが、違いはforeachがアクションであるということです。saveAsTextFile(path) / saveAsSequenceFile(path) / saveAsObjectFile(path)

3.PairRDDの一般的な操作

RDDは通常、値型とKey-Value型に分けられます。前の紹介は値型RDDの操作であり、実際の使用は、PairRDDとしても知られるより多くのKey-Value型RDDです。値型のRDD操作は基本的にRDD.scalaに集中しています。Key-Value型のRDD操作はPairRDDFunctions.scalaに集中しています。

上記で紹介した演算子のほとんどは、ペアRDDに有効です。RDDの値がキー値の場合、暗黙的にペアRDDに変換できます。ペアRDDには、独自の変換演算子とアクション演算子もあります。

ファイル

3.1一般的なPairRDDの変換操作

3.1.1同様のマップ操作

mapValues / flatMapValues /キー/値。これらの操作は、簡略化された操作であるマップ操作を使用して実装できます。

3.1.2集約操作[重要かつ困難]

PariRDD(k、v)には幅広いアプリケーションがあり、aggregate groupByKey / reduceByKey / foldByKey / AggregateByKey CombineByKey(OLD)/ CombineByKeyWithClassTag(NEW)=>基礎となる実装subtractByKey:減算と同様に、RDDのキーを削除します。他のRDD要素のキーと同じ

結論:同等の効率を得るために最もよく知られた方法を使用します。groupByKeyは一般的に非効率的であるため、使用はできるだけ少なくします。

3.1.3ソート操作

sortByKey:sortByKey関数は、PairRDDに作用してキーを並べ替えます

3.1.4結合操作

cogroup / join / leftOuterJoin / rightOuterJoin / fullOuterJoin

ファイル

val rdd1 = sc.makeRDD(Array((1,"Spark"), (2,"Hadoop"), (3,"Kylin"), (4,"Flink")))
val rdd2 = sc.makeRDD(Array((3,"李四"), (4,"王五"), (5,"赵六"), (6,"冯七")))
val rdd3 = rdd1.cogroup(rdd2)
rdd3.collect.foreach(println)
rdd3.filter{case (_, (v1, v2)) => v1.nonEmpty & v2.nonEmpty}.collect
// 仿照源码实现join操作
rdd3.flatMapValues( pair =>
for (v <- pair._1.iterator; w <- pair._2.iterator) yield (v, w)
)
val rdd1 = sc.makeRDD(Array(("1","Spark"),("2","Hadoop"),("3","Scala"),("4","Java")))
val rdd2 = sc.makeRDD(Array(("3","20K"),("4","18K"),("5","25K"),("6","10K")))
rdd1.join(rdd2).collect
rdd1.leftOuterJoin(rdd2).collect
rdd1.rightOuterJoin(rdd2).collect
rdd1.fullOuterJoin(rdd2).collect

3.1.5アクション操作

collectAsMap / countByKey / lookup(key)

ファイル

lookup(key):効率的な検索方法。パーティションに対応するデータのみを検索します(RDDにパーティショナーがある場合)

4.メッセージ

実際の戦闘からの本当の知識、特定の実現が必要な場合、特定の演算子について考え、それを使用し、理解できないソースコードを見ると、成功します。Wu Xie、Xiao San Ye、バックグラウンドの小さな新人、ビッグデータ、人工知能。もっと注意してくださいファイル

おすすめ

転載: blog.csdn.net/hu_lichao/article/details/112134716