网上用python写spark+kafka的资料好少啊 自己记录一点踩到的坑~

spark+kafka介绍的官方网址:http://spark.apache.org/docs/latest/streaming-kafka-0-8-integration.html

python的pyspark库函数文档:http://spark.apache.org/docs/latest/api/python/pyspark.streaming.html?highlight=kafkautils.createdirectstream#pyspark.streaming.kafka.KafkaUtils.createDirectStream

上面两个是最重要的资料,大多数问题可以通过仔细研读上面两个文档得到答案

官网上说了,spark和kafka连用有两种方式:接收器形式  以及 直连形式

一、 接收器形式

优点:支持kafka的group.id设置,支持用kafka api查询offset,如果数据断掉后,可以通过group.id轻松找到上一次失败的位置

缺点:

1.失败处理复杂。由于kafka队列信息由kafka自己记录,当spark消费了数据但是处理中出错时会导致数据丢失。为了避免数据丢失就必须开启Write Ahead Logs,把spark接收到的数据都存储到分布式文件系统中,比如HDFS,然后失败时从存储的记录中找到失败的消息。这导致同一批数据被kafka和spark存储了2次。造成数据冗余。

2.如果有多个地方都想获取同一个kafka队列的数据,必须建立多个流,无法用一个流并行处理。

该方法是比较老的一种方式,并不太被推荐。

二、直连形式

优点:

1. 不需两次存储数据,直连形式时,spark自己管理偏移信息,不再使用kafka的offset信息。所以spark可以自行处理失败情况,不要再次存储数据。spark保证数据传输时Exactly-once。

2.只需建立一个流就可以并行的在多个地方使用流中的数据

缺点:

不支持kafka的group,不支持通过kafka api查询offset信息!!!!

在连接后spark会根据fromOffsets参数设置起始offset,默认是从最新的数据开始的。也就是说,必须自己记录spark消耗的offset位置。否则在两次脚本启动中间的数据都会丢失。

我选用的是直连形式,我处理offset的方法是将spark消费的offset信息实时记录到文件中。在启动脚本时通过记录的文件来找到起始位置。

#!/usr/bin/python
# coding=utf-8
from pyspark import SparkContext
from pyspark.streaming import StreamingContext
from pyspark.streaming.kafka import KafkaUtils, TopicAndPartition
import time
import os
import json
broker_list = "xxxx"
topic_name = "xxxx"
timer = 5
offsetRanges = [] def store_offset_ranges(rdd):
global offsetRanges
offsetRanges = rdd.offsetRanges()
return rdd def save_offset_ranges(rdd):
root_path = os.path.dirname(os.path.realpath(__file__))
record_path = os.path.join(root_path, "offset.txt")
data = dict()
f = open(record_path, "w")
for o in offsetRanges:
data = {"topic": o.topic, "partition": o.partition, "fromOffset": o.fromOffset, "untilOffset": o.untilOffset}
f.write(json.dumps(data))
f.close() def deal_data(rdd):
data = rdd.collect()
for d in data:
# do something
pass def save_by_spark_streaming():
root_path = os.path.dirname(os.path.realpath(__file__))
record_path = os.path.join(root_path, "offset.txt")
from_offsets = {}
# 获取已有的offset,没有记录文件时则用默认值即最大值
if os.path.exists(record_path):
f = open(record_path, "r")
offset_data = json.loads(f.read())
f.close()
if offset_data["topic"] != topic_name:
raise Exception("the topic name in offset.txt is incorrect") topic_partion = TopicAndPartition(offset_data["topic"], offset_data["partition"])
from_offsets = {topic_partion: long(offset_data["untilOffset"])} # 注意设置起始offset时的方法
print "start from offsets: %s" % from_offsets sc = SparkContext(appName="Realtime-Analytics-Engine")
ssc = StreamingContext(sc, int(timer)) kvs = KafkaUtils.createDirectStream(ssc=ssc, topics=[topic_name], fromOffsets=from_offsets,
kafkaParams={"metadata.broker.list": broker_list})
kvs.foreachRDD(lambda rec: deal_data(rec))
kvs.transform(store_offset_ranges).foreachRDD(save_offset_ranges) ssc.start()
ssc.awaitTermination()
ssc.stop() if __name__ == '__main__':
save_by_spark_streaming()

运行:

正常情况下,只要输入下面的语句就可以运行了

spark-submit --packages org.apache.spark:spark-streaming-kafka--8_2.:2.2. spark_kafka.py

然而,我的总是报错,找不到依赖包,说各种库不认识。所以我只好用--jars来手动指定包的位置了..................

spark-submit --packages org.apache.spark:spark-streaming-kafka--8_2.:2.2. --jars /root/.ivy2/jars/org.apache.kafka_kafka_2.-0.8.2.1.jar,/root/.ivy2/jars/com.yammer.metrics_metrics-core-2.2..jar spark_kafka.py

吐槽:

我就踩在直连形式不支持offset的坑上了..... 开始官方文档没仔细看,就瞄了一眼说是直连形式好,就豪不犹豫的用了。结果我的脚本不稳定,各种断,然后中间数据就各种丢啊.......

