Pyspark_结构化流3

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操作。

猜你喜欢

转载自blog.csdn.net/weixin_53280379/article/details/129855931