3

我正在嘗試使用NiFi來處理使用HDF 1.2的大型CSV文件(每個潛在的數十億條記錄)。我已經實現了我的流程,並且對於小文件一切正常。Apache NiFi - OutOfMemory錯誤:在SplitText處理器上超出了GC開銷限制

的問題是,如果我嘗試將文件大小推到100MB(1M記錄)我從負責文件拆分成單記錄的SplitText處理器獲得一個java.lang.OutOfMemoryError: GC overhead limit exceeded。我已經搜索了這一點,它基本上意味着垃圾收集器執行時間太長而沒有獲得太多的堆空間。我預計這意味着太多的流文件正在生成太快。

我該如何解決這個問題?我試過改變nifi的最大堆空間和其他內存相關的屬性的配置,但似乎沒有任何工作。

現在我增加了一箇中間SplitText與1K的行數和,讓我避免錯誤,但我不認爲這是因爲當傳入文件大小會變得更多潛在的固溶那恐怕我會從處理器中得到同樣的行爲。

歡迎任何建議!謝謝

回答

4

出現此錯誤的原因是,將行數爲1的1M記錄拆分時,將創建1M個等同於1M個Java對象的流文件。總的來說,使用兩個SplitText處理器的方法很常見,並且避免了同時創建所有對象。你也許可以在第一次拆分時使用更大的拆分大小,也許10k。對於十億條記錄,我想知道第三個級別是否合理,從1B到10M,然後是10M到10K,然後是10K到1,但是我不得不使用它。

需要考慮的一些額外事項是將默認堆大小從512MB增加到您已經完成的大小,並確定是否真的需要將其分割爲1行。如果不知道流程的其他信息,很難說,但是在很多情況下,如果您想要將每條生產線交付到某處,則可能會有一個處理器讀取大分隔文件並將每條生產線流到目標位置。例如,這是PutKafka和PutSplunk的工作方式,他們可以使用1M行文件並將每行傳送到目標。

+0

如果沒有「一次性」的方式來做到這一點,我一定會嘗試多個層次。關於PutKafka,我會結束在集羣中與KaFi一起設置Kafka。忽略這將需要一些羣集資源的事實,性能或其他觀點是否有優勢?感謝您一如既往地瞭解有關NiFi行爲的有用信息。 – riccamini

+1

好吧,我不一定說你需要Kafka作爲其中的一部分,在你將每個流文件拆分爲1行之後,我更多地詢問你想要在流程中做什麼,看看你是否真的需要這樣做。很多時候,人們只是想將這些行傳遞給外部系統,在這種情況下,可能有一個處理器可以在大文件中傳輸,並將每行發送到某個位置,而不會創建數百萬個流文件,而kafka和splunk是這只是兩個例子。 –

+0

我其實需要逐行分割文件,然後在每個字段上應用不同的轉換/標準化。然後,我將每條線回到一起,然後全部導出到蜂巢中。 – riccamini

相關問題