2017-09-28 26 views
5

Tôi có một ứng dụng java cần đọc một lượng lớn dữ liệu từ MongoDB 3.2 và chuyển nó sang Hadoop.Đọc dữ liệu mongodb lớn

Ứng dụng hàng loạt này chạy mỗi 4 giờ 6 lần một ngày.

Thông số kỹ thuật dữ liệu:

  • Tài liệu: 80000 tại một thời điểm (mỗi 4 giờ)
  • Kích thước: 3GB

Hiện nay tôi đang sử dụng MongoTemplatenha phiến trong để truy cập MongoDB. Tuy nhiên tôi nhận được một ngoại lệ oom khi xử lý dữ liệu này bằng cách sử dụng sau đây:

List<MYClass> datalist = datasource.getCollection("mycollection").find().asList(); 

cách tốt nhất để đọc dữ liệu này và cư để Hadoop là gì?

  • MongoTemplate::Stream() và viết thư cho Hadoop từng cái một?
  • batchSize(someLimit) và viết toàn bộ hàng loạt cho Hadoop?
  • Cursor.batch() và viết thành từng tệp một?

Trả lời

1

Vấn đề của bạn nằm ở asList() gọi

Điều này buộc người lái xe để lặp qua toàn bộ con trỏ (80.000 tài liệu vài hợp đồng biểu diễn), giữ tất cả trong bộ nhớ.

batchSize(someLimit)Cursor.batch() muốn trợ giúp ở đây khi bạn duyệt qua toàn bộ con trỏ, cho dù kích thước lô là bao nhiêu.

Thay vào đó bạn có thể:

1) Lặp lại con trỏ: List<MYClass> datalist = datasource.getCollection("mycollection").find()

2) Đọc tài liệu cùng một lúc và thức ăn các tài liệu vào một bộ đệm (giả sử một danh sách)

3) Đối với mỗi 1000 tài liệu (ví dụ) gọi API Hadoop, xóa bộ đệm, sau đó bắt đầu lại.

0

Cuộc gọi asList() sẽ cố gắng tải toàn bộ bộ sưu tập Mongodb vào bộ nhớ. Đang cố gắng tạo một đối tượng danh sách bộ nhớ lớn hơn 3gb kích thước.

Lặp lại bộ sưu tập bằng con trỏ sẽ khắc phục sự cố này. Bạn có thể làm điều này với lớp Datasource, nhưng tôi thích loại tóm tắt an toàn mà Morphia cung cấp với các lớp học DAO:

class Dao extends BasicDAO<Order, String> { 
    Dao(Datastore ds) { 
     super(Order.class, ds); 
    } 
    } 

    Datastore ds = morphia.createDatastore(mongoClient, DB_NAME); 
    Dao dao = new Dao(ds); 

    Iterator<> iterator = dao.find().fetch(); 
    while (iterator.hasNext()) { 
     Order order = iterator.next; 
     hadoopStrategy.add(order); 
    } 
Các vấn đề liên quan