問題
在多任務工作流中使用鍵-值參數是一個常見的用例。有多個任務並行運行是正常的,每個任務對於同一個鍵可以有不同的參數值。這些鍵-值參數在代碼中讀取,並由每個任務使用。
例如,假設你有四個任務:task1,task2,task3,task4在工作流作業中。表名參數鍵和參數值是否為員工,部門,位置,聯係人.
在運行作業時,您希望每個任務獲得自己的參數。但是,如果應用程序代碼使用Scala伴生對象,您可能會注意到一個任務參數應用於所有其他任務,而不是應用每個任務的各自參數。這會產生不一致的結果。
在我們的示例中,如果任務使用Scala伴生對象並行運行,則任何一個任務參數(例如,task4參數聯係人)可以作為表名傳遞給其他三個任務。
導致
當在應用程序代碼中使用伴生對象時,伴生對象中有一個可並發修改的可變狀態。因為所有任務都運行在同一個集群上,所以該類隻加載一次,所有任務都運行在同一個Java虛擬機(JVM)下。
解決方案
您可以通過應用這些解決方案之一來緩解這個問題。最佳選擇取決於您的特定用例。
- 按順序運行作業(在任務中添加依賴項)。
- 將每個任務安排在不同的集群上。
- 重寫加載配置的代碼,以便顯式地創建一個新對象,而不是使用伴生對象的共享狀態。