首页 文章

通过Cygnus将实时数据保存到Cosmos是缓慢且不可靠的

提问于
浏览
2

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

我有8个传感器设备可以推动IDAS的更新 . 有些更新每秒发送一次,有些更新每5秒一次,平均每秒更新8,35次更新 . 我创建了对Orion(版本0.22)的订阅,以便向Cygnus发送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源不能将通知注入hdfs-channel,它也不会将其注入mysql-channel和mongo-channel,并且该通知完全丢失 . 它不会持久存在于任何地方 .

你可以通过启动3个独立的Cygnuses(一个用于Cosmos,一个用于MySQL,一个用于MongoDB),使用不同的http源端口,不同的管理接口端口以及为每个Cygnus添加订阅来解决问题 . MySQL和MongoDB持久化不会受到hdfs-channel变满的影响,但持续存在的Cosmos仍存在问题 . 使用我们的8个传感器设备添加更多hdfs-sink可能会起到作用,但如果添加更多传感器设备或发送更多更新,则只是推迟了问题 .

这两个问题有点无关,但无论如何我都在问......

问题1:持续到宇宙的情况真的很慢吗?

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

问题2:如果通知无法注入hdfs-channel(我猜任何 Channels ),它是否真的是这样的情况,它也没有被添加到其他 Channels 并被完全丢弃?

1 回答

  • 0

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

    • 许多FIWARE用户共享HDFS endpoints (运行在cosmos.lab.fiware.org:14000的HttpFS服务器) . 但是,我猜你的MySQL和MongoDB部署是私有的,因此只能由你使用 .

    • HDFS接收器基于WebHDFS,一种REST API,而MySQL和MongoDB接收器基于"binary protocols"(分别使用JDBC和Mongo驱动程序) . 有一个旧的issue at Github关于转移到接收器的"binary"实现 .

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

    • 尝试将looging级别更改为 ERROR ;日志记录跟踪消耗大量资源 .

    • 尝试向Cygnus发送"batches"通知(猎户座通知可能包含多个上下文实体元素);每个批次都作为一个Flume事件存储在通道中 .

    • 正如您已经想到的那样,尝试配置多个HDFS接收器,这是解释here(阅读完整文档也是一个好主意) .

    然而,如果瓶颈在HDFS endpoints 上,我发现这不会解决任何问题 .

    关于Cygnus不会在其他非HDFS Channels 中放置一个事件,如果它不能在HDFS Channels 中保留,我会看一下 . Cygnus依赖于Apache Flume并且事件传递功能在Flume的核心内,所以它似乎是关于Flume的错误/问题 .

相关问题