"object" in Scala is similar to a class with only static fields /
methods in Java. So when you set its fields in the driver, the
"object" does not get serialized and sent to the executors; they have
their own copy of the class and its static fields, which haven't been
initialized.

Use a proper class, instantiate it, and then use it in the executors. e.g.

class Foo extends Serializable {
 ...
}

 val foo = new Foo()
 foo.field1 = "blah"

 lines.map(line => { println(foo) }) // now you should see the field
values you set.



On Mon, Jun 23, 2014 at 7:44 AM, Yana Kadiyska <yana.kadiy...@gmail.com> wrote:
> Hi folks, hoping someone can explain to me what's going on:
>
> I have the following code, largely based on RecoverableNetworkWordCount
> example
> (https://github.com/apache/spark/blob/master/examples/src/main/scala/org/apache/spark/examples/streaming/RecoverableNetworkWordCount.scala):
>
> I am setting fields on an object that gets accessed within the map function.
> But the workers do not see the set values. Could someone help me understand
> what is going on? I suspect the serialization of the object happens not when
> I think it does....
>
> object Foo{
>     var field1 = -1
>     var field2 = -2
> }
>
> def main(args: Array[String]) {
>     //open a yaml file
>    Foo.field1 = value_from_yaml
>    Foo.field2 = value from_yaml
>
>    val ssc = StreamingContext.getOrCreate(checkpointDirectory,
>       () => { createContext()  })
>     ssc.start()
> }
>
> def createContext(){
>      // create streaming context
>     println(Foo)                                                    <--
> foo's fields are  set
>     lines.map(line =>{
>          println(Foo)                                               <--
> foo's fields are not set
>     })
> }



-- 
Marcelo

Reply via email to