Почему загрузка 4000 изображений в Redis с использованием spark-submit занимает больше времени (9 минут), чем загрузка этих же изображений в HBase (2,5 минуты)? - PullRequest
0 голосов
/ 05 июля 2018

Загрузка изображений в Redis должна выполняться намного быстрее, чем при использовании Hbase, поскольку Redis работает с оперативной памятью, а HBase использует HDFS для хранения данных. Я был удивлен, когда я загрузил 4000 изображений в Redis, это заняло 9 минут, чтобы закончить! Хотя тот же процесс я сделал с использованием HBase, и это заняло всего 2,5 минуты. Есть ли толкование для этого? Любые предложения по улучшению моего кода? Вот мой код:

// The code for loading the images into Hbase (adopted from NIST)
val conf = new SparkConf().setAppName("Fingerprint.LoadData") 
val sc = new SparkContext(conf) 
Image.dropHBaseTable() Image.createHBaseTable() 
val checksum_path = args(0) 
println("Reading paths from: %s".format(checksum_path.toString)) 
val imagepaths = loadImageList(checksum_path) println("Got %s images".format(imagepaths.length))
imagepaths.foreach(println) 
println("Reading files into RDD") 
val images = sc.parallelize(imagepaths).map(paths => Image.fromFiles(paths._1, paths._2)) 
println(s"Saving ${images.count} images to HBase")
Image.toHBase(images) 
println("Done")

} val conf = new SparkConf().setAppName("Fingerprint.LoadData") val sc = new SparkContext(conf) Image.dropHBaseTable() Image.createHBaseTable() val checksum_path = args(0) println("Reading paths from: %s".format(checksum_path.toString)) val imagepaths = loadImageList(checksum_path) println("Got %s images".format(imagepaths.length)) imagepaths.foreach(println) println("Reading files into RDD") val images = sc.parallelize(imagepaths) .map(paths => Image.fromFiles(paths._1, paths._2)) println(s"Saving ${images.count} images to HBase") Image.toHBase(images) println("Done")

} def toHBase(rdd: RDD[T]): Unit = {

     val cfg = HBaseConfiguration.create()
     cfg.set(TableOutputFormat.OUTPUT_TABLE, tableName)
     val job = Job.getInstance(cfg)
     job.setOutputFormatClass(classOf[TableOutputFormat[String]])
     rdd.map(Put).saveAsNewAPIHadoopDataset(job.getConfiguration)

} 

// Код для загрузки изображений в Redis

  val images = sc.parallelize(imagepaths).map(paths => Image.fromFiles(paths._1, paths._2)).collect
        for(i <- images){
val stringRdd = sc.parallelize(Seq((i.uuid, new String(i.Png, StandardCharsets.UTF_8))))
        sc.toRedisKV(stringRdd)(redisConfig)
        stringRdd.collect}                    
        println("Done")
...