[英]Read large mongodb data
我有一個java應用程序需要從MongoDB 3.2讀取大量數據並將其傳輸到Hadoop。
該批次應用程序每4小時運行6次,每天6次。
數據規格:
目前我正在使用MongoTemplate和Morphia來訪問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.