StructuredStreaming处理时参数checkpointLocation配置

本文介绍了一个在Spark使用Kafka读取数据并写入MySQL时遇到的常见错误,并详细解释了解决该问题的方法,即通过设置checkpointLocation参数来避免文件找不到的异常。
部署运行你感兴趣的模型镜像

问题记录:

在spark进行实时计算时,通过Kafka读取数据写到mysql中,由于本地测试环境提交任务可以正常执行,但是在生产环境总是报如下错误,提示文件找不到,但是查看又不是具体的配置文件或jar包类文件,一时摸不清头脑了,后来通过错误日志的 trace找到原因。原来生产环境是强制要求在写流时,添加参数checkpointLocation,最终问题得以解决

错误信息:

Showing 4096 bytes. Click here for full log

amenode.dfs.test.net" port: 9000 file: "/home/spark/cache/sys/.sparkStaging/test_1639467581591_25244/__spark_conf__.zip" } size: 338563 timestamp: 1639532451695 type: ARCHIVE visibility: PRIVATE

===============================================================================
21/12/15 09:41:18 INFO ApplicationMaster: Started progress reporter thread with (heartbeat : 1000, initial allocation : 200) intervals
21/12/15 09:41:25 WARN Utils: Truncated the string representation of a plan since it was too large. This behavior can be adjusted by setting 'spark.debug.maxToStringFields' in SparkEnv.conf.
21/12/15 09:41:41 WARN StreamingQueryManager: spark.sql.adaptive.enabled is not supported in streaming DataFrames/Datasets and will be disabled.
21/12/15 09:41:41 ERROR ApplicationMaster: User class threw exception: java.io.FileNotFoundException: /data12/yarn/nm-local-dir/usercache/hdp-bdview-sys/appcache/application_1639467581591_25244/container_e209_1639467581591_25244_01_000001/tmp/temporary-80a66b1b-629a-4f98-bc1e-99af39e009fd
java.io.FileNotFoundException: /data12/yarn/nm-local-dir/usercache/hdp-bdview-sys/appcache/application_1639467581591_25244/container_e209_1639467581591_25244_01_000001/tmp/temporary-80a66b1b-629a-4f98-bc1e-99af39e009fd
	at org.apache.hadoop.fs.viewfs.InodeTree.resolve(InodeTree.java:452)
	at org.apache.hadoop.fs.viewfs.ViewFileSystem.mkdirs(ViewFileSystem.java:446)
	at org.apache.hadoop.fs.FileSystem.mkdirs(FileSystem.java:1913)
	at org.apache.spark.sql.execution.streaming.StreamExecution.<init>(StreamExecution.scala:90)
	at org.apache.spark.sql.execution.streaming.MicroBatchExecution.<init>(MicroBatchExecution.scala:48)
	at org.apache.spark.sql.streaming.StreamingQueryManager.createQuery(StreamingQueryManager.scala:281)
	at org.apache.spark.sql.streaming.StreamingQueryManager.startQuery(StreamingQueryManager.scala:322)
	at org.apache.spark.sql.streaming.DataStreamWriter.start(DataStreamWriter.scala:297)
	at com.test.demo1.KafkaToMySQL$.main(KafkaToMySQL.scala:91)
	at com.test.demo1.KafkaToMySQL.main(KafkaToMySQL.scala)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.lang.reflect.Method.invoke(Method.java:497)
	at org.apache.spark.deploy.yarn.ApplicationMaster$$anon$2.run(ApplicationMaster.scala:685)
