Apache Spark 在 Jersey 依赖注入方面表现不佳
Apache Spark isn't playing nice with Jersey dependency injection
我正在尝试使用 com.github.sps.metrics.metrics-opentsdb
库将我的 spark 作业的指标记录到我的 OpenTSDB 服务器。我 运行 遇到了一个问题,我在处理 EncodingFilters 的球衣代码中遇到了一个奇怪的 NPE。
这是我遇到的异常:
ERROR OpenTsdb: send to opentsdb endpoint failed
javax.ws.rs.ProcessingException: java.lang.NullPointerException
at org.apache.cxf.jaxrs.client.AbstractClient.checkClientException(AbstractClient.java:582)
at org.apache.cxf.jaxrs.client.AbstractClient.preProcessResult(AbstractClient.java:564)
at org.apache.cxf.jaxrs.client.WebClient.doResponse(WebClient.java:1148)
at org.apache.cxf.jaxrs.client.WebClient.doChainedInvocation(WebClient.java:1098)
at org.apache.cxf.jaxrs.client.WebClient.doInvoke(WebClient.java:894)
at org.apache.cxf.jaxrs.client.WebClient.doInvoke(WebClient.java:865)
at org.apache.cxf.jaxrs.client.WebClient.invoke(WebClient.java:428)
at org.apache.cxf.jaxrs.client.WebClient$SyncInvokerImpl.method(WebClient.java:1635)
at org.apache.cxf.jaxrs.client.WebClient$SyncInvokerImpl.method(WebClient.java:1630)
at org.apache.cxf.jaxrs.client.WebClient$SyncInvokerImpl.post(WebClient.java:1570)
at org.apache.cxf.jaxrs.client.spec.InvocationBuilderImpl.post(InvocationBuilderImpl.java:145)
at com.github.sps.metrics.opentsdb.OpenTsdb.sendHelper(OpenTsdb.java:176)
at com.github.sps.metrics.opentsdb.OpenTsdb.send(OpenTsdb.java:162)
at com.github.sps.metrics.opentsdb.OpenTsdb.send(OpenTsdb.java:138)
at com.adobe.gto.gateway.common.metrics.Metrics$RunnableMetricRecorder.run(Metrics.java:220)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
at java.lang.Thread.run(Thread.java:745)
Caused by: java.lang.NullPointerException
at org.glassfish.jersey.client.filter.EncodingFilter.getSupportedEncodings(EncodingFilter.java:110)
at org.glassfish.jersey.client.filter.EncodingFilter.filter(EncodingFilter.java:84)
at org.apache.cxf.jaxrs.client.spec.ClientRequestFilterInterceptor.handleMessage(ClientRequestFilterInterceptor.java:60)
at org.apache.cxf.phase.PhaseInterceptorChain.doIntercept(PhaseInterceptorChain.java:308)
at org.apache.cxf.jaxrs.client.AbstractClient.doRunInterceptorChain(AbstractClient.java:652)
at org.apache.cxf.jaxrs.client.WebClient.doChainedInvocation(WebClient.java:1097)`
我查看了 EncodingFilter.class 中的代码,发现我失败的行是这样的:
List<ContentEncoder> encoders = serviceLocator.getAllServices(ContentEncoder.class);
在 class 中,我看到 serviceLocator 没有实例化,而是在 class 的顶部看到了这一行:
@Inject
private ServiceLocator serviceLocator;
我最初认为这可能是一个错误的依赖项,所以我检查了 my mvn dependency:tree
并确保 cxf 和 jersey 项目的所有版本都匹配,所以我认为这不是问题所在。现在我认为它与 Apache Spark 特别有关,我认为这是因为我有一个单独的应用程序使用相同的 metrics-opentsdb
库而且我从未看到上述异常,一切正常其他应用程序。
那么,有人知道 jersey 依赖注入和 spark 是怎么回事吗?有没有人处理过同样的问题并修复它?问题完全是别的吗?
A co-worker 指出 CXF 和 Jersey 是竞争产品,并建议我删除 CXF,因为 metrics-opentsdb
库说它使用 Jersey。
所以我 re-wrote 我的应用程序的一部分使用 CXF,并在我的 pom.xml
中的一个依赖项中添加了一个 <exclusions>
部分,现在一切似乎都正常。
我正在尝试使用 com.github.sps.metrics.metrics-opentsdb
库将我的 spark 作业的指标记录到我的 OpenTSDB 服务器。我 运行 遇到了一个问题,我在处理 EncodingFilters 的球衣代码中遇到了一个奇怪的 NPE。
这是我遇到的异常:
ERROR OpenTsdb: send to opentsdb endpoint failed
javax.ws.rs.ProcessingException: java.lang.NullPointerException
at org.apache.cxf.jaxrs.client.AbstractClient.checkClientException(AbstractClient.java:582)
at org.apache.cxf.jaxrs.client.AbstractClient.preProcessResult(AbstractClient.java:564)
at org.apache.cxf.jaxrs.client.WebClient.doResponse(WebClient.java:1148)
at org.apache.cxf.jaxrs.client.WebClient.doChainedInvocation(WebClient.java:1098)
at org.apache.cxf.jaxrs.client.WebClient.doInvoke(WebClient.java:894)
at org.apache.cxf.jaxrs.client.WebClient.doInvoke(WebClient.java:865)
at org.apache.cxf.jaxrs.client.WebClient.invoke(WebClient.java:428)
at org.apache.cxf.jaxrs.client.WebClient$SyncInvokerImpl.method(WebClient.java:1635)
at org.apache.cxf.jaxrs.client.WebClient$SyncInvokerImpl.method(WebClient.java:1630)
at org.apache.cxf.jaxrs.client.WebClient$SyncInvokerImpl.post(WebClient.java:1570)
at org.apache.cxf.jaxrs.client.spec.InvocationBuilderImpl.post(InvocationBuilderImpl.java:145)
at com.github.sps.metrics.opentsdb.OpenTsdb.sendHelper(OpenTsdb.java:176)
at com.github.sps.metrics.opentsdb.OpenTsdb.send(OpenTsdb.java:162)
at com.github.sps.metrics.opentsdb.OpenTsdb.send(OpenTsdb.java:138)
at com.adobe.gto.gateway.common.metrics.Metrics$RunnableMetricRecorder.run(Metrics.java:220)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
at java.lang.Thread.run(Thread.java:745)
Caused by: java.lang.NullPointerException
at org.glassfish.jersey.client.filter.EncodingFilter.getSupportedEncodings(EncodingFilter.java:110)
at org.glassfish.jersey.client.filter.EncodingFilter.filter(EncodingFilter.java:84)
at org.apache.cxf.jaxrs.client.spec.ClientRequestFilterInterceptor.handleMessage(ClientRequestFilterInterceptor.java:60)
at org.apache.cxf.phase.PhaseInterceptorChain.doIntercept(PhaseInterceptorChain.java:308)
at org.apache.cxf.jaxrs.client.AbstractClient.doRunInterceptorChain(AbstractClient.java:652)
at org.apache.cxf.jaxrs.client.WebClient.doChainedInvocation(WebClient.java:1097)`
我查看了 EncodingFilter.class 中的代码,发现我失败的行是这样的:
List<ContentEncoder> encoders = serviceLocator.getAllServices(ContentEncoder.class);
在 class 中,我看到 serviceLocator 没有实例化,而是在 class 的顶部看到了这一行:
@Inject
private ServiceLocator serviceLocator;
我最初认为这可能是一个错误的依赖项,所以我检查了 my mvn dependency:tree
并确保 cxf 和 jersey 项目的所有版本都匹配,所以我认为这不是问题所在。现在我认为它与 Apache Spark 特别有关,我认为这是因为我有一个单独的应用程序使用相同的 metrics-opentsdb
库而且我从未看到上述异常,一切正常其他应用程序。
那么,有人知道 jersey 依赖注入和 spark 是怎么回事吗?有没有人处理过同样的问题并修复它?问题完全是别的吗?
A co-worker 指出 CXF 和 Jersey 是竞争产品,并建议我删除 CXF,因为 metrics-opentsdb
库说它使用 Jersey。
所以我 re-wrote 我的应用程序的一部分使用 CXF,并在我的 pom.xml
中的一个依赖项中添加了一个 <exclusions>
部分,现在一切似乎都正常。