簡體   English   中英

如何在Spark(Python / Scala)中處理ASM文件

[英]How to process ASM files in Spark (Python/Scala)

首先,以下是ASM文件中的示例行,其中包含1-2百萬行,如下所示:

.text:0040120F 03 CA                                   add     ecx, edx
.text:00401211 89 48 3C                                mov     [eax+3Ch], ecx
.text:00401214 8B 0D C4 7E 58 00                           mov     ecx, dword_587EC4

我想計算Spark中每個文件的Header(text)和Segments(add,mov)以便快速處理。 我已經閱讀了文檔/文章,但是沒有找到任何一種技術來逐行分析文件以僅計算這些標題和段。

處理后,結果應為:

'text': 3,
'add': 1,
'mov': 2 

無論如何,有沒有從Spark中的裝配文件中提取這些零件?

問題大小

假設匯編文件的每一行都占用200字節的數據。 一個50 MB的文件大約有250,000行,並用5.6分鍾來處理所有這些行,因此每行的處理時間為1到1.5 ms。 它相當高,但是我們不要挑戰它。 以這種速率,處理136 GB將花費10天半。

使用Spark映射/減少

在這些假設下,減少映射似乎確實很受歡迎,希望Spark可以提供幫助。 我不知道您使用哪種基礎結構來運行Spark作業,因此以下內容集中於處理ASM文件各行的代碼,並且仍然非常通用。

首先,讓我們實現從每行單獨提取信息的邏輯。

val regex = "\\.(.*):(?:[A-Z0-9]+\\s)+\\s+([a-z]+).*".r

def parse(line: String) = {
  line match {
    case regex(header, instruction) => Seq(header, instruction)
    case _ => Seq()
  }
}

現在我們需要從程序集文件中創建一個RDD,例如

val rdd = sparkContext.textFile("hdfs://path/file1,hdfs://path/file2,...")

或者,如果您想從目錄中讀取所有文件,請執行以下操作:

val rdd = sparkContext.textFile("hdfs://path/*")

並編寫實際的map / reduce以提取行標題和ASM指令的頻率:

val frequencies = rdd.flatMap(parse _).map((_, 1)).reduceByKey(_ + _)

測試與結果

我用示例中的三行代碼在spark-shell對其進行了測試:

val rdd = sc.parallelize(Seq(
  ".text:0040120F 03 CA                    add     ecx, edx",
  ".text:00401211 89 48 3C                 mov     [eax+3Ch], ecx",
  ".text:00401214 8B 0D C4 7E 58 00        mov     ecx, dword_587EC4"
))

並顯示輸出:

frequencies.foreach(x => println(x._1 + ":" + x._2))

這給了

mov:2
add:1
text:3

筆記

臨時的“解析”邏輯基於我從問題陳述中所了解的內容,但是我猜想它需要針對您的用例進行調整。

暫無
暫無

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

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