如題,就是多個節點都能訪問到,然后都能去更新這個變數,更新完以后,其他節點訪問 也是最新值,spark有這種解決方案嗎?共享變數是只讀的,貌似做不到
uj5u.com熱心網友回復:
廣播變數 sc.broadcast() ?uj5u.com熱心網友回復:
spark提供了累加變數,看官方說明說的很清楚uj5u.com熱心網友回復:
請問LZ找到解決方案了嗎uj5u.com熱心網友回復:
廣播變數是從Driver上把廣播物件序列化,在Executor上反序列化。因此在Executor上對廣播變數修改,只是修改Executor本地的副本,其他Executor的副本不會受到影響。而累加器則是Driver只讀,Executor只寫的物件。
因此你只能通過資料庫或者HDFS檔案等來做資料實時共享了,封裝好訪問的方法在算子里面訪問,注意讀寫鎖問題。
uj5u.com熱心網友回復:
另外如果不是特別龐大的物件,例如字串或者陣列、不大的集合,可以序列化后放在ZooKeeper上。注意ZK的資料不能超過1MB推薦一個庫menagerie,實作了分布式鎖,Leader選舉,以及實作了java.util.concurrent包下的并發集合介面的分布式實作
uj5u.com熱心網友回復:
只能自己封裝實作,廣播變數和累積變數都不能像你說的那么用。把要共享的資料放zookeeper是個辦法,就是要自己控制并發寫的問題。不嫌麻煩,就開個web服務,每次從web服務上獲取值,完了更新上去。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/74361.html
標籤:Spark
