我需要计算"新用户,活跃用户"服务器端日志中的应用程序。
我用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分钟滑动一次,我认为)来实现算法,那是不对的。
如果有人能给我一些想法或榜样,我将不胜感激。谢谢你的时间。
答案 0 :(得分:0)
您可以利用以下策略,而不是从Hbase获取它: -
接下来在您的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