[博学谷学习记录] 超强总结,用心分享|Pyspark_结构化流3

本文介绍了如何在Pyspark中设置检查点以实现容错,并详细展示了如何从Kafka读取数据以及将数据写入Kafka的流程,包括创建SparkSession,对接Kafka,数据处理和输出。检查点在Spark-Kafka整合中对于保证消息处理准确性至关重要。
摘要由CSDN通过智能技术生成

Pyspark

注:大家觉得博客好的话,别忘了点赞收藏呀,本人每周都会更新关于人工智能和大数据相关的内容,内容多为原创,Python Java Scala SQL 代码,CV NLP 推荐系统等,Spark Flink Kafka Hbase Hive Flume等等~写的都是纯干货,各种顶会的论文解读,一起进步。
今天继续和大家分享一下Pyspark_结构化流3
#博学谷IT学习技术支持



前言

接上次继续Pyspark_结构化流,今天主要是结合kafka操作,也是实际工作中用的最多的方式。


一、CheckPoint检查点目录设置

设置检查点, 目的是为了提供容错性, 当程序出现失败了, 可以从检查点的位置, 直接恢复处理即可, 避免出现重复处理的问题
方式一: 基于DataStreamWrite设置
streamDF.writeStream.option(“checkpointLocation”, “path”)
方式二: SparkConf设置
sparkConf.set(“spark.sql.streaming.checkpointLocation”, “path”)
在后续和Kafka对接后, 检查点尤其重要意义: 整合后, Spark不屑使用Kafka的偏移量维护, 将整个生产和消费的偏移量信息维护工作, 交给了自己的checkpoint来处理, 从而确定消息处理准确性

二、Spark 和 Kafka 整合

1.从kafka中读取数据

import os
from pyspark.sql import SparkSession

# 锁定远端环境, 确保环境统一
os.environ['SPARK_HOME'] = '/export/server/spark'
os.environ['PYSPARK_PYTHON'] = '/root/anaconda3/bin/python3'
os.environ['PYSPARK_DRIVER_PYTHON'] = '/root/anaconda3/bin/python3'

if __name__ == '__main__':
    print("spark 消费kafka的数据")

    # 1- 创建SparkSession
    spark = SparkSession.builder.appName("spark streaming kafka").master("local[*]") \
        .config('spark.sql.shuffle.partitions', 4) \
        .getOrCreate()

    # 2- 对接Kafka, 从Kafka中获取消息数据
    # endingOffsets只支持批处理
    # .option("endingOffsets", """{"stream_topic":{"0":-1,"1":-1,"2":-1}}""")
    df = spark.readStream \
        .format('kafka') \
        .option('kafka.bootstrap.servers', 'node1:9092,node2:9092,node3:9092') \
        .option('subscribe', 'stream_topic') \
        .load()

    # 3- 处理数据
    df = df.selectExpr("CAST(key AS STRING)", "CAST(value AS STRING)", 'topic', 'partition', 'offset', 'timestamp',
                       'timestampType')

    # 4- 输出
    df.writeStream.format('console').outputMode('append').start().awaitTermination()

2.数据写入Kafka中

from pyspark import SparkContext, SparkConf
from pyspark.sql import SparkSession
import os

# 锁定远端环境, 确保环境统一
os.environ['SPARK_HOME'] = '/export/server/spark'
os.environ['PYSPARK_PYTHON'] = '/root/anaconda3/bin/python3'
os.environ['PYSPARK_DRIVER_PYTHON'] = '/root/anaconda3/bin/python3'

if __name__ == '__main__':
    print("演示: 将数据写入到Kafka中")

    # 1- 创建SparkSession镀锡
    spark = SparkSession.builder \
        .appName('file_source') \
        .master('local[1]') \
        .config('spark.sql.shuffle.partitions', 4) \
        .getOrCreate()

    # 2- 对接数据源: 从端口号中获取消息数据
    df = spark.readStream \
        .format('socket') \
        .option('host', 'node1') \
        .option('port', 44444) \
        .load()

    # 3- 处理数据
    df.createTempView('t1')

    df = spark.sql("""
            select
                split(value,'-')[0] as key,
                split(value,'-')[1] as value
            from t1
    """)

    # 4- 输出数据
    df.writeStream.format('console').outputMode('append').start()

    # 对接kafka , 将数据输出到kafka上
    df.writeStream\
        .format('kafka')\
        .option('kafka.bootstrap.servers','node1:9092,node2:9092,node3:9092')\
        .option('topic','stream_topic01')\
        .option('checkpointLocation','/structured/chk')\
        .start()\
        .awaitTermination()


总结

今天主要和大家分享了如何用Pyspark_结构化流结合kafka操作。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值