Fiware 通过天鹅座将实时数据保存到宇宙是缓慢和不可靠的
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通道很快就满了,您会收到一条日志文件警告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接
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接收器,这一点已经解释过了(阅读完整文档也是一个好主意)