21/12/15 09:41:41 INFO ApplicationMaster: Final app status: FAILED, exitCode: 15, (reason: User class threw exception: java.io.FileNotFoundException: /data12/yarn/nm-local-dir/usercache/hdp-bdview-sys/appcache/application_1639467581591_25244/container_e209_1639467581591_25244_01_000001/tmp/temporary-80a66b1b-629a-4f98-bc1e-99af39e009fd
	at org.apache.hadoop.fs.viewfs.InodeTree.resolve(InodeTree.java:452)
	at org.apache.hadoop.fs.viewfs.ViewFileSystem.mkdirs(ViewFileSystem.java:446)
	at org.apache.hadoop.fs.FileSystem.mkdirs(FileSystem.java:1913)
	at org.apache.spark.sql.execution.streaming.StreamExecution.<init>(StreamExecution.scala:90)
	at org.apache.spark.sql.execution.streaming.MicroBatchExecution.<init>(MicroBatchExecution.scala:48)
	at org.apache.spark.sql.streaming.StreamingQueryManager.createQuery(StreamingQueryManager.scala:281)
	at org.apache.spark.sql.streaming.StreamingQueryManager.startQuery(StreamingQueryManager.scala:322)
	at org.apache.spark.sql.streaming.DataStreamWriter.start(DataStreamWriter.scala:297)
	at com.test.demo1.KafkaToMySQL$.main(KafkaToMySQL.scala:91)
	at com.test.demo1.KafkaToMySQL.main(KafkaToMySQL.scala)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.lang.reflect.Method.invoke(Method.java:497)
	at org.apache.spark.deploy.yarn.ApplicationMaster$$anon$2.run(ApplicationMaster.scala:685)
)

纠正后代码:

//需要添加的参数:
//option("checkpointLocation", "./chk1")

   df.as(Encoders.product[Test])
      .writeStream
      .option("checkpointLocation", "./chk1")
      .outputMode(OutputMode.Append)
      .trigger(trigger)
      .foreachBatch(MySQLWriter.foreachBatchFunction(xxxxxxx))
      .start()

您可能感兴趣的与本文相关的镜像

ACE-Step

ACE-Step

音乐合成
ACE-Step

ACE-Step是由中国团队阶跃星辰(StepFun)与ACE Studio联手打造的开源音乐生成模型。 它拥有3.5B参数量,支持快速高质量生成、强可控性和易于拓展的特点。 最厉害的是,它可以生成多种语言的歌曲,包括但不限于中文、英文、日文等19种语言

