流数据和Hadoop? (不是Hadoop Streaming)
题
我想使用MapReduce方法分析连续的数据流(通过HTTP访问),所以我一直在研究Apache Hadoop。不幸的是,似乎Hadoop希望以一个固定大小的输入文件开始工作,而不是在消费者到达时能够将新数据传递给消费者。这是真的吗,还是我错过了什么?是否有一个不同的MapReduce工具可以处理从打开的套接字读入的数据?可扩展性是一个问题,所以我更愿意让MapReducer处理凌乱的并行化内容。
我玩过级联并且能够在通过HTTP访问的静态文件,但这实际上并没有解决我的问题。我可以使用curl作为中间步骤将数据转储到Hadoop文件系统的某个地方,并编写一个监视程序,以便在每次准备好新的数据块时触发新作业,但这是一个肮脏的黑客行为;必须有一些更优雅的方式来做到这一点。有任何想法吗?
解决方案
你描述的hack或多或少是标准的做事方式 - Hadoop基本上是一个面向批处理的系统(一方面,如果数据没有结束,Reducers就无法启动,因为它们必须在地图阶段结束后开始)。
旋转日志;当你将它们旋转出来时,将它们转储到HDFS中。有一个看门狗进程(可能是分布式进程,使用ZooKeeper协调)监视转储地并启动新的处理作业。您需要确保作业在足够大的输入上运行以保证开销。
Hbase是hadoop生态系统中的BigTable克隆,可能对您感兴趣,因为它允许连续的插入流;但是,您仍然需要以批处理模式运行分析查询。
其他提示
我认为你应该看看Esper CEP( http://esper.codehaus.org/)。
雅虎S4 http://s4.io/
它提供实时流计算,如map reduce
Twitter的风暴是您所需要的,您可以尝试一下!
这里有多个选项。 我建议将Kafka和Storm +(Hadoop或NoSql)结合起来作为解决方案。 我们已经使用这些开源工具构建了我们的大数据平台,并且它运行良好。
您的用例听起来类似于使用Hadoop编写Web爬虫的问题 - 数据从打开的套接字(缓慢)返回(通过HTTP获取远程页面)。
如果是,请参阅为什么提取网页不能很好地映射到map-reduce 。你可能想查看 Bixo中的FetcherBuffer 类,它在reducer中实现线程化方法(通过Cascading)来解决这类问题。
如您所知,Hadoop在流挖掘中使用的主要问题是,首先,它使用HFDS,这是一个磁盘,磁盘操作会带来延迟,导致流中缺少数据。第二,是管道不平行。 Map-reduce通常对批量数据进行操作,而不是像流数据那样对实例进行操作。
我最近阅读了一篇关于M3的文章,该文章通过绕过HDFS并在对象数据库中执行内存计算来解决第一个问题。对于第二个问题,他们使用的是增量学习者,这些学习者不再是批量学习的。值得一试的 Hadoop Online
但是, Apache Storm 是该问题的关键解决方案,但这还不够。你需要一些euqivalent of map-reduce,这就是为什么你需要一个名为 SAMOA 的库,它实际上有很好的算法对于有点缺乏的在线学习。
市场上有几种成熟的流处理框架和产品。开源框架例如是Apache Storm或Apache Spark(它们都可以在Hadoop之上运行)。您还可以使用IBM InfoSphere Streams或TIBCO StreamBase等产品。
看看这篇InfoQ文章,它详细解释了流处理以及所有这些框架和产品:实时流处理/流媒体分析与Hadoop结合使用。除了文章还解释了它如何与Hadoop互补。
顺便提一下:许多软件供应商(如Oracle或TIBCO)都将这种流处理/流分析方法称为“快速数据<!>”;而不是<!>“;大数据<!>”;因为你必须实时行动而不是批处理。
您应该尝试使用Apache Spark Streaming。 它应该适合您的目的。