基于Python的Spark Streaming+Kafka编程实践

本文详细介绍了如何使用Python实现Spark Streaming与Kafka的整合,包括基于Receiver和Direct两种模型,强调了Direct方式的并行性和高效性,并提供了代码实践和调优建议,如设置合理的batchDuration、maxRatePerPartition、缓存策略和JVM GC选项等。
摘要由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

演示环境

  1. Spark:1.6
  2. Kafka:kafka_2.11-0.9.0.1
  3. 实现语言:Python

编程模型

目前Spark Streaming 的kafka编程主要包括两种模型
1. 基于Receiver
2. Direct(无Receiver)

基于Receiver

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

原理图

这里写图片描述

说明

  1. 需要借助Write Ahead Logs 来保证数据的不丢失,如果我们启用了Write Ahead Logs复制到文件系统如HDFS,那么storage level需要设置成 StorageLevel.MEMORY_AND_DISK_SER,也就是KafkaUtils.createStream(…, StorageLevel.MEMORY_AND_DISK_SER)
  2. 在Receiver的方式中,Spark中的partition和kafka中的partition并不是相关的,所以如果我们加大每个topic的partition数量,仅仅是增加线程来处理由单一Receiver消费的主题。但是这并没有增加Spark在处理数据上的并行度。
  3. 对于不同的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中进行记录

原理图

这里写图片描述

说明

  1. 简化的并行:在Receiver的方式中我们提到创建多个Receiver之后利用union来合并成一个Dstream的方式提高数据传输并行度。而在Direct方式中,Kafka中的partition与RDD中的partition是一一对应的并行读取Kafka数据,这种映射关系也更利于理解和优化。
  2. 高效:在Receiver的方式中,为了达到0数据丢失需要将数据存入Write Ahead Log中,这样在Kafka和日志中就保存了两份数据,浪费!而第二种方式不存在这个问题,只要我们Kafka的数据保留时间足够长,我们都能够从Kafka进行数据恢复。
  3. 精确一次:在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.ProducerCon
Python爬虫是一种用于抓取网页数据的程序,它可以通过发送HTTP请求并解析HTML内容来提取所需的数据。通过使用Python库如BeautifulSoup和Scrapy,我们可以编写爬虫来自动化数据收集和提取。 Flume是一个分布式的、可靠的、可扩展的日志收集、聚合和传输系统。它可以从多个源采集实时数据,并将其传输到其他处理系统中,如Hadoop和SparkKafka是一个高吞吐量的分布式数据流平台,它允许以实时方式收集、处理和存储数据流。它被广泛用于大数据和流处理应用中,包括实时推荐、日志处理和事件驱动的架构。 Spark Streaming是Apache Spark的一个子项目,它允许在实时流数据中进行高效的流处理。Spark Streaming可以与Kafka等数据源集成,以实时的方式处理来自不同源的数据,并进行转换、分析和存储。 MySQL是一种关系型数据库管理系统,它被广泛用于存储和管理结构化数据。在上述技术栈中,MySQL可以被用作存储爬虫抓取的数据、Kafka传输的数据和Spark Streaming处理的数据。 ECharts是一种用于数据可视化的JavaScript图表库,它可以将数据转化为图表和图形,使数据更易于理解和分析。 综上所述,以上提到的技术可以结合使用来构建一个完整的实时数据处理和可视化系统。Python爬虫用于抓取实时数据,Flume用于收集和传输数据,Kafka用于数据流处理,Spark Streaming用于实时分析,MySQL用于数据存储,最后使用ECharts将数据可视化。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值