1. 程式人生 > >大資料學習之路105-視窗函式及foreachRDD,foreachPartition,foreach對比

大資料學習之路105-視窗函式及foreachRDD,foreachPartition,foreach對比

sparkstreaming的視窗函式:

視窗函式的作用主要是計算一段時間之內的資料的變化,那麼就會有人產生疑問,為什麼視窗與視窗之間需要重疊呢?

其實不重疊也是可以的,但是如果不重疊的話,將來做出來的報表一個時間段與另一個時間段的資料就會產生劇烈的變化。

視窗函式可以讓我們一下子操作多個批次。

上面這些就是視窗函式,那麼我們怎麼用呢?

我們這裡舉個例子:

如果我們想使用reduceByKeyAndWindow的話,首先我們需要一個DStream,並且這個裡面裝的是鍵值對。

這裡的Seconds(30)是視窗的間隔,Seconds(10)是滑動的間隔。

而且這兩個間隔必須是生成批次的時間間隔。

假如生成批次的時間間隔是5秒,那麼視窗就是6個,滑動就是2個。

那麼我們如何將資料寫到外部的儲存介質(比如hdfs,redis,mysql...)?

我們可以通過foreachRDD.我們來看一下:

這段話的意思就是DStream的foreachRDD方法是一個強大的功能,他允許我們將資料寫到外部系統中。

上面的這個方法中我們可以拿到一個批次對應的RDD,那我們為什麼一次拿出來一個RDD呢?

因為他每隔一段時間生成一個RDD。我們在拿到一個RDD之後,首先拿到一個外部系統的連線。

拿到連線之後,將RDD裡面的資料通過foreach寫入。

這種方法其實並不好!

為什麼這麼說?因為RDD中有很多分割槽。而RDD中有很多的資料,這些資料是分散在多臺機器上的。

一個RDD只有一個連線,所以他會將這個連線通過網路序列化到其他的機器上。

所以這種方式並不好。

接下來我們再看一看稍微好點的方式:

這裡我們先通過foreachPartition拿到一個分割槽。然後每個分割槽拿一個連線。然後分割槽裡面的資料再通過foreach寫入。

但是這種方式還是不夠好!

最好的方式是接下來的。

這種方式先拿到一個分割槽,接下來通過一個連線池拿到一個連線。

接下來這個分割槽中的資料使用這一個連線,用完之後再將這個連線還回去。