You are viewing a plain text version of this content. The canonical link for it is here.
Posted to reviews@spark.apache.org by GitBox <gi...@apache.org> on 2022/09/26 09:01:32 UTC
[GitHub] [spark] LuciferYang commented on pull request #37999: [SPARK-39146][CORE] Introduce `JacksonUtils` to use singleton Jackson ObjectMapper
LuciferYang commented on PR #37999:
URL: https://github.com/apache/spark/pull/37999#issuecomment-1257719214
Write a mirco-benchmark to test Jackson ObjectWriter read and write:
https://github.com/LuciferYang/spark/blob/objectMapper/sql/catalyst/src/test/scala/org/apache/spark/sql/connector/catalog/JacksonBenchmark.scala
```scala
def testReadJsonToMap(valuesPerIteration: Int): Unit = {
val input =
"""
|{"mergeDir":"/a/b/c/mergeDirName","attemptId":"appattempt_1648454518011_994053_000001"}
""".stripMargin
val benchmark = new Benchmark("Test read json to map",
valuesPerIteration, output = output)
benchmark.addCase("Test Multiple") { _: Int =>
for (_ <- 0L until valuesPerIteration) {
val mapper = new ObjectMapper()
mapper.registerModule(DefaultScalaModule)
mapper.readValue(input, classOf[mutable.HashMap[String, String]])
}
}
val mapper = new ObjectMapper()
mapper.registerModule(DefaultScalaModule)
benchmark.addCase("Test Single") { _: Int =>
for (_ <- 0L until valuesPerIteration) {
mapper.readValue(input, classOf[mutable.HashMap[String, String]])
}
}
benchmark.run()
}
def testWriteMapToJson(valuesPerIteration: Int): Unit = {
val map: mutable.HashMap[String, String] = new mutable.HashMap[String, String]()
map.put("mergeDir", "/a/b/c/mergeDirName")
map.put("attemptId", "yarn_appattempt_1648454518011_994053_000001")
val benchmark = new Benchmark("Test write map to json",
valuesPerIteration, output = output)
benchmark.addCase("Test Multiple") { _: Int =>
for (_ <- 0L until valuesPerIteration) {
val mapper = new ObjectMapper()
mapper.registerModule(DefaultScalaModule)
mapper.writeValueAsString(map)
}
}
val mapper = new ObjectMapper()
mapper.registerModule(DefaultScalaModule)
benchmark.addCase("Test Single") { _: Int =>
for (_ <- 0L until valuesPerIteration) {
mapper.writeValueAsString(map)
}
}
benchmark.run()
}
def testCreateObjectMapper(valuesPerIteration: Int): Unit = {
val benchmark = new Benchmark("Test create ObjectMapper",
valuesPerIteration, output = output)
benchmark.addCase("Test create ObjectMapper") { _: Int =>
for (_ <- 0L until valuesPerIteration) {
val mapper = new ObjectMapper()
mapper.registerModule(DefaultScalaModule)
}
}
benchmark.run()
}
override def runBenchmarkSuite(mainArgs: Array[String]): Unit = {
val valuesPerIteration = 10000
testCreateObjectMapper(valuesPerIteration = valuesPerIteration)
testWriteMapToJson(valuesPerIteration = valuesPerIteration)
testReadJsonToMap(valuesPerIteration = valuesPerIteration)
}
```
and run this use GA:
```
------------------------------------------------------------------------------------------------------------------------
Test create ObjectMapper 648 652 4 0.0 64819.0 1.0XOpenJDK 64-Bit Server VM 1.8.0_332-b09 on Linux 5.13.0-1022-azure
Intel(R) Xeon(R) Platinum 8272CL CPU @ 2.60GHz
Test write map to json: Best Time(ms) Avg Time(ms) Stdev(ms) Rate(M/s) Per Row(ns) Relative
------------------------------------------------------------------------------------------------------------------------
Test Multiple 2116 2127 15 0.0 211556.5 1.0X
Test Single 4 4 0 2.4 416.1 508.4XOpenJDK 64-Bit Server VM 1.8.0_332-b09 on Linux 5.13.0-1022-azure
Intel(R) Xeon(R) Platinum 8272CL CPU @ 2.60GHz
Test read json to map: Best Time(ms) Avg Time(ms) Stdev(ms) Rate(M/s) Per Row(ns) Relative
------------------------------------------------------------------------------------------------------------------------
Test Multiple 8848 8867 27 0.0 884776.2 1.0X
Test Single
```
From the test results, we should use singleton Jackson ObjectMapper, because it seems expensive to new a ObjectMapper instance.
--
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.
To unsubscribe, e-mail: reviews-unsubscribe@spark.apache.org
For queries about this service, please contact Infrastructure at:
users@infra.apache.org
---------------------------------------------------------------------
To unsubscribe, e-mail: reviews-unsubscribe@spark.apache.org
For additional commands, e-mail: reviews-help@spark.apache.org