Fiware 通过天鹅座将实时数据保存到宇宙是缓慢和不可靠的

Fiware 通过天鹅座将实时数据保存到宇宙是缓慢和不可靠的,fiware,fiware-cygnus,fiware-cosmos,Fiware,Fiware Cygnus,Fiware Cosmos,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通道mysql通道mongo通道)和3个接收器(hdfs接收器mysql接

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通道mysql通道mongo通道)和3个接收器(hdfs接收器mysql接收器mongo接收器)

mysql接收器和mongo接收器几乎实时保存数据。然而,hdfs接收器的速度非常慢,仅为每秒1,65个事件。由于http源每秒接收大约8,35个事件,hdfs通道很快就满了,您会收到一条日志文件警告

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源无法将通知注入hdfs通道,它也不会将其注入mysql通道和mongo通道,并且该通知将完全丢失。它不会持续到任何地方

您可以通过使用不同的http源端口、不同的管理接口端口和为每个Cygnus添加订阅来启动3个单独的Cygnus(一个用于Cosmos,一个用于MySQL,一个用于MongoDB)来部分地规避这个问题。MySQL和MongoDB的持久化不受hdfs通道变满的影响,但Cosmos的持久化仍然存在问题。添加更多hdfs接收器可能会解决我们的8个传感器设备的问题,但如果您添加更多传感器设备或它们发送更多更新,您只是在推迟问题

这两个问题有点无关,但我还是要问

问题1:坚持宇宙真的那么慢吗

我知道,与持久化到本地数据库相比,幕后还有很多事情要做,我们使用的是Cosmos的公共实例,虽然资源有限,但仍然如此。它甚至可以用于实时数据(我们的8传感器设备测试甚至相当温和)?当然,可以创建一个接收器,将数据推送到一个文件中,然后将一个简单的文件上传到Cosmos,但这有点麻烦。我想没有这样的文件接收器了吧


问题2:如果通知无法注入hdfs通道(我猜是任何通道),它也不会添加到其他通道,而是被完全丢弃,这是真的吗?

所有接收器的设计都非常相似,但hdfs接收器和MySQL/MongoDB接收器之间存在一些差异:

  • HDFS端点(运行在cosmos.lab.fiware.org:14000的HttpFS服务器)在许多fiware用户之间共享。但是,我猜您的MySQL和MongoDB部署是私有的,因此只供您使用
  • HDFS接收器基于RESTAPI WebHDFS,而MySQL和MongoDB接收器基于“二进制协议”(分别使用JDBC和Mongo驱动程序)。关于转移到接收器的“二进制”实现,有一个古老的说法
尽管如此,为了解决当前实施中的问题,我提出了以下建议:

  • 尝试将松动级别更改为
    错误
    ;记录跟踪会消耗大量资源
  • 尝试向Cygnus发送“批”通知(Orion通知可能包含多个上下文实体元素);每个批次作为单个水槽事件存储在通道中
  • 正如您已经了解到的,尝试配置多个HDFS接收器,这一点已经解释过了(阅读完整文档也是一个好主意)
然而,如果瓶颈在HDFS端点上,我认为这不会解决任何问题

关于Cygnus,如果事件不能持久化到HDFS通道中,则不会在其他非HDFS通道中放置事件,我将对此进行研究。Cygnus依赖于Flume,而事件交付功能是Flume的核心,因此这似乎是Flume的一个bug/问题