我在Spark应用程序中有一个要求,需要定期更新工作代码将使用的变量。
为了获得更具体的理解,我需要将数据以相等的分区放置到Kinesis碎片中。动觉碎片的数量可以随时增加或减少,因此我应该始终获得正确的碎片数量,因为我的分区键是
System.currentTimeMillis%shadSize
但是我不想总是查询这个,所以像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()
}
我认为您只需要使用具有均匀分布的随机分区密钥,例如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-变量
驱动程序可以根据需要定期更新广播var,工作人员只能读取广播var。值 。然后可以使用broadcastVar。值插入到shard哈希函数中。
问题内容: 我有一个Ember应用程序,其模型来自Ajax调用。第一次调用的效果很好,我具有向Ajax调用返回承诺的模型钩子,该调用检索要显示的数据。 但是此数据在后端经常更改,因此我想让Webapp定期(例如每5秒一次)轮询服务器,并更新或什至更好地将模型数据与新检索的数据完全交换。 使用Ember.js的合适方法是什么?我是Ember的新手,所以对此有点迷惑。 问题答案: 我认为这是一个很好的
问题内容: 根据此文档,我需要确保我具有1.0.1或更高版本的OpenSSL版本才能连接到Salesforce API 。 根据这个问题,我可以执行以下步骤(已成功完成) 酿造更新 酿造安装openssl 酿造链接–force openssl 运行时,我得到以下信息: 但是,当我运行时,我得到以下信息: 我从计算机中收到混合信号,但是我的salesforce模块仍然无法正常工作,因此我知道Open
问题内容: 我已安装Anaconda(Python 2.7.11 | Anaconda自定义(64位)|(默认值,2016年2月16日,09:58:36)[win32上的MSC v.1500 64位(AMD64)]),并且我正在使用Spyder 2.3.8 想要将Spyder更新到最新版本,所以我完成了以下命令: 它们都运行无误,但spyder版本没有更改-这是我用来启动的命令: C:\ Anac
问题内容: 这个问题的答案是 社区的努力。编辑现有答案以改善此职位。它当前不接受新的答案或互动。 我尝试了这个: …但是没有用。 如何在Windows上执行此操作? 问题答案: 这是在Windows上升级 npm的 最佳新方法。 以管理员身份运行PowerShell 注意:请勿运行。而是使用它来更新npm。另外,如果您运行NodeJS安装程序,它将替换节点版本。 在节点安装它的位置就地升级npm。
我想把Chromedriver更新到最新版本。 如何在命令行上执行此操作?
问题内容: 谁能帮我,我是java编程的新手 假设我有JSONArray,其数据如下: 如何更新到中 如何更新到中 并试图循环数据 谁能帮我 问题答案: 这是代码: 是你的 现在,如果您进行打印,则可以看到值已更改。