Apache flink 流式传输到拼花地板文件对flink 1.6.1不满意

Apache flink 流式传输到拼花地板文件对flink 1.6.1不满意,apache-flink,Apache Flink,我对flink(以及拼花地板/hadoop)非常陌生,所以我肯定在做一些非常愚蠢的事情。我正在尝试创建一个接收器,它将把我的数据源转储到拼花地板文件中 我的代码如下所示: val streamEnv = StreamExecutionEnvironment.getExecutionEnvironment streamEnv.setParallelism(1); streamEnv.enableCheckpointing(100, CheckpointingMode.EXACTLY_ONCE);

我对flink(以及拼花地板/hadoop)非常陌生,所以我肯定在做一些非常愚蠢的事情。我正在尝试创建一个接收器,它将把我的数据源转储到拼花地板文件中

我的代码如下所示:

val streamEnv = StreamExecutionEnvironment.getExecutionEnvironment
streamEnv.setParallelism(1);
streamEnv.enableCheckpointing(100, CheckpointingMode.EXACTLY_ONCE);
val sink = StreamingFileSink.forBulkFormat(outputPath, ParquetAvroWriters.forReflectRecord(classOf[MyClass])).build()
testSource.addSink(sink)
不幸的是,我没有得到以前的异常,但它仍然没有生成正确的输出。我目前得到一个.part xxx文件,其中包含4B个数据。这个流中大约有20000条记录,所以这似乎不正确

在我开始写这个问题之前,我从第84行的ParquetAvroWriters.java中得到了一个methodnotfound异常。该代码如下所示:

    return AvroParquetWriter.<T>builder(out)
            .withSchema(schema)
            .withDataModel(dataModel)
            .build();
返回AvroParquetWriter.builder(out)
.withSchema(schema)
.withDataModel(数据模型)
.build();
AvroParquetWriter方法签名为:

  public static <T> Builder<T> builder(Path file)
publicstaticbuilder(路径文件)
但是ParquetAvroWriters.java调用它时的参数是StreamOutputFile,因此没有方法错误


我正在使用link1.6.1和拼花hadoop/parquet avro 1.10.0。我应该如何设置来编写拼花地板文件?这是最令人沮丧的-我甚至找不到一个编译的例子。任何帮助都将不胜感激

Flink的
StreamingFileSink
使用批量格式自动使用
OnCheckpointRollingPolicy
。这意味着只有在检查点完成时,结果才会具体化。这需要提供一次处理保证

我假设您正在使用
CollectionSource
作为测试输入,并且该输入的处理时间小于指定的
100ms
。因此,无法完成任何检查点,也不会写入任何结果。一旦输入被完全消耗,Flink就不会触发检查点。因此,最后一个完成的检查点之后的所有事件都将不可见


尝试减少检查点间隔,增加
CollectionSource
中的元素数,或编写自己的
TestingSource extends SourceFunction
,其运行时间至少与单个检查点间隔相同(例如,使用睡眠)。这样,Flink应该能够完成一个检查点,从而将结果写入指定的目录。

在阅读了这些人的信息后,我用相同的代码创建了一个项目(类似),但您可以编译和执行

object CustomSource {

 case class TextOut(data:String )

 def generateRandomStringSource(out: SourceContext[TextOut]) = {
   val lines = Array("how are you", "you are how", " i am fine")
   while (true) {
    val index = Random.nextInt(3)
    Thread.sleep(200)
    out.collect(TextOut(lines(index)))
  }
}


def main(args: Array[String]) {

  val streamEnv = 
  StreamExecutionEnvironment.getExecutionEnvironment

  streamEnv.setParallelism(1)
  streamEnv.enableCheckpointing(10000, 
  CheckpointingMode.EXACTLY_ONCE)
  val sink = StreamingFileSink.forBulkFormat(new 
    Path("file:///tmp/test2"),
   ParquetAvroWriters.forReflectRecord(classOf[TextOut])).build()

  val customSource = streamEnv.addSource(generateRandomStringSource 
  _)

  customSource.print()

   customSource.addSink(sink)




   streamEnv.execute()

 }
}

我创建了一个项目来展示它是如何运行的,以及它所需要的最少的东西(jar、etc)

这是链接:


Jose

Hmmm,所以我尝试了这个,它改变了日志记录行为,但没有改变最终结果。Hmmm,所以我尝试了这个(将其更改为10mS),它改变了日志记录行为,但没有改变最终结果。我在日志中得到了几个“作业b17241e8482642131ad342f0cf42779f的已完成检查点3(206毫秒内2624字节)”。然后,作业b17241e8482642131ad342f0cf42779f的全部:
检查点触发任务源:自定义文件源(1/1)未处于运行状态,而是已完成。正在中止检查点。
我的临时拼花文件中仍然有一个惊人的4B。如果我通过writeAsCsv将源代码保存到csv文件中,我将获得14921行输出,因此源代码看起来正常。您使用哪个输入源?您是否使用集合中的流执行环境?如果是这样,那么
10ms
也可能过高,因为处理20000条记录的速度可能非常快。您是否可以尝试定义自己的
SourceFunction
,在每次记录发出后插入一个短睡眠。它正在从S3读取一个文本文件(streamNV.readTextFile)。当然,我在中间映射中添加了1mS(转换每个JSON文本行)。仍然得到同样的结果不幸的是。。。但是,我也得到了大量这样的信息:
检查点触发任务源:作业48da965be54163702cc4b0ffe837a005的自定义文件源(1/1)未处于运行状态,而是已完成。中止检查点
我认为问题在于您将
连续文件监视功能
文件处理模式#处理_一次
一起使用。请使用
StreamExecutionEnvironment#readFile(FileInputFormat,String,FileProcessingMode,long)
将其设置为连续处理。这样,源代码将不会终止,您将能够接受检查点。请不要发布仅链接的答案。始终包含指向答案的链接摘要,以便在链接目标被删除时,答案仍然有用,请参阅以获取更多信息。我提供了一个解决方案。那么代码还不够,你需要所有的都是正确的,在本例中,pom.xml也是正确的。它不再是一个只回答问题的链接。