2017-01-12 11 views
0

com.github.sps.metrics.metrics-opentsdbライブラリを使用して、スパークジョブからOpenTSDBサーバーにメトリックを記録しようとしています。 EncodingFiltersを扱うジャージーコードで奇妙なNPEを取得するという問題が発生しています。私はEncodingFilter.classのコードを見て、私は失敗だ行が、このことがわかりましたApache SparkがJersey依存関係注入でうまく動作しない

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)` 

List<ContentEncoder> encoders = serviceLocator.getAllServices(ContentEncoder.class); 
ここ

は私が取得しています例外で私はのServiceLocatorがインスタンス化されていないことを確認し、クラスで

、代わりに私はクラスの先頭に次の行を参照してください。

@Inject 
private ServiceLocator serviceLocator; 

私は最初はそれが悪い依存関係にあると考えていたので、my mvn dependency:treeをチェックし、cxfとjerseyプロジェクトのすべてのバージョンが一致していることを確認しました。今、私はそれがApache Sparkと具体的に何かを持っていると思っています。同じmetrics-opentsdbライブラリを使用する別個のアプリケーションがあり、上記の例外が表示されることはありません。

だから、ジャージー依存性注入とスパークで何が起こっているか知っていますか?誰もこの同じ問題を扱い、それを修正しましたか?問題は他に何か他のものですか?

+0

Maven/Gradleのシャドウイングプラグインを使用してアプリケーションを「ファットジャー」にパッケージ化していますか?もしそうなら、おそらくサービスファイルがオーバーライドされている可能性があります。 –

+0

@TzachZohar、私はmavenのShadeプラグインを使用していますが、Eclipseでもアプリを実行しているときに問題が発生します。私は日食でそれを実行している間、私はファイルのオーバーライドの問題を持っていないという印象を受けています。そうじゃないの? – Hardy

+0

うーん..あなたは私をそこに持っています - 私はそれがEclipseでもうまくいくと思います... –

答えて

0

CXFとJerseyが競合製品であると指摘し、metrics-opentsdbライブラリでJerseyを使用していると言われているので、CXFを削除することを提案しました。 私はCXFを使用していたアプリケーションの一部を書き直し、<exclusions>セクションを私のpom.xmlの私の依存関係の一つに追加しましたが、今はすべてうまくいくようです。

関連する問題