Twitter 使用Spark流媒体持久化推文

Twitter 使用Spark流媒体持久化推文,twitter,hdfs,twitter4j,apache-spark,spark-streaming,Twitter,Hdfs,Twitter4j,Apache Spark,Spark Streaming,首先,我们的要求相当简单。当tweet出现时,我们所需要做的就是将它们保存在HDFS上(定期) JavaStreamingContext的“checkpoint”API看起来很有希望,但经过进一步审查,它似乎有不同的用途。(另外,我不断收到“/checkpoint/temp,error:No-this file或directory(2)”错误,但现在我们不必担心这个问题) 问题:JavaDStream没有“saveAsHadoopFiles”方法——这有点道理。我想从流媒体作业保存到Hadoop

首先,我们的要求相当简单。当tweet出现时,我们所需要做的就是将它们保存在HDFS上(定期)

JavaStreamingContext的“checkpoint”API看起来很有希望,但经过进一步审查,它似乎有不同的用途。(另外,我不断收到“/checkpoint/temp,error:No-this file或directory(2)”错误,但现在我们不必担心这个问题)

问题:JavaDStream没有“saveAsHadoopFiles”方法——这有点道理。我想从流媒体作业保存到Hadoop不是一个好主意

推荐的方法是什么?我是否应该将传入的“tweet”写入卡夫卡队列,然后使用“Camus”(加缪)等工具推送到HDFS?

偶然发现了这篇很棒的博客文章,证实了我的想法。作者使用卡夫卡、斯托姆、加缪等技术构建了一个“外汇交易系统”。这个用例和我的相似,所以我将使用这个设计和工具。谢谢


您可以通过在数据流上使用hadoop操作来保存数据:

val streamingContext = new StreamingContext(sparkContext, Duration(window))
val tweetStream = TwitterUtils.createStream(streamingContext,...).map(tweet=>tweet.toJSONString)
tweetStream.saveAsTextFiles(pathPrefix, suffix)

假设输入恒定,时间窗口将让您控制每个流媒体间隔要处理的消息量。

为什么从流媒体作业保存到hadoop不是一个好主意?我想这就是你真正想要的。如果我们保存到HDFS,每次收到一条消息,我们的解决方案会扩展吗?推特每秒发送数百万条推特。将每条推文直接插入HDFS将无法缩放!是吗?如果HDFS的写入吞吐量无法保持持续的消息写入,那么在这两者之间添加另一个系统(如kafka)将有何帮助?使用一个调整过的窗口(x秒),您可以收集足够的消息,以微批量方式写入HDFS。这应该是相当有效的。“一个调整过的窗口”正是卡夫卡提供给我们的,不是吗?另外还有其他好处。Storm和Spark streaming都与Kafka进行了很好的集成,用于实时处理。Kafka为您提供了一个高吞吐量队列,但这是增加系统复杂性的另一个因素。如果您预期的瓶颈是HDFS,我不认为卡夫卡能为您提供什么帮助。您的体系结构需求在问题中没有得到很好的反映。好吧,也许您是对的。下面是我如何映射它的:我说,“首先,我们的需求相当简单——写到HDFS”。这在本节的博文中得到了回答:“批聚合服务的数据管道:慢”。它指出他们使用了“加缪”——这也是我的想法。在未来,卡夫卡/风暴或火花流将派上用场。不管怎样,我的错!谢谢您的时间。我在JavaStreamingContext或StreamingContext上都没有看到“createTwitterStream”方法。可能只有Scala才有?我正在使用Spark Streaming的1.1.0版本。它名为
TwitterUtils.createStream(ssc,…)
我将用确切的调用更新答案。