web-dev-qa-db-ja.com

StormクラスターでAWSSQSキューを読み取るときにこれらのParseError例外が発生する原因

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応答がこれらの問題の原因である理由を理解できません。何か案は?

24
Joel Rosenberg

長い間ここで私自身の質問に答えます。

現在、OracleとOpenJDKのJavaには、XML拡張制限処理のバグがあり、複数のXMLドキュメントを解析するときに共有カウンターがデフォルトの上限に達します。

  1. https://blogs.Oracle.com/joew/entry/jdk_7u45_aws_issue_12
  2. https://bugs.openjdk.Java.net/browse/JDK-8028111
  3. https://github.com/aws/aws-sdk-Java/issues/12

私たちのバージョン(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を偽造してワーカーを殺す心配はありません。

49
Joel Rosenberg