ScalaのJson Parserを「spray-json」に変えたら処理速度が36倍になった話


仕事でEMR+Sparkを使って、いろいろなサービスが出すfluentdのログを整形していた時に、jsonのパースを変えたら処理速度が6時間→10分になった話

Jsonパーサーを変えようと思ったきっかけ

sparkが2.0.0になったので、scala2.10.xで組んでたやつをこの際に2.11.xにあげるか!というノリ

scala2.10.x → 2.11の乗り換えで
scala.util.parsing.jsonがdeprecatedになってしまうので、変えないとまずくなってしまった故

Jsonパーサー

結果、6時間かかっていたものが10分に短縮

環境的にはどちらもc4.x2largeをマスター、コア、タスク合わせて6台利用してました@EMR

導入方法(おまけ)

  • build.sbtへ追記
libraryDependencies ++= Seq(
  "io.spray" %%  "spray-json" % "1.2.6"
)
  • マッピングクラス、パーサークラスの準備
class Mapping(
    val hoge : String
    .......
    ......
    ...
)
object MappingProtocol {
    implicit object  MappingJsonFormat extends RootJsonFormat[Mapping] {

    override def read(json: JsValue): Mapping = {
        ...
        new Mapping

    }

    override def write(obj: Mapping): JsValue = {
        JsObject( ... )

    }

}

処理

import spray.json._
import さきほど準備したやつ

val json = """適当なjson"""
val jsonP = json.parseJson
val jsonC = jsonP.convertTo[Mapping]

2016/08/17 追記

@xuwei_k さんのご指摘でそもそも標準のパーサーは使っちゃいけないみたいです。他のものを使いましょう(戒め)