CDH Spark Streaming

翻译: https://www.cloudera.com/documentation/enterprise/latest/topics/spark_streaming.html
版本: 5.14.2

Spark Streaming是核心Spark的扩展,可实现数据流的可扩展,高吞吐量,容错处理。Spark Streaming接收输入数据流并将数据分成批次,批次被称为DStreams。DStream可以从Kafka,Flume和Kinesis等来源创建,也可以通过对其他DStream进行操作来创建。每个输入DStream都与一个 Receiver 关联,它接收来自源的数据并将其存储在执行器内存中。

有关Spark Streaming的详细信息,请参阅Spark Streaming Programming Guide。

继续阅读:

  • Spark Streaming和动态分配
  • Spark Streaming示例
  • 在Spark Streaming中启用容错处理
  • 为长时间运行的Spark Streaming作业配置身份验证
  • 云中Spark流的最佳实践

Spark Streaming和动态分配

从CDH 5.5开始,默认开启动态分配,这意味着执行程序在闲置时被移除。但是,动态分配在Spark Streaming中无效。在Spark Streaming中,每批都有数据进来,执行者只要有数据就可以运行。如果执行程序空闲超时小于批处理持续时间,则执行程序会不断被添加和删除。但是,如果执行程序空闲超时大于批处理持续时间,则不会删除执行程序。因此,Cloudera建议您通过设置禁用动态分配 spark.dynamicAllocation.enabled 。

Spark Streaming示例

本示例使用Kafka将单词流传送到Python字数统计程序。

  1. 安装Kafka并创建一个Kafka服务。
  2. 创建一个Kafka topic wordcounttopic 并传入您的ZooKeeper服务器:
$ kafka-topics --create --zookeeper zookeeper_server:2181 --topic wordcounttopic \
--partitions 1 --replication-factor 1
  1. 根据Spark Streaming示例kafka_wordcount.py创建一个Kafka字数Python程序。该版本将输入流划分为10秒的批次并对每批中的单词进行计数:
from __future__ import print_function

import sys

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

if __name__ == "__main__":
    if len(sys.argv) != 3:
        print("Usage: kafka_wordcount.py  ", file=sys.stderr)
        exit(-1)

    sc = SparkContext(appName="PythonStreamingKafkaWordCount")
    ssc = StreamingContext(sc, 10)

    zkQuorum, topic = sys.argv[1:]
    kvs = KafkaUtils.createStream(ssc, zkQuorum, "spark-streaming-consumer", {topic: 1})
    lines = kvs.map(lambda x: x[1])
    counts = lines.flatMap(lambda line: line.split(" ")).map(lambda word: (word, 1)).reduceByKey(lambda a, b: a+b)
    counts.pprint()

    ssc.start()
    ssc.awaitTermination()
  1. 使用提交应用程序 spark-submit , 禁用动态分配并传入ZooKeeper服务器和主题 wordcounttopic.。要在本地运行,您必须至少指定两个工作线程:一个接收和一个处理数据。
$ spark-submit --master local[2] --conf "spark.dynamicAllocation.enabled=false" \
--jars SPARK_HOME/lib/spark-examples.jar kafka_wordcount.py \
zookeeper_server:2181 wordcounttopic

在CDH部署中,使用包安装时,SPARK_HOME 默认为/usr/lib/spark ; parcel安装时默认为 /opt/cloudera/parcels/CDH/lib/spark ; Cloudera Manager 部署时,可用脚本在 /usr/bin 中。

或者,您可以按如下方式在YARN上运行:

$ spark-submit --master yarn --deploy-mode client --conf "spark.dynamicAllocation.enabled=false" \
--jars SPARK_HOME/lib/spark-examples.jar kafka_wordcount.py \
zookeeper_server:2181 wordcounttopic
  1. 在另一个窗口中,创建一个Kafka生产者,发布给 wordcounttopic:
$ kafka-console-producer --broker-list kafka_broker:9092 --topic wordcounttopic
  1. 在生产者窗口中,键入以下内容:
hello
hello
hello
hello
hello
hello
gb
gb
gb
gb
gb
gb

根据您键入的速度,在Spark Streaming应用程序窗口中,您将看到如下输出:

-------------------------------------------
Time: 2016-01-06 14:18:00
-------------------------------------------
(u'hello', 6)
(u'gb', 2)

-------------------------------------------
Time: 2016-01-06 14:18:10
-------------------------------------------
(u'gb', 4)

在Spark Streaming中启用容错处理

如果Spark Streaming应用程序的驱动程序主机失败,则可能会丢失已收到但尚未处理的数据。为确保没有数据丢失,可以使用Spark Streaming recovery 。在发生故障时,Spark将收到数据写入HDFS,并使用此数据恢复状态。

要启用Spark Streaming恢复:

  1. 在 SparkConf对象中,设置 spark.streaming.receiver.writeAheadLog.enable 参数true。
  2. 使用这个 SparkConf 创建一个StreamingContext 实例,并指定一个检查点目录。
  3. 在StreamingContext中 使用 getOrCreate 方法 , 要么创建新的上下文,要么从检查点目录的旧上下文中恢复:
from __future__ import print_function

import sys

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

checkpoint = "hdfs://ns1/user/systest/checkpoint"

# Function to create and setup a new StreamingContext
def functionToCreateContext():

  sparkConf = SparkConf()
  sparkConf.set("spark.streaming.receiver.writeAheadLog.enable", "true")
  sc = SparkContext(appName="PythonStreamingKafkaWordCount",conf=sparkConf)
  ssc = StreamingContext(sc, 10)

  zkQuorum, topic = sys.argv[1:]
  kvs = KafkaUtils.createStream(ssc, zkQuorum, "spark-streaming-consumer", {topic: 1})
  lines = kvs.map(lambda x: x[1])
  counts = lines.flatMap(lambda line: line.split(" ")).map(lambda word: (word, 1)).reduceByKey(lambda a, b: a+b)
  counts.pprint()

  ssc.checkpoint(checkpoint)   # set checkpoint directory
  return ssc

if __name__ == "__main__":
  if len(sys.argv) != 3:
    print("Usage: kafka_wordcount.py  ", file=sys.stderr)
    exit(-1)

  ssc = StreamingContext.getOrCreate(checkpoint, lambda: functionToCreateContext())
  ssc.start()
  ssc.awaitTermination()

有关更多信息,请参阅检查点。

为了防止接收器发生故障时的数据丢失,接收器必须能够根据需要重放来自原始数据源的数据。

  • spark.streaming.receiver.writeAheadLog.enable参数为true时,kafka接收器自动重播。
  • 无接收器的Direct Kafka DStream 不需要spark.streaming.receiver.writeAheadLog.enable 参数并且可以在没有数据丢失的情况下运行,即使没有流式恢复。
  • 包装在Spark中的Flume接收器在接收器故障时自动重放数据。

有关更多信息,请参阅Spark Streaming + Kafka集成指南和 Spark Streaming + Flume集成指南。

为长时间运行的Spark Streaming作业配置身份验证

如果您使用的是认证的Spark通信,则必须为长时间运行的Spark Streaming作业执行其他配置步骤。请参阅在YARN上为长时间运行的应用程序配置Spark。

云中Spark流的最佳实践

将Spark Streaming 与云服务一起用作基础存储层时,请使用集群上的临时HDFS来存储检查点,而不是Amazon S3或Microsoft ADLS等云存储。

你可能感兴趣的:(CDH Spark Streaming)