版权声明:本文为CSDN博主原创文章,未经博主允许不得转载。

说明

Spark Streaming的原理说明的文章很多,这里不做介绍。本文主要介绍使用Kafka作为数据源的编程模型,编码实践,以及一些优化说明。

spark streaming:http://spark.apache.org/docs/1.6.0/streaming-programming-guide.html

streaming-kafka-integration:http://spark.apache.org/docs/1.6.0/streaming-kafka-integration.html

演示环境

Spark:1.6

Kafka:kafka_2.11-0.9.0.1

实现语言:Python

编程模型

目前Spark Streaming 的kafka编程主要包括两种模型:

基于Receiver

Direct(无Receiver)

基于Receiver

这种方式利用接收器(Receiver)来接收kafka中的数据,其最基本是使用Kafka高阶用户API接口。对于所有的接收器,从kafka接收来的数据会存储在spark的executor中,之后spark streaming提交的job会处理这些数据

原理图

说明

需要借助Write Ahead Logs 来保证数据的不丢失,如果我们启用了Write Ahead Logs复制到文件系统如HDFS,那么storage level需要设置成 StorageLevel.MEMORY_AND_DISK_SER,也就是KafkaUtils.createStream(…, StorageLevel.MEMORY_AND_DISK_SER)

在Receiver的方式中,Spark中的partition和kafka中的partition并不是相关的,所以如果我们加大每个topic的partition数量,仅仅是增加线程来处理由单一Receiver消费的主题。但是这并没有增加Spark在处理数据上的并行度。

对于不同的Group和topic我们可以使用多个Receiver创建不同的Dstream来并行接收数据,之后可以利用union来统一成一个Dstream。

Direct(无Receiver)

在spark1.3之后,引入了Direct方式。不同于Receiver的方式,Direct方式没有receiver这一层,其会周期性的获取Kafka中每个topic的每个partition中的最新offsets,之后根据设定的maxRatePerPartition来处理每个batch

不同于Receiver的方式(是从Zookeeper中读取offset值,那么自然zookeeper就保存了当前消费的offset值,那么如果重新启动开始消费就会接着上一次offset值继续消费)。而在Direct的方式中,是直接从kafka来读数据,那么offset需要自己记录,可以利用checkpoint、数据库或文件记录或者回写到zookeeper中进行记录

原理图

说明

简化的并行:在Receiver的方式中我们提到创建多个Receiver之后利用union来合并成一个Dstream的方式提高数据传输并行度。而在Direct方式中,Kafka中的partition与RDD中的partition是一一对应的并行读取Kafka数据,这种映射关系也更利于理解和优化。

高效:在Receiver的方式中,为了达到0数据丢失需要将数据存入Write Ahead Log中,这样在Kafka和日志中就保存了两份数据,浪费!而第二种方式不存在这个问题,只要我们Kafka的数据保留时间足够长,我们都能够从Kafka进行数据恢复。

精确一次:在Receiver的方式中,使用的是Kafka的高阶API接口从Zookeeper中获取offset值,这也是传统的从Kafka中读取数据的方式,但由于Spark Streaming消费的数据和Zookeeper中记录的offset不同步,这种方式偶尔会造成数据重复消费。而第二种方式,直接使用了简单的低阶Kafka API,Offsets则利用Spark Streaming的checkpoints进行记录,消除了这种不一致性。

代码实践

Kafka生产者

package com.eric.kafka.producer;

import java.util.ArrayList;

import java.util.List;

import java.util.Random;

import java.util.Properties;

import kafka.javaapi.producer.Producer;

import kafka.producer.KeyedMessage;

import kafka.producer.ProducerConfig;

/**

* Hello world!

*/

public class ProcuderSample {

private final Producer

Tag标签:

pythonspark实践_基于Python的Spark Streaming Kafka编程实践相关推荐

  1. spark spark streaming + kafka receiver方式消费消息

    2019独角兽企业重金招聘Python工程师标准>>> kafka + spark streaming 集群 前提: spark 安装成功,spark 1.6.0 zookeeper ...

