Ich versuche, mehrere Einfügeanweisungen in PutHiveQL über ReplaceText Prozessor einzugeben. Jede insert-Anweisung ist eine Flowdatei, die aus ReplaceText stammt. Ich setze den Stapel in PutHiveQL auf 100. Es scheint jedoch immer noch 1 Flowfile zu senden. Wie implementiert man diese Charge am besten?Wie funktioniert PutHiveQL im Batch?
Antwort
Ich glaube nicht, dass der PutHiveQL-Prozessor Anweisungen auf der JDBC-Ebene wie erwartet bündelt, nicht in der Art, wie es Prozessoren wie PutSQL tun. From the code, sieht es so aus, als ob die Batch Size-Eigenschaft verwendet wird, um zu steuern, wie viele Flowfiles der Prozessor bearbeitet, bevor er liefert, aber die Anweisungen für jede Flowdatei werden immer noch einzeln ausgeführt.
Das könnte ein gutes Thema für eine NiFi feature request sein.
Die Version von Hive, die von NiFi unterstützt wird, erlaubt keine Batching/Transaktionen. Der Parameter Batch Size versucht, mehrere eingehende Flow-Dateien etwas schneller zu verschieben, als wenn der Prozessor gelegentlich aufgerufen wird. Wenn Sie also den PutHiveQL-Prozessor alle 5 Sekunden mit einer Stapelgröße von 100 planen, wird der Prozessor alle 5 Sekunden (wenn sich 100 Flussdateien in der Warteschlange befinden) versuchen, diese während einer "Sitzung" zu verarbeiten.
Alternativ können Sie eine Batch-Größe von 0 oder 1 angeben und so schnell wie Sie möchten; Leider hat dies keine Auswirkungen auf die Hive-Seite der Dinge, da es jede HiveQL-Anweisung automatisch festschreibt; Die Version von Hive unterstützt keine Transaktionen oder Stapelverarbeitung.
Eine andere (möglicherweise mehr performant) Alternative, um die gesamte Menge von Zeilen als CSV in HDFS-Datei und die HiveQL „LOAD DATA“ DML-Anweisung zu setzen ist eine Tabelle auf dem Daten zu erstellen: https://cwiki.apache.org/confluence/display/Hive/GettingStarted#GettingStarted-DMLOperations