データが主食

データエンジニアの備忘録。分析だったり、読んだ本のメモだったり。

URL前方一致クエリを高速に実行するためにhttp://を除外してみた(Spark編)

ktr89.hateblo.jp

をSparkでも実験してみた件。URLの前方一致検索をするときに、http://とかhttps://を排除して保存しておいた方が速いんじゃないの?という仮説の検証です。今回はSpark(Scala)を使ってみます。

build.sbtはこんな感じ

libraryDependencies += "com.storm-enroute" %% "scalameter" % "0.8.2"
libraryDependencies += "org.apache.spark" %% "spark-sql" % "2.4.0"

testFrameworks += new TestFramework("org.scalameter.ScalaMeterFramework")

parallelExecution in Test := false

実験のコードはこんな感じ

import org.scalameter._
import org.apache.spark.sql.SparkSession
import org.apache.log4j.Logger
import org.apache.log4j.Level

object main extends App{
  Logger.getLogger("org").setLevel(Level.OFF)
  Logger.getLogger("akka").setLevel(Level.OFF)

  val rmSchemes = {
    for{
      i <- 0 until 1000000
    } yield i.toString + ".example.com"
  }.toList

  val allUrls = rmSchemes.map(i => "http://" + i)
  val spark = SparkSession
  .builder()
  .appName("SparkSpeedTest")
  .master("local")
  .getOrCreate()
  val sc = spark.sparkContext


  val standardConfig = config(
    Key.exec.minWarmupRuns -> 5,
    Key.exec.maxWarmupRuns -> 20,
    Key.exec.benchRuns -> 10,
    Key.verbose -> false
  ) withWarmer(new Warmer.Default)


  val paraAllUrl = sc.parallelize(allUrls)
  val time1 = standardConfig measure {
    paraAllUrl.filter(url => url matches ("^1.example.com.*")).collect()
  }
  println(time1)

  val paraRmSchemes = sc.parallelize(allUrls)
  val time2 = standardConfig measure {
    paraRmSchemes.filter(url => url matches ("^http://1.example.com.*")).collect()
  }
  println(time2)

  spark.stop()
}
ec2-user:~/environment/compare $ sbt run
[info] Loading project definition from /home/ec2-user/environment/compare/project
[info] Loading settings for project compare from build.sbt ...
[info] Set current project to compare (in build file:/home/ec2-user/environment/compare/)
[info] Running main 
Using Spark's default log4j profile: org/apache/spark/log4j-defaults.properties
1781.8816930999997 ms
1699.6211689999996 ms
[success] Total time: 124 s, completed Jan 28, 2019 2:59:11 PM

実験結果

ログの種類 平均時間
URLそのまま 1782 ms
http://除外 1700 ms
  • あまり高速化できなかった