繁体   English   中英

从 kafka 读取然后 writeStream 到 json 文件,但在 HDFS json 文件中只找到一条消息

[英]Read from kafka then writeStream to json file, but only found one message in HDFS json file

只需设置一个 hadoop/kafka/spark,1 个节点的演示环境。 在 pyspark 中,我尝试读取(.readStream)Kafka 消息并将其写入(.writeStream)到 hadoop 中的 json 文件中。 奇怪的是,在 hadoop“输出/测试”目录下,我可以找到一个已创建的 json 文件,但仅在一条消息中。 来自 kafka 的所有新消息都不会更新 json 文件。 但我想将来自 Kafka 的所有消息存储到一个 json 文件中。
我已尝试将接收器类型设置为 console(writeStream.format("console")) 或 kafak(writeStream.format("kafka")),它正常工作。 有什么建议或意见吗? 接下来是示例代码。

schema = StructType([StructField("stock_name",StringType(),True),
                     StructField("stock_value", DoubleType(), True),
                     StructField("timestamp", LongType(), True)])

line = spark \
  .readStream \
  .format("kafka") \
  .option("kafka.bootstrap.servers", "127.0.1.1:9092") \
  .option("subscribe", "fakestock") \
  .option("startingOffsets","earliest")\
  .load()\
  .selectExpr("CAST(value AS STRING)")
   
df=line.select(functions.from_json(functions.col("value")\
  .cast("string"),schema).alias("parse_value"))\
  .select("parse_value.stock_name","parse_value.stock_value","parse_value.timestamp")
query=df.writeStream\
  .format("json")\
  .option("checkpointLocation", "output/checkpoint")\
  .option("path","output/test")\
  .start()

不可能将所有记录存储在一个文件中。 Spark 作为 Kafka 消费者定期轮询数据批次,然后将这些批次写入唯一文件。

在不知道主题中有多少记录的情况下,很难说 output 路径中应该有多少记录,但是您的代码看起来还不错。 然而,Parquet 更推荐 output 格式而不是 JSON。

另外值得一提的是,Kafka Connect 有一个 HDFS 插件,只需要编写一个配置文件,不需要 Spark 解析代码。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM