GCP 数据流:Log4J StackOverflowError 又名 Java 类路径操作
GCP Dataflow: Log4J StackOverflowError aka Java Classpath manipulation
我正在尝试在 Google Cloud Dataflow 上部署一个简单的管道(将一些数据从 PubSub 复制到 Bigtable),但我不断收到以下错误:
Exception in thread "main"
java.lang.WhosebugError
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
这个错误杀死了工人。即使我的代码 没有日志记录语句或导入 ,并且确实在堆栈中引用了我的代码的 none,也会发生这种情况痕迹。我熟悉 ,我可以看到(在 GCP Stackdriver 中)我的 Java 命令 does indeed 包含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
在我自己的依赖项中 不是 。如何编辑此命令并将其从类路径中删除?或者有更好的解决方案吗?
谢谢!
好的,所以降级这些依赖项:
<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
。我在官方 (?) examples 上对我的实现进行建模,但是,它使用 2.4.0
.
我正在尝试在 Google Cloud Dataflow 上部署一个简单的管道(将一些数据从 PubSub 复制到 Bigtable),但我不断收到以下错误:
Exception in thread "main"
java.lang.WhosebugError
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
这个错误杀死了工人。即使我的代码 没有日志记录语句或导入 ,并且确实在堆栈中引用了我的代码的 none,也会发生这种情况痕迹。我熟悉 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
在我自己的依赖项中 不是 。如何编辑此命令并将其从类路径中删除?或者有更好的解决方案吗?
谢谢!
好的,所以降级这些依赖项:
<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
。我在官方 (?) examples 上对我的实现进行建模,但是,它使用 2.4.0
.