如何定期更新Spark工作人员的对象?

时间:2016-11-24 12:38:58

标签: scala apache-spark spark-streaming amazon-kinesis

我的Spark应用程序中有一个要求,我需要定期更新工作代码将使用的变量。

为了更具体的理解,我需要将我的数据以相同的分区方式放到Kinesis分片上。 kinesis分片的数量可以随时增加或减少,所以我应该总是得到正确数量的分片,因为我的分区键是

System.currentTimeMillis % shardSize

但我不想总是查询这个,所以像java.util.TimerTask这样的东西会有帮助,我可以向工作人员广播。

这是我需要定期运行并将值广播给奴隶的代码。

def fetchNumberOfShards(): Integer = {
    val describeStreamRequest = new DescribeStreamRequest()
    describeStreamRequest.setStreamName(streamName)
    val describeStreamResult = kinesisClient.describeStream( describeStreamRequest )
    val shards = describeStreamResult.getStreamDescription().getShards()
    return shards.size()
}

1 个答案:

答案 0 :(得分:0)

我认为你需要使用统一分布的随机分区键,比如System.currentTimeMillis。您实际上并不需要指定要使用的分片,因此不需要跟踪有多少分片。

修改

鉴于你没有幸运,广播变量将为你解决这个问题:

  

广播变量允许程序员在每台机器上保留一个只读变量

// executes on driver
scala> var broadcastVar = sc.broadcast(numShards)
broadcastVar: org.apache.spark.broadcast.Broadcast[Int] = Broadcast(0)

// retrieve value on worker
scala> broadcastVar.value
res0: Int = 5

http://spark.apache.org/docs/latest/programming-guide.html#broadcast-variables

驱动程序可以根据需要定期更新broadcastVar,工作人员只能阅读broadcastVar.value。然后,您可以使用broadcastVar.value插入您的分片哈希函数。