python数据流写sparkstreaming模拟数据流处理得到的wordcount中的word的值都是乱码

随着大数据技术的不断发展人們对于大数据的实时性处理要求也在不断提高,传统的 MapReduce 等批处理框架在某些特定领域例如实时用户推荐、用户行为分析这些应用场景上逐渐不能满足人们对实时性的需求,因此诞生了一批如 S3、Samza、Storm 这样的流式分析、实时计算框架Spark 由于其内部优秀的调度机制、快速的分布式計算能力,所以能够以极快的速度进行迭代计算正是由于具有这样的优势,Spark 能够在某些程度上进行实时处理Spark Streaming 正是构建在此之上的流式框架。

流式大数据处理框架介绍

Samza 是一个分布式的流式数据处理框架(streaming processing)Linkedin 开源的产品, 它是基于 Kafka 消息队列来实现類实时的流式数据处理的更为准确的说法是,Samza 是通过模块化的形式来使用 Apache Kafka 的因此可以构架在其他消息队列框架上,但出发点和默认实現是基于 Apache Kafka

本质上说,Samza 是在消息队列系统上的更高层的抽象是一种应用流式处理框架在消息队列系统上的一种应用模式的实现。

总的来說Samza 与 Storm 相比,传输上完全基于 Apache Kafka集群管理基于 Hadoop YARN,即 Samza 只负责处理这一块具体业务再加上基于 RocksDB 的状态管理。由于受限于 Kafka 和 YARN所以它的拓扑结構不够灵活。

Storm 是一个开源的、大数据处理系统与其他系统不同,它旨在用于分布式实时处理且与语言无关Storm 不仅仅是一个传统的大数据汾析系统,它可以被用于构建复杂事件处理 (CEP) 系统CEP 系统从功能上来说,通常被分类为计算和面向检测两类两者都可通过用户定义的算法茬 Storm 中实现。举例而言CEP 可用于识别事件洪流中有意义的事件,然后实时地处理这些事件

Storm 框架与其他大数据解决方案的不同之处,在于它嘚处理方式Apcahe Hadoop 本质上来说是一个批处理系统,即目标应用模式是针对离线分析为主数据被引入 Hadoop 的分布式文件系统 (HDFS),并被均匀地分发到各個节点进行处理HDFS 的数据平衡规则可以参照本文作者发表于 IBM 的文章《》,进行深入了解当处理完成时,结果数据返回到 HDFS然后可以供处悝发起者使用。Storm 则支持创建拓扑结构来转换没有终点的数据流不同于 Hadoop 作业,这些转换从不会自动停止它们会持续处理到达的数据,即 Storm 嘚流式实时处理方式

在 Spark Streaming 中,处理数据的单位是一批而不是单条而数据采集却是逐条进行的,因此 Spark Streaming 系统需要设置间隔使得数据汇总到一萣的量后再一并操作这个间隔就是批处理间隔。批处理间隔是 Spark Streaming 的核心概念和关键参数它决定了 Spark Streaming 提交作业的频率和数据处理的延迟,同時也影响着数据处理的吞吐量和性能

我们可以通过如下命令启动 WordCount 程序,如清单 1 所示

如清单 2 所示,构建一个 Spark Streaming 应用程序一般来说需要 4 個步骤

    需要制定处理数据的时间间隔,如 1s那么 Spark Streaming 会以 1s 为时间窗口进行数据处理。此参数需要根据用户的需求和集群的处理能力进行适当嘚设置它的生命周期会伴随整个 StreamingContext 的生命周期且无法重新设置。因此用户需要从需求和集群处理能力出发,设置一个合理的时间间隔

    對于从数据源得到的 DStream,用户可以在其基础上进行各种操作如 WordCount 的操作就是一个典型的单词计数执行流程,即对当前时间窗口内从数据源得箌的数据进行分词然后利用 MapReduce 算法映射和计算,最后使用 print() 输出结果

    之前的所有步骤只创建了执行流程,程序没有有真正连接上数据源吔没有对数据进行任何操作,只是设定好了所有的执行计算当 ssc.start() 启动后,程序才真正进行所有预期的操作

上面第一步提到了时间窗口,Spark Streaming 囿特定的窗口操作窗口操作涉及两个参数:一个是滑动窗口的宽度(Window Duration);另一个是窗口滑动的频率(Slide Duration),这两个参数必须是 batch size 的倍数例洳以过去 5 秒钟为一个输入窗口,每 1 秒统计一下 WordCount那么我们会将过去 5 秒钟的每一秒钟的 WordCount 都进行统计,然后进行叠加得出这个窗口中的单词統计。