还有官网上居然完全没有对fromOffsets这个参数的说明,我找了好久好久才弄清楚这个参数怎么拼出来啊.................

【python】spark+kafka使用的更多相关文章

  1. 大数据Spark+Kafka实时数据分析案例

    本案例利用Spark+Kafka实时分析男女生每秒购物人数,利用Spark Streaming实时处理用户购物日志,然后利用websocket将数据实时推送给浏览器,最后浏览器将接收到的数据实时展现, ...

  2. [Spark][kafka]kafka 生产者,消费者 互动例子

    [Spark][kafka]kafka 生产者,消费者 互动例子 # pwd/usr/local/kafka_2.11-0.10.0.1/bin 创建topic:# ./kafka-topics.sh ...

  3. [Spark][Python]spark 从 avro 文件获取 Dataframe 的例子

    [Spark][Python]spark 从 avro 文件获取 Dataframe 的例子 从如下地址获取文件: https://github.com/databricks/spark-avro/r ...

  4. [Spark][Python]Spark 访问 mysql , 生成 dataframe 的例子:

    [Spark][Python]Spark 访问 mysql , 生成 dataframe 的例子: mydf001=sqlContext.read.format("jdbc").o ...

  5. Spark+Kafka的Direct方式将偏移量发送到Zookeeper实现(转)

    原文链接:Spark+Kafka的Direct方式将偏移量发送到Zookeeper实现 Apache Spark 1.3.0引入了Direct API,利用Kafka的低层次API从Kafka集群中读 ...

  6. Mac下Python与Kafka的配合使用

    安装并配置Kafka 安装 # brew install kafka 配置 """ zookeeper配置文件/usr/local/etc/kafka/zookeeper ...

  7. kfka学习笔记一:使用Python操作Kafka

    1.准备工作 使用python操作kafka目前比较常用的库是kafka-python库,但是在安装这个库的时候需要依赖setuptools库和six库,下面就要分别来下载这几个库 https://p ...

  8. python访问kafka

    操作系统 : CentOS7.3.1611_x64 Python 版本 : 3.6.8 kafka 版本 : 2.3.1 本文记录python访问kafka的简单使用,是入门教程,高阶读者请直接忽略. ...

  9. python调用kafka服务(使用kafka-python库)

    试验环境: CDH 5.15.1 CentOS 7 Python 3.7.0 kafka 1.1.1 kafka-python :https://pypi.org/project/kafka-pyth ...

随机推荐

  1. 【blog】好用的markdown插件 - Mditor

    效果 官网地址 GitHub: https://github.com/houfeng/mditor 主页: http://houfeng.net/mditor/

  2. Codeforces Round #545 (Div. 2)(D. Camp Schedule)

    题目链接:http://codeforces.com/contest/1138/problem/D 题目大意:给你两个字符串s1和s2(只包含0和1),对于s1中,你可以调换任意两个字符的位置.问你最 ...

  3. CentOS7 设置主机名及IP映射

    1.设置主机名 查看本机的主机名,使用如下三个命令中任意一个即可 # hostname # uname -n # cat /proc/sys/kernel/hostname 使用 vi 编辑器打开 / ...

  4. Navicat for Mysql连接mysql数据库时出现 2003-Can't connect to MySql server on 'localhost'(10061)

    一.环境:linux服务器下 二.问题:在windows7下使用Navicat for Mysql连接mysql数据库时出现 2003-Can't connect to MySql server on ...

  5. OVS-----CentOS7上搭建基于Open vSwitch的VxLAN隧道实验

    一.关于VXLAN VXLAN 是 Virtual eXtensible LANs 的缩写,它是对 VLAN 的一个扩展,是非常新的一个 tunnel 技术,在Open vSwitch中应用也非常多. ...

  6. 将replicated数据与元数据关联

    本章介绍元数据的用法以及如何将replicated数据与元数据相关联. 12.1概述 将数据从一个表复制到另一个表时,重要的考虑因素是源表和目标表的列结构(元数据)是否相同. Oracle Golde ...

  7. mysql5.7 版本中 timestamp 不能为零日期 以及sql_mode合理设置

    ---恢复内容开始--- 摘要: mysql5.7版本相比较之前的版本有很多的特性的增加以及默认配置的改变,在使用中难免会遇到与之前的使用习惯或者项目需求不符的情况.就需要调整相应的变量的值,比如sq ...

  8. js加密转python3

    //add by wangp at 2018-01-23 密码加密方法 start function encrypt(pwd){ var key = "MIIBIjANBgkqhkiG9w0 ...

  9. C++ 类中特殊的成员变量(常变量、引用、静态)的初始化方法

    有些成员变量的数据类型比较特别,它们的初始化方式也和普通数据类型的成员变量有所不同.这些特殊的类型的成员变量包括: a.引用 b.常量 c.静态 d.静态常量(整型) e.静态常量(非整型) 常量和引 ...

  10. 题解-PKUWC2018 随机游走

    Problem loj2542 题意:一棵 \(n\) 个结点的树,从点 \(x\) 出发,每次等概率随机选择一条与所在点相邻的边走过去,询问走完一个集合 \(S\)的期望时间,多组询问 \(n\le ...