2013-03-06 18 views
1

有沒有人知道可用於重新索引所有/某些命名空間中的所有/某些實體的庫或良好代碼示例?針對AppEngine的Reindex任務/映射器/作業Java

如果我自己實現這個,MapReduce應該考慮什麼?

「我需要重新索引?」感覺像是許多開發者遇到的問題,但最接近我能找到的是this,這可能是一個好的開始?

其他選項是使用任務隊列的自制解決方案,該任務隊列迭代數據存儲區命名空間和實體,但我不希望重新發明輪子並尋求一個可靠的,經過驗證的解決方案。

有什麼選擇?

回答

2

恐怕我不知道任何預建系統。我想你基本上需要創建一個遊標來遍歷所有的實體,然後做一個get和put所有的實體(或者可選地檢查它們是否在索引之前在索引中 - 如果你有一些贏的話) t需要更新,這會以讀取和/或小操作爲代價爲您節省寫入)。

按照這裏的例子: https://code.google.com/p/objectify-appengine/wiki/IntroductionToObjectify#Cursors

  1. 創建java.util.concurrent.SynchronousQueue中保存數據存儲密鑰的批次。
  2. 創建10個新消費者線程使用ThreadManager(電流限制): https://developers.google.com/appengine/docs/java/javadoc/com/google/appengine/api/ThreadManager 這些線程應該做到以下幾點:
    1. 創建一個新的對象化實例,並關閉會話緩存和內存緩存的對象化。
    2. 從SynchronousQueue獲取一批密鑰。
    3. 使用批處理get獲取所有這些實體。
    4. (可選)爲使用相關屬性的所有實體執行鍵唯一查詢。
    5. 把所有這些實體(或排除上面返回的那些)。從第2步
  3. 在循環
  4. 重複,使用純鍵光標查詢取出下一鍵30,並把它們插入的SynchronousQueue。
  5. 將所有項目放入SynchronousQueue後,設置屬性以在所有消費者線程完成其工作後停止所有消費者線程。
+0

我需要一些時間來嘗試一下。所以你建議不使用MapReduce的自定義實現。這不完全是MapReduce的範圍,並且MapReduce不會執行此循環嗎? – koma 2013-03-14 13:30:57

+0

這兩種方法都有問題。用我提出的建議,你必須自己管理工作,這是一個隨着任務規模增長的問題。我猜如果你以一次性的數量爲一百萬的實體索引,我的解決方案可能比處理Python/Java/Objectify索引問題更容易。什麼是索引的決定在Objectify中是微不足道的,但我認爲很難轉化爲Python。 – mjaggard 2013-03-18 14:13:23