2

Cygnus のバージョンは 0.8.2 で、FI-Ware ラボ内の FI-Ware インスタンスから Cosmos のパブリック インスタンスを使用しています。

IDAS に更新をプッシュする 8 つのセンサー デバイスがあります。1 秒に 1 回の更新もあれば、5 秒に 1 回の更新もあり、平均して 1 秒あたり約 8,35 回更新されます。Orion (バージョン 0.22) へのサブスクリプションを作成して、ONCHANGE 通知を Cygnus に送信しました。

Cygnus は、データを Cosmos、Mongo、および MySQL に保持するように構成されています。1 つのソース (http-source)、3 つのチャネル (hdfs-channel mysql-channel mongo-channel)、および 3 つのシンク (hdfs-sink mysql-sink mongo-sink) の標準構成を使用しました。

mysql-sink と mongo-sink は、ほぼリアルタイムでデータを保持します。ただし、hdfs-sink は非常に遅く、1 秒あたり約 1.65 イベントしかありません。http-source は 1 秒あたり約 8,35 のイベントを受信するため、hdfs-channel はすぐにいっぱいになり、ログ ファイルに警告が表示されます。

time=2015-07-30T13:39:02.168CEST | lvl=WARN | trans=1438256043-345-0000002417 | function=doPost | comp=Cygnus | msg=org.apache.flume.source.http.HTTPSource$FlumeHTTPServlet[203] : Error appending event to channel. Channel might be full. Consider increasing the channel capacity or make sure the sinks perform faster.
org.apache.flume.ChannelException: Unable to put batch on required channel: org.apache.flume.channel.MemoryChannel{name: hdfs-channel}
        at org.apache.flume.channel.ChannelProcessor.processEventBatch(ChannelProcessor.java:200)
        at org.apache.flume.source.http.HTTPSource$FlumeHTTPServlet.doPost(HTTPSource.java:201)
        at javax.servlet.http.HttpServlet.service(HttpServlet.java:725)
        at javax.servlet.http.HttpServlet.service(HttpServlet.java:814)
        at org.mortbay.jetty.servlet.ServletHolder.handle(ServletHolder.java:511)
        at org.mortbay.jetty.servlet.ServletHandler.handle(ServletHandler.java:401)
        at org.mortbay.jetty.servlet.SessionHandler.handle(SessionHandler.java:182)
        at org.mortbay.jetty.handler.ContextHandler.handle(ContextHandler.java:766)
        at org.mortbay.jetty.handler.HandlerWrapper.handle(HandlerWrapper.java:152)
        at org.mortbay.jetty.Server.handle(Server.java:326)
        at org.mortbay.jetty.HttpConnection.handleRequest(HttpConnection.java:542)
        at org.mortbay.jetty.HttpConnection$RequestHandler.content(HttpConnection.java:945)
        at org.mortbay.jetty.HttpParser.parseNext(HttpParser.java:756)
        at org.mortbay.jetty.HttpParser.parseAvailable(HttpParser.java:218)
        at org.mortbay.jetty.HttpConnection.handle(HttpConnection.java:404)
        at org.mortbay.jetty.bio.SocketConnector$Connection.run(SocketConnector.java:228)
        at org.mortbay.thread.QueuedThreadPool$PoolThread.run(QueuedThreadPool.java:582)
Caused by: org.apache.flume.ChannelException: Space for commit to queue couldn't be acquired Sinks are likely not keeping up with sources, or the buffer size is too tight
        at org.apache.flume.channel.MemoryChannel$MemoryTransaction.doCommit(MemoryChannel.java:128)
        at org.apache.flume.channel.BasicTransactionSemantics.commit(BasicTransactionSemantics.java:151)
        at org.apache.flume.channel.ChannelProcessor.processEventBatch(ChannelProcessor.java:192)
        ... 16 more

副作用として、http-source が hdfs-channel に通知を注入できない場合、mysql-channel と mongo-channel にも通知が注入されず、その通知が完全に失われます。どこにも永続化されていません。

異なる http ソース ポート、異なる管理インターフェイス ポートを使用して 3 つの個別の Cygnus (Cosmos 用、MySQL 用、MongoDB 用) を起動し、各 Cygnus にサブスクリプションを追加することで、問題を部分的に回避できます。MySQL と MongoDB の永続化は、hdfs チャネルがいっぱいになっても影響を受けませんが、Cosmos の永続化にはまだ問題があります。hdfs-sink を追加すると、8 つのセンサー デバイスで問題が解決する可能性がありますが、センサー デバイスを追加したり、更新を送信したりすると、問題が先送りされるだけです。

これら2つの質問は少し関係ありませんが、とにかく尋ねています...

質問 1: コスモスへの固執がそれほど遅いというのは本当ですか?

ローカル データベースへの永続化と比較して、舞台裏で多くのことが行われていること、およびリソースが制限されている Cosmos のパブリック インスタンスを使用していることはわかっていますが、それでもなおです。リアルタイム データでそのように使用することを意図しているのでしょうか (当社の 8 センサー デバイス テストはかなり控えめです)? もちろん、データをファイルにプッシュするシンクを作成してから、Cosmos に単純なファイルをアップロードすることもできますが、少し手間がかかります。そのようなファイルシンクは利用できないと思いますか?

質問 2: 通知を hdfs チャネル (任意のチャネルだと思います) に挿入できない場合、他のチャネルにも追加されず、完全に破棄されるというのは本当ですか?

4

1 に答える 1

0

すべてのシンクの設計は非常に似ていますが、HDFS シンクと MySQL/MongoDB シンクにはいくつかの違いがあります。

  • HDFS エンドポイント (cosmos.lab.fiware.org:14000 で実行されている HttpFS サーバー) は、多くの FIWARE ユーザー間で共有されます。ただし、MySQL と MongoDB のデプロイはプライベートなものであり、あなただけが使用していると思います。
  • HDFS シンクは REST API である WebHDFS に基づいていますが、MySQL および MongoDB シンクは「バイナリ プロトコル」に基づいています (JDBC および Mongo ドライバーがそれぞれ使用されます)。Githubには、シンクの「バイナリ」実装への移行に関する古い問題があります。

そうは言っても、現在の実装で問題を解決しようとしているのは、これらが私の推奨事項です。

  • ルックアップ レベルをERROR;に変更してみてください。トレースのロギングは多くのリソースを消費します。
  • 通知の「バッチ」を Cygnus に送信してみてください (Orion 通知には複数のコンテキスト エンティティ要素が含まれる場合があります)。各バッチは、単一の Flume イベントとしてチャネルに保存されます。
  • すでにわかっているように、複数の HDFS シンクを構成してみてください。これについては、こちらで説明しています(ドキュメント全体を読むこともお勧めします)。

それでも、ボトルネックが HDFS エンドポイントにある場合、これでは何も解決しないことがわかります。

Cygnus については、イベントを HDFS チャネルに永続化できない場合、他の非 HDFS チャネルにイベントを配置しません。Cygnus はApache Flumeに依存しており、イベント配信機能は Flume のコア内にあるため、Flume に関するバグ/問題のようです。

于 2015-08-19T07:12:38.057 に答える