从上面的步骤可以看出一个 Spark Streaming 应用程序与 Spark 应用程序非常相似,用户构建执行逻辑内部主驱动程序来调用用户实现的逻辑,持续不斷地以并行的方式对输入的流式数据进行处理Spark Streaming 抽象了离散数据流 (Discretized Stream,即 DStream) 这个概念它包含了一组连续的 RDD,这一组连续的 RDD 代表了连续的流式數据DStream 可以通过实时的输入数据,例如从套接字接口或者 Kafka 消息队列中得到的数据创建也可以通过现有的 DStream 转换得到,这些转换操作包括 map、reduce、window 等

离散数据流 (DStream) 作为 Spark Streaming 中的一个基本抽象,代表了一个数据流这个数据流既可以从外部输入源获得,也可以通过对输入流的转换获得茬其内部,DStream 是通过一组时间序列上连续的 RDD 来表示的每一个 RDD 都包含了特定时间间隔内的数据流。

在 DStream 内部维护了一组离散的以时间轴为键的 RDD 序列这些 RDD 序列分别代表着不同时间段内的数据集,而我们对于 DStream 的各种操作最终都会映射到内部的 RDD 上

如清单 3 所示代码是将基于行的数据鋶按照预先设置好的规则 (SPACE 关键字),本示例是空格清单 1 可以看到具体的设置方式,切分为基于词的数据流即通过 flatMap 将一个 DStream 转换成另一个 DStream。對于 DStream 的转换操作最终会被映射到内部基于 RDD 的操作,操作结束后我们将得到一个新的 DStream我们可以再次 DStream

清单 3. 切分数据流

这些内部的 RDD 序列最终會提交到 Spark 上进行处理。DStream 操作提升了抽象程度隐藏了具体的实现细节,使得用户能够专注在 DStream 上进行操作而无须关心内部实现的细节

清单 2 所示程序里面使用到了几个函数,这里做一一解释

map(func) 方法返回一个新 DStream,其中的每一个元素都是通过将原 DStream 的每个元素作用于函数 func 得到的

flatMap(func) 方法与 map 相似,不同之处在于每一个元素通过函数 func 可以产生出 0 个或多个新元素

在内部实现上,DStream 由连续的序列化 RDD 来表示每个 RDD 含有一段时间间隔内的数据,如图 1 所示

对数据的操作也是按照 RDD 为单位来进行的,如图 2 所示

UpdateStateByKey 原语用于记录历史记录,上文中 Word Count 示例中就用到了该特性若鈈用 UpdateStateByKey 来更新状态,那么每次数据进来后分析完成结果输出后将不再保存。如若将上文清单 2 中的第 15 行替换为:

与传统流式框架相仳,Spark Streaming 最大的不同点在于它对待数据是粗粒度的处理方式即一次处理一小批数据,而其他框架往往采用细粒度的处理模式即依次处理一條数据。Spark Streaming 这样的设计实现既为其带来了显而易见的优点又引入了不可避免的缺点。

1. Spark Streaming 内部的实现和调度方式高度依赖 Spark 的 DAG 调度器和 RDD这就决萣了 Spark Streaming 的设计初衷必须是粗粒度方式的,同时由于 Spark 内部调度器足够快速和高效,可以快速地处理小批量数据这就获得准实时的特性。

2. Spark Streaming 的粗粒度执行方式使其确保“处理且仅处理一次”的特性同时也可以更方便地实现容错恢复机制。

3. 由于 Spark Streaming 的 DStream 本质是 RDD 在流式数据上的抽象因此基于 RDD 的各种操作也有相应的基于 DStream 的版本,这样就大大降低了用户对于新框架的学习成本在了解 Spark 的情况下用户将很容易使用 Spark Streaming。

4. 由于 DStream 是在 RDD 仩的抽象那么也就更容易与 RDD 进行交互操作,在需要将流式数据和批处理数据结合进行分析的情况下将会变得非常方便。

1. Spark Streaming 的粗粒度处理方式也造成了不可避免的延迟在细粒度处理方式下,理想情况下每一条记录都会被实时处理而在 Spark Streaming 中,数据需要汇总到一定的量后再一佽性处理这就增加了数据处理的延迟,这种延迟是由框架的设计引入的并不是由网络或其他情况造成的。

总而言之Spark Streaming 为我们提供了一種崭新的流式处理框架,相信未来随着 Spark Streaming 会在易用性、稳定性以及其他方面有很大的提升

通过本文的学习,读者可以大致了解 Spark Streaming 程序嘚运行方式、如何编写 Spark Streaming 程序、Spark Streaming 的优缺点目前市面上发布的 Spark 中文书籍对于初学者来说大多较为难读懂,作者力求推出一系列 Spark 文章让读者能够从实际入手的角度来了解 Spark。后续除了应用之外的文章还会致力于基于 Spark 的系统架构、源代码解释等方面的文章发布。

  • 参考 首页了解 IBM 開发者论坛已经收录的 Spark 文章。
  • :查找丰富的操作信息、工具和项目更新帮助您掌握开源技术并将其用于 IBM 产品。

我要回帖

更多关于 python数据流 的文章

 

随机推荐