Vấn đề ở đây liên quan đến tính không nối tiếp của lớp avro.Schema được sử dụng trong Công việc. Ngoại lệ được ném ra khi bạn cố gắng tham khảo đối tượng lược đồ từ mã bên trong hàm bản đồ.
Ví dụ, nếu bạn cố gắng làm như sau, bạn sẽ nhận được "Task không serializable" ngoại lệ:
val schema = new Schema.Parser().parse(new File(jsonSchema))
...
rdd.map(t => {
// reference to the schema object declared outside
val record = new GenericData.Record(schema)
})
Bạn có thể làm tất cả mọi thứ để làm việc bằng cách chỉ cần tạo một thể hiện mới của giản đồ bên trong hàm khối:
val schema = new Schema.Parser().parse(new File(jsonSchema))
// The schema above should not be used in closures, it's for other purposes
...
rdd.map(t => {
// create a new Schema object
val innserSchema = new Schema.Parser().parse(new File(jsonSchema))
val record = new GenericData.Record(innserSchema)
...
})
vì bạn không muốn phân tích giản đồ Avro cho mỗi bản ghi bạn xử lý, một giải pháp tốt hơn sẽ phân tích các lược đồ ở mức phân vùng. Các công trình sau cũng hoạt động:
val schema = new Schema.Parser().parse(new File(jsonSchema))
// The schema above should not be used in closures, it's for other purposes
...
rdd.mapPartitions(tuples => {
// create a new Schema object
val innserSchema = new Schema.Parser().parse(new File(jsonSchema))
tuples.map(t => {
val record = new GenericData.Record(innserSchema)
...
// this closure will be bundled together with the outer one
// (no serialization issues)
})
})
Mã trên hoạt động miễn là bạn cung cấp tham chiếu di động cho tệp jsonSchema, vì chức năng bản đồ sẽ được thực thi bởi nhiều người thực thi từ xa. Nó có thể là một tham chiếu đến một tệp trong HDFS hoặc nó có thể được đóng gói cùng với ứng dụng trong JAR (bạn sẽ sử dụng các hàm nạp lớp để lấy nội dung của nó trong trường hợp sau).
Đối với những người đang cố gắng sử dụng Avro với Spark, nhận thấy rằng vẫn còn một số vấn đề chưa được giải quyết biên soạn và bạn phải sử dụng việc nhập khẩu sau trên Maven POM:
<dependency>
<groupId>org.apache.avro</groupId>
<artifactId>avro-mapred</artifactId>
<version>1.7.7</version>
<classifier>hadoop2</classifier>
<dependency>
Lưu ý "hadoop2"
phân loại. Bạn có thể theo dõi sự cố tại https://issues.apache.org/jira/browse/SPARK-3039.
Nguồn
2014-12-11 22:50:34
Bạn có thể vui lòng cung cấp dấu vết ngăn xếp ngoại lệ không? Các số phiên bản Spark, Hadoop và Avro cũng có thể hữu ích. – Wildfire
Hãy tha thứ cho sự ngây thơ của tôi. Tôi có thể hỏi công việc đang làm gì ở đây không? Có vẻ như đó là một công việc giảm bản đồ? Nếu chúng ta sử dụng tia lửa để viết ra, tại sao chúng ta cần một công việc giảm bản đồ? –