[英]GCP Dataflow: Log4J StackOverflowError aka Java Classpath manipulation
我正在嘗試在Google Cloud Dataflow上部署一個簡單的管道(將一些數據從PubSub復制到Bigtable),但我不斷收到以下錯誤:
Exception in thread "main"
java.lang.StackOverflowError
at java.util.HashMap.hash(HashMap.java:338)
at java.util.HashMap.get(HashMap.java:556)
at org.slf4j.impl.Log4jLoggerFactory.getLogger(Log4jLoggerFactory.java:67)
at org.slf4j.LoggerFactory.getLogger(LoggerFactory.java:358)
[ multiple times ... ]
at org.apache.log4j.Category.<init>(Category.java:57)
at org.apache.log4j.Logger.<init>(Logger.java:37)
at org.apache.log4j.Log4jLoggerFactory.getLogger(Log4jLoggerFactory.java:43)
at org.apache.log4j.LogManager.getLogger(LogManager.java:45)
at org.slf4j.impl.Log4jLoggerFactory.getLogger(Log4jLoggerFactory.java:73)
at org.slf4j.LoggerFactory.getLogger(LoggerFactory.java:358)
java failed with exit status 1
這個錯誤殺死了工人。 即使我的代碼中沒有日志記錄語句或導入 ,也確實發生了這種情況,實際上我的代碼都沒有在堆棧跟蹤中引用。 我熟悉了這個問題 ,我可以看到(以GCP為Stackdriver),我的Java命令確實包含log4j_to_slf4j.jar
:
java -Xmx5834483752 -XX:-OmitStackTraceInFastThrow -Xloggc:/var/log/dataflow/jvm-gc.log -XX:+PrintGCDetails -XX:+PrintGCDateStamps -XX:+UseGCLogFileRotation -XX:NumberOfGCLogFiles=2 -XX:GCLogFileSize=512K -cp /opt/google/dataflow/streaming/libWindmillServer.jar:/opt/google/dataflow/streaming/dataflow-worker.jar:/opt/google/dataflow/slf4j/jcl_over_slf4j.jar:/opt/google/dataflow/slf4j/log4j_over_slf4j.jar:/opt/google/dataflow/slf4j/log4j_to_slf4j.jar: ...
問題是這個Java命令是由Google創建的。 log4j_to_slf4j.jar
不屬於我自己的依賴項。 如何編輯此命令並將其從Classpath中刪除? 或者有更好的解決方案嗎?
謝謝!
好吧降級這些依賴項:
<dependency>
<groupId>org.apache.beam</groupId>
<artifactId>beam-runners-google-cloud-dataflow-java</artifactId>
<version>2.12.0</version>
</dependency>
<dependency>
<groupId>org.apache.beam</groupId>
<artifactId>beam-sdks-java-extensions-json-jackson</artifactId>
<version>2.12.0</version>
</dependency>
從2.12.0
到2.9.0
已經解決了這個問題。 它再次以2.10.0
失敗。 我在官方(?) 示例中建模我的實現,然而,使用2.4.0
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.