Storm0.8.1を使用してAmazonSQSキューから着信メッセージを読み取り、そうすると一貫した例外が発生します。
2013-12-02 02:21:38 executor [ERROR]
Java.lang.RuntimeException: com.amazonaws.AmazonClientException: Unable to unmarshall response (ParseError at [row,col]:[1,1]
Message: JAXP00010001: The parser has encountered more than "64000" entity expansions in this document; this is the limit imposed by the JDK.)
at REDACTED.spouts.SqsQueueSpout.handleNextTuple(SqsQueueSpout.Java:219)
at REDACTED.spouts.SqsQueueSpout.nextTuple(SqsQueueSpout.Java:88)
at backtype.storm.daemon.executor$fn__3976$fn__4017$fn__4018.invoke(executor.clj:447)
at backtype.storm.util$async_loop$fn__465.invoke(util.clj:377)
at clojure.lang.AFn.run(AFn.Java:24)
at Java.lang.Thread.run(Thread.Java:701)
Caused by: com.amazonaws.AmazonClientException: Unable to unmarshall response (ParseError at [row,col]:[1,1]
Message: JAXP00010001: The parser has encountered more than "64000" entity expansions in this document; this is the limit imposed by the JDK.)
at com.amazonaws.http.AmazonHttpClient.handleResponse(AmazonHttpClient.Java:524)
at com.amazonaws.http.AmazonHttpClient.executeHelper(AmazonHttpClient.Java:298)
at com.amazonaws.http.AmazonHttpClient.execute(AmazonHttpClient.Java:167)
at com.amazonaws.services.sqs.AmazonSQSClient.invoke(AmazonSQSClient.Java:812)
at com.amazonaws.services.sqs.AmazonSQSClient.receiveMessage(AmazonSQSClient.Java:575)
at REDACTED.spouts.SqsQueueSpout.handleNextTuple(SqsQueueSpout.Java:191)
... 5 more
Caused by: javax.xml.stream.XMLStreamException: ParseError at [row,col]:[1,1]
Message: JAXP00010001: The parser has encountered more than "64000" entity expansions in this document; this is the limit imposed by the JDK.
at com.Sun.org.Apache.xerces.internal.impl.XMLStreamReaderImpl.setInputSource(XMLStreamReaderImpl.Java:219)
at com.Sun.org.Apache.xerces.internal.impl.XMLStreamReaderImpl.<init>(XMLStreamReaderImpl.Java:189)
at com.Sun.xml.internal.stream.XMLInputFactoryImpl.getXMLStreamReaderImpl(XMLInputFactoryImpl.Java:277)
at com.Sun.xml.internal.stream.XMLInputFactoryImpl.createXMLStreamReader(XMLInputFactoryImpl.Java:129)
at com.Sun.xml.internal.stream.XMLInputFactoryImpl.createXMLEventReader(XMLInputFactoryImpl.Java:78)
at com.amazonaws.http.StaxResponseHandler.handle(StaxResponseHandler.Java:85)
at com.amazonaws.http.StaxResponseHandler.handle(StaxResponseHandler.Java:41)
at com.amazonaws.http.AmazonHttpClient.handleResponse(AmazonHttpClient.Java:503)
... 10 more
キューのデータをデバッグしましたが、すべて問題ないようです。 APIのXML応答がこれらの問題の原因である理由を理解できません。何か案は?
長い間ここで私自身の質問に答えます。
現在、OracleとOpenJDKのJavaには、XML拡張制限処理のバグがあり、複数のXMLドキュメントを解析するときに共有カウンターがデフォルトの上限に達します。
私たちのバージョン(6b27-1.12.6-1ubuntu0.12.04.4)は影響を受けていないと思いましたが、OpenJDKバグレポートに記載されているサンプルコードを実行すると、バグの影響を受けやすいことが確かに確認されました。
この問題を回避するには、jdk.xml.entityExpansionLimit=0
をStormワーカーに渡す必要がありました。クラスター全体でstorm.yaml
に以下を追加することにより、この問題を軽減することができました。
supervisor.childopts: "-Djdk.xml.entityExpansionLimit=0"
worker.childopts: "-Djdk.xml.entityExpansionLimit=0"
これは技術的にはサービス拒否攻撃にさらされることに注意する必要がありますが、XMLドキュメントはSQSからのみ取得されるため、誰かが悪意のあるXMLを偽造してワーカーを殺す心配はありません。