如何使用spark在java中映射日志文件?

时间:2015-06-09 08:27:55

标签: java apache-spark

我必须监控一个日志文件,其中写有应用程序的使用历史记录。此日志文件的格式为:

<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%时打印警告

关于我如何开始的任何建议?

提前感谢。

1 个答案:

答案 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
}

注意:这只是批处理而非实时处理。