Hive &引用;不是拼花锉刀(太小)";在Spark结构化流媒体运行期间从Presto

Hive &引用;不是拼花锉刀(太小)";在Spark结构化流媒体运行期间从Presto,hive,hdfs,apache-spark-sql,parquet,presto,Hive,Hdfs,Apache Spark Sql,Parquet,Presto,我建立了一个管道,从卡夫卡读取数据,使用Spark结构化流处理数据,然后将拼花文件写入HDFS。数据查询的下游客户端正在使用配置为将数据作为配置单元表读取的Presto Kafka-->火花-->HDFS-->普雷斯托实木复合地板 一般来说,这是可行的。当Spark作业运行批处理时发生查询时,就会出现问题。Spark作业在HDFS上创建零长度拼花文件。如果Presto在处理查询过程中试图打开此文件,则会抛出错误: 查询20171116_170937_07282_489cc失败:打开配置单元拆分时

我建立了一个管道,从卡夫卡读取数据,使用Spark结构化流处理数据,然后将拼花文件写入HDFS。数据查询的下游客户端正在使用配置为将数据作为配置单元表读取的Presto

Kafka-->火花-->HDFS-->普雷斯托实木复合地板

一般来说,这是可行的。当Spark作业运行批处理时发生查询时,就会出现问题。Spark作业在HDFS上创建零长度拼花文件。如果Presto在处理查询过程中试图打开此文件,则会抛出错误:

查询20171116_170937_07282_489cc失败:打开配置单元拆分时出错hdfs://namenode:50071/hive/warehouse/table/part-00000-5a7c242a-3e53-46d0-9ee4-5d004ef4b1e4-c000.snappy.拼花地板(偏移量=0,长度=0):hdfs://namenode:50071/hive/warehouse/table/part-00000-5a7c242a-3e53-46d0-9ee4-5d004ef4b1e4-c000.snappy.parquet不是拼花文件(太小)

此时文件实际上是零字节,因此错误是完全正确的,但这不是我希望管道的行为。我希望能够连续写入适当的HDFS文件夹,而不会干扰Presto查询

作业的Spark scala代码如下所示:

val FilesOnDisk = 1
Spark
  .initKafkaStream("fleet_profile_test")
  .filter(_.name.contains(job.kafkaTag))
  .flatMap(job.parser)
  .coalesce(FilesOnDisk)
  .writeStream
  .trigger(ProcessingTime("1 hours"))
  .outputMode("append")
  .queryName(job.queryName)
  .format("parquet")
  .option("path", job.outputFilesPath)
  .start()
作业在小时的最顶端:00开始。该文件在:05第一次在HDFS上以零长度文件的形式显示。直到在作业完成之前的:21完全写入该文件后,该文件才会更新。这使得该表实际上在25%的时间内无法使用

每个文件只有500kB多一点,所以我不希望文件的物理写入需要很长时间。据我所知,拼花地板文件的元数据位于文件的末尾,因此编写更大文件的人会遇到更多的麻烦


人们在处理此Presto错误时使用了哪些策略来集成Spark结构化流媒体和Presto?

您可以尝试说服Presto(或Presto团队)忽略空文件,但这不会有帮助,因为程序正在编写文件(此处:Spark)最终将刷新部分数据,文件将显示为部分、非空且格式不正确,因此也会导致错误


防止Presto(或其他读取表数据的程序)看到部分文件的方法是将文件汇编到不同的位置,然后以原子方式将文件移动到正确的位置。

我花了一段时间才承认这是真正正确的(可能只是正确的)解决问题的方法。我现在已经接受了,你的答案也是。嗨@Dave_Cameron,我有一个非常类似的问题。我正在阅读卡夫卡的一个主题并将其写入拼花地板,尽管我没有使用HDFS。当我尝试从Spark读取拼花地板文件并且流正在运行时,我得到“无法推断拼花地板的模式”。必须手动指定;"我猜这是因为我在写的时候读的是同一个拼花地板。我在spark用户的邮件中看到了你写的这是为你工作的吗?你找到其他解决方案了吗?Cheers@redsk我也有同样的问题!如果你把这个问题作为一个单独的问题来问,那就太好了,我可以展示一些解决方案的代码打开。非常快速的答案是您需要在DataStreamReader上指定架构。请检查此方法: