簡體   English   中英

Scala對象成員如何與Spark RDD一起使用

[英]How scala object member work with spark rdd

我有一個spark應用程序,該輸出結果為redis。

它在本地模式下工作正常,但無法將redisHost與我分配的args(0)像在紗線群集模式下那樣連接10.242.10.100

redisHost保持不變127.0.0.1

object TestSparkClosure {
  val logger: Logger = LoggerFactory.getLogger(TestSparkClosure.getClass)
  var redisHost = "127.0.0.1"
  var redisPort = 6379

  def main(args: Array[String]) {
    val conf = new SparkConf().setAppName("TestSparkClosure")

    if (args.length > 0) {
      redisHost = args(0)
    } else {
      conf.setMaster("local")
    }
    val sparkContext = new SparkContext(conf)
    var rdd = getRdd(sparkContext)
    rdd.foreachPartition(partitionOfRecords => {
      logger.info("host:port:" + redisHost + ":" + redisPort.toString)
      val jedis = new Jedis(redisHost, redisPort)
      partitionOfRecords.foreach(pair => {
        val keystr = pair._1
        val valuestr = pair._2
        jedis.set(keystr, valuestr)
      })
    })
  }

  def getRdd(spark: SparkContext): RDD[(String, String)] = {
    val rdd = spark.parallelize(List("2017\t1", "2018\t2", "2017\t3", "2018\t4", "2017\t5", "2018\t6")).map(line => {
      val cols = line.split("\t")
      (cols(0), cols(1))
    })
    rdd.reduceByKey((x, y) => {
      ((x.toInt + y.toInt).toString)
    }, 3)
  }
}

當我用這樣的局部變量替換redisHost時,它再次正常工作。

    var localRedisHost = redisHost
    rdd.foreachPartition(partitionOfRecords => {
      logger.info("host:port:" + localRedisHost + ":" + redisPort.toString)
      val jedis = new Jedis(localRedisHost , redisPort)
      partitionOfRecords.foreach(pair => {
        val keystr = pair._1
        val valuestr = pair._2
        jedis.set(keystr, valuestr)
      })
    })

誰能解釋火花塞在這里的工作原理?

非常感謝。

這是因為您使用的變量無法使用序列化。 當您定義本地元素時,它可以,因此您可以在RDD中使用它。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM