簡體   English   中英

如何使用Spark映射Java中的日志文件?

[英]how to map a log file in java using 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始終相同,因為僅在一個應用程序中引用,所以datedd/mm/yyyy hh/mm cpuUsage表示cpuUsagememoryUsage%表示,例如:

<3ghffh3t482age20304,230720142245,0.2,3,5>

因此,具體來說, 我必須檢查此應用程序將使用spark和map reduce算法監視的CPU使用率和內存使用率的百分比

我的輸出是在CPU或內存使用率達到100%時打印警報

關於我如何開始的任何建議?

提前致謝。

這個想法是聲明一個類並將該行映射到一個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
}

注意:這僅是批處理,不是實時處理。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM