2016-09-27 119 views
4

我开发了一个用于HDFS数据摄取的NiFi流程原型。现在我想提高整体表现,但似乎我不能真正前进。 Apache NiFi优化问题

流接收输入的csv文件(每行有80个字段),在行级别拆分它们,对字段应用一些转换(使用4个自定义处理器按顺序执行),将新行缓存到csv文件,将它们输出到HDFS中。我以这种方式开发了处理器,当读取每个单独的记录并将其字段移至flowfile属性时,只会访问一次流文件的内容。测试已在亚马逊EC2 m4.4xlarge实例(16核CPU,64 GB RAM)上执行。

这是我试过到目前为止:

  • 感动
  • 感动在内存中的出处库(NiFi无法跟上flowfile库和不同的SSD驱动器的内容库根据​configuration best practices
  • 我已经试过为了总线程
  • 来吸引不同的号码分配多个线程每个处理器的事件发生率)
  • 配置系统
  • 我试着增加nifi.queue.swap.threshold和设置背压从来没有(与G1GC组合)达到极限交换从8
  • 尝试不同的JVM内存设置到32 GB
  • 我已经试过增加实例规范,没有什么变化

从我所进行的监测,它看起来像磁盘不是瓶颈(他们基本上空闲时间的很大一部分,显示出实际上是在正在执行的计算-memory),平均CPU负载低于60%。

我能得到的最多的是215k行/分,这是3,5k行/秒。在数量上,它只有4,7 MB /秒。我瞄准的东西绝对比这更大。 就像比较一样,我创建了一个读取文件的流程,将它拆分成行,将它们合并成块并输出到磁盘上。这里我得到12k行/秒,或17 MB/s。看起来并不令人惊讶,我想我可能做错了什么。 有没有人有关于如何改善表演的建议?在集群上运行NiFi会有多少好处,而不是随着实例规格的增长而增长?谢谢大家

+0

您的定制处理器可在任何地方进行评估吗?就你所建立的流程而言,吞吐量在哪里下降?大概你使用的是GetFile,然后是你的链表。 – apiri

+0

是的! https://drive.google.com/drive/folders/0BwYJl5zg1oWSbi1nbG9LQnY2ZWc?usp=sharing我的吞吐量随着定制处理器而下降。我预计,因为他们执行比内置操作更复杂的操作。但是,他们仍然只是访问flowfile属性并创建新的属性。分配给他们几个线程似乎不工作。然而,这篇文章的最后一部分是甚至绕过它们,只是分割行并将它们合并在一起,我得到了12k行/秒。我应该搬到更高的层次并将批次作为工作单位吗?感谢您的时间。 – riccamini

+0

平均而言,您正在处理的流程文件的大小是多少?有一件事向我跳出来,就是一个处理器正在紧绷并在堆上施加压力。你使用的是什么版本的NiFi?使用m4类实例,我假设这个EBS。它是什么类的EBS? GP2?预设的iOPS? – apiri

回答

3

事实证明,糟糕的表现是开发的定制处理器和合并内容内置处理器的组合。 same question mirrored on the hortonworks community forum得到了有趣的反馈。

关于第一个问题,建议将SupportsBatching注释添加到处理器。这允许处理器将多个提交进行批处理,并允许NiFi用户利用配置菜单中的处理器执行来支持延迟或吞吐量。其他信息可以在文档here上找到。

另一个发现是MergeContent内置处理器本身似乎没有最佳性能,因此如果可能的话,应该考虑修改流程并避免合并阶段。