pythonspark实践_基于Python的Spark Streaming Kafka编程实践
版权声明:本文为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编程实践相关推荐
- spark spark streaming + kafka receiver方式消费消息
2019独角兽企业重金招聘Python工程师标准>>> kafka + spark streaming 集群 前提: spark 安装成功,spark 1.6.0 zookeeper ...
- 编程实现将rdd转换为dataframe:源文件内容如下(_第四篇|Spark Streaming编程指南(1)
Spark Streaming是构建在Spark Core基础之上的流处理框架,是Spark非常重要的组成部分.Spark Streaming于2013年2月在Spark0.7.0版本中引入,发展至今 ...
- 基于案例贯通 Spark Streaming 流计算框架的运行源码
本期内容 : Spark Streaming+Spark SQL案例展示 基于案例贯穿Spark Streaming的运行源码 一. 案例代码阐述 : 在线动态计算电商中不同类别中最热门的商品排名,例 ...
- 将MNIST手写数字数据集导入NumPy数组(《深度学习入门:基于Python的理论与实现》实践笔记)
将MNIST手写数字数据集导入NumPy数组(<深度学习入门:基于Python的理论与实现>实践笔记) 一.下载MNIST数据集(使用urllib.request.urlretrieve( ...
- 基于Python的Kmeans聚类分析介绍及实践
基于Python的Kmeans聚类分析介绍及实践 这是一篇学习的总结笔记 参考自<从零开始学数据分析与挖掘> [中]刘顺祥 著 完整代码及实践所用数据集等资料放置于:Github 聚类算法 ...
- 基于Python的线性回归预测模型介绍及实践
基于Python的线性回归预测模型介绍及实践 这是一篇学习的总结笔记 参考自<从零开始学数据分析与挖掘> [中]刘顺祥 著 完整代码及实践所用数据集等资料放置于:Github 线性回归预测 ...
- 基于Seq2Seq的中文聊天机器人编程实践(Encoder编码器-Decoder解码器框架 + Attention注意力机制)
日萌社 人工智能AI:Keras PyTorch MXNet TensorFlow PaddlePaddle 深度学习实战(不定时更新) Encoder编码器-Decoder解码器框架 + Atten ...
- Scala Spark Streaming + Kafka + Zookeeper完成数据的发布和消费
一.Spark Streaming Spark Streaming是核心Spark API的扩展,可实现实时数据流的可扩展,高吞吐量,容错流处理.数据可以从许多来源(如Kafka,Flume,Kine ...
- spark streamming + kafka + Redis 实践
java操作Redis:http://blog.csdn.net/xyang81/article/details/51918129 数据order.txt A 202.106.196.115 手机 i ...
最新文章
- 多线程端点服务发布程序(摘)
- tomact错误日志是那个_如何查看tomcat启动异常日志详情
- 会员制的cd出租销售java_模式|酒店改造养老会员制盈利模式及交易结构深度探讨...
- 【.NET Core 3.0】小技巧 || 原生DI一对多注入
- 给VBox中的linux添加虚拟硬盘(扩容)
- HBase之HRegionServer处理put请求
- Power BI Desktop交互式和弦图
- Chrome浏览器导出插件crx
- python 读取图片颜色值生成excel像素画
- 1至100之和用c语言表达方式,C语言菜鸟基础教程之求1到100的和
- Layui表格刷新(重载)
- Python+OpenCV+PyQt5+多线程实现桌面监控程序
- java格林威治时间转北京时间
- win10变win7bios如何设置?
- CAJ文献如何转成PDF?免费全篇转换的方法
- 东文财、赵栋《面向对象程序设计(java)》第十一周学习总结
- 20211219 小信号建模——状态空间法
- 动态壁纸制作工具哪个好用
- python输出字符串中的大写字母_如何在python中查找字符串中的大写字母
- 如何确定EINT中断唤醒源
热门文章
- TRUNCATE TABLE恢复-脚本
- 2021 ACDU China Tour-上海站暨数据库大咖讲坛(第4期)成功举办!(附视频回放PPT下载)...
- 了解 MongoDB 看这一篇就够了
- 技术核心 | MySQL性能结构优化原理
- 【推荐】 RAC 性能优化全攻略与经典案例剖析
- 带你读AI论文:SDMG-R结构化提取—无限版式小票场景应用
- Python 绑定:从 Python 调用 C 或 C++
- 重磅解读:K8s Cluster Autoscaler模块及对应华为云插件Deep Dive
- 实战案例丨ModelArts在数据标注、数据过滤上的应用技巧:自动分组
- 【华为云技术分享】DAS文件上传组件的进化