Spark学习实例(Python):输入源实时处理 Input Sources Streaming

在之前学习的RDD和DataFrame数据集主要处理的是离线数据,随着时代发展进步,我们会发现越来越多数据是在源源不断发回到数据中心,同时需要立刻响应给用户,这样的情况我们就会用到实时处理,常用的场景有实时显示某商场一小时人流密度、实时显示当天火车站人口总数等等。接下来从实时数据源说起,实时数据源主要有:

  • File Source
  • Socket Source
  • Flume Source
  • Kafka Source

File Source指的是文件作为数据来源,常用的有本地文件file和分布式系统hdfs,这边以本地文件来说明,实现代码如下

from pyspark import SparkContext
from pyspark.streaming import StreamingContext

if __name__ == '__main__':
    sc = SparkContext(appName="inputSourceStreaming", master="local[*]")
    # 第二个参数指统计多长时间的数据
    ssc = StreamingContext(sc, 5)

    lines = ssc.textFileStream("file:///home/llh/data/streaming")
    counts = lines.flatMap(lambda line: line.split(" ")).map(lambda x: (x, 1)).reduceByKey(lambda a,b: a+b)
    counts.pprint()
    # -------------------------------------------
    # Time: 2019-07-31 18:11:55
    # -------------------------------------------
    # ('hong', 2)
    # ('zhang', 2)
    # ('li', 2)
    # ('san', 2)
    # ('wang', 2)
    ssc.start()
    ssc.awaitTermination()

然后不断向/home/llh/data/streaming/目录下拷贝文件,结果如上面注释所示

Socket Source指网络套接字作为数据来源,用命令nc模拟网络发送信息,实现代码如下

from pyspark import SparkContext
from pyspark.streaming import StreamingContext

if __name__ == '__main__':
    sc = SparkContext(appName="inputSourceStreaming", master="local[*]")
    # 第二个参数指统计多长时间的数据
    ssc = StreamingContext(sc, 5)

    lines = ssc.socketTextStream("localhost", 9999)
    counts = lines.flatMap(lambda line: line.split(" ")).map(lambda x: (x, 1)).reduceByKey(lambda a,b: a+b)
    counts.pprint()
    # -------------------------------------------
    # Time: 2019-07-31 18: 43:25
    # -------------------------------------------
    # ('hadoop', 1)
    # ('spark', 1)
    ssc.start()
    ssc.awaitTermination()

命令端执行~$ nc -lk 9999

hadoop spark

之后运行代码即可

Flume是一个高可用海量收集日志系统,因此可作为数据来源,实现代码如下

from pyspark import SparkContext
from pyspark.streaming import StreamingContext
from pyspark.streaming.flume import FlumeUtils

if __name__ == '__main__':
    sc = SparkContext(appName="inputSourceStreaming", master="local[*]")
    # 第二个参数指统计多长时间的数据
    ssc = StreamingContext(sc, 5)

    lines = FlumeUtils.createStream("localhost", 34545)
    counts = lines.flatMap(lambda line: line.split(" ")).map(lambda x: (x, 1)).reduceByKey(lambda a,b: a+b)
    counts.pprint()

    ssc.start()
    ssc.awaitTermination()

Kafka是一款分布式消息队列,常作为中间件用于传输,隔离,Kafka是以上四种里面实际开发最常用的流式数据来源,一样实现代码如下

from pyspark import SparkContext
from pyspark.streaming import StreamingContext
from pyspark.streaming.kafka import KafkaUtils

if __name__ == '__main__':
    sc = SparkContext(appName="inputSourceStreaming", master="local[*]")
    # 第二个参数指统计多长时间的数据
    ssc = StreamingContext(sc, 5)

    kvs = KafkaUtils.createDirectStream(ssc, "topic-name", "localhost:9092")
    lines = kvs.map(lambda x: x[1])
    counts = lines.flatMap(lambda line: line.split(" ")).map(lambda x: (x, 1)).reduceByKey(lambda a,b: a+b)
    counts.pprint()

    ssc.start()
    ssc.awaitTermination()

好了,以上就是实时处理主要数据来源,第四种最为重要必须掌握。

Spark学习目录:

发布了84 篇原创文章 · 获赞 28 · 访问量 6万+

猜你喜欢

转载自blog.csdn.net/a544258023/article/details/97890000