我必须监控一个日志文件,其中写有应用程序的使用历史记录。此日志文件的格式为:
<AppId,date,cpuUsage,memoryUsage>
<AppId,date,cpuUsage,memoryUsage>
<AppId,date,cpuUsage,memoryUsage>
<AppId,date,cpuUsage,memoryUsage>
<AppId,date,cpuUsage,memoryUsage>
... about 800000 rows
AppId
始终相同,因为仅在一个应用中引用,date
以此格式表示dd/mm/yyyy hh/mm
cpuUsage
,而memoryUsage
表示为%
所以例如:
<3ghffh3t482age20304,230720142245,0.2,3,5>
因此,在特定的 中,我必须使用spark和map reduce算法监视此应用程序要监控的CPU使用率和内存使用率的百分比 。
我的输出是在cpu或内存占用率为100%时打印警告
关于我如何开始的任何建议?
提前感谢。
答案 0 :(得分:1)
我们的想法是声明一个类并将该行映射到一个scala对象,
让我们按如下方式声明案例类,
case class App(name: String, date: String, cpuUsage: Double, memoryusage: Double)
然后初始化SparkContext并从存在数据的文本文件中创建RDD,
val sc = new SparkContext(sparkConf)
val inFile = sc.textFile("log.txt")
然后解析每一行并将其映射到App对象,以便范围检查更快,
val mappedLines = inFile.map(x => (x.split(",")(0), parse(x)))
其中parse(x)方法定义如下,
def parse(x: String):App = {
val splitArr = x.split(",");
val app = new App(splitArr(0),
splitArr(1),
splitArr(2).toDouble,
splitArr(3).toDouble)
return app
}
请注意,我假设输入如下,(这只是为了给你一个想法,而不是整个程序),
ffh3t482age20304,230720142245,0.2,100.5
然后执行过滤器转换,您可以在其中执行检查并报告厌恶条件,
val anamolyLines = mappedLines.filter(doCheckCPUAndMemoryUtilization)
anamolyLines.count()
其中doCheckCPUAndMemoryUtilization函数定义如下,
def doCheckCPUAndMemoryUtilization(x:(String, App)):Boolean = {
if(x._2.cpuUsage >= 100.0 ||
x._2.memoryusage >= 100.0) {
System.out.println("App name -> "+x._2.name +" exceed the limit")
return true
}
return false
}
注意:这只是批处理而非实时处理。