在我停止作业之前,Spark Structured Streaming writestream不会写入文件

时间:2019-02-28 08:43:16

标签: scala apache-spark apache-kafka parquet spark-structured-streaming

我在一个经典的用例上使用Spark结构化流:我想从kafka主题中读取内容并将流以拼花格式写入HDFS。

这是我的代码:

import org.apache.spark.sql.SparkSession
import org.apache.spark.sql.functions._
import org.apache.spark.sql.streaming.Trigger
import org.apache.spark.sql.types.{ArrayType, DataTypes, StructType}

object TestKafkaReader extends  App{
  val spark = SparkSession
    .builder
    .appName("Spark-Kafka-Integration")
    .master("local")
    .getOrCreate()
  spark.sparkContext.setLogLevel("ERROR")
  import spark.implicits._

  val kafkaDf = spark
    .readStream
    .format("kafka")
    .option("kafka.bootstrap.servers","KAFKA_BROKER_IP:PORT")
    //.option("subscribe", "test")
    .option("subscribe", "test")
    .option("startingOffsets", "earliest")
    .load()

  val moviesJsonDf = kafkaDf.selectExpr("CAST(value AS STRING)")

  // movie struct
  val struct = new StructType()
    .add("title", DataTypes.StringType)
    .add("year", DataTypes.IntegerType)
    .add("cast", ArrayType(DataTypes.StringType))
    .add("genres", ArrayType(DataTypes.StringType))

  val moviesNestedDf = moviesJsonDf.select(from_json($"value", struct).as("movie"))
  // json flatten
  val movieFlattenedDf = moviesNestedDf.selectExpr("movie.title", "movie.year", "movie.cast","movie.genres")


  // convert to parquet and save to hdfs
  val query = movieFlattenedDf
    .writeStream
    .outputMode("append")
    .format("parquet")
    .queryName("movies")
    .option("checkpointLocation", "src/main/resources/chkpoint_dir")
    .start("src/main/resources/output")
    .awaitTermination()
  }

上下文:

  • 我直接从intellij运行此程序(带有本地火花 已安装)
  • 我设法毫无问题地从kafka读取并写入 控制台(使用控制台模式)
  • 目前我要写入文件 在本地计算机上(但我确实尝试了HDFS群集,问题是 一样)

我的问题:

在工作期间,它没有在文件夹中写入任何内容,我必须手动停止工作才能最终看到文件。

我发现也许与.awaitTermination()有关 有关信息,我尝试删除此选项,但如果没有此操作,我会收到错误消息,并且作业根本无法运行。

也许我没有设置正确的选项,但是在阅读了很多文档并在Google上搜索后,我什么都没找到。

您能帮我吗?

谢谢

编辑:

  • 我正在使用spark 2.4.0
  • 我尝试了64 / 128mb格式=>在停止工作之前,什么也不会更改任何文件

1 个答案:

答案 0 :(得分:1)

是的,问题解决

我的问题是,我的数据太少,spark正在等待更多数据来写入镶木地板文件。

要进行这项工作,我使用@AlexandrosBiratsis的评论 (更改块大小)

再次全部归功于@AlexandrosBiratsis 非常感谢你