DSTREAM関連の操作をスパーク

操作と出力操作画面を切り替え、通常のスイッチング動作:RDDは同様に、DSTREAMも操作のそれらの一連の方法を提供し、これらの動作は、次の3つのカテゴリに分けることができます。

通常の変換動作

表1に示すように、共通変換動作

表1一般的な変換操作
彼の 説明
マップ(FUNC) 各ソース要素DSTREAM関数funcから返された新しいDSTREAM。
flatMap(FUNC) 入力要素の各々がゼロ以上の出力要素にマッピングされてもよいことを除いて同様の操作をマップ
フィルタ(FUNC) ソースDSTREAMの戻り値に選択FUNC機能は、最終的に新しいDSTREAMを返し、要素の唯一の真のです。
ディストリビューション(numPartitions) DSTREAMパーティションのサイズは、パラメータ入力numPartitionsの値によって変化します
労働組合(otherStream) 新DSTREAMリターン要素は、DSTREAMが後に他のDSTREAMと組み合わせるソースが含まれています
カウント() DSTREAM RDDカウント内部ソースに含まれる要素の数にRDDは、内部戻りは、唯一の要素が含まれDSTREAM
削減(FUNC) ソースDSTREAM RDD重合操作の各要素に対して関数func(二つのパラメータと結果を返す)を使用して新しいDSTREAMが行われ、リターンRDDは唯一つの内部要素が含まれ
countByValue() 計算DSTREAM RDD要素は、各周波数内に現れると、KはRDD型素子であり、ロング要素の発生頻度で新しいDSTREAM(<K、ロング>)を返します
reduceByKey(FUNC、[numTasks]) 型は<K、V> DSTREAM時間値のペアである場合、重合関数funcを使用して集約される各キー値V新しいキーと値のペアDSTREAM、ため、戻り型と呼ばれています。あなたは、並行タスク構成の異なる数によって提供されてもよいnumTasks
参加(otherStream、[numTasks]) 型と呼ばれるときに<K、V>と<K、W> 2 DSTREAMのキー、戻り値の型<K、<V、W >>は、新しいキーと値のペアをDSTREAMています
コグループ(otherStream、[numTasks]) 2 DSTREAMは、<K、V>と<K、W>キーと値のペアを含む各呼び出さ<K、配列[V]、配列[W]>新しいタイプDSTREAMを返す場合
変換(FUNC) 各RDD RDDツーKDDソースDSTREAM機能のアプリケーションを介してRDDの任意の操作DSTREAMのために使用することができる新しいDSTREAMを返します
updateStateByKey(FUNC) これは、各キーの新しい状態を前の状態に基づいて、その新しい値が関数funcを算出することによって誘導される新しい状態DSTREAMを返します。この方法は、各キーのいずれかの状態データを維持するために使用することができます

表1に列挙された動作では、変換(FUNC)メソッドとupdateStateByKey(fhnc)メソッドに見えるで詳しくさらに価値があります。

1.変換(FUNC)メソッド

変換方法と同様のtransformWith(FUNC)メソッドDSTREAM上の任意のRDDツーRDD機能への適用を可能にする、彼らは、任意の動作に適用することが可能でRDD DSTREAMのAPIに露出していません。

たとえば、データセットの別のバッチで、各データストリームは、直接接続DSTREAMのAPIにさらされていないことができますが、簡単に非常に強力なDSTREAMになり、これを行うには(FUNC)メソッドを、変換することができます。

例えば、入力データを接続することにより、クリーンアップフィルタを行うには、事前に計算されたスパムメッセージ、リアルタイムのデータを流します。実際には、機械学習アルゴリズムは、計算に使用することができ、グラフィックス(FUNC)メソッドを変換します。

2. updateStateByKey(FUNC)方法

新しい情報を更新継続可能にしながらupdateStateByKey(FUNC)任意の状態の方法は、維持することができます。この機能を使用するには、次の2つの手順を実行する必要があります。

1)定義は、状態:状態は、データの任意のタイプであってもよいです。

2)更新機能を定義します。以前の状態と入力ストリームから取得した更新され、新しい値の状態で機能を使用する方法を指定します。

例示する例では、テキスト・データ・ストリームは、ワード数であると仮定されます。ここで、カウントは状態を実行している、それは整数です。次のようにUpdate関数が定義されています。

