Cygnus版本是0.8.2,我正在FI-Ware实验室内的FI-Ware实例中使用Cosmos的公共实例。
我有8个传感器设备可以将更新推送到IDAS。有些更新每秒发送一次,有些更新每5秒一次,平均每秒更新8,35次更新。我创建了对Orion(版本0.22)的订阅,以便向天鹅座发送ONCHANGE通知。
Cygnus配置为将数据保存到Cosmos,Mongo和MySQL。我使用的标准配置是1个源(http源),3个通道(hdfs-channel mysql-channel mongo-channel)和3个sink(hdfs-sink mysql-sink mongo-sink)。
mysql-sink和mongo-sink实时保存数据。但是,hdfs-sink非常慢,每秒只有大约1,65个事件。由于http源每秒接收大约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,并且该通知完全丢失。它不会持久存在于任何地方。
你可以通过启动3个独立的Cygnuses(一个用于Cosmos,一个用于MySQL,一个用于MongoDB),使用不同的http源端口,不同的管理接口端口以及为每个Cygnus添加订阅来解决问题。 MySQL和MongoDB持久化不会受到hdfs-channel变满的影响,但持续存在的Cosmos仍存在问题。使用我们的8个传感器设备可以添加更多hdfs-sinks,但如果您添加更多传感器设备或发送更多更新,则只是推迟了问题。
这两个问题有点无关,但无论如何我都在问......
问题1:坚持宇宙的情况确实如此缓慢吗?
我知道,与持久保存到本地数据库相比,幕后有很多事情发生,而且我们正在使用资源有限的Cosmos公共实例,但仍然如此。它是否意味着以这种方式与实时数据一起使用(我们的8传感器设备测试甚至非常适度)?当然可以创建一个将数据推送到文件然后将简单文件上传到Cosmos的接收器,但这有点麻烦。我猜有没有这样的文件接收器?
问题2:如果通知无法注入hdfs-channel(我猜任何频道),它是否真的是这样,它也没有被添加到其他频道而且它被完全丢弃了?
答案 0 :(得分:0)
所有接收器设计都非常相似,但HDFS接收器和MySQL / MongoDB接收器之间存在一些差异:
据说,并试图解决当前实施的问题,这些是我的建议:
ERROR
;日志记录跟踪消耗大量资源。然而,如果瓶颈在HDFS端点上,我发现这不会解决任何问题。
关于Cygnus如果无法在HDFS频道中保留事件,则不会在其他非HDFS频道中放置事件,我会看一下。 Cygnus依赖于Apache Flume,事件提供功能属于Flume的核心,所以它似乎是关于Flume的错误/问题。