  2. 编程实现将rdd转换为dataframe:源文件内容如下(_第四篇|Spark Streaming编程指南(1)

    Spark Streaming是构建在Spark Core基础之上的流处理框架,是Spark非常重要的组成部分.Spark Streaming于2013年2月在Spark0.7.0版本中引入,发展至今 ...

  3. 基于案例贯通 Spark Streaming 流计算框架的运行源码

    本期内容 : Spark Streaming+Spark SQL案例展示 基于案例贯穿Spark Streaming的运行源码 一. 案例代码阐述 : 在线动态计算电商中不同类别中最热门的商品排名,例 ...

  4. 将MNIST手写数字数据集导入NumPy数组(《深度学习入门:基于Python的理论与实现》实践笔记)

    将MNIST手写数字数据集导入NumPy数组(<深度学习入门:基于Python的理论与实现>实践笔记) 一.下载MNIST数据集(使用urllib.request.urlretrieve( ...

  5. 基于Python的Kmeans聚类分析介绍及实践

    基于Python的Kmeans聚类分析介绍及实践 这是一篇学习的总结笔记 参考自<从零开始学数据分析与挖掘> [中]刘顺祥 著 完整代码及实践所用数据集等资料放置于:Github 聚类算法 ...

  6. 基于Python的线性回归预测模型介绍及实践

    基于Python的线性回归预测模型介绍及实践 这是一篇学习的总结笔记 参考自<从零开始学数据分析与挖掘> [中]刘顺祥 著 完整代码及实践所用数据集等资料放置于:Github 线性回归预测 ...

  7. 基于Seq2Seq的中文聊天机器人编程实践(Encoder编码器-Decoder解码器框架 + Attention注意力机制)

    日萌社 人工智能AI:Keras PyTorch MXNet TensorFlow PaddlePaddle 深度学习实战(不定时更新) Encoder编码器-Decoder解码器框架 + Atten ...

  8. Scala Spark Streaming + Kafka + Zookeeper完成数据的发布和消费

    一.Spark Streaming Spark Streaming是核心Spark API的扩展,可实现实时数据流的可扩展,高吞吐量,容错流处理.数据可以从许多来源(如Kafka,Flume,Kine ...

  9. spark streamming + kafka + Redis 实践

    java操作Redis:http://blog.csdn.net/xyang81/article/details/51918129 数据order.txt A 202.106.196.115 手机 i ...

最新文章

  1. 多线程端点服务发布程序(摘)
  2. tomact错误日志是那个_如何查看tomcat启动异常日志详情
  3. 会员制的cd出租销售java_模式|酒店改造养老会员制盈利模式及交易结构深度探讨...
  4. 【.NET Core 3.0】小技巧 || 原生DI一对多注入
  5. 给VBox中的linux添加虚拟硬盘(扩容)
  6. HBase之HRegionServer处理put请求
  7. Power BI Desktop交互式和弦图
  8. Chrome浏览器导出插件crx
  9. python 读取图片颜色值生成excel像素画
  10. 1至100之和用c语言表达方式,C语言菜鸟基础教程之求1到100的和
  11. Layui表格刷新(重载)
  12. Python+OpenCV+PyQt5+多线程实现桌面监控程序
  13. java格林威治时间转北京时间
  14. win10变win7bios如何设置?
  15. CAJ文献如何转成PDF?免费全篇转换的方法
  16. 东文财、赵栋《面向对象程序设计(java)》第十一周学习总结
  17. 20211219 小信号建模——状态空间法
  18. 动态壁纸制作工具哪个好用
  19. python输出字符串中的大写字母_如何在python中查找字符串中的大写字母
  20. 如何确定EINT中断唤醒源

热门文章

  1. TRUNCATE TABLE恢复-脚本
  2. 2021 ACDU China Tour-上海站暨数据库大咖讲坛(第4期)成功举办!(附视频回放PPT下载)...
  3. 了解 MongoDB 看这一篇就够了
  4. 技术核心 | MySQL性能结构优化原理
  5. 【推荐】 RAC 性能优化全攻略与经典案例剖析
  6. 带你读AI论文:SDMG-R结构化提取—无限版式小票场景应用
  7. Python 绑定:从 Python 调用 C 或 C++
  8. 重磅解读:K8s Cluster Autoscaler模块及对应华为云插件Deep Dive
  9. 实战案例丨ModelArts在数据标注、数据过滤上的应用技巧:自动分组
  10. 【华为云技术分享】DAS文件上传组件的进化