2016-11-24 2 views
0

У меня есть требование в моем приложении Spark, где мне нужно периодически обновлять переменную, которая будет использоваться рабочим кодом.Как периодически обновлять объекты на рабочих Spark?

Для более конкретного понимания мне нужно поместить мои данные в осколки Кинезиса с равным разделением. Количество 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

Я думаю, вам нужно просто использовать случайный ключ раздела с равномерным распределением, скажем System.currentTimeMillis. На самом деле вам не нужно указывать, какой осколок использовать, и поэтому не нужно отслеживать количество черепов.

EDIT

Учитывая, что у вас не было удачи с этим, широковещательные переменные будут решать это для вас:

Broadcast переменные позволяют программисту сохранить только для чтения переменной, сохраненную на каждой машине

// 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 для подключения к вашей хэш-функции.

+0

Я пробовал это, так или иначе Kinesis не распределяет ключи разделов равномерно. Особенно, когда происходит перестановка. Вот почему этот код. – cmbendre

+0

Я обновил ответ, включив широковещательные переменные, которые помогут вам решить эту проблему – ImDarrenG

Смежные вопросы