注:大家觉得博客好的话,别忘了点赞收藏呀,本人每周都会更新关于人工智能和大数据相关的内容,内容多为原创,Python Java Scala SQL 代码,CV NLP 推荐系统等,Spark Flink Kafka Hbase Hive Flume等等~写的都是纯干货,各种顶会的论文解读,一起进步。
今天继续和大家分享一下Pyspark_结构化流3
#博学谷IT学习技术支持
接上次继续Pyspark_结构化流,今天主要是结合kafka操作,也是实际工作中用的最多的方式。
设置检查点, 目的是为了提供容错性, 当程序出现失败了, 可以从检查点的位置, 直接恢复处理即可, 避免出现重复处理的问题
方式一: 基于DataStreamWrite设置
streamDF.writeStream.option(“checkpointLocation”, “path”)
方式二: SparkConf设置
sparkConf.set(“spark.sql.streaming.checkpointLocation”, “path”)
在后续和Kafka对接后, 检查点尤其重要意义: 整合后, Spark不屑使用Kafka的偏移量维护, 将整个生产和消费的偏移量信息维护工作, 交给了自己的checkpoint来处理, 从而确定消息处理准确性
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()
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操作。