<think>嗯,用户想用PySpark Streaming来读取Kafka数据,我需要详细介绍一下步骤。首先,我应该回忆一下PySpark Streaming和Kafka集成的相关知识。记得在Spark Structured Streaming中,Kafka是一个常用的数据源。可能需要先确认用户是否了解Structured Streaming,或者他们是否在使用旧的Spark Streaming(DStreams)。 首先,可能需要说明两者的区别。Structured Streaming是更现代、更推荐的API,而DStreams是旧的。现在大多数情况下应该用Structured Streaming,所以应该以这个为例来介绍。 接下来,步骤应该是如何配置和读取Kafka数据。比如需要添加依赖项,比如Spark Kafka连接器的包。这里需要注意Spark版本和Kafka版本的对应关系,不同的版本可能需要不同的包名。例如,对于Spark 3.x和Kafka 0.10以后,可能用的是spark-sql-kafka-0-10这个包。 然后,用户需要创建一个SparkSession,然后使用readStream方法,指定format为"kafka",然后配置参数如kafka.bootstrap.servers,subscribe等。可能需要解释这些参数的含义,比如bootstrap.servers是Kafka的地址,subscribe是要订阅的topic。 接着,可能需要提到如何处理从Kafka读取的数据。Kafka消息的键和值都是二进制格式,可能需要转换成字符串或者其他格式。比如用from_avro函数处理Avro数据,或者用cast转换成字符串。 然后,如何处理数据,比如进行一些转换或者聚合,最后输出到某个地方,比如控制台或者另一个Kafka topic,或者其他存储系统。可能需要给出示例代码,比如将数据写入控制台,并触发间隔。 另外,还需要提醒用户注意检查点的位置,保证容错性,以及在启动应用如何提交作业,可能需要用spark-submit并包含相应的包,比如--packages org.apache.spark:spark-sql-kafka-0-10_2.12:3.2.1这样的参数。 另外,可能需要注意安全配置,比如如果Kafka需要SSL或者SASL验证,需要在选项中添加相关配置。比如设置kafka.ssl.truststore.location等参数。 还有可能的问题,比如数据反序列化的问题,或者处理偏移量的问题,需要确保正确管理偏移量以避免数据丢失或重复处理。不过对于Structured Streaming来说,这些可能是自动处理的,但用户可能需要了解如何手动管理。 总结一下,我应该分步骤介绍如何设置环境,添加依赖,创建SparkSession,配置Kafka参数,读取数据流,处理数据,输出结果,以及运行的注意事项,比如提交命令和安全配置。需要确保示例代码正确,并且参数如服务器地址和topic名称需要替换成用户的实际信息。</think>使用 PySpark Streaming 读取 Kafka 数据主要通过 **Structured Streaming API**(推荐)或旧的 **DStream API** 实现。以下是基于 **Structured Streaming** 的步骤详解: --- ### **1. 环境准备** - **依赖包**:确保 PySpark 包含 Kafka 连接器。通常需在启动加载 `spark-sql-kafka` 包: ```bash spark-submit --packages org.apache.spark:spark-sql-kafka-0-10_2.12:3.5.0 your_script.py ``` (版本需匹配你的 Spark 和 Kafka,例如 `3.5.0` 对应 Spark 3.5.x) --- ### **2. 初始化 SparkSession** ```python from pyspark.sql import SparkSession spark = SparkSession.builder \ .appName("KafkaStreamReader") \ .getOrCreate() ``` --- ### **3. 读取 Kafka 数据流** 使用 `readStream` 方法配置 Kafka 参数: ```python df = spark.readStream \ .format("kafka") \ .option("kafka.bootstrap.servers", "localhost:9092") \ # Kafka 服务器地址 .option("subscribe", "your_topic") \ # 订阅的 Topic .option("startingOffsets", "latest") \ # 从最新偏移量开始 .load() ``` **关键配置参数**: - `kafka.bootstrap.servers`: Kafka 集群地址(逗号分隔多个地址)。 - `subscribe` / `assign`: 指定订阅的 Topic 或 Partition。 - `startingOffsets`: `earliest`(从头消费)或 `latest`(从最新消息开始)。 - `failOnDataLoss`: 数据丢失是否报错(默认 `True`)。 --- ### **4. 解析 Kafka 数据** Kafka 消息的 `key` 和 `value` 默认是二进制格式,需转换为字符串(或其他格式): ```python from pyspark.sql.functions import col, from_json # 假设 value 是 JSON 字符串 parsed_df = df.select( col("key").cast("string").alias("message_key"), from_json(col("value").cast("string"), schema).alias("data"), # schema 是自定义的 StructType col("topic"), col("partition"), col("offset") ) ``` --- ### **5. 数据处理与输出** 对数据进行处理(如过滤、聚合),并定义输出方式(例如写入控制台): ```python query = parsed_df.writeStream \ .outputMode("append") \ # 输出模式(append/update/complete) .format("console") \ # 输出到控制台 .option("truncate", "false") \ # 显示完整内容 .start() query.awaitTermination() # 等待流式任务终止 ``` **其他输出方式**: - **Kafka**:`.format("kafka").option("topic", "output_topic")` - **文件系统**:`.format("parquet").option("path", "/output/path")` - **内存**:`.format("memory").queryName("table_name")` --- ### **6. 完整示例代码** ```python from pyspark.sql import SparkSession from pyspark.sql.types import StructType, StringType, IntegerType # 定义数据 Schema schema = StructType() \ .add("user_id", IntegerType()) \ .add("event", StringType()) spark = SparkSession.builder \ .appName("KafkaJsonReader") \ .getOrCreate() # 读取 Kafka 流 df = spark.readStream \ .format("kafka") \ .option("kafka.bootstrap.servers", "localhost:9092") \ .option("subscribe", "user_events") \ .load() # 解析 JSON 数据 parsed_df = df.select( from_json(col("value").cast("string"), schema).alias("data") ).select("data.*") # 展开为 user_id 和 event 列 # 过滤并输出到控制台 query = parsed_df.filter("event = 'login'") \ .writeStream \ .outputMode("append") \ .format("console") \ .start() query.awaitTermination() ``` --- ### **7. 注意事项** - **检查点(Checkpoint)**:长期运行的任务需设置检查点目录以保存进度和恢复状态: ```python .option("checkpointLocation", "/path/to/checkpoint") ``` - **安全配置**:若 Kafka 启用 SSL/SASL,需添加 `kafka.security.protocol`、`kafka.ssl.truststore.location` 等参数。 - **并行度**:调整 `numPartitions` 或 `minPartitions` 优化读取性能。 通过以上步骤,即可使用 PySpark Streaming 高效消费 Kafka 数据流并进行实处理
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值