【问题标题】:Persisting real-time data through Cygnus to Cosmos is slow and unreliable通过 Cygnus 将实时数据持久化到 Cosmos 缓慢且不可靠
【发布时间】:2015-07-30 13:52:26
【问题描述】:

Cygnus 版本是 0.8.2,我正在使用 FI-Ware Lab 内的 FI-Ware 实例中的 Cosmos 公共实例。

我有 8 个将更新推送到 IDAS 的传感器设备。有些更新每秒一次,有些更新每 5 秒一次,平均每秒更新 8,35 次左右。我创建了对 Orion(0.22 版)的订阅,以向 Cygnus 发送 ONCHANGE 通知。

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

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

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

问题一:坚持宇宙真的有那么慢吗?

我知道与持久化到本地数据库相比,幕后发生了很多事情,而且我们正在使用资源有限的 Cosmos 的公共实例,但仍然如此。它甚至意味着要以这种方式与实时数据一起使用(我们的 8 传感器设备测试甚至相当适中)?当然可以创建一个接收器,将数据推送到一个文件,然后将一个简单的文件上传到 Cosmos,但这有点麻烦。我猜没有这样的文件接收器可用?

问题2:如果通知不能注入hdfs-channel(我猜是任何通道),它是否真的没有被添加到其他通道并且被完全丢弃?

【问题讨论】:

    标签: fiware fiware-cygnus fiware-cosmos


    【解决方案1】:

    所有 sinks 的设计都非常相似,但是 HDFS sink 和 MySQL/MongoDB sinks 之间存在一些差异:

    • HDFS 端点(运行于 cosmos.lab.fiware.org:14000 的 HttpFS 服务器)在许多 FIWARE 用户之间共享。不过,我猜您的 MySQL 和 MongoDB 部署是私有的,因此仅供您使用。
    • HDFS 接收器基于 WebHDFS(一种 REST API),而 MySQL 和 MongoDB 接收器基于“二进制协议”(分别使用 JDBC 和 Mongo 驱动程序)。有一个旧的issue at Github 关于迁移到接收器的“二进制”实现。

    话虽如此,并尝试解决当前实施的问题,这些是我的建议:

    • 尝试将looging级别改为ERROR;记录跟踪会消耗大量资源。
    • 尝试向 Cygnus 发送“批量”通知(Orion 通知可能包含多个上下文实体元素);每个批次都作为单个 Flume 事件存储在通道中。
    • 正如您已经想到的那样,尝试配置多个 HDFS 接收器,这在 here 中进行了解释(阅读完整文档也是一个好主意)。

    不过,如果瓶颈在 HDFS 端点上,我认为这不会解决任何问题。

    关于 Cygnus 不会在其他非 HDFS 通道中放置事件,如果它不能在 HDFS 通道中持久化,我会看看。 Cygnus 依赖于Apache Flume,并且事件传递功能在 Flume 的核心内,所以这似乎是 Flume 的一个错误/问题。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-11-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多