2016-09-27 121 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內置處理器本身似乎沒有最佳性能,因此如果可能的話,應該考慮修改流程並避免合併階段。