updateFunction DEF(newValues:SEQ [INT]、runningCount:オプション[INT]);
Option- [INT] = {
ヴァルNEWCOUNT = ... // runningCount新しいCOUNT取得し、プリアンブルに新しい値を追加するために
Sを一部(NEWCOUNT)
}

この関数は、値の対を含むDSTREAM適用される(前の例で、例えば、ワードカウント、DSTREAMは<ワード、1>キーと値のペアを含みます)。これはnewValuesが最新の値であり、更新機能、値の前にrunningCount(例えばWordでWORDCOUNTなど)内の各要素を必要とします。

ヴァルrunningCounts = pairs.updateStateByKey [INT](updateFunction._)

ウィンドウの変換操作

スパークストリーミングはまた、スライディングウィンドウによって変換されたデータを可能にする計算ウィンドウ、表2に示すウィンドウ切替動作を提供します

表2ウィンドウの切り替え操作
変更 説明
窓(windowLength、slideInterval) ウィンドウを取得した新しいDSTREAMバッチがソースDSTREAMに基づいて計算されて返します
countByWindow(windowLength、slideInterval) のスライディングウィンドウDSTREAMに基づいて要素の数を返します。
reduceByWindow(FUNC、windowLength、slideInterval) ソースDSTREAM要素系重合操作ウィンドウをスライドさせる新しいDSTREAMを得るために
reduceByKeyAndWindow(FUNC、windowLength、slideInterval、[numTasks]) 重合を使用して関数func重合はK <K、V>に進んで、キーと値の種類DSTREAMに基づいて、ウィンドウをスライディング、新しいDSTREAMを取得
reduceByKeyAndWindow(FUNC、invFunc、windowLength、slideInterval、[numTasks]) スライディングウィンドウ新しい増分間隔重合内の最初のデータのより効率的なバージョンを達成し、その後、同じ時間間隔での最初の統計データを削除するには。
例えば、最後の5秒の間、T + 4秒の計算は、この時間窓をWORDCOUNT、時間があってもよい。3 T + 5秒過去の統計プラス[T + 3、T + 4 ] 統計マイナス[T- 2、T-1]統計、この方法は、統計的効率を中間体3秒統計情報を多重化することができます
countByValueAndWindow(windowLength、slideInterval、[numTasks]) スライディングウィンドウ内の各要素の出現頻度に基づいて、各ソースDSTREAM RDDについて計算、及び、KはRDD型素子であるDSTREAM [<K、ロング>]、ロング要素の周波数で戻ります。削減タスクの数は、オプションのパラメータで設定することができます

スパークストリーミングでは、データ処理がバッチで行われ、データ収集は、一枚ずつ行われ、第1のバッチ間隔は、収集されたデータのバッチにわたる時間間隔は最大集約されるであろう場合スパークストリーミングに設定しますに対処するためのシステムへのデータの一括なります。

对于窗口操作而言,在其窗口内部会有 N 个批处理数据,批处理数据的大小由窗口间隔决定,而窗口间隔指的就是窗口的持续时间。

在窗口操作中,只有窗口的长度满足了才会触发批数据的处理。除了窗口的长度,窗口操作还有另一个重要的参数,即滑动间隔,它指的是经过多长时间窗口滑动一次形成新的窗口。滑动间隔默认情况下和批次间隔相同,而窗口间隔一般设置得要比它们两个大。在这里必须注意的一点是,滑动间隔和窗口间隔的大小一定得设置为批处理间隔的整数倍。

如图 1 所示,批处理间隔是 1 个时间单位,窗口间隔是 3 个时间单位,滑动间隔是 2 个时间单位。对于初始的窗口(time 1~time 3),只有窗口间隔满足了才会触发数据的处理。

这里需要注意,有可能初始的窗口没有被流入的数据撑满,但是随着时间的推进/窗口最终会被撑满。每过 2 个时间单位,窗口滑动一次,这时会有新的数据流入窗口,窗口则移去最早的 2 个时间单位的数据,而与最新的 2 个时间单位的数据进行汇总形成新的窗口(time 3~ time 5)。

DStream的批处理间隔示意
图 1  DStream的批处理间隔示意

对于窗口操作,批处理间隔、窗口间隔和滑动间隔是非常重要的 3 个时间概念,是理解窗口操作的关键所在。

输出操作

