火花结构流:不正确写

时间:2017-12-15 09:20:59

标签: python apache-spark spark-structured-streaming

我将抄表记录作为JSON从kafka_2.11-0.10.0.1流式传输到Spark 2.1。我切换到结构化流媒体;虽然kafka消费者确认传入的数据,但我的控制台和writeStream不会移动。我正在测试

pyspark --packages org.apache.spark:spark-sql-kafka-0-10_2.11:2.1.0

我的代码:

from pyspark.sql import SparkSession
from pyspark.sql.functions import *
from pyspark.sql.types import *
spark = SparkSession \
    .builder \
    .appName("interval") \
    .master("local[4]") \
    .getOrCreate()
schema = StructType().add("customer_id", StringType()) 
df = spark \
      .readStream \
      .format("kafka") \
      .option("kafka.bootstrap.servers", "xx.xxx.xx.xxx:9092") \
      .option("subscribe", "test") \
  .option("startingOffsets", "earliest") \
  .load() \
  .select(from_json(col("value").cast("string"), schema).alias("parsed_value"))

query = df.writeStream \
 .option("checkpointLocation", "/user/XX/checkpoint5") \
 .format("parquet") \
 .start("/user/XX/interval5") 

它创建了检查点&带有388字节拼花文件的数据目录。但是,没有写入任何流数据。

$ hdfs dfs -ls interval5
drwxr-xr-x   ... interval5/_spark_metadata
-rw-r--r--   ... interval5/part-00000-0b2eb00a-c361-4dfe-a24e-9589d150a911.snappy.parquet
-rw-r--r--   ... interval5/part-00000-e0cb12d1-9c29-4eb0-92a8-688f468a42ce.snappy.parquet

kafka-consumer确认数据正在发货:

{"customer_id":"customer_736"}
{"customer_id":"customer_995"}
{"customer_id":"customer_1899"}
{"customer_id":"customer_35"}

kafka-consumer显示流数据。

我认为我错过了一个必要的步骤来出列并保存流式行 - 拖网堆栈溢出的一天没有帮助。 (已编辑以删除对控制台的引用;因为它不相关)。

2 个答案:

答案 0 :(得分:2)

使用.option("startingOffsets", "latest"),您应该只期望在启动流式查询后发布的消息。

因此,预期的行动方案是启动流式查询,然后发布消息。

  

没有任何内容写入镶木地板文件。

自从您使用.format("console")后,您会看到已保存到镶木地板文件中。您必须将其更改为parquet并重新启动查询。

答案 1 :(得分:0)

相同的结构化流.py代码在spark-submit中工作,但它永远不会使用pspark处理任何数据;没有错误消息,控制台输出或镶木地板数据(除了目录创建和元数据)。 去图。