如题,就是多个节点都能访问到,然后都能去更新这个变量,更新完以后,其他节点访问  也是最新值,spark有这种解决方案吗?共享变量是只读的,貌似做不到

解决方案 »

  1.   

    广播变量 sc.broadcast() ?
      

  2.   

    spark提供了累加变量,看官方说明说的很清楚
      

  3.   

    广播变量是从Driver上把广播对象序列化,在Executor上反序列化。因此在Executor上对广播变量修改,只是修改Executor本地的副本,其他Executor的副本不会受到影响。
    而累加器则是Driver只读,Executor只写的对象。
    因此你只能通过数据库或者HDFS文件等来做数据实时共享了,封装好访问的方法在算子里面访问,注意读写锁问题。
      

  4.   

    另外如果不是特别庞大的对象,例如字符串或者数组、不大的集合,可以序列化后放在ZooKeeper上。注意ZK的数据不能超过1MB
    推荐一个库menagerie,实现了分布式锁,Leader选举,以及实现了java.util.concurrent包下的并发集合接口的分布式实现
      

  5.   

    只能自己封装实现,广播变量和累积变量都不能像你说的那么用。把要共享的数据放zookeeper是个办法,就是要自己控制并发写的问题。不嫌麻烦,就开个web服务,每次从web服务上获取值,完了更新上去。