我的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()
}
答案 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
插入您的分片哈希函数。