|
|
@ -1,14 +1,14 @@
|
|
|
|
## 3.1 Spark结构化流快速入门
|
|
|
|
## 3.1 Spark结构化流快速入门
|
|
|
|
Spark Streaming是核心Spark API的扩展,可实现实时数据流的可伸缩,高吞吐量,容错流处理。数据可以从像kafka,Flume,Kinesis,或TCP套接字许多来源摄入,并且可以使用与像高级别功能表达复杂的算法来处理map,reduce,join和window。最后,可以将处理后的数据推送到文件系统,数据库和实时仪表板。实际上,你可以在数据流上应用Spark的 机器学习和 图形处理算法。
|
|
|
|
Spark Streaming 是核心 Spark API 的扩展,可实现实时数据流的可伸缩,高吞吐量,容错流处理。数据可以从像 kafka,Flume,Kinesis,或 TCP 套接字许多来源摄入,并且可以使用与像高级别功能表达复杂的算法来处理 map,reduce,join和window。最后,可以将处理后的数据推送到文件系统,数据库和实时仪表板。实际上,你可以在数据流上应用 Spark 的 机器学习和 图形处理算法。
|
|
|
|

|
|
|
|

|
|
|
|
|
|
|
|
|
|
|
|
在编写自己的Spark Streaming程序之前,让我们快速简单对Spark Streaming进行入门。
|
|
|
|
在编写自己的 Spark Streaming 程序之前,让我们快速简单对 Spark Streaming 进行入门。
|
|
|
|
|
|
|
|
|
|
|
|
### 3.1.1 一个简单的例子
|
|
|
|
### 3.1.1 一个简单的例子
|
|
|
|
|
|
|
|
|
|
|
|
假设我们要计算从侦听TCP套接字的数据服务器接收到的文本数据中的单词数。
|
|
|
|
假设我们要计算从侦听 TCP 套接字的数据服务器接收到的文本数据中的单词数。
|
|
|
|
|
|
|
|
|
|
|
|
首先,我们必须导入必要的类并创建一个本地SparkSession,这是与Spark相关的所有功能的起点。
|
|
|
|
首先,我们必须导入必要的类并创建一个本地 SparkSession ,这是与 Spark 相关的所有功能的起点。
|
|
|
|
|
|
|
|
|
|
|
|
```
|
|
|
|
```
|
|
|
|
from pyspark.sql import SparkSession
|
|
|
|
from pyspark.sql import SparkSession
|
|
|
@ -21,7 +21,7 @@ spark = SparkSession \
|
|
|
|
.getOrCreate()
|
|
|
|
.getOrCreate()
|
|
|
|
```
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
接下来,让我们创建一个流数据框架,该数据框架表示从侦听localhost:9999的服务器接收的文本数据,并转换该数据框架以计算字数。
|
|
|
|
接下来,让我们创建一个流数据框架,该数据框架表示从侦听`localhost:9999`的服务器接收的文本数据,并转换该数据框架以计算字数。
|
|
|
|
```
|
|
|
|
```
|
|
|
|
lines = spark \
|
|
|
|
lines = spark \
|
|
|
|
.readStream \
|
|
|
|
.readStream \
|
|
|
@ -41,9 +41,9 @@ words = lines.select(
|
|
|
|
wordCounts = words.groupBy("word").count()
|
|
|
|
wordCounts = words.groupBy("word").count()
|
|
|
|
```
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
此lines DataFrame表示一个包含流文本数据的无界表。该表包含一列名为“值”的字符串,流文本数据中的每一行都成为表中的一行。请注意,由于我们正在设置转换,并且尚未开始转换,因此当前未接收到任何数据。接下来,我们使用了两个内置的SQL函数-split和explode,将每一行拆分为多行,每行各有一个单词。另外,我们使用函数alias将新列命名为“ word”。最后,我们wordCounts通过对数据集中的唯一值进行分组并对其进行计数来定义DataFrame。请注意,这是一个流数据帧,它表示流的运行字数。
|
|
|
|
此 lines DataFrame 表示一个包含流文本数据的无界表。该表包含一列名为“值”的字符串,流文本数据中的每一行都成为表中的一行。请注意,由于我们正在设置转换,并且尚未开始转换,因此当前未接收到任何数据。接下来,我们使用了两个内置的 SQL 函数`split`和`explode`,将每一行拆分为多行,每行各有一个单词。另外,我们使用函数`alias`将新列命名为'word'。最后,我们 `wordCounts` 通过对数据集中的唯一值进行分组并对其进行计数来定义 DataFrame 。请注意,这是一个流数据帧,它表示流的运行字数。
|
|
|
|
|
|
|
|
|
|
|
|
现在,我们对流数据进行了查询。剩下的就是实际开始接收数据并计算计数了。为此,我们将其设置outputMode("complete")为在每次更新计数时将完整的计数集(由指定)打印到控制台。然后使用开始流计算start()。
|
|
|
|
现在,我们对流数据进行了查询。剩下的就是实际开始接收数据并计算计数了。为此,我们将其设置`outputMode("complete")`为在每次更新计数时将完整的计数集(由指定)打印到控制台。然后使用开始流计算`start()`。
|
|
|
|
|
|
|
|
|
|
|
|
```
|
|
|
|
```
|
|
|
|
# Start running the query that prints the running counts to the console
|
|
|
|
# Start running the query that prints the running counts to the console
|
|
|
@ -56,16 +56,16 @@ query = wordCounts \
|
|
|
|
query.awaitTermination()
|
|
|
|
query.awaitTermination()
|
|
|
|
```
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
执行此代码后,流计算将在后台开始执行。该query对象是该活动流查询的句柄,可以使用它来终止查询,awaitTermination()用来防止在该查询处于活动状态时退出该过程。
|
|
|
|
执行此代码后,流计算将在后台开始执行。该 query 对象是该活动流查询的句柄,可以使用它来终止查询,`awaitTermination()`用来防止在该查询处于活动状态时退出该过程。
|
|
|
|
|
|
|
|
|
|
|
|
要实际执行此示例代码,你还需要通过使用以下命令将Netcat(在大多数类Unix系统中找到的一个小实用程序)作为数据服务器运行。
|
|
|
|
要实际执行此示例代码,你还需要通过使用以下命令将 Netcat(在大多数类Unix系统中找到的一个小实用程序)作为数据服务器运行。
|
|
|
|
```
|
|
|
|
```
|
|
|
|
nc -lk 9999
|
|
|
|
nc -lk 9999
|
|
|
|
apache spark
|
|
|
|
apache spark
|
|
|
|
apache hadoop
|
|
|
|
apache hadoop
|
|
|
|
```
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
示例代码侦听localhost:9999的服务器输出如下:
|
|
|
|
示例代码侦听`localhost:9999`的服务器输出如下:
|
|
|
|
```
|
|
|
|
```
|
|
|
|
-------------------------------------------
|
|
|
|
-------------------------------------------
|
|
|
|
Batch: 0
|
|
|
|
Batch: 0
|
|
|
|