2015-09-17 15 views
5

Tôi rất mới để Spark và tôi có bối cảnh mùa xuân (tải xml trong bối cảnh ứng dụng bằng cách sử dụng ClassPathXmlApplicationContext) cần phải được chuyển đến nút công nhân. Tôi có thể tạo ra bối cảnh Spark và cố gắng sử dụng cùng với flatMap của tôi và null của nó. Có anyway tôi có thể vượt qua điều này để chức năng Flatmap? Tôi đang gọi một khuôn khổ khác với tia lửa cần bối cảnh mùa xuân này.Làm thế nào để vượt qua bối cảnh mùa xuân để nút công nhân Spark

Dưới đây là một số mã

ApplicationContext context = new ClassPathXmlApplicationContext("spring/rules-engine-spring.xml"); 

JavaRDD<Row> partitions = r.mapPartitions(
    new FlatMapFunction<Iterator<Row>, Row>() { 
     public Iterable<Row> call(Iterator<Row> rowIterator) throws Exception { 

      List<Data> factList = new ArrayList<Data>(); 
      while (rowIterator.hasNext()) { 
       Row rw = rowIterator.next(); 
       Data fact = new Data(); 
       fact.setGrain(rw.getString(0)); 
       fact.setRoute(rw.getString(1)); 
       factList.add(fact); 
      } 
      Iterable itr = new Iterable() { 
        List l = new ArrayList<Integer>(); 

        public Iterator iterator() { 
         return l.iterator(); 
        } 
       }; 
      return itr; 
     } 

    }); 
List result=partitions.collect(); 

khi tôi đang cố gắng sử dụng bối cảnh với trong FlatMapFunction rỗng của nó. Ngoài phương thức này, ngữ cảnh có giá trị. Bất kỳ trợ giúp sẽ được đánh giá cao.

+0

Có ngoại lệ nào không? Bạn có thể thử tạo ngữ cảnh bên trong flatMap không? – Reactormonk

+0

Như tôi đã đề cập, tôi không thể tạo ngữ cảnh nhiều lần. Nó phải nằm ngoài FlatMap. Tôi đã thử tạo ra bối cảnh bên trong hàm và có lỗi nói rằng một số đối tượng ngữ cảnh đã có sẵn, vv Có cách nào tôi có thể tạo ngữ cảnh bên ngoài hàm flatmap và truy cập cùng với hàm không? –

+0

Bạn có chắc chắn rằng đối tượng không phải là null bên ngoài flatMap không? Nếu nó rỗng bên trong, có lẽ logic serialization đã không lấy nó một cách chính xác. Hoặc bằng cách nào đó được đánh dấu là thoáng qua. – Reactormonk

Trả lời

3

Khi bạn thực hiện một biến thoáng qua, nó sẽ không được tuần tự hóa và không có sẵn trên công nhân. Điều đó sẽ giải thích null bên trong flatMap. Bạn sẽ phải chắc chắn rằng serializer chọn lên lớp (và loại bỏ tạm thời). Bạn có thể sử dụng kryo để tuần tự hóa lớp mặc dù nó không phải là Serializable.

Via http://apache-spark-user-list.1001560.n3.nabble.com/Un-serializable-3rd-party-classes-Spark-Java-td7815.html:

Có một vài lựa chọn:

  • Kryo có thể có thể serialize các đối tượng này ra khỏi hộp, tùy thuộc những gì bên trong chúng. Thử bật tính năng này như được mô tả tại http://spark.apache.org/docs/latest/tuning.html.
  • Nếu điều đó không có tác dụng, bạn có thể tạo các đối tượng “trình bao bọc” của riêng mình để triển khai Serializable hoặc thậm chí là lớp con của FlexCompRowMatrix. Không cần phải thay đổi thư viện gốc.
  • Nếu thư viện có các chức năng tuần tự hóa riêng của nó, bạn cũng có thể sử dụng các hàm đó bên trong một đối tượng bao bọc. Hãy xem https://github.com/apache/spark/blob/master/core/src/main/scala/org/apache/spark/SerializableWritable.scala để biết ví dụ về cách chúng tôi tạo các Bài viết của Hadoop có thể tuần tự hóa được.
+0

Cảm ơn bạn rất nhiều. Nó đã giúp đỡ –

Các vấn đề liên quan