簡體   English   中英

閱讀大型mongodb數據

[英]Read large mongodb data

我有一個java應用程序需要從MongoDB 3.2讀取大量數據並將其傳輸到Hadoop。

該批次應用程序每4小時運行6次,每天6次。

數據規格:

  • 文件:每次80000(每4小時一次)
  • 尺寸:3gb

目前我正在使用MongoTemplateMorphia來訪問MongoDB。 但是,在使用以下內容處理此數據時,我收到OOM異常:

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

讀取此數據並填充到Hadoop的最佳方法是什么?

  • MongoTemplate::Stream()並逐個寫入Hadoop?
  • batchSize(someLimit)並將整個批處理寫入Hadoop?
  • Cursor.batch()Cursor.batch()寫入hdfs?

你的問題出在asList()調用上

這會強制驅動程序遍歷整個游標(80,000個文檔幾個Gigs),將所有內容保留在內存中。

無論批量大小是什么,當您遍歷整個游標時, batchSize(someLimit)Cursor.batch()將無助於此。

相反,你可以:

1)迭代游標: List<MYClass> datalist = datasource.getCollection("mycollection").find()

2)一次讀取一個文檔並將文檔送入緩沖區(比如列表)

3)對於每1000個文件(比如說)調用Hadoop API,清除緩沖區,然后重新開始。

asList()調用將嘗試將整個Mongodb集合加載到內存中。 試圖使內存列表對象大於3GB的大小。

使用游標迭代集合將解決此問題。 您可以使用Datasource類執行此操作,但我更喜歡Morphia為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);
  }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM