如何使用spark-streaming实现日常计算并获得实时结果

时间:2016-01-13 08:52:20

标签: algorithm scala apache-spark spark-streaming

我需要计算"新用户,活跃用户"服务器端日志中的应用程序。 我用scala和spark实现了每日计算算法。这项工作每天提交一次,并获得当天的所有结果。效果很好。
这是我执行旧日常算法的一些伪代码。此代码每天运行一次,并获得一组每日结果:

// Get today log from hbase or somewhere else
val log = getRddFromHbase(todayDate)
// Compute active user
val activeUser = log.map(line => ((line.uid, line.appId), line).reduceByKey(distinctStrategyMethod)
// Get history user from hdfs
val historyUser = loadFromHdfs(path + yesterdayDate)
// Compute new user from active user and historyUser
val newUser = activeUser.subtractByKey(historyUser)
// Get new history user
val newHistoryUser = historyUser.union(newUser)
// Save today history user
saveToHdfs(path + todayDate)

现在我想得到"实时"结果:
1。结果应重新计算,每5分钟或更短时间更换一次 2.结果应该在一天开始时为0,并且与当天结束时的旧算法相同。

我认为如果我使用一个恒定的时间窗口(1天,每5分钟滑动一次,我认为)来实现算法,那是不对的。
如果有人能给我一些想法或榜样,我将不胜感激。谢谢你的时间。

1 个答案:

答案 0 :(得分:0)

您可以利用以下策略,而不是从Hbase获取它: -

  1. Flume-NG - 安装Flume Agents并“拖尾”日志文件或编码您自己的Source以捕获实时生成的事件。列表项
  2. Flume-Spark Listener - 按照指定的说明操作并以近实时(非实时)方式接收事件。
  3. 接下来在您的Spark Streaming Code中,我们可以创建 StreamingContext 60秒或更短时间,如下所示: -

    val streamCtx = new StreamingContext(conf, Seconds(60))
    val lines = streamCtx.socketTextStream("HOST_NAME", PORT, MEMORY_AND_DISK_SER_2)
    //Next - Depending upon the format do the further computations 
    //and either print the results or Store in RDBMS/ NOSQL - HBASE/Cassandra