2014-11-11 2 views
0

Мне интересно, если следующий простой код будет работать в распределенной среде (он действительно работает в автономном режиме)?Apache Spark: обновить глобальные переменные в рабочих

public class TestClass { 
    private static double[][] testArray = new double[4][]; 
    public static void main(String[] args) { 
     for(int i = 0; i<4; i++) 
     { 
      testArray[i] = new double[10]; 
     } 
     ... 
     JavaRDD<String> testRDD = sc.textFile("testfile", 4).mapPartitionsWithIndex(
      new Function2<Integer, Iterator<String>, Iterator<String> >() { 
       @Override 
       public Iterator<String> call(Integer ind, Iterator<String> s) { 
        /*Update testArray[ind]*/ 
       } 
      }, true 
     ); 
    ... 

Если предполагается работать, интересно, как искра посылает часть testArray от рабочего до главного узла?

+0

на голосование закрыть: это совершенно правильный вопрос и ценный для других. Не видишь причину закрытия. Оставьте комментарий с рекомендациями по улучшению. – maasg

ответ

2

Номер Он не должен работать в распределенной среде.

Переменные, зафиксированные в закрытии, будут сериализованы и отправлены рабочим. Данные, первоначально установленные в драйвере, будут доступны для рабочих, но любые обновления на рабочем уровне будут доступны только в локальной области.

В локальной переменной используется одно и то же пространство памяти, и поэтому вы видите обновления, но это не будет масштабироваться для кластера.

Вам необходимо преобразовать вычисления с точки зрения операций RDD, чтобы собрать результаты.

+0

Спасибо! Не могли бы вы пролить свет на следующее утверждение, учитывая этот простой пример? >> Вам нужно преобразовать вычисления в терминах операций RDD для сбора результатов. –

+0

Есть несколько вариантов. Что должен делать шаг '/ * update testArray * /'? – maasg

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