Spark Streaming 允许 DStream 的数据被输出到外部系统,如数据库或文件系统。输出操作实际上使 transformation 操作后的数据可以被外部系统使用,同时输出操作触发所有 DStream 的 transformation 操作的实际执行(类似于 RDD 操作)。表 3 列出了目前主要的输出操作。

转换 描述
print() 在 Driver 中打印出 DStream 中数据的前 10 个元素
saveAsTextFiles(prefix,[suffix]) 将 DStream 中的内容以文本的形式保存为文本文件,其中,每次批处理间隔内产生的文件以 prefix-TIME_IN_MS[.suffix] 的方式命名
saveAsObjectFiles(prefix,[suffix]) 将 DStream 中的内容按对象序列化,并且以 SequenceFile 的格式保存,其中,每次批处理间隔内产生的文件以 prefix—TIME_IN_MS[.suffix]的方式命名
saveAsHadoopFiles(prefix,[suffix]) 将 DStream 中的内容以文本的形式保存为 Hadoop 文件,其中,每次批处理间隔内产生的文件以 prefix-TIME_IN_MS[.suffix] 的方式命名
foreachRDD(func) 最基本的输出操作,将 func 函数应用于 DStream 中的 RDD 上,这个操作会输出数据到外部系统,例如,保存 RDD 到文件或者网络数据库等。需要注意的是,func 函数是在该 Streaming 应用的 Driver 进程里执行的

dstream.foreachRDD 是一个非常强大的输出操作,它允许将数据输出到外部系统。但是,如何正确高效地使用这个操作是很重要的,下面来讲解如何避免一些常见的错误。

通常情况下,将数据写入到外部系统需要创建一个连接对象(如 TCP 连接到远程服务器),并用它来发送数据到远程系统。出于这个目的,开发者可能在不经意间在 Spark Driver 端创建了连接对象,并尝试使用它保存 RDD 中的记录到 Spark Worker 上,代码如下。

dstream.foreachRDD { rdd =>
val connection = createNewConnection() //在 Driver 上执行
rdd.foreach { record =>
connection.send(record) // 在 Worker 上执行
}
}

这是不正确的,这需要连接对象进行序列化并从 Driver 端发送到 Worker 上。连接对象很少在不同机器间进行这种操作,此错误可能表现为序列化错误(连接对不可序列化)、初始化错误(连接对象需要在 Worker 上进行初始化)等,正确的解决办法是在 Worker 上创建连接对象。

通常情况下,创建一个连接对象有时间和资源开销。因此,创建和销毁的每条记录的连接对象都可能会导致不必要的资源开销,并显著降低系统整体的吞吐量。

一个比较好的解决方案是使用 rdd.foreachPartition 方法创建一个单独的连接对象,然后将该连接对象输出的所有 RDD 分区中的数据使用到外部系统。

还可以进一步通过在多个 RDDs/batch 上重用连接对象进行优化。一个保持连接对象的静态池可以重用在多个批处理的 RDD 上,从而进一步降低了开销。

需要注意的是,在静态池中的连接应该按需延迟创建,这样可以更有效地把数据发送到外部系统。另外需要要注意的是,DStream 是延迟执行的,就像 RDD 的操作是由 Actions 触发一样。默认情况下,输出操作会按照它们在 Streaming 应用程序中定义的顺序逐个执行。

持久化

与 RDD 一样,DStream 同样也能通过 persist() 方法将数据流存放在内存中,默认的持久化方式是 MEMORY_ONLY_SER,也就是在内存中存放数据的同时序列化数据的方式,这样做的好处是,遇到需要多次迭代计算的程序时,速度优势十分的明显。

而对于一些基于窗口的操作,如 reduceByWindow、reduceByKeyAndWindow,以及基于状态的操作,如 updateStateBykey, 其默认的持久化策略就是保存在内存中。

对于来自网络的数据源(Kafka、Flume、Sockets 等),默认的持久化策略是将数据保存在两台机器上,这也是为了容错性而设计的。

推荐学习目录:40.Spark RDD
41.Spark总体架构和运行流程
42.Spark生态圈
43.Spark开发实例
44.Spark Streaming简介
45.Spark Streaming系统架构
46.Spark Streaming编程模型
47.Spark DStream相关操作
48.Spark Streaming开发实例

おすすめ

転載: blog.csdn.net/dsdaasaaa/article/details/94182127