[英]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.